.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
non-functional-requirements.mddocs/product/non-functional-requirements.md← product22,933 B← Back to the app

Non-Functional Requirements — AI Software Factory

Measurable, verifiable quality attributes. Every target has an ID (NFR-xx), a measurement method (how a test or dashboard proves it), and a verification owner. Performance targets derive from PRODUCT-SPEC.md §26 and the ROADMAP exit criteria; security targets from security-architecture.md; deployment/DR targets from deployment.md. Test mapping (which suite proves which NFR) is in testing.md §8.

Verification vocabulary: perf suite = tests/performance (k6/Artillery, run in CI nightly + on Phase 15 gate); load profile = named scenario in the perf suite; chaos = integration-stage fault injection; SLO burn = Grafana SLO dashboard evaluated over 28 d windows in staging/prod.


1. Performance targets (from PRODUCT-SPEC §26)

ID Metric Target Measurement method Verified by
NFR-1 Initial page load (authenticated app shell, page open) < 2 s (p75, local dev / reference self-host box) Playwright performance fixture: navigationStart → load + first meaningful paint of page title; 3 runs, median; run in CI on the e2e job's reference hardware e2e (perf fixture) + Lighthouse CI (perfmance ≥ 80)
NFR-2 Editor interaction (type, convert block, toggle todo) < 50 ms (p95, keystroke → rendered) In-app performance hook: performance.mark on input event → requestAnimationFrame after commit; sampled 1 % of events, reported via OpenTelemetry metric editor.interaction.duration; perf suite also drives 1 000 keystrokes and asserts client-reported p95 unit (engine ops) + e2e + otel metric assertion in perf
NFR-3 Local block movement (drag reorder, same page) < 16 ms (p95, commit → next frame) Same mark/measure around dnd-kit onDragEnd → React commit; additionally a headless e2e drag of a 500-block page asserting frame time (via requestAnimationFrame delta) e2e (phase-4 exit criterion)
NFR-4 Search response (POST /search) < 500 ms (p95) k6 HTTP check on a 1M-doc fixture index (100k pages + 500k blocks); p95 over 1 000 requests; OpenSearch query timing also logged server-side for cross-check perf suite + integration (index-lag test)
NFR-5 API p95 (all public endpoints, excluding uploads) < 300 ms (p95) k6 per-endpoint assertions from a recorded VU replay; server-side otel histogram http.server.request.duration as source of truth (client p95 as proxy); per-endpoint budgets published in the Grafana dashboard perf suite + staging SLO
NFR-6 Realtime update latency (edit → remote render) < 200 ms (p95, same deployment) Two headless browsers in the same Playwright worker: browser A applies an edit, browser B marks on Yjs apply; p95 over 500 iterations; ws round-trip also measured (ws.ping) e2e (phase-7 exit criterion)
NFR-7 100k-block page renders (virtualized) Tree loads & is interactive in < 2 s; memory < 500 MB for the page route e2e: open seeded 100k-block page (fixture script), measure to first paint + run 10 scroll operations without > 100 ms jank; Chrome DevTools protocol memory snapshot e2e + perf (node RSS in containerized run)
NFR-8 100k-record database renders Table view opens with first rows in < 2 s; scroll at 30 fps; POST /databases/:id/query returns a page of 100 rows in < 300 ms e2e with 100k-record fixture (seed script in tests/integration/fixtures); query timing from API response headers e2e + perf
NFR-9 File upload 500 MB file completes; throughput ≥ 50 MB/s on 1 GbE; 99 % of uploads < 2× theoretical time k6 multipart upload test (50 MB × 20 VUs) + one 500 MB e2e (phase-9 exit) e2e + perf
NFR-10 Concurrency: two editors, same block No lost updates; both texts merge (CRDT) e2e: 2 browsers edit the same paragraph from opposite ends simultaneously, 20 iterations; final text contains both edits e2e (phase-7)
NFR-11 Batch API: POST /databases/:id/records (100 records) < 1 s (p95) k6 on 10k-record database; assertion on response time perf
NFR-12 Import: 10k-block markdown file Completes < 60 s; progress events every ≤ 2 s e2e timing of the import job e2e (phase-10)

Scaling headroom rule: targets are measured on the reference self-host box (4 vCPU / 8 GB RAM, local Postgres/Redis/OpenSearch/MinIO) for self-host parity; the Kubernetes cluster profile (8 vCPU / 16 GB per api pod × 3) must hold the same targets at 3× concurrent users.

