.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
product-requirements.mddocs/product/product-requirements.md← product45,721 B← Back to the app

Product Requirements — AI Software Factory

Canonical requirement registry. Every requirement in this product has a stable ID (PR-xxx). This file is the authoritative ID source: if any other document, task file, or test references a PR-xxx ID, the definition lives here. requirements-matrix.md traces each ID to its task file, phase, and verification tests.

Priority legend

Priority Meaning
P0 MVP — must ship in the first production milestone (Phases 0–9 partial, see §MVP Boundary)
P1 Post-MVP production features (Phases 10–13)
P2 Enterprise / hardening (Phases 14–15)

Phase column references ROADMAP.md phase numbers (0–15). Verified by lists the task file (in docs/tasks/) and the test layer(s) that prove the requirement: unit (Vitest/Jest), integration (Testcontainers, tests/integration), e2e (Playwright, tests/e2e), perf (k6/Artillery, tests/performance), manual/ops (runbook-verified). Detailed functional text lives in functional-requirements.md; UI behavior in ux-requirements.md; measurable targets in non-functional-requirements.md.


1. Vision

AI Software Factory is a modern, self-hostable, multi-tenant collaborative workspace platform inspired by Notion — a production-grade SaaS platform, not a prototype. One deployment serves unlimited workspaces; every workspace is an isolated tenant with its own members, permissions, content, billing plan, and limits.

The platform combines, in one coherent surface:

1.1 Non-negotiable product principles

# Principle Consequence
1 Self-hostable One docker compose brings up everything; no mandatory SaaS dependency (email, AI, storage all pluggable).
2 Multi-tenant from day one Every query is tenant-scoped; no feature may leak across workspaces.
3 Server-side authorization The frontend is a convenience layer; every operation re-validates in packages/permissions.
4 Records are pages Every database row is also a full page — structure and prose never diverge.
5 Fractional ordering Block/page/record ordering is LexoRank-style strings; array indexes are never persisted.
6 Safe computation Formulas run in a bounded AST evaluator; AI page generation uses structured tool calls, never raw SQL.
7 Events for side effects Writes stay fast; search indexing, webhooks, automations, and notifications consume domain events.
8 Accessible by default WCAG 2.2 AA is a requirement, not a polish step (see ux-requirements §12).

2. Personas

Five personas anchor the requirements. Each maps to the roles and flows the platform must serve.

Persona Who Primary goals Key features relied on
P-A: Individual knowledge worker ("Ana, PM at a startup") Solo or small-team user in her personal workspace or a shared one Capture notes fast; organize projects as pages + databases; search her own knowledge Editor, slash commands, databases (table/board/calendar), templates, search, favorites, offline editing
P-B: Team lead ("Ben, engineering lead") Runs a team workspace with ~10 members Coordinate work via boards/timelines; assign via mentions; track status with rollups and dashboards; keep docs current Databases with relations/rollups, buttons, boards/timeline/calendar, comments/mentions, notifications, dashboards & charts, automations (status changes → notify)
P-C: Workspace admin ("Carol, head of ops") Manages one workspace (not the org) Control who sees what; keep content organized (teams, templates, trash hygiene); publish forms; share public pages RBAC + resource permissions, sharing scopes, invitations, teams, templates, forms, public sharing, file management, API keys
P-D: Developer / integrator ("Dan, platform engineer") Integrates the workspace with internal tools Automate with API + webhooks; build on typed REST endpoints; receive signed events REST API v1, API keys (scoped), OAuth2, webhooks (HMAC), OpenAPI docs, automation via API, import/export
P-E: Enterprise IT ("Eva, CISO/IT director") Procures and governs a self-hosted deployment Prove security: SSO, provisioning, auditability, retention, isolation SAML/OIDC SSO, SCIM, audit log viewer/export, retention policies, org policies, admin console, security headers, ASVS L2 posture, backup/DR

Persona coverage rule: for every P0 requirement, at least one of {P-A, P-B, P-C} benefits directly; P-D requirements land in Phase 13 and P-E requirements in Phase 14 unless a security property (audit, rate limiting) protects all personas from Phase 1 onward.


3. Scope & requirement registry

This section is the complete registry. Feature areas mirror PRODUCT-SPEC.md section numbers, cited as PS§n. Sub-requirements (e.g. PR-012a) inherit the parent's priority and phase unless stated otherwise.

3.1 Authentication & identity (PS§2.1, PS§24)

