.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
testing.mddocs/development/testing.md← development34,955 B← Back to the app

Testing Strategy — AI Software Factory

The testing contract for the whole monorepo. Strategy: a pyramid — many fast unit tests around the pure engines, a meaningful integration layer against real infrastructure, and a small number of end-to-end flows that prove the product works as a user experiences it. Coverage and engine mandates are NFRs (NFR-M1…M4 in non-functional-requirements.md §9). Related: development-guide.md §5 (commands), ../product/functional-requirements.md (what is being tested), AGENTS.md Definition of Done (every feature needs unit + integration + e2e where applicable).


1. Strategy pyramid

            ┌──────────────┐
            │     E2E      │  Playwright, tests/e2e
            │  (13 MVP     │  full stack, 3 browsers + mobile viewport
            │   flows +    │  nightly + every PR (chromium), full matrix
            │   regressions)│ on release branches
           ┌───────────────────────┐
           │     Integration       │  Jest + Testcontainers, tests/integration
           │ API + real PG/Redis/  │  permission matrix, cross-tenant, audit
           │ OpenSearch/MinIO/WS   │  completeness, events, pipelines
         ┌───────────────────────────────┐
         │            Unit               │  Vitest (packages) + Jest (apps/api)
         │ engines, services, codecs,    │  co-located *.test.ts / *.spec.ts
         │ schemas, guards (mocked deps) │  run on every commit, < 2 min
         └───────────────────────────────┘
        (below the pyramid: typecheck, lint, SCA, secret scan — CI gates)

Allocation rule: the harder something is to observe, the lower in the pyramid it must be tested. A formula bug is caught in a 5 ms unit test, not a 30 s e2e test. E2E proves wiring, unit tests prove logic.

Layer Tool Location Runtime target Fails CI when
Unit (packages) Vitest + @testing-library/react (ui/editor) packages/*/**/*.test.ts(x), co-located < 90 s all packages any failure or coverage below NFR-M1/M2 thresholds
Unit (api) Jest + supertest (controller level, mocked repos) apps/api/**/*.spec.ts, co-located < 60 s any failure or coverage < 70 % (apps)
Integration Jest + Testcontainers (postgres, redis, opensearch, minio) + real Nest app tests/integration/** < 10 min any failure
E2E Playwright tests/e2e/** < 15 min (chromium) any failure (chromium); other browsers: release gate
Performance k6 (HTTP) + Artillery (WS) tests/performance/** < 20 min pass-criteria breach (nightly + Phase 15 gate)
Security SCA (pnpm audit + OSV), gitleaks, ZAP baseline, axe (in e2e) .github/workflows + tests/e2e/a11y in CI critical SCA / secret / axe critical/serious

2. Unit testing

2.1 Tooling & config

Run: pnpm test:unit (Turbo, all workspaces). Single file: pnpm --filter @factory/database-engine exec vitest run formula.

2.2 Where tests live

Co-located, mirroring source: src/formula/evaluator.ts → src/formula/evaluator.test.ts. Shared fixtures per package under src/**/*.fixtures.ts or test/fixtures/ inside the package. No test file may import from another package's test/ directory (fixtures are re-used via packages/shared/test-utils when shared).

2.3 Mocking rules (the contract)

