.github/9
ISSUE_TEMPLATE/3bug_report.md config.yml feature_request.md
workflows/3ci.yml clean-clone.yml release.yml
CODEOWNERS dependabot.yml pull_request_template.md
apps/630
api/250
src/243
common/30
__tests__/3authorize.test.ts bigint-serialization.interceptor.test.ts files-limits.test.ts
filters/1all-exceptions.filter.ts
guards/3auth.guard.ts internal-service.guard.ts rate-limit.guard.ts
interceptors/2actor-context.interceptor.ts bigint-serialization.interceptor.ts
middleware/2idempotency.test.ts idempotency.ts
pipes/1zod-validation.pipe.ts
actor-context.ts audit.service.ts cache.test.ts cache.ts cookies.ts core.module.ts deprecation.ts email.service.ts errors.ts event-bus.ts log-scrubber.test.ts log-scrubber.ts logger.ts permission-cache-bridge.ts prisma.service.ts redis.service.ts trace-metadata.ts types.ts
config/1env.ts
lib/11
__tests__/5crypto.test.ts filter-builder.test.ts jwt.test.ts pagination.test.ts positions.test.ts
authorize.ts crypto.ts filter-builder.ts jwt.ts pagination.ts positions.ts
modules/197
ai/28
__tests__/4ai-writing.test.ts database-ai.test.ts generate-executor.test.ts prompts.test.ts
generator/4executor.ts generate.controller.ts generate.dto.ts generate.service.ts
ai-chat.service.ts ai-rate-limit.ts ai-writing.controller.ts ai-writing.dto.ts ai-writing.service.ts ai.controller.ts ai.module.ts ai.service.ts budget-guard.service.ts database-ai.controller.ts database-ai.dto.ts database-ai.service.ts db-prompts.ts dto.ts gateway-provider.ts ledger.service.ts prompts.ts rag.controller.ts rag.dto.ts rag.service.ts
api-keys/3api-keys.controller.ts api-keys.module.ts api-keys.service.ts
audit/2audit-log.controller.ts audit.module.ts
auth/4auth.controller.ts auth.module.ts auth.service.ts dto.ts
automations/5automations.controller.ts automations.module.ts automations.service.ts dto.ts webhook-incoming.controller.ts
blocks/5
__tests__/1batch-version-cas.test.ts
block.service.ts blocks.controller.ts blocks.module.ts dto.ts
comments/4comments.controller.ts comments.module.ts comments.service.ts dto.ts
databases/9
__tests__/3normalize-select-options.test.ts option-id-canonicalization.test.ts record-open-query-shape.test.ts
database.service.ts databases.controller.ts databases.module.ts dto.ts property-cache-schema.ts query.service.ts
docs/2docs.controller.ts docs.module.ts
files/10
__tests__/1quota.test.ts
dto.ts files.controller.ts files.module.ts files.service.ts quota.ts record.ts s3.ts uploads.controller.ts uploads.service.ts
forms/18debug.controller.ts form.dto.ts forms.controller.ts forms.module.ts forms.service.ts markdown.test.ts markdown.ts optional-auth.guard.ts public-forms.controller.ts public-forms.service.ts question.dto.ts questions.service.ts rate-limit.ts recaptcha.ts slug.ts submissions.controller.ts submissions.service.ts submit-schema.ts
health/3health.controller.ts health.module.ts health.service.ts
integrations/3integrations.controller.ts integrations.module.ts integrations.service.ts
internal/12
__tests__/2flush-query-shape.test.ts internal.endpoints.test.ts
ai-test-seam.controller.ts ai-test-seam.dto.ts ai-test-seam.service.ts internal.controller.ts internal.dto.ts internal.module.ts internal.service.ts test-seam.controller.ts test-seam.dto.ts test-seam.service.ts
notifications/3notifications.controller.ts notifications.module.ts notifications.service.ts
oauth/6
__tests__/1oauth.scopes.test.ts
oauth.controller.ts oauth.module.ts oauth.service.ts scopes.ts token-keys.ts
org/15audit.service.ts embed-preview.controller.ts guards.ts members.service.ts org-admin.controller.ts org-policy.service.ts org.module.ts overview.service.ts policy-effective.controller.ts policy.schema.ts policy.test.ts retention.service.ts totp.test.ts totp.ts two-factor.service.ts
orgs/5dto.ts orgs.controller.ts orgs.module.ts orgs.service.ts util.ts
pages/4dto.ts page.service.ts pages.controller.ts pages.module.ts
scim/15
__tests__/3email-mapping.test.ts etag.test.ts filters.test.ts
etag.ts filters.ts groups.service.ts schemas.ts scim-admin.controller.ts scim-admin.service.ts scim-auth.guard.ts scim-auth.service.ts scim-errors.ts scim.controller.ts scim.module.ts users.service.ts
search/4
__tests__/1search.service.test.ts
search.controller.ts search.module.ts search.service.ts
sessions/3sessions.controller.ts sessions.module.ts sessions.service.ts
share/3share.controller.ts share.module.ts share.service.ts
sso/16
__tests__/4enforcement.test.ts oidc.verify.test.ts provisioning.test.ts saml.validate.test.ts
enforcement.ts oidc.controller.ts oidc.service.ts oidc.ts provisioning.service.ts saml.controller.ts saml.ts schemas.ts sso-admin.controller.ts sso-admin.service.ts sso-secrets.ts sso.module.ts
teams/4dto.ts teams.controller.ts teams.module.ts teams.service.ts
users/4dto.ts users.controller.ts users.module.ts users.service.ts
webhooks/3webhooks.controller.ts webhooks.module.ts webhooks.service.ts
workspaces/4dto.ts workspaces.controller.ts workspaces.module.ts workspaces.service.ts
types/1xmldom.d.ts
app.module.ts constants.ts main.ts
_probe_rawbody.cjs .env.example Dockerfile package.json README.md tsconfig.json vitest.config.ts
realtime/33
src/17auth.ts comments.ts config.ts event-source.ts http-store.ts index.ts metrics.ts notifications.ts page-updated-source.ts presence.ts prisma-store.ts protocol.ts rate-limit.ts room-key.ts rooms.ts server.ts update-log.ts
test/11auth.test.ts config.test.ts event-source.test.ts http-store.test.ts metrics-merge.test.ts page-updated-source.test.ts presence.test.ts protocol.test.ts rate-limit.test.ts rooms.test.ts task-0094-builders.test.ts
.env.example Dockerfile package.json README.md tsconfig.json
web/255
src/244
app/45
__tests__/1theme-tokens.test.ts
(app)/26
w/25
[workspace]/25
ask/1page.tsx
databases/1
[id]/1page.tsx
favorites/1page.tsx
files/1page.tsx
notifications/1page.tsx
page/4
[id]/4
[block]/1page.tsx
share/1page.tsx
layout.tsx page.tsx
search/1page.tsx
settings/10
appearance/1page.tsx
automations/3
[id]/1page.tsx
new/1page.tsx
page.tsx
billing/1page.tsx
developers/1page.tsx
members/1page.tsx
permissions/1page.tsx
teams/1page.tsx
page.tsx
shared/1page.tsx
templates/1page.tsx
trash/1page.tsx
layout.tsx page.tsx
layout.tsx
(auth)/4
login/1page.tsx
register/1page.tsx
reset-password/1page.tsx
layout.tsx
api/2
metrics/1route.ts
v1/1
health/1route.ts
f/1
[slug]/1page.tsx
health/1
ready/1route.ts
org/2
[orgId]/2
admin/2
integrations/1page.tsx
page.tsx
share/1
[id]/1page.tsx
error.tsx global-error.tsx globals.css layout.tsx not-found.tsx page.tsx providers.tsx
components/118
admin/10
org-admin/8ApiKeysTab.tsx AuditTab.tsx MembersTab.tsx OverviewTab.tsx PoliciesTab.tsx RetentionTab.tsx WebhooksTab.tsx WorkspacePicker.tsx
ScimCard.tsx SsoTabs.tsx
ai/6ai-panel.tsx ask-ai-submenu.tsx db-ai-dialog.tsx generate-page-dialog.tsx writing-actions-menu.tsx writing-diff.tsx
automations/5action-editor.tsx condition-editor.tsx lib.ts run-history.tsx trigger-editor.tsx
collaboration/6CursorLayer.tsx OfflineBanner.tsx PresenceBar.tsx README.md ReviewFailedDialog.tsx StatusChip.tsx
comments/3comment-panel.tsx comment-thread.tsx mention-input.tsx
database/27
__tests__/2cell-editor.test.tsx cell-renderer.test.tsx
AiExtractDialog.tsx AiFormulaDialog.tsx AiGenerateDialog.tsx board-view.tsx buttons-panel.tsx calendar-view.tsx cell-editor.tsx cell-renderer.tsx chart-view.tsx database-page-view.tsx database-toolbar.tsx database-view-renderer.tsx db-embedded.tsx filter-builder.tsx form-builder-view.tsx formula-editor.tsx gallery-view.tsx group-builder.tsx list-view.tsx property-editor.tsx record-header.tsx record-panel.tsx sort-builder.tsx table-view.tsx timeline-view.tsx
dialogs/7
__tests__/1move-to-dialog.test.tsx
create-dialog.tsx dialog.tsx file-permissions-dialog.tsx invite-dialog.tsx move-to-dialog.tsx share-dialog.tsx
editor/19
__tests__/3code-block-text.test.ts code-block.test.tsx expandable.test.tsx
block-card.tsx block-renderer.tsx block-save-queue.ts block-toolbar.tsx context-menu.tsx expandable.tsx history-popover.tsx inline-editor.tsx insert-dialog.tsx page-canvas.tsx page-spinner.tsx page-view.tsx selection-toolbar.tsx slash-menu.tsx template-dialog.tsx type-menu.tsx
files/4FileBlock.tsx FileBrowser.tsx FilePicker.tsx PreviewModal.tsx
form/4form-field.tsx form-renderer.tsx form-responses-view.tsx form-view.tsx
layout/8
__tests__/1page-tree-icon.test.tsx
command-palette.tsx factory-logo.tsx page-tree-node.tsx sidebar.tsx theme-provider.tsx topbar.tsx workspace-shell.tsx
mentions/3
__tests__/1mention-model.test.ts
mention-model.ts MentionPopup.tsx
search/3ask-ai-search.tsx results-list.tsx search-dialog.tsx
settings/10
api-keys/4ApiKeyCreateDialog.tsx ApiKeyRevealDialog.tsx ApiKeyTable.tsx ScopesBadge.tsx
webhooks/5CurlExamples.tsx DeliveryInspector.tsx EventExplorer.tsx OverviewTab.tsx WebhooksTab.tsx
settings-shell.tsx
ui/3confirm-dialog.tsx form.tsx toaster.tsx
hooks/21
__tests__/4realtime-frame-handler.test.ts use-blocks.test.ts use-database-options.test.ts use-workspace.test.tsx
realtime-frame-handler.ts use-ai-stream.ts use-auth.ts use-blocks.ts use-database.ts use-db-ai-stream.ts use-forms.ts use-members.ts use-mention-sources.ts use-notifications.ts use-offline-status.ts use-pages.ts use-presence-announcer.ts use-presence-toasts.ts use-presence.ts use-realtime.ts use-workspace.ts
lib/50
__tests__/21ai-database.test.ts ai-generate.test.ts ai-sse.test.ts ai-writing.test.ts api-keys.test.ts api-members.test.ts auth-refresh.test.ts auth-store.test.ts batch-queue-drop.test.ts block-content.test.ts clipboard-import.test.ts code-highlight.test.ts offline-status.test.ts presence-announcer.test.ts presence-color.test.ts presence-cursor.test.ts presence-emitter.test.ts realtime-url.test.ts search.test.ts utils.test.ts writing-diff.test.ts
files/7
__tests__/2picker.test.ts upload.test.ts
api.ts picker.ts upload-store.ts upload.ts use-file-uploads.ts
ai-database.ts ai.ts api-keys.ts api.ts auth-store.ts batch-queue.ts block-content.ts clipboard-import.ts code-highlight.ts constants.ts offline-status.ts org-admin.ts presence-announcer.ts presence-color.ts presence-cursor.ts presence-editor-views.ts presence-emitter.ts query-client.ts realtime.ts search.ts types.ts utils.ts
stores/8
__tests__/1block-patch-store.test.ts
block-patch-store.ts comment-pill-store.ts database-store.ts editor-store.ts offlineQueue.ts presence-store.ts ui-store.ts
instrumentation.ts middleware.ts
.env.example Dockerfile next-env.d.ts next.config.mjs package.json postcss.config.mjs README.md tailwind.config.ts tsconfig.json tsconfig.tsbuildinfo vitest.config.ts
worker/92
src/87
__tests__/13ai-embedding.test.ts ai-request.test.ts ai-usage-budget.test.ts audit-export.test.ts email-decision.test.ts encrypt.test.ts health-search-index-lag.test.ts mime.test.ts retention.test.ts s3-sign.test.ts search-index.test.ts smtp.test.ts webhook-sign.test.ts
health/1server.ts
lib/12
__tests__/1clamav.test.ts
clamav.ts encrypt.ts job-otel.ts mime.ts notify.ts prisma.ts redis-stream.ts redis.ts s3.ts sharp.ts smtp.ts
processors/56
automations/28
__tests__/3condition-evaluator.spec.ts executors.spec.ts run-pipeline.spec.ts
executors/17assign-user.ts call-integration.ts change-status.ts classify.ts create-notification.ts create-page.ts email-cap.ts helpers.ts integration-registry.ts permission.ts record-write.ts registry.ts run-ai-action.ts send-email.ts send-webhook.ts types.ts update-record.ts
condition-evaluator.ts dead-letter.ts log.ts matcher.ts pipeline.ts run-state.ts schedule.ts watchdog.ts
files/15
__tests__/4errors.test.ts scan-gate.test.ts status.test.ts temp.test.ts
steps/4finalize.ts metadata.ts scan.ts thumbnails.ts
cleanup.ts errors.ts generateThumbs.ts processor.ts status.ts temp.ts types.ts
search-index/4builders.ts grants.ts index.ts processor.ts
ai-embedding.ts ai.processor.ts audit-export.ts automations.processor.ts email-decision.processor.ts email.processor.ts maintenance.processor.ts retention.ts webhooks.processor.ts
config.ts events.ts index.ts logger.ts queues.ts
.env.example Dockerfile package.json README.md tsconfig.json
docs/73
api/17ai.md authentication.md automations.md blocks.md comments.md databases.md files.md forms.md openapi.yaml org-admin.md pages.md scim.md search.md sso.md versioning.md webhooks.md workspaces.md
architecture/10ai-architecture.md automation.md backend-architecture.md database-architecture.md frontend-architecture.md realtime-architecture.md search-architecture.md security-architecture.md storage.md system-architecture.md
database/2database-architecture.md redis-keys.md
development/8admin-guide.md coding-standards.md deployment.md development-guide.md files-pipeline.md perf-report.md performance.md testing.md
product/4functional-requirements.md non-functional-requirements.md product-requirements.md ux-requirements.md
requirements/1requirements-matrix.md
security/5audit-report.md files.md forms.md license-allowlist.md security-architecture.md
tasks/16phase-00-foundation.md phase-01-authentication.md phase-02-workspace.md phase-03-pages.md phase-04-editor.md phase-05-databases.md phase-06-relations.md phase-07-collaboration.md phase-08-search.md phase-09-files.md phase-10-forms.md phase-11-automation.md phase-12-ai.md phase-13-api.md phase-14-enterprise.md phase-15-production.md
ui/9ai.md automations.md design-system.md developers.md files.md forms.md org-admin.md scim.md sso.md
support-matrix.md
infrastructure/71
caddy/1Caddyfile
docker/6
init/101-extensions.sql
opensearch/1init-indices.json
.env.docker docker-compose.yml opensearch-init.sh README.md
kubernetes/40
observability/20
alertmanager/1alertmanager.yaml
grafana/8
dashboards/6ai.json api-overview.json infra.json realtime.json search.json workers-queues.json
provisioning/2
dashboards/1dashboards.yaml
datasources/1datasource.yaml
prometheus/3alerts.yaml recording-rules.yaml scrape.yaml
scripts/1sync-sources.mjs
alertmanager.yaml grafana.yaml kustomization.yaml namespace.yaml node-exporter.yaml otel-collector.yaml prometheus.yaml
postgres/7configmap.yaml cronjob-backup.yaml cronjob-opensearch-snapshot.yaml pgbouncer.yaml replica.yaml statefulset.yaml walg-iam-policy.yaml
api.yaml configmap.yaml ingress.yaml kustomization.yaml namespace.yaml networkpolicy.yaml pdb.yaml README.md realtime.yaml redis.yaml secret.example.yaml web.yaml worker.yaml
nginx/2nginx.conf README.md
observability/14
alertmanager/1alertmanager.yaml
grafana/8
dashboards/6ai.json api-overview.json infra.json realtime.json search.json workers-queues.json
provisioning/2
dashboards/1dashboards.yaml
datasources/1datasource.yaml
prometheus/3alerts.yaml recording-rules.yaml scrape.yaml
scripts/1dashboard-completeness.mjs
README.md
terraform/8compute.tf data.tf main.tf network.tf outputs.tf README.md security.tf variables.tf
packages/289
ai/24
src/20
providers/7anthropic.ts google.ts http.ts index.ts openai-compatible.ts rag.test.ts writing.test.ts
schemas/2database.ts generate.ts
adapters.test.ts config.test.ts config.ts gateway.test.ts gateway.ts index.ts tools.test.ts tools.ts types.ts usage.test.ts usage.ts
package.json README.md tsconfig.json vitest.config.ts
auth/11
src/7index.ts passwords.test.ts passwords.ts sessions.test.ts sessions.ts tokens.test.ts tokens.ts
package.json README.md tsconfig.json vitest.config.ts
collaboration/17
src/13awareness.ts codec.test.ts codec.ts index.ts lww.test.ts lww.ts mapping.ts offline.ts outbox.test.ts outbox.ts provider.test.ts provider.ts types.ts
package.json README.md tsconfig.json vitest.config.ts
config/7
src/4eslint.base.js index.ts prettier.base.json tsconfig.base.json
package.json README.md tsconfig.json
database-client/5
src/2index.test.ts index.ts
package.json README.md tsconfig.json
database-engine/33
src/29
filter/2filter.test.ts index.ts
formula/8evaluator.ts formula.test.ts functions.ts index.ts lexer.ts parser.ts types.ts validate.ts
query/6group.ts index.ts paginate.ts pivot.ts query.test.ts sort.ts
relations/2index.ts relations.test.ts
rollups/2index.ts rollups.test.ts
values/5dates.ts index.ts registry.ts types.ts values.test.ts
views/3buttons.ts index.ts views.test.ts
index.ts
package.json README.md tsconfig.json vitest.config.ts
editor/25
src/21
marks/1highlight.ts
nodes/2equation.ts mention.ts
autosave.test.ts autosave.ts clipboard.test.ts clipboard.ts codec.test.ts codec.ts context-menu.test.ts context-menu.ts diff.test.ts diff.ts factory.ts history.test.ts history.ts index.ts positions.ts slash.test.ts slash.ts types.ts
package.json README.md tsconfig.json vitest.config.ts
observability/20
src/16
__tests__/8db-redis-metrics.test.ts metrics.test.ts otel.test.ts pino-otel.test.ts prometheus.test.ts resource.test.ts scrubber.test.ts traceparent.test.ts
index.ts metrics.ts otel.ts pino-otel.ts prometheus.ts resource.ts scrubber.ts traceparent.ts
package.json README.md tsconfig.json vitest.config.ts
permissions/11
src/7index.ts levels.test.ts levels.ts resolve.test.ts resolve.ts rules.test.ts rules.ts
package.json README.md tsconfig.json vitest.config.ts
search/22
src/18chunking.test.ts chunking.ts client.test.ts client.ts embeddings.test.ts embeddings.ts hybrid.test.ts hybrid.ts index.ts indexer.test.ts indexer.ts mapping.test.ts mapping.ts queries.test.ts queries.ts rrf.test.ts rrf.ts types.ts
package.json README.md tsconfig.json vitest.config.ts
shared/61
src/57
dto/17ai.dto.ts auth.dto.test.ts auth.dto.ts block.dto.ts browser-safety.test.ts comment.dto.ts database.dto.test.ts database.dto.ts file.dto.ts formula-ast.ts index.ts notification.dto.ts page.dto.ts search.dto.ts share.dto.ts webhook.dto.ts workspace.dto.ts
events/8audit-catalog.test.ts audit-catalog.ts audit-csv.test.ts audit-csv.ts audit-scope.test.ts audit-scope.ts catalog.test.ts catalog.ts
realtime/6comment-events.ts frames.test.ts frames.ts notification-policy.ts notification-prefs.ts task-0094.test.ts
automation.test.ts automation.ts constants.ts crypto.test.ts crypto.ts env.ts errors.ts events.test.ts events.ts forms.test.ts forms.ts index.ts markdown.test.ts markdown.ts mentions.test.ts mentions.ts net.test.ts net.ts positions.test.ts positions.ts presence.test.ts presence.ts security-headers.ts webhook-delivery.test.ts webhook-delivery.ts webhook-events.ts
package.json README.md tsconfig.json vitest.config.ts
storage/16
src/12client.test.ts client.ts index.ts keys.test.ts keys.ts mime.test.ts mime.ts presign.test.ts presign.ts thumbnails.test.ts thumbnails.ts types.ts
package.json README.md tsconfig.json vitest.config.ts
ui/37
src/33
components/19avatar.tsx badge.tsx button.tsx checkbox.tsx command.tsx context-menu.tsx dialog.tsx dropdown-menu.tsx empty-state.tsx index.ts popover.tsx separator.tsx skeleton.tsx slider.tsx spinner.tsx switch.tsx tabs.tsx toast.tsx tooltip.tsx
color.ts command-filter.test.ts command-filter.ts focus.test.ts focus.ts formatters.test.ts formatters.ts index.ts theme.test.ts theme.ts toast-store.test.ts toast-store.ts tokens.test.ts tokens.ts
package.json README.md tsconfig.json vitest.config.ts
prisma/16
migrations/13
20260927000000_init/1migration.sql
20260928000000_search_documents_content_hash/1migration.sql
20260929000000_workspace_usage_storage_bytes/1migration.sql
20260930000000_form_submitted_notification_type/1migration.sql
20261001000000_ai_phase12/1migration.sql
20261002000000_webhooks_secret_encrypted_dlq/1migration.sql
20261002111436_webhook_delivery_latency/1migration.sql
20261002120000_org_admin_2fa_retention_unique/1migration.sql
20261002215124_audit_export/1migration.sql
20261003210000_perf_indexes_hot_paths/1migration.sql
20261004004500_perf_indexes_hot_paths_2/1migration.sql
migration_lock.toml README.md
schema.prisma seed.ts verify.ts
scripts/7backup-health.ts docs-completeness.mjs generate-openapi.mjs minio-init.ts opensearch-reindex.ts storage-orphans.ts verify-clean-clone.sh
tests/169
e2e/63
.auth/1user.json
fixtures/7
files/6clip.mp4 clip.wav clip.webm hero-1400.png note.docx note.txt
realtime.ts
mocks/2oidc-issuer.ts saml-idp.ts
playwright-report/3
data/2a6557bae9c2714a658968d4eb8534195c08ebda8.png e3092d07d00a16063e46385c02a559a9054fa847.webm
index.html
reports/1files-security.json
specs/34ai-database.spec.ts ai-generate.spec.ts ai-rag.spec.ts ai-security.spec.ts ai-writing.spec.ts ai.spec.ts api-keys.spec.ts appearance-theme.spec.ts auth.spec.ts automation.spec.ts collab-two-tab.spec.ts comments.spec.ts databases.spec.ts default-workspace-alias.spec.ts developers.spec.ts editor.spec.ts files.spec.ts final-flow.spec.ts forms.spec.ts oauth.spec.ts org-admin.spec.ts pages.spec.ts performance.spec.ts presence-cursors.spec.ts qa-paste-toggle.spec.ts realtime.spec.ts scim.spec.ts search-index-lag.spec.ts search.spec.ts sharing.spec.ts sso.spec.ts task-0094-comments-notifications.spec.ts webhooks.spec.ts workspace.spec.ts
test-results-final-flow/3
final-flow-Release-v1-0-fi-6c06b-w-state-carries-sequential--chromium-desktop/2test-failed-1.png trace.zip
.last-run.json
utils/4api.ts dnd.ts search-lag.ts wait.ts
.gitignore fixtures.ts global-setup.ts package.json playwright.config.ts playwright.final-flow.config.ts README.md tsconfig.json
fixtures/1
files/1make-sparse.ts
integration/60
ai-capability/2ai-app.capability.test.ts gateway.capability.test.ts
drill/2seed-drill.mjs verify-restore.mjs
fixtures/5
files/5clip.mp4 clip.wav doc.pdf hero-1400.png note.txt
helpers/3api.ts containers.ts seed.ts
realtime/11control-channel.test.ts convergence.test.ts flush-rebase-http.test.ts handshake.test.ts heartbeat-limits.test.ts lifecycle.test.ts presence.test.ts rebase.test.ts resume.test.ts rt-helpers.ts task-0094-fanout.test.ts
ai-chat.integration.test.ts ai-database.integration.test.ts ai-generate.integration.test.ts ai-rag.integration.test.ts ai-writing.integration.test.ts api-keys.integration.test.ts audit-completeness.integration.test.ts audit-export-s3.integration.test.ts auth.integration.test.ts automation-pipeline.integration.test.ts automations.integration.test.ts blocks.integration.test.ts cache-invalidation.integration.test.ts comments.integration.test.ts databases.integration.test.ts files-lifecycle.integration.test.ts files-pipeline.integration.test.ts files-security.integration.test.ts files.integration.test.ts forms-responses.integration.test.ts forms.integration.test.ts oauth.integration.test.ts openapi.contract.test.ts org-admin.integration.test.ts package.json pages.integration.test.ts permissions.integration.test.ts README.md replica-routing.integration.test.ts retention-engine.integration.test.ts scim.integration.test.ts search.integration.test.ts sso.integration.test.ts tsconfig.json vitest.config.ts webhooks.integration.test.ts workspace.integration.test.ts
performance/28
fixtures/1search-100k.ts
helpers/2seed-100k.mjs seed-1k-load.mjs
reports/7api-load-smoke.json database-load-smoke.json editor-local.json realtime-load.json search-full.json search-last.json search-reduced.json
api-load.js api.js archive.tar database-load.js database.js editor-local.mjs extract-100k-env.mjs package.json README.md realtime-1k.js realtime-load.js realtime.js run-realtime-load.sh search-search.k6.js search-summary.json seed-100k.mjs threshold-breach-demo.js verify-zero-op-loss.mjs
security/16
helpers/1app.ts
audit-report.test.ts auth-paths.test.ts deps.test.ts formula-fuzz.test.ts gitleaks-config.test.ts headers.test.ts images.test.ts oracle.ts package.json permission-fuzz.test.ts rate-limits.test.ts README.md tsconfig.json upload-abuse.test.ts vitest.config.ts
README.md
.dockerignore .env .env.bak-task0125 .env.example .eslintrc.json .gitignore .npmrc .prettierignore .prettierrc.json AGENTS.md ARCHITECTURE.md CHANGELOG.md CONTRIBUTING.md gitleaks.toml LICENSE package.json pnpm-lock.yaml pnpm-workspace.yaml PRODUCT-SPEC.md README.md ROADMAP.md SECURITY.md tsconfig.json turbo.json
phase-05-databases.mddocs/tasks/phase-05-databases.md← tasks158,703 B← Back to the app