ID Requirement Priority Phase Verified by
PR-001 Users can register with email + password; email format and password strength (≥10 chars, mixed classes) validated server-side and client-side P0 1 phase-01-authentication.md · unit + integration + e2e
PR-002 New accounts require email verification (token link, 24 h expiry, single-use); unverified users get a limited session that prompts verification P0 1 phase-01-authentication.md · integration + e2e
PR-003 Login issues an access JWT (15 min) + rotating opaque refresh token (30 d, hashed at rest, single-use per rotation) P0 1 phase-01-authentication.md · unit + integration + e2e
PR-004 Refresh token rotation: using a previously-rotated token revokes the entire token family (replay detection) P0 1 phase-01-authentication.md · integration
PR-005 Logout revokes the current session; sessions can be listed and individually revoked from security settings P0 1 phase-01-authentication.md · integration + e2e
PR-006 Password reset: emailed token, 1 h expiry, single-use, revokes all sessions on use P0 1 phase-01-authentication.md · integration + e2e
PR-007 Passwords hashed with bcrypt (cost 12); comparison timing-safe; no plaintext ever logged P0 1 phase-01-authentication.md · unit
PR-008 Users can view/update profile: name, display name, avatar, locale, timezone, theme P0 1 phase-01-authentication.md · integration + e2e
PR-009 Registration and login endpoints are rate-limited per IP + per email (see security-architecture §10) P0 1 phase-01-authentication.md · integration
PR-010 Every login, failed login, logout, and reset emits a mandatory audit event (actor, IP, UA) P0 1 phase-01-authentication.md · integration
PR-011 Enterprise SSO via OIDC (auth code + PKCE) and SAML 2.0 per organization, with enforce mode that disables password login P2 14 phase-14-enterprise.md · integration + e2e
PR-012 SSO identity linking: sso_identities maps (provider, externalId) → user; first SSO login for a known email auto-links, else creates INVITED user P2 14 phase-14-enterprise.md · integration

3.2 Workspaces & tenancy (PS§1, PS§2.1)

ID Requirement Priority Phase Verified by
PR-013 Every registered user automatically gets a personal workspace (owner = user, isPersonal = true) P0 2 phase-02-workspace.md · integration + e2e
PR-014 Users can create additional workspaces (name, slug, icon); slug unique platform-wide P0 2 phase-02-workspace.md · integration + e2e
PR-015 Workspaces can be renamed, re-iconed, and (owner only) deleted with a confirmation cascade preview P0 2 phase-02-workspace.md · e2e
PR-016 Workspace membership with four roles: Owner, Admin, Member, Guest (RBAC matrix in §4) P0 2 phase-02-workspace.md · unit + integration
PR-017 Role changes are owner/admin-only; demoting the last Owner is rejected; all changes audited P0 2 phase-02-workspace.md · integration
PR-018 Email invitations: invite (role, expiry ≤30 d), accept (creates/links user), decline, revoke; one pending invitation per (workspace, email, role) P0 2 phase-02-workspace.md · integration + e2e
PR-019 Teams (teamspaces): name, slug, color, icon, ordered by fractional position; team membership; pages can live in a team P0 2 phase-02-workspace.md · integration + e2e
PR-020 Sidebar navigation: Home, Inbox, Search, Favorites, Teamspaces, Private, Shared, Trash — rendered from API, with expand/collapse and page-tree drill-down P0 2 phase-02-workspace.md · e2e
PR-021 Workspace settings pages: profile, members, teams, security, (billing placeholder, integrations placeholder) P0 2 phase-02-workspace.md · e2e
PR-022 Organization object groups workspaces; org membership with roles; org-level policies stored as JSON P2 14 phase-14-enterprise.md · integration
PR-023 SCIM 2.0 user & group provisioning endpoint (create/update/deactivate) for enterprise SSO P2 14 phase-14-enterprise.md · integration
PR-024 Per-workspace usage limits (JSON: members, storage MB, AI tokens, API rps) enforced at write boundaries P2 14 phase-14-enterprise.md · integration

3.3 Pages & page tree (PS§3)

ID Requirement Priority Phase Verified by
PR-025 Page CRUD: create, read, update (title/icon/cover/description), soft delete; title default "" P0 3 phase-03-pages.md · integration + e2e
PR-026 Pages nest to arbitrary depth via parentId; tree queries use fractional position for sibling order P0 3 phase-03-pages.md · unit + integration
PR-027 A page supports: icon (emoji or file id), cover, title, description, properties, blocks, comments, relations, permissions, history, child pages P0 3 phase-03-pages.md · e2e
PR-028 Trash: soft delete sets trashedAt; restore round-trips parent/position; purge is owner-only and removes blocks/comments/files references P0 3 phase-03-pages.md · integration + e2e
PR-029 Archives (archivedAt) separate from trash: archived pages hidden from default views, recoverable without "restore" semantics P0 3 phase-03-pages.md · integration
PR-030 Favorites: per-user, ordered (fractional), visible in sidebar; page can be favorited by any viewer with VIEW+ P0 3 phase-03-pages.md · e2e
PR-031 Page version history: snapshot per significant revision (title, structure, blocks) with author + note; restore to a version creates a new version P0 3 phase-03-pages.md · integration
PR-032 Private pages (isPrivate) hidden from all but the owner and explicit grants P0 3 phase-03-pages.md · integration
PR-033 Page tree loads virtualized: 100k-block workspace tree renders in < 2 s (target NFR-NF1) P0 3 phase-03-pages.md · perf + e2e

3.4 Block editor (PS§4, PS§5)