Rule Statement
U1 Unit tests of services mock repository interfaces, never Prisma directly. Every domain service depends on a *Repository interface (implemented in apps/api/src/common/repositories/*Prisma). In a unit test the service receives a stub/mock of that interface (Vitest vi.fn() / Jest jest.fn()). No PrismaClient import appears in any unit test file (enforced by eslint no-restricted-imports in *.test.ts files).
U2 Real Postgres is the job of integration tests (Testcontainers). If a unit test needs "the database", that is a design smell — refactor to a repository interface.
U3 Engines are pure: database-engine (filters, formulas, positions, rollups, view query) and permissions (decision logic) have no mocks at all — they take plain data and return plain data. Their tests are golden/property tests on real inputs.
U4 External I/O is mocked at the client boundary: OpenSearch client, S3 client, SMTP, AI provider, HTTP for webhooks. Mock the interface (SearchIndexer, FileStorage, MailSender, AiGateway, HttpClient), not fetch/axios.
U5 Time is injected (now: () => Date parameter or a test clock via vi.useFakeTimers) — no test may depend on wall-clock timing except where the SUT is a timer.
U6 No network in unit tests, ever (Vitest server.deps off + a CI guard that unit jobs run with networking disabled).
U7 Async: no setTimeout-based sleeps in assertions; use vi.waitFor/Jest waitFor on state.
U8 Error paths: every service method has a test for its typed ApiError cases (NOT_FOUND, VALIDATION_ERROR, PERMISSION_DENIED, CONFLICT) — the error code is part of the contract.

2.4 Coverage gates (NFR-M1/M2, enforced in CI)

Scope Line Branch Function
packages/database-engine, packages/permissions, packages/editor (positions, codec), packages/shared 90 % 85 % 90 %
apps/api 70 % 60 % 70 %
apps/web (components+hooks) 60 % 50 % 60 %
apps/worker, apps/realtime 60 % 50 % 60 %

3. Engine test mandates

These are named suites with their own acceptance criteria; they are the load-bearing logic of the product and get the strictest treatment.

3.1 Formula engine (packages/database-engine/formula)

3.2 Permission engine (packages/permissions)

3.3 Fractional positions (packages/editor/positions)

3.4 Filter / sort / group (packages/database-engine/query)

3.5 Yjs ↔ block-tree codec (packages/editor/codec + packages/collaboration)

3.6 Other mandated unit suites

4. Integration testing

4.1 Infrastructure: Testcontainers

tests/integration/testcontainers.ts starts, per test module (reuse via a module-scoped setup):

Container Image Used for
Postgres postgres:16-alpine every test (migrations applied via prisma migrate deploy on a temp db)
Redis redis:7-alpine event bus, rate limits, permission cache, queues
OpenSearch opensearchproject/opensearch:2.x (security disabled) search indexer + query tests
MinIO minio/minio file pipeline tests
(ClamAV — Phase 9) clamav/clamav scan-stage tests (EICAR sample)

The Nest app is booted for real (Test.createTestingModule with the real modules, Testcontainer URLs injected via env) — guards, pipes, interceptors, event bus, and repositories all live in this layer. The web app is not booted (that's e2e).

4.2 Fixtures & harness

4.3 Mandatory integration suites

Suite Proves (maps to)
auth/ register→verify→login→refresh-rotation→replay-revocation, password reset, sessions, rate limits (NFR-SE5), audit events (PR-001…010)
tenancy/ cross-tenant matrix: 2 workspaces × 50 random (actor, resource) request pairs → 0 leaks (NFR-P1, CI gate); personal workspace auto-creation; invitation lifecycle; last-owner protection
permissions/ the decision matrix executed against the live API (every cell: allowed ↔ 2xx, denied ↔ 403 + audit row) (NFR-SE2)
pages/ CRUD, nesting, fractional order across concurrent moves (2 clients interleaving inserts — final order consistent), trash/restore/purge cascade, versions, public share link (password/expiry)
databases/ records-as-pages (1:1 invariant), 100-record batch create, query endpoint = golden outputs, view CRUD, property type validation (22 types × valid/invalid value), relation link/unlink both sides + cardinality enforcement, rollup recompute on record.updated event (event-driven, no poll), formula recompute on dependency change, button action execution + audit
files/ full pipeline happy path (upload→scan→metadata→thumb→READY), EICAR → VIRUS_DETECTED + not servable (NFR-SE6), signed-URL expiry, mime-mismatch rejection, 50 MB multipart, versioning, per-file permission override
search/ event→index lag < 30 s, full-text/prefix/fuzzy, permission-filtered results (grant revoked → doc disappears from results within 30 s), reindex job, 503 graceful degradation (NFR-R3)
comments/ threads on page/block/record/selection, resolve/reopen, reactions dedup, mention → notification + mention_notifications read state
forms/ public unauthenticated submission → record + form.submitted event, validation rejection (server-side), closed form → 410, rate limit 10/15 min/IP
automations/ record-created → status change E2E-ish (trigger→condition→action), retry/backoff (force 3 failures → succeeds on 4th), dead-letter after exhaustion, run history rows + logs, paused automation ignored, schedule trigger with fake clock
webhooks/ signature correctness (recomputed in test), retry with backoff (flaky receiver: fail 2× then 200), delivery log rows, SSRF rejection (private IP URL), event fan-out to multiple subscriptions
api-keys/ key create (raw shown once) → hashed at rest (DB assert), scope enforcement (READ key → 403 on write), revocation, per-key rate limit
audit/ run the audit scenario script → assert all mandatory events present with actor/ip/ua/resource fields (NFR-SE7)
retention/ (Phase 14) policy set → job run → purged/kept per scope; HOLD blocks purge
realtime/ two WS clients join a doc room → edit converges; presence heartbeat + stale prune (fake time); resume after reconnect (update log); permission: guest with VIEW can join read-only (updates rejected)

4.4 File-upload fixture conventions (Phase 9, TASK-0105)

The files security suite has four non-obvious fixture rules:

4.5 Local dev-stack relaunch gotchas (Phase 9, recorded 2026-09-30)

If the local pnpm dev (turbo) stack is killed and relaunched app-by-app (rather than via turbo run dev), four env/infra traps silently break the e2e suite — none show up in the API's own logs:

5. E2E testing (Playwright)

5.1 Project config (tests/e2e/playwright.config.ts)

Project Browser / viewport Runs
chromium Chrome, 1440×900 every PR (CI) + nightly
firefox 1440×900 nightly + release branch
webkit 1440×900 nightly + release branch
mobile chromium, 390×844 (touch) nightly + release branch
a11y chromium, 1440×900, axe-core injected every PR (MVP flows only)

Common config: testDir: 'tests/e2e/specs', workers: 4, retries: 1 (CI only), timeout: 30 s, expect.timeout: 5 s, trace: 'retain-on-failure', screenshots: 'only-on-failure', video: 'retain-on-failure'.

Stack boot (tests/e2e/global-setup.ts): docker infra up (idempotent), prisma migrate deploy + a dedicated e2e seed (small: 2 workspaces, 3 users, 1 database with 20 records, 1 public page, 1 form), api + worker + realtime started as child processes (or containers) with NODE_ENV=test, OpenSearch pre-indexed. Teardown kills the processes. The e2e suite never touches the dev seed.

5.2 Auth via storageState

5.3 The 13 MVP flows

These 13 specs are the MVP acceptance set (each ≈ one user journey; all must pass on chromium for the MVP release; AGENTS.md DoD requires an E2E test per feature, so feature specs are added on top of these):

# Flow (spec file) Proves (PR refs)
1 01-register-verify-login.spec.ts — register → verify email (token from outbox) → land in personal workspace → login again → session appears in security settings PR-001…005, 013
2 02-workspace-invite.spec.ts — owner creates workspace → invites member's email → member registers/accepts → sees workspace + role; invitation revoke path PR-014…018
3 03-page-tree-trash.spec.ts — create page → nest child → rename → favorite → delete → restore (position preserved) → purge (owner) PR-025…028, 030
4 04-editor-blocks-dnd.spec.ts — type text → slash menu: heading, todo, quote, callout, divider, code → drag-reorder 2 blocks → nest into toggle → multi-block drag → undo/redo → reload → order persists PR-034…036, 045, 050, 051, 043
5 05-editor-menus-keyboard.spec.ts — right-click block menu (turn into, duplicate, color), page menu (duplicate, move), keyboard: ⌘B/I/U, ⌘⇧1/2/3, ⌘Z/⇧⌘Z, ⌘A ladder, ⌘K palette navigation PR-041, 048, 049
6 06-editor-paste-external.spec.ts — copy markdown from an external textarea (clipboard API) → paste → blocks created (heading/list/todo/table); copy block → paste into another page PR-043
7 07-database-table-crud.spec.ts — slash /database → add properties (number, select, date, checkbox) → add 3 records inline → edit cells (commit/revert) → archive → duplicate PR-057…061, 062, 074
8 08-database-board.spec.ts — add Board view → columns from Status → create card in "To Do" → drag to "Done" (property updated, row in table reflects) → filter on board PR-064, 053, 071
9 09-database-filter-sort-group.spec.ts — table: nested filter (OR inside AND) → row set matches expected ids → 2-key sort (nulls) → group by select → group counts correct PR-071…073
10 10-relations.spec.ts — create Tasks db → add Relation property (1:N, bidirectional) → link 2 tasks to a project from both sides → reverse list updates → unlink PR-075, 076
11 11-search.spec.ts — edit page title/content → wait ≤ 30 s → global search finds it (highlight) → type filter → guest (no grant) does not see the page in results PR-098…104
12 12-files.spec.ts — upload image via OS-drag simulation (input fallback) → pipeline to READY (progress UI) → insert into block → resize → download (signed URL) → file trash PR-105…110
13 13-comments-mentions.spec.ts — comment on a block → @mention second user → second user's inbox shows notification → reply → resolve → react PR-091…096

Additional standing e2e specs: public-share.spec.ts (public URL, password, expiry, duplicate), offline.spec.ts (Phase 7: edit offline → reconnect → sync), realtime-two-browsers.spec.ts (Phase 7), audit-visual.spec.ts (Phase 14), a11y/ (axe over the 13 flows: 0 critical/serious).

5.4 AGENTS.md DoD → test matrix

Every feature task's Definition of Done maps to tests as follows (checked in the task file):

DoD item Where it's proven
Backend + frontend implemented unit (service) + feature e2e
Database migration integration (migrate deploy + schema assertion)
API validation unit (schema) + integration (400 with field errors)
Authorization integration permission matrix cell + e2e role pair
Error handling unit (ApiError cases) + e2e (error states)
Loading / empty state e2e (expect skeleton → content; empty-state text)
Mobile behavior mobile project spot-checks (≥ 1 spec per phase touching layout)
Accessibility a11y project (axe) + manual checklist for new components
Unit / integration / E2E tests this document's gates
Documentation / logging / audit docs CI check; integration (log field assertions); audit suite

6. Performance testing

6.1 Scripts (tests/performance/)

Script Tool Scenario
api-load.js k6 80/20 read/write mix over the recorded endpoint set (pages, db query, search, comments); ramp 0 → 1 000 rps over 5 min, hold 30 min
search-latency.js k6 1 000 queries against the 1M-doc fixture index; per-analyzer variants (full/prefix/fuzzy)
db-query.js k6 POST /databases/:id/query on the 100k-record fixture: paged reads, filtered reads, 100-record batch writes (NFR-11)
upload.js k6 50 MB multipart × 20 VUs (NFR-9)
ws-load.js Artillery 10 000 WS connections across 100 rooms (100/room); 10 % of clients edit at 2 updates/s; 30 min (NFR-S2); measures p95 apply latency + connection stability
realtime-latency.js Artillery + client probe 2-peer per room, 500 edits, latency A→B (NFR-6)
event-bus.js k6 (producer) + metrics 5 000 events/s for 5 min → consumer lag assertion (NFR-S4)

Fixtures: tests/performance/fixtures/ — generator scripts produce the 100k-record database, 100k-block page, and 1M-doc OpenSearch index (same generators as the integration fixtures, larger scale).

6.2 Load profiles & pass criteria

Profile When Pass criteria (from the NFR doc)
smoke (2 min) every PR (api only, 50 VUs, 2 min) error rate < 0.5 %, p95 < 2× budget (soft gate, advisory)
standard (35 min) nightly NFR-5 (p95 < 300 ms @ 1k rps), NFR-4 (search p95 < 500 ms), NFR-9 (upload), error < 0.1 %
scale (60 min) release branch + Phase 15 gate NFR-S2 (10k WS, p95 < 200 ms, pod mem < 2 GB), NFR-S3, NFR-S4, NFR-11
soak (4 h) Phase 15 gate + quarterly no memory growth > 10 % over the window (leak check), no connection drops, lag stable

Reports: k6/Artillery JSON + HTML to artifacts/perf/ (CI upload); a comparison against the previous run is posted to the PR (regression > 10 % on any target metric = failing check on the scale profile).

7. Security testing

Check Tool Gate
Dependency SCA pnpm audit --audit-level=critical + OSV API on lockfile blocking (critical)
Secrets in repo/history gitleaks + trufflehog blocking
Web attack baseline ZAP baseline scan against staging (auth flow scripted) blocking on High+ findings
Payload suite tests/e2e/security/: SQLi (every string input), XSS (block content, comments, titles, share tokens), path traversal (file names), CSRF (state change without token), IDOR (cross-workspace ids) blocking
Permission matrix integration permissions/ suite (NFR-SE2) blocking
Accessibility axe-core in the a11y project (0 critical/serious) blocking on MVP flows
ASVS L2 manual + tool-assisted audit (Phase 15) release gate

8. CI pipeline mapping

Repo: GitHub Actions (.github/workflows/ci.yml). Jobs run in a fixed order (dag), on a ubuntu-latest runner with Docker (for Testcontainers + e2e stack):

install ──► lint ──► typecheck ──► unit ──► integration ──► build ──► security ──► e2e ──► (merge)
                │            │           │            │              │           │           │
                │            │           │            │              │           │        perf-smoke
                │            │           │            │              │           └──► (main/nightly: perf-standard)
                └── shared cache (pnpm store, turbo cache)
Stage Runs Fails PR on
install corepack enable, pnpm install --frozen-lockfile any
lint eslint (all workspaces, incl. import-boundary + i18n + no-eval + no-secrets rules) + prettier check any
typecheck turbo run typecheck (strict) any
unit turbo run test:unit with coverage → coverage gates (NFR-M1/M2) any failure / below threshold
integration pnpm test:integration (Testcontainers, workers=2) any
build turbo run build (all apps + packages) any
security SCA + gitleaks + (on staging deploy) ZAP baseline critical SCA / secret / High ZAP
e2e pnpm test:e2e chromium + a11y project, full stack from global-setup any chromium/a11y failure
perf-smoke tests/performance smoke profile (advisory) — (comment only)
nightly (schedule) e2e full browser matrix (firefox/webkit/mobile) + perf-standard + formula fuzz (10k) posts report; blocks release branch promotion
on main (post-merge) release build (docker images tagged sha-<short>), deploy to staging, SLO dashboard refresh deploy failure pages on-call
release branch perf-scale + soak + DR drill checklist (quarterly) Phase-gate (Phase 15 exit)

Artifact retention: e2e traces/videos 14 d, perf reports 90 d, docker images 30 d.

9. Test authoring rules

  1. Name by behavior: describe("formula: dateAdd") → it("adds months crossing year and leap day"). No test1, no "works".
  2. One behavior per it; arrange-act-assert in one screen; no more than 2 assertions per it (split otherwise) — except matrix suites which iterate the matrix in a loop.
  3. Stable IDs in fixtures (cuid or literal) so failure reports are debuggable; generated ids are logged with the failing assertion.
  4. No test may depend on test order or wall clock (fake clocks, unique slugs, clean fixtures).
  5. Fix the code, not the test: a failing golden test means either a bug or an intended behavior change — the latter requires updating the golden file + the functional requirement in the same PR (with reviewer sign-off on the diff of expectations).
  6. Flaky = P1 bug: any test with ≥ 2 CI flakes in a week gets an issue; flaky e2e specs are quarantined (test.fixme with issue link) and tracked in docs/tasks/ until fixed.
  7. Every bug fix ships with a regression test at the lowest pyramid level that catches it (AGENTS.md rule 9).
  8. Coverage is a floor, not a goal: 90 % with meaningless assertions is worse than 80 % with the matrix suites — reviewers reject assertion-free coverage padding.