Phase 5 — Database Engine — Task Specifications (TASK-0063 … TASK-0080)

Purpose. Task spec sheet for Phase 5 of ROADMAP.md: turn the existing DatabaseModule (databases + filter-builder scaffolding), the Prisma database models (databases, database_properties — 22 PropertyType values —, database_views — 9 ViewType values —, database_records (record = page, 1:1 via pageId), record_properties EAV), and packages/database-engine into the full database engine of PRODUCT-SPEC §9, docs/product/functional-requirements.md §5, and docs/architecture/frontend-architecture.md §6 (view renderer architecture, cell renderers, query pipeline).

Phase exit criteria (verbatim from ROADMAP.md, Phase 5):

Task table

ID Title Estimate
TASK-0063 Databases CRUD + DATABASE block in pages (slash /database lands here) L
TASK-0064 Property system: 22 types, value codecs, property CRUD UI L
TASK-0065 Records: record = page (create/update/archive/duplicate, record page) L
TASK-0066 Table view: virtualized grid, inline editing, column mgmt, bulk ops L
TASK-0067 Filter engine: nested AND/OR/NOT, operator matrix, push-down, builder UI L
TASK-0068 Sorting + grouping (multi-key, collapsible sections, group order) M
TASK-0069 View management (9 views, per-view config, view tabs UI) M
TASK-0070 Board view (kanban, drag card → property update) L
TASK-0071 Calendar view (month/week, date mapping, day-click create) M
TASK-0072 List + Gallery views M
TASK-0073 Timeline view (date-range bars, month axis) M
TASK-0074 Chart view base (bar/line/area/pie/donut/number, SVG) L
TASK-0075 Dashboard view base (widget grid) M
TASK-0076 Database AI hooks (documented stubs for Phase 12) S
TASK-0077 Search-ready records (indexable body on record save) M
TASK-0078 E2E database suite (tests/e2e/databases.spec.ts) — core scenarios L
TASK-0079 100k-record seed, perf probes, engine unit gate (CI) M
TASK-0080 Phase-5 exit verification (checklist evidence, conflict log) S