ID Requirement Priority Phase Verified by
PR-034 Editor stores a block tree (stable ids, fractional position, content JSON, properties JSON) — never one HTML document P0 4 phase-04-editor.md · unit (codec) + integration
PR-035 Text blocks: paragraph, heading_1, heading_2, heading_3, quote, callout (icon + background color) P0 4 phase-04-editor.md · unit + e2e
PR-036 List blocks: bulleted_list, numbered_list (numbering continues across siblings), todo (checkbox state), toggle (collapsed children) P0 4 phase-04-editor.md · unit + e2e
PR-037 Media blocks: image (upload, caption, width resize), video (upload or URL), audio (upload, player), file (upload, download card), bookmark (URL preview card), embed (provider iframe) P0 (image, file) / P1 (video, audio, bookmark, embed) 4 / 9 phase-04-editor.md, phase-09-files.md · e2e
PR-038 Code & equation blocks: code (language select, line numbers, syntax highlight, copy) and equation (KaTeX/MathJax rendering) P0 (code) / P1 (equation) 4 phase-04-editor.md · e2e
PR-039 Layout blocks: divider, spacer (height), column_list + column (2–4 columns, resizable widths, drag between columns) P0 (divider) / P1 (spacer, columns) 4 phase-04-editor.md · e2e
PR-040 Advanced blocks: table (static, cell editing), synced_block (master + linked copies), child_page / child_database (sidebar-style row), linked_database (query on another database) P0 (table, synced_block) / P1 (child_page, child_database, linked_database) 4 / 5 phase-04-editor.md, phase-05-databases.md · e2e
PR-041 Editor keyboard model: Enter (new block), Shift+Enter (soft break), Backspace (merge/delete), Tab/Shift+Tab (indent/unindent), arrows (navigation & caret), Cmd/Ctrl+A (select block then all), C/X/V/Z/Shift+Z, Cmd/Ctrl+B/I/U, Cmd/Ctrl+K (palette) P0 4 phase-04-editor.md · e2e
PR-042 Mouse interactions: hover controls (drag handle, add-below), select & multi-select (shift/box), context menu, resize (columns/images) P0 4 phase-04-editor.md · e2e
PR-043 Undo/redo history (in-memory + block versions) survives reload for the session; copy/paste internal (JSON) and external (markdown + HTML) both directions P0 4 phase-04-editor.md · unit + e2e
PR-044 Every mouse operation has a keyboard/ARIA equivalent (accessibility invariant) P0 4 phase-04-editor.md · e2e + manual a11y audit

3.5 Slash commands & context menus (PS§6, PS§7)

ID Requirement Priority Phase Verified by
PR-045 Typing / opens a searchable command menu; commands: /text, /heading 1–3, /quote, /callout, /todo, /bullet, /number, /toggle, /divider, /image, /video, /file, /code, /table, /database, /board, /calendar, /timeline, /chart, /form P0 4 phase-04-editor.md · e2e
PR-046 Slash commands create blocks at the caret position, replacing the query; results are grouped (Text, Lists, Media, Data, Layout) and keyboard-navigable P0 4 phase-04-editor.md · e2e
PR-047 /database (and /board, /calendar, …) opens a property picker and dynamically creates a database block with default properties P0 4–5 phase-04-editor.md, phase-05-databases.md · e2e
PR-048 Block context menu: Turn into · Duplicate · Copy · Copy link · Move to · Delete · Comment · Ask AI · Color · Background · Convert to (heading/quote/callout/todo) · More P0 4 phase-04-editor.md · e2e
PR-049 Page context menu (sidebar + top bar): Open · Open in new tab · Duplicate · Rename · Move · Copy link · Favorite · Archive · Delete · Export · Share · Permissions P0 4–3 phase-03-pages.md, phase-04-editor.md · e2e

3.6 Drag & drop (PS§8)

ID Requirement Priority Phase Verified by
PR-050 Block dragging within a page: reorder, nest as child, un-nest; drop indicator (line/box); auto-scroll at viewport edges P0 4 phase-04-editor.md · e2e + perf (NFR-NF3: < 16 ms local move)
PR-051 Multi-block drag (shift-click range) moves as a unit; relative ordering preserved P0 4 phase-04-editor.md · e2e
PR-052 Cross-page drag: drop a block onto a sidebar page (or into a child_page/child_database block) to move it; drag between columns P0 4 phase-04-editor.md · e2e
PR-053 Database row dragging: reorder rows (table), move cards across board columns (status change = property update) P0 5 phase-05-databases.md · e2e
PR-054 Sidebar page dragging: reorder + reparent pages in the tree P0 4–3 phase-04-editor.md · e2e
PR-055 File/image drop from OS into editor or database property cell creates a file block / files property value P0 9 phase-09-files.md · e2e
PR-056 All DnD uses dnd-kit with drop animations and non-drag keyboard alternative ("Move to" in context menus, arrow-key move in tables/boards) P0 4 phase-04-editor.md · e2e

3.7 Databases (PS§9)