2. Scalability

ID Requirement Target Measurement method
NFR-S1 Record volume A single database sustains 100 000 records; a workspace sustains 1 000 databases / 1 000 000 records Seed fixture; query plan inspection (EXPLAIN ANALYZE archived in perf run); p95 view-load < 2 s at 100k (NFR-8); record inserts at 10 rps for 10 min without degradation
NFR-S2 Concurrent editors 10 000 concurrent WebSocket editors across 100 pages (100/page) Artillery ws scenario: 10k connections, 10 % editing (2 updates/s each), 30 min; assertions: p95 update < 200 ms, memory per realtime pod < 2 GB, no connection drops > 0.1 %
NFR-S3 API throughput 1 000 rps sustained (read:write = 80:20 mix) k6 ramp to 1k rps, 30 min; p95 < 300 ms, error rate < 0.1 %, CPU < 70 % headroom
NFR-S4 Event bus throughput Domain events: 5 000/s peak, no loss (at-least-once), consumer lag < 30 s Load with 10k editors + automations; Redis stream XLEN growth + consumer-group lag metric bus.consumer.lag
NFR-S5 Search index size 10M indexed documents, query p95 < 500 ms, index job throughput ≥ 500 docs/s OpenSearch cluster stats + perf run
NFR-S6 Storage 50 TB object storage per deployment; 1 000 files/s upload rate at the pipeline Per-plan quotas (functional §12); pipeline queue depth metrics under load

Capacity planning: every deployment ships with a capacity dashboard (rows per table, connection pool utilization, queue depths, WS count) so operators see the approach to these ceilings; horizontal scaling of api (stateless), realtime (rooms shard by consistent hash of doc id), worker (queue-backed) is the first lever — see deployment.md §3.

3. Reliability & availability

ID Requirement Target Measurement / guarantee
NFR-R1 API availability 99.9 % monthly (≤ 43.8 min downtime) SLO burn: 28 d rolling window on http.server.request success ratio (5xx excluded from "up" definition: an error ≠ outage, but sustained 5xx > 5 % counts); error budget alert at 50 % burn
NFR-R2 Realtime degradation Realtime server down ⇒ app remains fully usable: edits buffer (offline queue, NFR-O1), presence shows "realtime unavailable" chip, no crash loop; recovery auto-reconnects chaos test: kill realtime pods mid-edit in integration e2e; assert no JS errors, edits persisted after 60 s
NFR-R3 Search degradation OpenSearch down ⇒ search returns 503 → UI empty state "Search is unavailable"; all other features unaffected chaos: point SEARCH_URL at a dead port; run the 13 MVP flows
NFR-R4 Queue degradation Redis down ⇒ API returns 503 on enqueue-bound ops (file pipeline, automations, webhooks) with a clear error; reads/writes of core content still work (events logged to Postgres outbox fallback) chaos: redis failover drill in staging
NFR-R5 Data loss Zero-loss for committed operations (durable writes); at-least-once for events; no silent drops Postgres durability (synchronous_commit=on default), event outbox reconciliation job test
NFR-R6 Pod/replica failure Killing any single api/worker/realtime pod causes < 30 s user-visible impact (LB health checks + graceful drain) k8s chaos: kubectl delete pod during load; assertion on error spike < 30 s
NFR-R7 Error budget policy Error budget (0.1 %) exhausted ⇒ feature freeze for non-reliability work (release process gate) Release checklist references SLO dashboard

4. Security (targets — design in security-architecture.md)