Phase Completion Checklist (evidence recorded by TASK-0080)

Recorded notes (conflicts/adjustments, per AGENTS.md):

  1. The PropertyType enum in prisma/schema.prisma has 24 values (TITLE … UNIQUE_ID) and is authoritative; docs/api/databases.md §5.1 documents exactly those 24 wire types. docs/product/product-requirements.md PR-058 and this phase therefore count "24 property types" = the enum. (Earlier drafts counted 22; RICH_TEXT and DATE_RANGE were added to the enum to match the value codec set — resolved, no longer a conflict.)
  2. The 10th view type FORM is in the ViewType enum and the schema, but form building is Phase 10 (PRODUCT-SPEC §11, PR-069). Phase 5 ships 8 view types client-side (TABLE, LIST, BOARD, GALLERY, CALENDAR, TIMELINE, CHART, DASHBOARD); the FORM view row exists in the view-type registry as enabled: false ("Phase 10") so view creation lists all 9 without a working form.
  3. Relation/Rollup/Formula/Button value editing is Phase 6; Phase 5 must still accept these property types in the schema (so a database created in Phase 5 can gain relations in Phase 6 without a schema migration), render read-only placeholder cells, and keep the query engine from attempting to compute them.
  4. The phase brief lists 17 topics but fixes the range at 18 tasks (TASK-0063…0080). Resolution: the final topic ("E2E database suite + exit verification") is split into TASK-0078 (core E2E scenarios), TASK-0079 (100k seed + perf probes + structural unit gate), TASK-0080 (phase-exit verification + Phase-6 handoff). All 17 topics remain covered, one per task, with the close-out work split across the last three.