ID Requirement Priority Phase Verified by
PR-057 Database = named container with typed properties, records, views; embedded in pages via database block or standalone P0 5 phase-05-databases.md · integration + e2e
PR-058 24 property types: Title, Text, Rich Text, Number, Select, Multi Select, Status, Date, Date Range, Person, Email, Phone, URL, Checkbox, Files, Created Time, Created By, Last Edited Time, Last Edited By, Relation, Rollup, Formula, Button, Unique ID P0 (core 15: Title, Text, Rich Text, Number, Select, Multi Select, Status, Date, Date Range, Person, Checkbox, Files, Unique ID, Created/Last-Edited ×4) / P1 (Email, Phone, URL, Relation*, Rollup*, Formula*, Button*) — *land in Phase 6 5 / 6 phase-05-databases.md, phase-06-relations.md · unit + integration
PR-059 Exactly one TITLE property per database; renaming/deleting the title property is blocked P0 5 phase-05-databases.md · unit
PR-060 Records: each record is 1:1 with a page (database_records.pageId); the record page shows all properties above its block content P0 5 phase-05-databases.md · integration + e2e
PR-061 Record create (inline row, "Add new", from form, from API), update (inline cell edit), archive (soft), duplicate P0 5 phase-05-databases.md · integration + e2e
PR-062 Table view: virtualized 100k+ rows; inline editing per type; row height; column width + visibility; row hover actions; multi-select rows P0 5 phase-05-databases.md · e2e + perf (NFR-NF1)
PR-063 List view: minimal rows (title + 2 properties), fast scan P1 5 phase-05-databases.md · e2e
PR-064 Board view: group-by one property (required, default status); kanban columns; card shows selected properties; add/edit/reorder cards; WIP optional P0 5 phase-05-databases.md · e2e
PR-065 Calendar view: day/week/month; date or date-range properties; multi-day bars; click-day → new record P1 5 phase-05-databases.md · e2e
PR-066 Gallery view: card grid with cover/icon, title, selected properties; card layout config (cover on/off, size, property rows) P1 5 phase-05-databases.md · e2e
PR-067 Timeline view: Gantt-style bars from date-range (or date + duration); zoom levels; today marker P1 5 phase-05-databases.md · e2e
PR-068 Chart view + Dashboard view as first-class view types composing widgets/charts P1 5 / 12 phase-05-databases.md, phase-12-ai.md (adjacent) · e2e
PR-069 Form view: published form over the database (see Forms §) P1 10 phase-10-forms.md · e2e
PR-070 Per-view settings: filters, sort, group, visible properties, column widths, card layout, color, density, page size P0 5 phase-05-databases.md · e2e
PR-071 Filters: nested boolean tree — AND / OR / NOT groups with conditions (property, operator, value); 20+ operators per type (e.g. contains, before, is empty, is within) P0 5 phase-05-databases.md · unit (golden datasets) + integration
PR-072 Sort: multi-key (property, direction ASC/DESC); nulls first/last P0 5 phase-05-databases.md · unit
PR-073 Group: multi-level grouping by property; collapsible groups; group counts P0 5 phase-05-databases.md · unit
PR-074 Database property management: add/rename/reorder (fractional)/hide/delete properties; delete keeps values until records gone; type change with lossless conversions only P0 5 phase-05-databases.md · integration

3.8 Relations, rollups, formulas, buttons (PS§9.4–9.7)

ID Requirement Priority Phase Verified by
PR-075 Relations between databases: ONE_TO_ONE, ONE_TO_MANY, MANY_TO_MANY; bidirectional with named reverse property; link/unlink records from either side P0 6 phase-06-relations.md · unit + integration + e2e
PR-076 Relation cells show linked record titles (multi-select popover, search); reverse side updates automatically P0 6 phase-06-relations.md · e2e
PR-077 Rollups: COUNT, SUM, AVERAGE, MIN, MAX, PERCENT, UNIQUE over a relation's target property, with optional filter P1 6 phase-06-relations.md · unit (golden) + integration (event-driven recompute)
PR-078 Rollup values recompute on relation/link/property change via domain events (no polling) P1 6 phase-06-relations.md · integration
PR-079 Formula engine: safe parser → AST → evaluator; never arbitrary JavaScript/eval P1 6 phase-06-relations.md · unit (100% function coverage, fuzzing)
PR-080 Formula functions: if, and, or, not, sum, average, min, max, dateAdd, dateBetween, now, concat, replace, contains, length, plus prop("Name") accessor and literals (string/number/bool/date) P1 6 phase-06-relations.md · unit
PR-081 Formulas declare dependencies (property ids); recomputed when any dependency changes; inferred return type (number/text/bool/date/array) P1 6 phase-06-relations.md · unit + integration
PR-082 Database buttons: run an action sequence — set property, create page, update page, archive page, duplicate page, send webhook, trigger automation P1 6 phase-06-relations.md · integration + e2e
PR-083 Button config validated server-side; actions execute with the invoking user's permissions; execution logged P1 6 phase-06-relations.md · integration

3.9 Collaboration, realtime (PS§13, PS§25)