ID Requirement Target Measurement
NFR-SE1 OWASP ASVS Level 2 conformance ASVS L2 checklist (v4.0.3) executed in Phase 15 + dependency SCA (0 known critical/high unpatched, 30 d max patch SLA) + pen-test report filed
NFR-SE2 Authorization bypass 0 unauthorized reads/writes across the permission test matrix Integration suite: full decision matrix (role × resource × level) run against the live API — 100 % pass required (CI gate)
NFR-SE3 Injection 0 SQL/NoSQL/XSS command-injection vectors SQLi/XSS payloads in e2e security suite (parameterized queries via Prisma; output encoding); ZAP baseline scan (0 high) in CI
NFR-SE4 Secret hygiene 0 secrets in repo/history; all secrets from env/secret store gitleaks + trufflehog in CI (blocking); secret-scanning PR check
NFR-SE5 Auth endpoint abuse Rate limits hold: 5 000 brute-force attempts → ≤ 5 account lockouts bypasses = 0 Load test on /auth/login with credential stuffing simulation; assert 429s
NFR-SE6 File pipeline Malware sample (EICAR) blocked in 100 % of pipeline runs; 0 direct object key reads without permission Integration: EICAR upload test (phase-9 exit); signed-URL expiry test
NFR-SE7 Audit completeness 100 % of mandatory events (security-architecture §12) emitted for the audit test script Integration: run the audit scenario script, assert every event present in audit_logs
NFR-SE8 Transport 100 % of traffic TLS 1.2+ (1.3 preferred); HSTS max-age ≥ 1 year, includeSubDomains curl/TLS scanner in CI against staging; header assertions in e2e

5. Privacy & data retention

ID Requirement Target
NFR-P1 Tenant isolation No query may return rows outside the caller's workspace (proven by the cross-tenant test suite: 50 random cross-workspace request pairs, 0 leaks — CI gate)
NFR-P2 Data minimization API responses contain only fields the caller needs (DTO projections); no PII in logs (PII scrubber on log pipeline; test: seed identifiable strings, assert absent from Loki)
NFR-P3 Retention (platform defaults) Trash: 30 days → purge. Password reset tokens: 1 h. Verification tokens: 24 h. Webhook delivery payloads: 90 days. Automation logs: 180 days. Audit logs: 400 days (org policy override, NFR-P4). File objects: with the file row (purge job)
NFR-P4 Enterprise retention policies retention_policies (PURGE/HOLD, per scope) enforced by nightly job; HOLD prevents purge (litigation-hold); test: policy set → job run → rows purged/kept per policy (phase-14 exit)
NFR-P5 GDPR-style rights (self-host posture) Export (personal data per user) and delete (user + cascade) operations available to workspace owners; deletion is soft (30 d) then hard; both audited
NFR-P6 Cookies & tracking No third-party cookies; no analytics by default; first-party functional cookies only (session, csrf); documented in the cookie notice (enterprise deploys may disable the notice)

6. Backup & disaster recovery

ID Requirement Target Measurement
NFR-B1 Postgres backup WAL archiving continuous (PITR capable); base backup nightly Restore drill: PITR to a point 10 min before a seeded "incident" marker; data verified (row-count checksum) — quarterly in prod, monthly in staging (runbook in deployment.md §8)
NFR-B2 Object storage S3/MinIO versioning + cross-bucket (or cross-region) replication Restore drill: recover a deleted file to a prior version
NFR-B3 OpenSearch Snapshot repo (S3), snapshot hourly (delta) Restore drill: reindex from snapshot, verify doc count + sample query
NFR-B4 RPO ≤ 5 minutes (all data stores) Measured by t(now) - t(last consistent backup/WAL/Snapshot) during drills
NFR-B5 RTO ≤ 1 hour (full platform in a fresh cluster) DR drill: destroy the cluster, execute the documented restore runbook, time to "13 MVP flows pass in the restored environment"; target < 60 min, hard ceiling 2 h
NFR-B6 Backup integrity Every backup verified (restore test) within 24 h of creation; unverified backups are flagged in the backup dashboard Backup job emits backup.verified metric; alert if stale
NFR-B7 Secrets & config All config reconstructable from repo + secret store (IaC: terraform state encrypted); a fresh deployment from git + secret store works "Clone-to-cluster" drill (part of the DR drill)

7. Observability

7.1 Signals

Signal Standard Details
Traces OpenTelemetry (OTLP/HTTP) One service name per app (api, worker, realtime, web); spans on: HTTP handlers, services (domain ops), repositories (DB queries), queue jobs, WS operations, external calls (S3, OpenSearch, AI providers); sampling: 100 % errors, 10 % others (configurable)
Metrics Prometheus (pull) via otel bridge Histograms: http.server.request.duration (by route, code), db.query.duration (by op), queue.process.duration (by queue), ws.message.duration, search.query.duration, ai.request.duration, editor.interaction.duration (client → RUM); gauges: queue.depth, ws.connections, bus.consumer.lag, redis.pool.checked_out, pg.pool.checked_out; counters: events.published, webhooks.delivered (by status), audit.events (by action), files.uploaded (by status)
Logs Structured JSON (pino) → Loki Fields: ts, level, msg, service, request_id, user_id?, workspace_id?, route?, duration_ms?, error?; no secrets, no PII (scrubber); correlation via request_id (HTTP) and doc_id (realtime)