TASK-0063

Title

Databases CRUD + DATABASE block in pages

Objective

Complete database creation/read/update/delete with the embedded DATABASE block: POST /v1/workspaces/:wid/databases creates the Database row, its default TITLE property, an initial view, and (when pageId is given) the DATABASE block — in one transaction — so the Phase-4 slash /database command (TASK-0054) lands a fully functional, empty database inline in a page.

Background

Phase 4 shipped the DATABASE block node (placeholder renderer) and the slash property picker that calls the create endpoint; the DatabaseModule scaffolding exists (controllers + filter-builder). databases/database_properties/database_views models are defined in prisma/schema.prisma. Database.pageId is a plain ref to the embedding page (database-architecture §1.3). A database is addressable both by GET /v1/databases/:id and by its block; the block is the view, the database row is the source of truth (a linked_database block in Phase 6+ re-uses the same database — views are per-database, not per-block, per functional-requirements §5.3 view rules). Icon/title: Database.icon (emoji or file id — file id resolves through Phase-9 file rendering; Phase 5 accepts emoji + file-id string), Database.title.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0064

Title

Property system: 24 property types — value codecs, API CRUD, property editor UI

Objective

Implement the full typed property system: all 22 PropertyType values with per-type value codecs in packages/database-engine/src/values, property add/rename/reorder/ hide/delete APIs (exactly one TITLE, PR-059), and the property editor UI in the database header (add property dialog with type picker + per-type config forms, column visibility toggles per view).