ID Requirement Priority Phase Verified by
PR-084 Realtime WebSocket server: rooms per (workspace, page/database); token auth; heartbeat 30 s; stale peer pruning; per-connection rate limits P1 7 phase-07-collaboration.md · integration + e2e
PR-085 Yjs CRDT sync of the block tree: multi-user concurrent edits, server-authoritative doc hydrated from Postgres, debounced persistence P1 7 phase-07-collaboration.md · unit (codec) + integration + e2e
PR-086 Presence: avatars in top bar, "who is here", live cursors with name + color, awareness via Yjs protocol P1 7 phase-07-collaboration.md · e2e
PR-087 Realtime propagation latency < 200 ms p95 (local deployment) — target NFR-NF6 P1 7 phase-07-collaboration.md · perf
PR-088 Realtime comments: comment threads update participants live over the socket P1 7 phase-07-collaboration.md · e2e
PR-089 Reconnection with Yjs update resume (Redis update log, truncated after persistence); backpressure on slow clients P1 7 phase-07-collaboration.md · integration
PR-090 Offline mode: edits buffered in IndexedDB (Yjs local-first), queue synced on reconnect, CRDT conflict resolution, offline indicator P1 7 phase-07-collaboration.md · e2e

3.10 Comments, mentions, notifications (PS§14)

ID Requirement Priority Phase Verified by
PR-091 Comments attach to: page, block, text selection (anchor/offset), database record P0 3 (page/block) / 5 (record) / 7 (selection) phase-03-pages.md, phase-05-databases.md, phase-07-collaboration.md · integration + e2e
PR-092 Comment threads: create, reply, resolve, reopen, edit (own), delete (own or admin); status open/resolved/reopened P0 3 phase-03-pages.md · integration + e2e
PR-093 Comment reactions: emoji on comments and replies, one per (target, user, emoji) P0 3 phase-03-pages.md · e2e
PR-094 Mentions: @user, @team, @page, @database with searchable popup; mention notifies the target P0 7 phase-07-collaboration.md · integration + e2e
PR-095 Notifications (in-app, email, webhook channels) for: mention, comment, assignment, page shared, task assigned, database change, automation, integration P0 (in-app mention/comment) / P1 (email + full set) 7 phase-07-collaboration.md · integration + e2e
PR-096 Inbox: unread list, mark read (single/all), deep links, notification preferences per type + quiet hours P0 7 phase-07-collaboration.md · e2e
PR-097 Mention notifications track read state independently (mention_notifications) P0 7 phase-07-collaboration.md · integration

3.11 Search (PS§15)

ID Requirement Priority Phase Verified by
PR-098 Search everything in a workspace: pages, blocks, databases, records, comments, files, users P0 8 phase-08-search.md · integration + e2e
PR-099 Full-text (BM25) + prefix + fuzzy matching via OpenSearch analyzers/queries P0 8 phase-08-search.md · integration
PR-100 Search filters: type, workspace/team, updated date, creator; result snippets with highlighted matches P0 8 phase-08-search.md · e2e
PR-101 Recent searches + suggestions (typeahead) in search UI and command palette P0 8 phase-08-search.md · e2e
PR-102 Index pipeline: domain events → indexer worker → OpenSearch; index lag < 30 s; periodic reconciliation job P0 8 phase-08-search.md · integration + perf
PR-103 Search results are permission-filtered at query time (visibility snapshot per document) P0 8 phase-08-search.md · integration
PR-104 Search response < 500 ms p95 — target NFR-NF4 P0 8 phase-08-search.md · perf

3.12 Files (PS§16)

ID Requirement Priority Phase Verified by
PR-105 S3-compatible storage (MinIO in dev); private buckets; presigned upload (multipart for large files) and short-lived signed download URLs P0 9 phase-09-files.md · integration + e2e
PR-106 File pipeline: upload → virus scan (ClamAV) → metadata extraction (mime, dimensions, duration, page count, hashes) → thumbnail/preview → DB metadata; status machine UPLOADING→SCANNING→READY/FAILED P0 9 phase-09-files.md · integration
PR-107 Supported kinds: images, PDF, documents (docx/xlsx/pptx/md/txt), video, audio, archives, attachments; previews per kind P0 (image, pdf, doc, txt) / P1 (video, audio, xlsx, archives) 9 phase-09-files.md · e2e
PR-108 Virus-detected files quarantined (VIRUS_DETECTED), never served; admin sees scan report P0 9 phase-09-files.md · integration
PR-109 File metadata: name, size, mime, uploader, versions (file_versions), trash, per-file permission overrides P0 9 phase-09-files.md · integration + e2e
PR-110 Files usable in editor (image/file blocks), database (Files property), and form answers P0 9 phase-09-files.md · e2e
PR-111 500 MB file upload works (multipart); per-plan size quotas enforced P0 9 phase-09-files.md · integration + perf

3.13 Permissions & sharing (PS§17, PS§18)