7.2 Required dashboards (Grafana)

  1. Overview (SLO burn, error rate, p95 latency, throughput, WS connections, queue depths).
  2. API (per-route latency/error, rate-limit hits, 4xx/5xx breakdown).
  3. Realtime (connections by workspace/room, message rate, p95 update latency, dropped messages, Redis update-log size).
  4. Queues (BullMQ per queue: waiting/active/completed/failed, processing time, DLQ depth).
  5. Search (query latency, index job throughput, consumer lag, OpenSearch cluster health).
  6. Storage (upload rate, pipeline stage durations, scan verdicts, storage used by workspace).
  7. AI (tokens in/out by workspace, cost estimate, provider latency/error, budget burn).
  8. Capacity (table row counts, DB connection pools, WS memory, disk).

7.3 Alert rules (initial set — full list in deployment.md §9)

Alert Condition Severity
API error rate > 1 % 5xx over 5 min page (critical)
API latency p95 > 500 ms over 10 min warn
SLO burn error budget 50 % consumed warn → page at 90 %
Queue backlog depth > 1 000 or oldest job > 5 min (search index), > 30 min (webhook) warn
DLQ any new dead-letter (automation/webhook) warn
WS saturation connections > 8 000 per realtime pod, or p95 update > 400 ms warn
Consumer lag events older than 30 s unprocessed warn
Disk > 80 % on any stateful volume warn → critical 90 %
Backup last successful backup/verify older than schedule × 2 critical
Certificate TLS expiry < 14 d warn
Realtime unreachable health check failing 3× critical
Virus detections > 0 in an hour (anomaly) warn
AI budget workspace budget 90 % consumed warn (to workspace admin)

8. Offline behavior (NFR-O series)

ID Requirement Target / rule
NFR-O1 Offline editing Full block editing works with network down; every keystroke applies locally < 50 ms (same budget as online — Yjs local ops are synchronous)
NFR-O2 Sync durability Offline edits survive browser restart (IndexedDB-persisted Yjs doc + mutation queue); no edit loss on crash (queue written before ack)
NFR-O3 Reconnect Within 30 s of connectivity return: full sync complete for ≤ 50 pending edits; user sees "Syncing…" then "All changes saved"
NFR-O4 Conflict handling CRDT: concurrent text edits merge automatically (0 user action); non-CRDT fields (title, property values): last-writer-wins + toast; deleted-record conflict: conflict dialog (keep my edit as new record / discard)
NFR-O5 Scope v1 offline = editor + read cache + mutation queue. Offline database queries are not supported (cached views read-only); offline file uploads queue and start on reconnect (NFR-O6)
NFR-O6 Queued uploads Files dropped offline hold a local preview (blob), upload starts on reconnect; user-visible state "Waiting for connection"

9. Maintainability

ID Requirement Target Measurement
NFR-M1 Test coverage — engine packages ≥ 90 % (line + branch) for packages/database-engine, packages/permissions, packages/editor (positions + codec), packages/shared (schemas) Vitest coverage gate in CI: build fails below threshold (coverageThreshold)
NFR-M2 Test coverage — apps ≥ 70 % line for apps/api (Jest), ≥ 60 % for apps/web components, 60 % apps/worker, 60 % apps/realtime Jest/Vitest coverage gate
NFR-M3 Engine coverage — formula 100 % of the 16 functions covered + fuzz suite (10 000 random valid/invalid expressions, 0 crashes, 0 hangs) dedicated fuzz job (nightly)
NFR-M4 Type safety strict: true everywhere; 0 any outside explicit // type-escape: <reason> comments (lint rule counts them, ratchet down only) typecheck + eslint gate
NFR-M5 Dependency hygiene 0 unreviewed new deps (PR justification required — coding-standards §10); majors bumped with a changelog entry + test pass; SCA: 0 critical PR template + Dependabot/renovate PRs reviewed as majors
NFR-M6 Module boundaries Import-boundary lint rules (coding-standards §3) pass with 0 exceptions file eslint import/no-restricted-paths in CI
NFR-M7 Build time Monorepo full CI (lint → typecheck → unit → build) < 15 min cold Turbo pipeline timing in CI; regression > 20 % flagged
NFR-M8 Docs currency Every merged feature PR updates: task file status, API docs (if API changed), and at least one of {product, ux, security, database} docs when behavior changed PR checklist (required tick) + CI check that docs/ or CHANGELOG.md touched (informational)