Background

functional-requirements §5.1 fixes, per type: config JSON (select/multi-select/status options[{id,name,color}], number format/precision/prefix/suffix/currency, person multiple, files maxCount, relation {relationId, multiple}, rollup {rollupId}, formula {formulaId}, button {buttonId}, unique id format/prefix), the record_properties.value JSON shape (select option ids not names, dates ISO 8601, ranges {start,end}, person id(s), files id arrays), and the editor widget. PR-074: add/rename/reorder (fractional position)/hide/delete; delete keeps values until records are gone (soft deletedAt); type change only with lossless conversion (Phase 5: allow text→rich_text, number→text; everything else → error, conversion pipeline lands with Phase-6 computed-property work). Phase 6 owns the semantics of RELATION/ROLLUP/FORMULA/BUTTON values; Phase 5 owns their schema + config UI + read-only placeholder cells (header note 3).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0065

Title

Records: record = page (create/update/archive/duplicate + record page layout)

Objective

Implement records as first-class entities that are 1:1 with pages (ADR-006): record create materializes a Page row + DatabaseRecord row + record_properties rows in one transaction; record page shows the properties panel (left) + block content (right); record update (per-property value writes with per-type validation), archive, duplicate; record positions in views via fractional position.

Background

ADR-006 (database-architecture §2.3): creation order pages first (id = record's pageId), then database_records, then record_properties — one transaction; the record inherits page permissions; trash via pages.trashedAt (page-level) is distinct from record.archivedAt (database-level archive, hidden from default views, restorable); versions/comments/sharing work unchanged (page features). Value writes go through PATCH /v1/databases/:id/records/:rid {properties: {propertyId: value}} — server validates each value against the property's codec (TASK-0064), auto properties are server-managed (lastEditedBy/Time updated on any change; createdBy/Time set at creation; client-sent auto values ignored), relation/rollup/formula/button values are rejected in Phase 5 (422 computed_property_readonly — Phase 6 owns them). DatabaseRecord.position = row order in table/board (fractional).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0066

Title

Table view: virtualized grid, per-type inline editing, column resize/reorder, bulk select

Objective

Implement the TABLE view — the workhorse: a virtualized grid (100k+ records, @tanstack/react-virtual rows + column virtualization > 50 columns, sticky title column), per-property-type inline cell editing (optimistic with rollback), column width drag (min 80 px) + reorder, row hover actions, multi-select with bulk toolbar (archive, duplicate, delete), sort-by-column-click, density toggle, and the POST /v1/databases/:id/query pipeline that feeds every view.

Background

frontend-architecture §6 is binding: one query pipeline for all views — view config (filter tree, sort[], group[], pageSize, visible properties, Zod-validated from @factory/shared) → POST /v1/databases/:id/query (server applies filter→sort→group→paginate in packages/database-engine + EAV pivot in one indexed round-trip + relation counts later) → RecordsPageDto {records: RecordWithValues[], cursor, total, groups?} → renderer. Table specifics (functional-requirements §5.3): virtualized 100k+, sticky title + first visible column, inline editing, row hover actions (open page, duplicate, archive, comment), multi-select shift-click + bulk toolbar, row height from density, column width drag min 80 px, "show more columns" chevron. PR-062 P0. Server-side: the query engine's sort/group/filter are TASK-0067/0068 — this task builds the query endpoint skeleton (position-ordered cursor pagination + EAV pivot) that those tasks extend, so the table works from day one of Phase 5.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0067

Title

Filter engine: nested AND/OR/NOT tree, operator matrix, server push-down, filter builder UI

Objective

Implement the filter engine end-to-end: the nested AND/OR/NOT filter tree with the full per-type operator matrix in packages/database-engine/src/filter (pure, shared client+server), server-side push-down of the common cases into the Prisma WHERE clause via the existing apps/api filter-builder, client-side evaluation for the rest (same code path), and the filter builder dialog UI (per-view + "Add filter" drawer).

Background

functional-requirements §5.4 (PR-071 P0): tree {op: "and"|"or"|"not", children: [Condition|Group]}, Condition = {propertyId, operator, value}; operators by type — text: is, isNot, contains, doesNotContain, startsWith, endsWith, isEmpty, isNotEmpty; number: is, isNot, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual, isBetween, isEmpty; date: is, isBefore, isAfter, isOnOrAfter, isOnOrBefore, isWithin, isRelative ("this week"), isEmpty; select/status/multi: is, isNot, contains, doesNotContain; person: is, isNot, is ("me"); checkbox: isChecked, isUnchecked; relation: contains, doesNotContain, isEmpty (Phase-6); file: hasFiles, hasNoFiles. Special value tokens: "me" (current user), "today", "now" (resolved server-side per actor/timezone). "Evaluation is server-side in packages/database-engine (shared with the client for optimistic UI) — same code path, property-tested against golden datasets." The query endpoint's filter slot (TASK-0066 R1) is filled here.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0068

Title

Sorting + grouping (multi-key sort, collapsible group sections, group order by value)

Objective

Implement multi-key sorting and multi-level grouping in the engine (applied after filter, per the pipeline order) and in the UI: sort manager (add/remove/reorder keys, null ordering per key), group manager (1–3 levels, collapsible sections with counts, group order by value/property), consumed by the table (group sections), board (group[0] = columns), and all other views.

Background

functional-requirements §5.4 (PR-072/073 P0): sort applied after filter — multi-key [{propertyId, direction, nullOrder? (default nulls-last)}], stable sort with record position as the final tiebreaker; group applied after sort — multi-level (≤ 3), collapsible, group headers show counts, "boards use group[0] as columns". database_views.sort/group JSONB columns exist. Values sort by type semantics (number numeric, date chronological, select/status by option order from config, text locale-aware, person by name, checkbox false-first, missing values per nullOrder).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0069

Title

View management: create/rename/delete/reorder views, per-view config, view tabs UI

Objective

Complete view lifecycle management for all 9 view types: create (type picker, per-type config defaults), rename, delete (last view protected), reorder (fractional position), and per-view configuration persistence (visible properties, column widths, card layout, color, density, page size, plus filter/sort/group from 0067/0068) in database_views.config JSONB — with the view tabs bar as the single UI.

Background

frontend-architecture §6 + functional-requirements §5.3: "views are per-database, not per-page (a linked_database block re-uses the same views); view creation via '+' with type picker; view rename/duplicate/delete (last view cannot be deleted); per-view settings persist independently (changing one view's filter never affects others)." Each view keeps name, type, position, config, filter, sort, group, pageSize (model). config shape (Zod ViewConfigSchema per type): visiblePropertyIds[] (order = display order of visible columns, distinct from the global property position — visible list defines order in this view), columnWidths{pid: px}, cardLayout (board: {showCover, properties[] (≤2), showAvatar}; gallery: {cover: bool, size: 'S'|'M'|'L', properties[] (≤3)}; list: {properties[] (≤2)}), color (accent token for the view tab/card), density (table: compact/default/relaxed; board: compact/comfortable), pageSize (10/25/50/100/200, default 50 for non-table views), chartId? (chart view), dashboardId? (dashboard view), groupGranularity (date views), wipLimit? (board, TASK-0070).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0070

Title

Board view (kanban: group columns, cards, dnd-kit card drag → property update)

Objective

Implement the BOARD view: kanban columns from the single group property (default: first STATUS/SELECT; picker when none), cards showing title + configured properties + avatar, dnd-kit card drag between columns that updates the group property (one API call), per-column "+" create (pre-set option), WIP display, collapse empty columns, and horizontal + per-column virtualization.

Background

functional-requirements §5.3 BOARD: "Exactly one group property (default: first STATUS/SELECT; picker if none); columns = option values in option order; ungrouped records → 'Empty' column; cards show title + configured properties; card click opens page; drag card to column = status update (one API call); '+' per column creates record pre-set to that option." PR-064 P0. View config: cardLayout {showCover, properties[] ≤ 2, showAvatar}, density, wipLimit?, color. dnd-kit per the Phase-4 pattern (frontend-architecture §3.5 — board groups as containers). The card drag is the database-side analog of PR-053 (Phase 5, this task).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0071

Title

Calendar view (month grid + week strip, date mapping, day-click create, navigate, today)

Objective

Implement the CALENDAR view: month grid + week strip, record placement by a DATE or DATE_RANGE property (start/end for ranges), multi-day spans, day click → create record with the date pre-filled, month/week/day navigation, today highlight, and month-level windowing.

Background

functional-requirements §5.3 CALENDAR: "Day/week/month switch; source property = first DATE or DATE_RANGE (picker); month grid with record dots/mini-cards; week/day list; click day → new-record dialog (date pre-filled); multi-day ranges render as spans; 'today' highlighted." PR-065 P1. View config: sourcePropertyId (a DATE/DATE_RANGE property — the "choose a property" first-run state when the db has none), mode: 'month'|'week'|'day', pageSize-irrelevant (the calendar fetches the visible window ± 1 month of records — a range query, not a cursor page). Query support: the endpoint gains a dateWindow {from, to} convenience filter (server-side: push-down to the source property's date columns — reuses TASK-0067 push-down for date between).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0072

Title

List + Gallery views

Objective

Implement the LIST view (compact rows: icon, title, 2–3 properties, one per row, row virtualization) and the GALLERY view (card grid: cover, icon, title, first text property; lightbox-ish detail popover; grid virtualization; drag reorder within view), completing the simple remaining view types.

Background

functional-requirements §5.3: LIST — "Compact rows: title + up to 2 secondary properties; row click opens page; same filter/sort/group as table; no inline editing except quick actions" (PR-063 P1). GALLERY — "Card grid (cover = record cover, fallback icon); card layout config: cover on/off, size (S/M/L), property rows (≤ 3); click opens page; drag reorder within view" (PR-066 P1). Both consume the standard query pipeline (TASK-0066) + view settings (TASK-0069: cardLayout.properties ≤ 2 for list / ≤ 3 + cover + size for gallery). Gallery drag reorder = record position PATCH (same mechanism as board within-column reorder, TASK-0070 R4) — but only when the view is not grouped/sorted by a property (reorder with an active sort = no-op with a tooltip "Clear sort to reorder" — documented).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0073

Title

Timeline view (date-range bars on a month-scale axis, horizontal scroll, click-to-open)

Objective

Implement the TIMELINE view: Gantt-style bars from DATE_RANGE (or DATE) properties on a horizontal month-scale time axis with month/week ticks, horizontal scroll + zoom (day/week/month), overlap handling, bar click → open record, drag bar to move / resize edges to update the date property, and a today line.

Background

functional-requirements §5.3 TIMELINE: "Source = DATE_RANGE (or DATE + optional duration property); horizontal time axis with month/week ticks; zoom (day/week/ month/quarter); bars draggable to move (updates property); resize edges (updates end); today line; swimlanes per group property." PR-066-adjacent P1. Phase 5 scope: zoom levels day/week/month (quarter = month + 3 grouping — included via the same math), swimlanes = group by (TASK-0068, optional — "swimlanes per group property" = the view settings group picker, one level), duration-property support for DATE sources is skipped (DATE_RANGE only + DATE renders a zero-width bar on its day — documented). The view needs a range query (TASK-0071's explicit date-window filter pattern).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0074

Title

Chart view base (bar/line/area/pie/donut/number aggregations, SVG renderers)

Objective

Implement the CHART view type: chart creation (bar, line, area, pie, donut, number) over a database's number properties with group-by + filter + aggregation config, server-side aggregation in the query pipeline, and pure-SVG renderers in packages/database-engine/src/views (no chart library — the spec's renderer location is explicit), powering the CHART view and the chart block (Phase-4 block type, Phase-5 renderer swap).

Background

PRODUCT-SPEC §12: "Charts: bar, line, area, pie, donut, number. Config: x-axis, y-axis, group, filter, aggregation, color, legend." The charts table exists (chartType, config Json — x/y axis property, group by, aggregation, colors, legend; filter Json?; position). frontend-architecture §6 CHART row: "data is server-aggregated (query returns aggregate buckets, not rows)". Aggregations: COUNT/SUM/AVG/MIN/MAX on NUMBER properties (PERCENT/UNIQUE are Phase-6 rollup-domain — the chart base supports the 5); group-by: any property (select/status → category buckets, date → time buckets day/week/month, number/text → value buckets (text: top 10 + "Other"), person → user buckets); the CHART view (TASK-0069 registry) embeds one chart per database view instance (the view's config.chartId) — creating a CHART view creates a default chart (first number property, COUNT, grouped by first select/status if any). The chart block (in a page) renders the same renderer with content.chartId (the Phase-4 chart node's placeholder swaps to the live renderer — the block's chart must belong to the page's workspace, server-checked on render).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0075

Title

Dashboard view base (widget grid: embed views/charts/text/number widgets, resize + reorder)

Objective

Implement the DASHBOARD view type: a widget grid composing widgets — table, board, chart, number, calendar, timeline, text, linked-database — from DashboardWidget rows with sourceRef, dnd-kit grid resize + reorder, per-widget filter override, and the DASHBOARD view mounting the grid (view config.dashboardId).

Background

PRODUCT-SPEC §12: "Dashboards compose widgets: table, board, chart, number, calendar, timeline, text, linked database — resizable, draggable, configurable, filterable." The dashboards + dashboard_widgets tables exist (widgetType, sourceRef Json? {type: "database"|"chart"|"view", id}, layout Json — x/y/w/h grid units + position, filter Json?, position). frontend-architecture §6 DASHBOARD row: "widget grid from DashboardWidget.layout; each widget embeds a table/board/chart/number/calendar/ timeline/text/linked-database source; drag/resize with dnd-kit (grid mode); each embedded widget is virtualized internally." dashboard-architecture §1.5: "Widget data is fetched by the client through the normal query endpoints… the server never renders widget pixels." Scope note: Dashboard is workspace-level (workspaceId); a DASHBOARD view on a database references a dashboard via config.dashboardId — creating a DASHBOARD view creates a dashboard bound to that database's workspace (name = "Dashboard of <db>"). The FORM widget type in dashboard_widgets? — the enum comment lists 8 types (table|board|chart|number|calendar|timeline|text| linked_database) — no form widget (forms are Phase 10; a form widget lands there).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0076

Title

Database AI hooks (documented stubs for Phase 12)

Objective

Reserve the database AI surface: POST /v1/databases/:id/ai/generate (generate a database from a natural-language description) and POST /v1/databases/:id/ai/formula (generate a formula expression) as documented, permission-checked stubs returning 501 NOT_IMPLEMENTED with a stable envelope, plus the UI affordances (disabled with "Phase 12" hints) so Phase 12 only swaps the handler implementations and flips the feature flag — zero UI rework.

Background

PRODUCT-SPEC §21: "Database AI (generate database, extract data, generate formula)"; backend-architecture §8 reserves NOT_IMPLEMENTED (501) for "endpoint not available on this plan/phase". Phase 12 owns the AI gateway + structured tool calls (its task file phase-12-ai.md implements the real handlers against these exact routes and envelope shapes — the contract is fixed here). Scope is deliberately minimal: the routes, the DTO schemas, the permission checks, the flag, and the UI hints. No worker, no provider, no token budget in Phase 5 (those are Phase 12/15).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0077

Title

Search-ready records (indexable body built on record save, event for the indexer)

Objective

Make every record's searchable content available to the Phase-8 search pipeline: on record create/update, build a search body (title + property values concatenated in a stable order) and emit it in the record.created/record.updated events so the search-index consumer group (Phase 8) can index search_documents rows of type record without re-deriving text from EAV. The Phase-5 slice: the event payload + the body builder (pure, in packages/database-engine); the actual OpenSearch indexing is Phase 8.

Background

backend-architecture §7.3: the search-index consumer group upserts "search_documents mirror + OpenSearch doc (incl. permission stamp)" from page.created/updated, database.created, record.created/updated-class events. database-architecture §2.3: "the title is also denormalized into the search index." Phase 8 owns the indexer itself; Phase 5 owns making record events indexer-ready: a deterministic searchBody (title + "<Property>: <value>" lines for every non-empty value, in property position order, values rendered via the codec display() in en-US — the indexer re-localizes snippets in Phase 8), capped at 64 KB, with the property names included (so "Budget: 42000" matches "Budget" queries). Computed properties are excluded in Phase 5 (they don't exist yet); Phase 6 extends the builder to include formula/rollup display values.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0078

Title

E2E database suite (tests/e2e/databases.spec.ts) — core scenarios

Objective

Author the Playwright E2E suite for Phase 5 covering the behavioral exit criteria: create via slash, 5 property types, add rows, filter+sort+group, board drag updates property, record opens page, 1000-row scroll virtualization, all 8 views open a record's page, archive/trash lifecycle, and the permission matrix. The 100k seed, perf probes, and CI engine gate land in TASK-0079; final phase-exit evidence lands in TASK-0080.

Background

AGENTS.md CI contract (install → lint → typecheck → unit → integration → build → security scan → E2E); Playwright in tests/e2e; the Phase-3/4 suites (tests/e2e/pages.spec.ts, tests/e2e/editor.spec.ts — Phase 4's TASK-0062) set the fixture/CI patterns to reuse (authed-user fixtures, network spies). Phase-5 exit criteria (ROADMAP): "100k-record database renders with virtualization; filter/sort/ group engine unit-tested; all views open a record's page." This task owns the behavioral scenarios; TASK-0079 owns the 100k proof + the structural unit gate; TASK-0080 assembles the exit evidence.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0079

Title

100k-record seed, perf probes, engine unit gate (CI)

Objective

Produce the machine-verifiable proof for the remaining two ROADMAP exit criteria: the deterministic 100k-record seed + the 100k virtualization/perf probe (100k-record database renders with virtualization) and the structural unit gate that the filter/sort/group engine is unit-tested (every operator in the matrix has a golden fixture; the fuzz suites run in CI).

Background

ROADMAP Phase-5 exit: "100k-record database renders with virtualization; filter/sort/group engine unit-tested; all views open a record's page." The third is TASK-0078; the first two are proof artifacts, and this task builds them. database-architecture §4: the 100k-record filtered query target is < 300 ms via (databaseId, archivedAt) + the EAV uniques (expression indexes are the documented MVP+1 follow-up); §6: "Seed (prisma/seed): a demo org + workspace with a 100k-record database and a 100k-block page (used by the performance suite and the Phase 3/5 exit criteria)" — the 100k-block page half landed in Phase 4 (TASK-0062 R2); this task adds the 100k-record half. The engine goldens live in packages/database-engine/src/filter/__tests__/fixtures/ (TASK-0067) and src/sort/__tests__//src/group/__tests__/ (TASK-0068) — this task adds the structural check that no operator/type pair is untested, making "unit-tested" enforceable rather than a convention.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0080

Title

Phase-5 exit verification (checklist evidence, conflict log)

Objective

Close Phase 5: run the full contract one final time, record the exit-criteria evidence (run hashes + artifact links) against the Phase Completion Checklist at the top of this file, verify the recorded notes (conflicts/adjustments) are resolved or carried forward, and mark the ROADMAP Phase-5 boxes with the evidence — the same close-out discipline as Phase 4's TASK-0062.

Background

ROADMAP: "A phase is done when every task in its file meets the Definition of Done in AGENTS.md." Phase 5's exit criteria are: 100k-record database renders with virtualization (TASK-0079), filter/sort/group engine unit-tested (TASK-0079 gate + engine suite), all views open a record's page (TASK-0078 scenario 6). The phase also carried three recorded notes (header): the 22-vs-24 property-count reconciliation, the FORM view deferral to Phase 10, and the Phase-6 placeholder behavior for RELATION/ROLLUP/FORMULA/BUTTON — each must be verified as implemented-as-recorded before the phase closes (AGENTS.md rule 29: conflicts are recorded, not guessed).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done