ID Requirement Priority Phase Verified by
PR-112 RBAC workspace roles (Owner/Admin/Member/Guest) define base capability; see §4 P0 2 phase-02-workspace.md, phase-03-pages.md · unit (permission engine)
PR-113 Resource-level permissions: None / View / Comment / Edit / Full Access at workspace, teamspace, page, database, record, file P0 3 phase-03-pages.md · unit (decision matrix) + integration
PR-114 Effective level = max(role_base, explicit grants), computed by walking up the page tree (child inherits parent grants unless a nearer explicit grant overrides) P0 3 phase-03-pages.md · unit (engine property tests)
PR-115 Every backend operation re-validates server-side; frontend checks are UX-only P0 2 all phases · integration (unauthorized-access suite)
PR-116 Grant management UI: share dialog (scope picker), granular "Can edit / Can view / …", inherit indicators, remove grant P0 3 phase-03-pages.md · e2e
PR-117 Share scopes: private, workspace, team, specific users, public — one Share row per token P0 3 phase-03-pages.md · integration
PR-118 Public pages: https://<host>/share/<token>; options: allow comments, allow duplicate, allow search indexing, password, expiration P0 3 phase-03-pages.md · e2e
PR-119 Permission + share changes audited (permission.changed, page.shared) P0 3 phase-03-pages.md · integration
PR-120 Advanced permission policy expressions (enterprise) + guest restrictions (no export, no share) P2 14 phase-14-enterprise.md · unit + integration

3.14 Templates (PS§19)

ID Requirement Priority Phase Verified by
PR-121 Template types: workspace, database, page, team; built-in + user templates; frozen snapshot at creation P1 10 phase-10-forms.md (adjacent) / phase-05-databases.md · integration + e2e
PR-122 "New from template" materializes a new page/database (new ids, relations intact) without touching the source P1 10 phase-05-databases.md · integration
PR-123 Template browser in page/database creation flows (slash menu, sidebar "+") P1 10 phase-05-databases.md · e2e

3.15 Import / export (PS§20)

ID Requirement Priority Phase Verified by
PR-124 Import: Markdown, HTML, CSV, JSON, Notion export (zip); pipeline upload → parser → normalizer → block/db conversion → validation → import P1 10 phase-10-forms.md (adjacent) · unit (parsers) + integration
PR-125 Export: Markdown, HTML, PDF, CSV (database), JSON (page/database) — per page, database, or team P1 10 phase-10-forms.md (adjacent) · integration + e2e
PR-126 Imports are permission-checked and audited; large imports run as jobs with progress P1 10 phase-10-forms.md (adjacent) · integration

3.16 Forms (PS§11)

ID Requirement Priority Phase Verified by
PR-127 Form builder: questions (SHORT_TEXT, LONG_TEXT, NUMBER, EMAIL, DATE, CHECKBOX, SINGLE_SELECT, MULTI_SELECT, RATING, FILE), required flag, validation config, property mapping P1 10 phase-10-forms.md · e2e
PR-128 Public form pages (unique slug, branding/intro/success message, closed state); submission works without authentication P1 10 phase-10-forms.md · e2e
PR-129 Submission creates a database record + FormSubmission row; fires form.submitted event (drives automations/webhooks) P1 10 phase-10-forms.md · integration
PR-130 Form responses view: table of submissions, view as record, delete P1 10 phase-10-forms.md · e2e

3.17 Dashboards & charts (PS§12)

ID Requirement Priority Phase Verified by
PR-131 Charts: bar, line, area, pie, donut, number; config: x-axis, y-axis, group by, filter, aggregation, color, legend; bound to a database P1 10 phase-10-forms.md (adjacent) · e2e
PR-132 Dashboards: widget grid (table, board, chart, number, calendar, timeline, text, linked database); widgets resizable, draggable, configurable, filterable P1 10 phase-10-forms.md (adjacent) · e2e
PR-133 Dashboard can be published as a public read-only page P1 10 phase-10-forms.md (adjacent) · e2e

3.18 Automation (PS§10)

ID Requirement Priority Phase Verified by
PR-134 Automation = trigger(s) → conditions → action(s), executed via BullMQ workers; statuses DRAFT/ACTIVE/PAUSED/ARCHIVED P1 11 phase-11-automation.md · integration + e2e
PR-135 Triggers: RECORD_CREATED, RECORD_UPDATED, PROPERTY_CHANGED, PAGE_CREATED, FORM_SUBMITTED, SCHEDULE (cron), WEBHOOK, MANUAL P1 11 phase-11-automation.md · integration
PR-136 Actions: UPDATE_RECORD, CREATE_PAGE, SEND_EMAIL, SEND_WEBHOOK, CREATE_NOTIFICATION, ASSIGN_USER, CHANGE_STATUS, CALL_INTEGRATION, RUN_AI_ACTION P1 11 phase-11-automation.md · integration
PR-137 Execution: retries with exponential backoff (max 8), dead-letter queue, per-action timeout (default 30 s) P1 11 phase-11-automation.md · integration
PR-138 Every run recorded (automation_runs + automation_logs: status, input, output, error, timing) with history UI P1 11 phase-11-automation.md · e2e
PR-139 Trigger matcher + condition evaluator are pure, unit-tested functions; automation runs carry the actor's permissions P1 11 phase-11-automation.md · unit + integration
PR-140 Automation execution audit event (automation.executed) P1 11 phase-11-automation.md · integration