10. Browser & platform support

Platform Supported (v1) Notes
Chrome / Edge Latest 2 major (desktop) Primary test target
Firefox Latest 2 major (desktop)
Safari Latest 2 major (desktop + iPadOS)
Mobile browsers iOS Safari 16+, Android Chrome 115+ Responsive web (no app shell features: no offline on iOS Safari without PWA install — PWA manifest ships, install is optional)
Node (server) ≥ 20 LTS CI matrix: 20 + 22
Dropped IE 11, Safari 14-, Firefox ESR Explicitly unsupported; graceful "please update" screen via feature detection (not UA sniffing)

E2E matrix (Playwright): chromium + firefox + webkit on ubuntu-latest, desktop viewport 1440×900 + mobile 390×844 (phase-gated per task).

11. Internationalization readiness

ID Requirement Target
NFR-I1 String extraction 100 % of user-visible strings pass through the i18n wrapper (t("key")) — enforced by an eslint rule in apps/web (no raw string literals in JSX text); keys namespaced domain.area.item
NFR-I2 Dates/numbers All rendering via Intl.DateTimeFormat/Intl.NumberFormat with the user's locale + timezone (stored on users); database date properties always stored UTC, rendered in user TZ
NFR-I3 Plurals & gender ICU MessageFormat strings (plural categories); no hardcoded English in code paths (error codes stable, messages translatable)
NFR-I4 Layout No truncation of translated strings below 120 % length (component text overflow rules); RTL: not in v1 (logical CSS properties used so RTL is a token flip, documented)
NFR-I5 Search OpenSearch analyzers: en default + standard fallback; UI search is locale-aware but cross-language matching is not promised in v1
NFR-I6 Locale data Locale picker in user settings (v1: en-US only functional; the pipeline exists, translation catalogs are post-v1 — PR-166 is readiness)

12. Self-hostability (deployment posture)

ID Requirement Target
NFR-H1 One-command local pnpm install && pnpm docker:up && pnpm db:migrate && pnpm db:seed && pnpm dev from a clean clone works (Phase 0 exit criterion, re-verified in CI on every merge)
NFR-H2 Production from git A fresh Linux server (8 GB) can run the full platform from docker compose (all apps + infra) or Kubernetes manifests, with config only via env vars / secret store
NFR-H3 Resource floor Minimum supported production sizing: api × 2 (1 vCPU/1 GB each), realtime × 2 (1 vCPU/2 GB), worker × 2 (1 vCPU/2 GB), web × 2 (1 vCPU/1 GB), Postgres 4 vCPU/16 GB/100 GB, Redis 2 GB, OpenSearch 1 node 4 vCPU/16 GB, MinIO 100 GB — documented in deployment.md §2
NFR-H4 Upgrades Zero-downtime rolling deploy (k8s) or docker compose pull && up -d with migration step; backward-compatible API (v1 contract); upgrade runbook < 30 min (NFR-B5 sibling)
NFR-H5 Telemetry opt-out All telemetry (otel) disabled by default in self-host; enabling is a flag (OTEL_ENABLED), no data leaves the deployment

13. NFR → verification map (summary)

NFR group Primary proof Gate
NFR-1…12 (perf) tests/performance + e2e perf fixtures Phase 15 exit + nightly
NFR-S1…S6 Load profiles (Artillery/k6) Phase 15 exit
NFR-R1…R7 SLO dashboards + chaos integration tests Ongoing (staging SLO burn)
NFR-SE1…SE8 Security suites + ASVS audit + SCA/ZAP Phase 15 + every PR
NFR-P1…P6 Cross-tenant suite + retention integration tests Every PR (cross-tenant) / Phase 14
NFR-B1…B7 DR drills (runbook) Quarterly (prod)
NFR-O1…O6 Offline e2e (Playwright network emulation) Phase 7
NFR-M1…M8 CI coverage/lint/build gates Every PR
NFR-I1…I6 eslint i18n rule + locale integration tests Every PR
NFR-H1…H5 Phase 0 CI matrix + clone-to-cluster drill Every merge / quarterly