3.19 AI (PS§21)

ID Requirement Priority Phase Verified by
PR-141 AI gateway with provider abstraction: OpenAI, Anthropic, Google, OSS (vLLM/Ollama), custom OpenAI-compatible; unified chat/embed/tools API; provider swap changes zero app code P1 12 phase-12-ai.md · unit + integration
PR-142 Ask AI (chat) with workspace context; conversation history persisted P1 12 phase-12-ai.md · e2e
PR-143 Page AI: summarize, rewrite, improve writing, translate (selection or block level) P1 12 phase-12-ai.md · e2e
PR-144 Database AI: generate database from description, extract data into records, generate formula P1 12 phase-12-ai.md · integration
PR-145 RAG workspace search: content chunker → embeddings → vector store → hybrid (BM25 + semantic + metadata) → LLM answer with source citations P1 12 phase-12-ai.md · integration + e2e
PR-146 AI generation (page, database, template, tasks) via structured tool calls — never raw SQL or raw block mutation; generated output validated against Zod schemas P1 12 phase-12-ai.md · integration
PR-147 All AI calls logged (provider, model, tokens in/out, latency); per-workspace token budgets enforced P1 12 phase-12-ai.md · integration

3.20 Public API & webhooks (PS§22)

ID Requirement Priority Phase Verified by
PR-148 REST API v1: pages CRUD, databases (GET /databases/:id, POST /databases/:id/query, POST /databases/:id/records), search (POST /search), files (POST /files), records, comments, workspaces P1 13 phase-13-api.md · integration + e2e
PR-149 API keys: workspace-scoped, scopes READ/WRITE/ADMIN, hashed at rest (raw key shown once), per-key rate limit, expiry, revocation P1 13 phase-13-api.md · integration + e2e
PR-150 OAuth2 (authorization code) for third-party apps P1 13 phase-13-api.md · integration
PR-151 Webhooks: subscribe to `page.created updated deleted, database.created updated, record.created
PR-152 OpenAPI 3 spec generated and CI-checked against live endpoints; interactive docs at /docs P1 13 phase-13-api.md · CI contract test
PR-153 API errors use the standard ApiError envelope with stable codes; API-key auth E2E-tested P1 13 phase-13-api.md · e2e

3.21 Enterprise (PS§2.3)

ID Requirement Priority Phase Verified by
PR-154 Audit log: mandatory event catalog (actor type/id, workspace, resource, action, timestamp, IP, UA, metadata); viewer with filters + export (CSV/JSON) P2 14 phase-14-enterprise.md · integration + e2e
PR-155 Organization policies: enforced security settings (password policy, SSO enforce, public-sharing toggle) P2 14 phase-14-enterprise.md · integration
PR-156 Data retention policies: PURGE / HOLD per scope (comments, trash, audit_logs, files) with retainDays; nightly retention job P2 14 phase-14-enterprise.md · integration
PR-157 Admin console: org overview, usage, members, policies, SSO config P2 14 phase-14-enterprise.md · e2e

3.22 Platform & hardening (PS§24, PS§26, PS§27)

ID Requirement Priority Phase Verified by
PR-158 Security baseline: security headers (CSP, HSTS, X-Frame-Options), secure cookies (HttpOnly/SameSite=Lax), CSRF protection, CORS allow-list, rate limiting tiers — see security-architecture P0 1 (core) / 15 (full audit) phase-01-authentication.md, phase-15-production.md · integration + security scan
PR-159 Performance: initial page load < 2 s, editor interaction < 50 ms, local block move < 16 ms, search < 500 ms, API p95 < 300 ms, realtime update < 200 ms; 100k-record databases without full render P0 3/4/5 (targets) / 15 (load proof) phase-15-production.md · perf
PR-160 Scalability: 10k concurrent WS editors, 1k rps API, 100k-record queries within NFR budgets P1 15 phase-15-production.md · perf
PR-161 Reliability: 99.9% API availability SLO; graceful degradation — realtime down ⇒ polling fallback + banner; search down ⇒ "search unavailable" empty state, app keeps working P1 15 phase-15-production.md · manual/ops + integration (chaos)
PR-162 Observability: OpenTelemetry traces/metrics, Prometheus + Grafana dashboards, Loki logs, alerting (latency, queue depth, WS count, error rate) P2 15 phase-15-production.md · manual/ops
PR-163 Backup/DR: Postgres PITR + S3 versioning + OpenSearch snapshots; RPO ≤ 5 min, RTO ≤ 1 h; restore drill documented and executed P2 15 phase-15-production.md · manual/ops (runbook)
PR-164 Theming: light / dark / system via design tokens (CSS variables); no hard-coded colors in app code P0 0 phase-00-foundation.md · manual/ops + e2e (visual smoke)
PR-165 Accessibility: WCAG 2.2 AA — keyboard navigation, ARIA, focus management, reduced motion, high contrast, accessible menus/dialogs, non-drag DnD alternatives P0 4 (editor) / ongoing phase-04-editor.md · e2e + manual a11y audit (axe)
PR-166 Internationalization readiness: all user-facing strings extractable (i18n keys), date/number formatting via user locale + timezone, no hard-coded English in code paths P2 15 phase-15-production.md · lint rule + manual/ops
PR-167 Browser support: latest 2 major versions of Chrome, Edge, Firefox, Safari (desktop) + responsive behavior on tablet/mobile P0 0 phase-00-foundation.md · e2e (Playwright matrix)

4. Role capability matrix

Workspace RBAC baseline (before resource-level grants; resource grants can raise a level above the baseline, never silently grant what a role withholds at the workspace root).

Capability Owner Admin Member Guest
Manage workspace (rename, settings, delete) ✅ ✅ — —
Manage members & roles ✅ ✅ — —
Invite members (any role) ✅ ✅ (≤ Member) — —
Manage teams ✅ ✅ — —
Create/edit pages in own spaces ✅ ✅ ✅ — (only where granted)
Create/edit pages anywhere in workspace ✅ ✅ ✅ —
Comment on pages ✅ ✅ ✅ ✅ (where ≥ Comment)
View pages ✅ ✅ ✅ (non-private) only where granted
Delete pages ✅ ✅ own pages —
Manage permissions/sharing of a page ✅ ✅ page creator/editors (Full Access) —
Manage databases (properties, views) ✅ ✅ ✅ —
Create API keys ✅ ✅ — —
Manage webhooks & integrations ✅ ✅ — —
View audit log ✅ ✅ (workspace events) — —
Purge trash ✅ ✅ (30-day-old items) own items —
Export workspace ✅ ✅ — —
View AI usage / set budgets ✅ ✅ — —

Inheritance rule (mirrors PR-114): effective access to a resource = max(role_base(level), explicit_grants along the page-tree path from root to resource). A None explicit grant is an override that wins over inheritance (it is not the same as "no grant"). The full algorithm is in security-architecture §4.


5. MVP boundary

First production milestone = Phases 0–9 (partial), per ROADMAP.md:

5.1 In the MVP (all P0 above)

Area Included
Auth Register, verify, login, logout, refresh rotation, password reset, profile, sessions (PR-001…PR-010)
Workspace Personal + team workspaces, members/roles, invitations, teams, sidebar, settings (PR-013…PR-021)
Pages CRUD, nesting, tree, trash/restore, archives, favorites, versions, permissions, sharing incl. public (PR-025…PR-033, PR-112…PR-119)
Editor All P0 block types, drag & drop, slash menu, context menus, keyboard shortcuts, undo/redo, copy/paste (PR-034…PR-056)
Databases Core 15 property types, records-as-pages, table view + board view, filters/sort/group, per-view settings (PR-057…PR-064, PR-070…PR-074)
Relations Bidirectional relations + relation links (PR-075, PR-076)
Search Indexer + full-text/prefix/fuzzy + filters + UI + permission filtering (PR-098…PR-104)
Files S3 pipeline, upload/download, previews, versions, permissions (PR-105…PR-111)
Collaboration (basic) Comments + mentions + in-app notifications; realtime CRDT arrives Phase 7 (PR-091…PR-097 P0 parts)
Platform Security baseline, theming, a11y, browser support, perf budgets (PR-158, PR-159, PR-164…PR-167)

5.2 After the MVP (explicitly not in the first release)

Calendar / Timeline / Gallery / List views, rollups, formulas, database buttons, dashboards & charts (full), forms, automation, realtime collaboration (Yjs presence/cursors/offline), AI gateway + RAG, public API + webhooks, import/export, templates (full), enterprise (SSO/SCIM/audit viewer/ retention/admin console), production hardening suite (load, DR, observability dashboards).

5.3 Out of scope (not planned for v1)

Item Reason / deferral
Mobile native apps (iOS/Android) Responsive web is v1; native is post-v1
Offline sync for non-editor data (databases) beyond CRDT edits v1 offline = editor + local Yjs docs; full offline DB sync is v2
Email-in (inbox → page) Post-v1 integration
Marketplace for community templates Post-v1
In-editor whiteboard / canvas mode Post-v1
Multi-language UI translations (beyond i18n readiness) PR-166 makes it cheap; actual translation catalogs post-v1
Fine-grained row-level API scoping (API key per database) v2 API refinement
On-prem Windows deployment Self-host target is Linux containers

6. Cross-document map

Document Owns
PRODUCT-SPEC.md (root) Authoritative summary; section numbers cited here as PS§n
functional-requirements.md Exhaustive per-domain FR text, all IDs expanded
ux-requirements.md Layout, interactions, states, shortcuts, a11y
non-functional-requirements.md Measurable targets (NFR-NF1…) with methods
../security/security-architecture.md Authn/authz/transport/file/audit deep design
../database/database-architecture.md Authoritative schema reference
../requirements/requirements-matrix.md PR → task/phase/status traceability
../ui/design-system.md Tokens, components, visual specs