.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
audit-report.mddocs/security/audit-report.md← security26,705 B← Back to the app

AI Software Factory — Security Audit Report (TASK-0134)

Standard: OWASP Application Security Verification Standard (ASVS), Version 4.0.3, Level 2. Scope: The ai-software-factory monorepo — apps/{api,web,worker,realtime}, packages/*, prisma/, tests/*, CI (.github/workflows), and the four Docker images. Method: A structured L2 audit across dependencies, secrets, auth paths, permissions (differential fuzzing vs a brute-force oracle), transport/headers (CORS/CSRF/CSP), file-upload abuse, formula-engine fuzzing, and rate-limit verification. Every control below was checked against the running stack (API :4000, web :3000, realtime :4001, PostgreSQL 16, Redis 7, OpenSearch 2, MinIO) and/or the source tree; each finding has a status and a linked regression test.

How to read the status column. pass = control satisfied and proven by a test. N-A (justified) = the control does not apply to this platform, with the reason stated. fixed / mitigated / accepted = a finding (see §4) resolved to that state. The cross-check suite tests/security/audit-report.test.ts enforces that every control row has a status and that every finding row has a status + an existing regression-test path, and that the findings table is append-only (deletions forbidden) and signed.


1. Verification requirement areas (ASVS 4.0.3, Level 2)

The 16 ASVS verification requirement areas (V1–V16) are each assessed at Level 2. Controls marked L2 are the ones in scope; controls that only exist at L1 are satisfied by construction (L2 ⊇ L1).

V1 — Architecture, Design and Threat Modeling

L2 Control Status Evidence / justification
L2 V1.1.1–V1.1.3 Threat model exists and is maintained pass docs/security/security-architecture.md is the threat-model home; updated with the new controls in this task (op-limit, cookie centralization, log scrubber, new rate buckets).
L2 V1.2.1–V1.2.3 Security requirements defined per feature pass Each phase task spec carries a ## Security section; this task's DoD is the L2 checklist.
L2 V1.3.x Secure design decisions documented pass Key decisions recorded as findings (F-107 CSRF model, F-122 test-image N/A) and in security-architecture.md.

V2 — Security Requirements

L2 Control Status Evidence / justification
L2 V2.1.x Functional security requirements traceable pass Roadmap + task specs; the audit maps controls to tests.
L2 V2.2.x Threat analysis for new features pass New rate buckets, log scrubber, and image scan each have a finding + test.

V3 — Authentication

L2 Control Status Evidence / justification
L2 V3.1.1 Access tokens use a minimal, non-sensitive claim set pass tests/security/auth-paths.test.ts asserts the access JWT claims (sub, workspaceId, authMethod, iat/exp 15 min).
L2 V3.1.2 Token algorithm pinned; alg:none rejected pass auth-paths.test.ts — a crafted alg:none token is rejected 401 before signature verification.
L2 V3.2.1 Refresh-token rotation with reuse detection revokes the family pass auth-paths.test.ts — rotate, reuse an old token → whole family 401s.
L2 V3.2.2 Session identifier changes on privilege change (fixation) pass auth-paths.test.ts — each login mints a fresh session id + fresh refresh cookie; no pre-login cookie to fixate.
L2 V3.4.x Password policy + hashing pass Enforced at register (Phase 1); bcrypt/argon2 in apps/api (unit-tested).
L2 V3.5.x SSO / OAuth / SAML pass Phase 14; auth-paths.test.ts covers the OAuth redirect_uri allowlist + state/nonce (exempt from CSRF by credential type).

V4 — Session Management

L2 Control Status Evidence / justification
L2 V4.1.x Session cookie flags (Secure/HttpOnly/SameSite/Path) pass auth-paths.test.ts asserts every Set-Cookie carries Path=/; HttpOnly; SameSite=Lax (+Secure in prod) from the single source apps/api/src/common/cookies.ts.
L2 V4.1.3 CSRF protection on state-changing routes accepted (F-107) Deviation from the spec's double-submit token: the web app uses an in-memory Bearer access token (never a cookie) for all state-changing calls; the only cookie-auth route is POST /auth/refresh (the 401 retry), which is SameSite=Lax (not sent on cross-site POST). A cross-origin page cannot read the in-memory Bearer. Recorded as finding F-107 (AGENTS rule 29); coverage proven by the CSRF route-walk in auth-paths.test.ts (100% of state-changing web routes go through the Bearer client).
L2 V4.2.x Session timeout / absolute expiry pass Access tokens exp in 15 min; refresh rotation bounds the long-lived session (Phase 1).
L2 V4.3.x Concurrent session management pass Per-user refresh families; revocation cascades (see V3.2.1).

V5 — Access Control

L2 Control Status Evidence / justification
L2 V5.1.1 Authorization enforced server-side on every route pass RBAC + resource permissions in packages/permissions; every handler resolves the level before acting (Phase 2/3).
L2 V5.1.2 No frontend-only authorization pass DoD "no app-code imports from tests/" + rule 19; the engine is the sole authority (fuzz-verified below).
L2 V5.2.x Fine-grained resource permissions match an independent oracle pass tests/security/permission-fuzz.test.ts — 10,000 fast-check worlds; the engine agrees with the brute-force oracle tests/security/oracle.ts on the final level (0 mismatches, fixed seed; SEC_FUZZ_SEED=random in nightly).
L2 V5.3.x Default-deny pass Unresolved level ⇒ no access; verified by the fuzz oracle (a resource with no grants is Guest).

V6 — Validation and Error Handling

L2 Control Status Evidence / justification
L2 V6.1.x All input validated server-side pass Zod schemas per controller (ZodValidate); auth-paths.test.ts + integration suites exercise validation errors.
L2 V6.2.1 Errors use a canonical envelope; no stack/SQL leakage to clients pass AllExceptionsFilter maps everything to {error:{code,message,requestId}}; a forced 500 returns a generic message (the stack is logged server-side, scrubbed — F-121).
L2 V6.3.x Formula / expression input validated by a safe parser pass tests/security/formula-fuzz.test.ts — 10,000 random expressions over the engine grammar; every eval completes or returns a typed error (FORMULA_TIMEOUT / FORMULA_ERROR); no crash, no hang.
L2 V6.4.x No arbitrary JS execution for formulas pass The engine is a safe AST evaluator (packages/database-engine), never eval/Function (rule 18).

V7 — Cryptographic Storage

L2 Control Status Evidence / justification
L2 V7.1.x Sensitive data at rest encrypted with approved ciphers pass AES-256-GCM (apps/api/src/lib/crypto.ts), random 12-byte IV per op; unit-tested roundtrip + fresh-IV.
L2 V7.2.x Key material from environment only, never in source pass MASTER_ENCRYPTION_KEY from .env (.env.example documents it); no key in source (gitleaks-verified).
L2 V7.3.x KMS-backed wrapping for webhook secrets pass Automation webhook secrets are KMS-wrapped (secretEncrypted) on create (Phase 13).

V8 — Data Protection

L2 Control Status Evidence / justification
L2 V8.1.x Secrets redacted from logs fixed (F-121) apps/api/src/common/log-scrubber.ts + wiring in AllExceptionsFilter; regression test apps/api/src/common/log-scrubber.test.ts (Bearer/JWT/factory-token/cred-param/cookie all redacted; innocent strings untouched).
L2 V8.2.x PII handled per policy pass Email stubs do not log bodies beyond a preview; audit events are structured (rule 27).
L2 V8.3.x No secrets in build artifacts or images fixed (F-120) Root .dockerignore excludes .env/.git/node_modules/keys; tests/security/images.test.ts + the CI image scan assert no .env and no gitleaks finding in any of the 4 image rootfs.

V9 — Communication

L2 Control Status Evidence / justification
L2 V9.1.1 All external communication over TLS (production) pass Deployment is behind a TLS terminator; HSTS is emitted in production (see V10).
L2 V9.1.2 TLS version / cipher enforcement (production) pass Termination layer enforces TLS 1.2+; the app does not terminate TLS directly (N-A at the app tier, enforced at the edge).
L2 V9.2.x Webhook / delivery URLs validated (SSRF guard) pass TASK-0130 delivery-URL guard + OAuth redirect_uri allowlist re-verified in auth-paths.test.ts.

V10 — HTTP Headers

L2 Control Status Evidence / justification
L2 V10.1.1 CSP default-src 'self', no unsafe-eval, frame-ancestors 'self' pass tests/security/headers.test.ts crawls HTML routes; CSP asserted on the single source packages/shared/src/security-headers.ts. swagger-ui runs from same-origin static assets under a scoped CSP (recorded).
L2 V10.1.2 X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, minimal Permissions-Policy pass headers.test.ts asserts all three on the crawled routes.
L2 V10.1.3 HSTS (production) pass headers.test.ts — HSTS is present in production and explicitly absent in dev (plain-HTTP :4000 must not set it).
L2 V10.2.x CORS restricted to configured origins; no * with credentials pass headers.test.ts — a disallowed origin gets no Set-Cookie echo and no readable auth headers; no Access-Control-Allow-Origin: * with Allow-Credentials: true.

V11 — Files and Web Uploads

L2 Control Status Evidence / justification
L2 V11.1.x Content type sniffed (magic bytes), not trusted from the client pass tests/security/upload-abuse.test.ts — polyglot files are served with the stored MIME, not the client's header.
L2 V11.1.1 Non-renderable types served with Content-Disposition: attachment pass upload-abuse.test.ts.
L2 V11.2.x Path-traversal (zip slip) rejected pass upload-abuse.test.ts — zip entries with ../../ are rejected by the path validator (v1 has no zip-extract pipeline; the validator guarding any future reference is asserted — N-A-with-guard recorded).
L2 V11.3.x Size cap enforced at presign (413) pass upload-abuse.test.ts — a 501 MB upload (plan cap 500) is rejected 413 at presign.
L2 V11.4.x Slow-loris / drip-feed upload terminated + partial purged pass upload-abuse.test.ts — a 5 s test timeout terminates the drip-feed; the partial is purged (no orphan object) and the File row is FAILED.
L2 V11.5.x Uploaded content virus-scanned pass ClamAV (clamav:3310) in the upload pipeline (Phase 9).

V12 — Business Logic

L2 Control Status Evidence / justification
L2 V12.1.x Rate limiting on all public/third-party endpoints pass tests/security/rate-limits.test.ts — auth, API (user/key/IP), incoming-webhook (60/min per webhookId), and public-form (5/min per IP+form) buckets each return the documented 429 + Retry-After at the documented value. The two new buckets are implemented this task (webhook 60/min; form 5/min — stricter than the spec's 20/min example, delta recorded in docs/api/authentication.md §11).
L2 V12.2.x Formula evaluation bounded (no unbounded time/memory) pass The AST evaluator enforces EVAL_OP_LIMIT=100_000 ops + a cooperative EVAL_TIMEOUT_MS=50 wall-clock backstop (packages/database-engine/src/formula/types.ts); formula-fuzz.test.ts proves the pathological family hits FORMULA_TIMEOUT, not a hang.
L2 V12.3.x Idempotency / replay protection pass Idempotency middleware (apps/api/src/common/middleware/idempotency.ts) + webhook replay-nonce (Phase 13).

V13 — Configuration Settings

L2 Control Status Evidence / justification
L2 V13.1.x Secure defaults; no debug/verbose in production pass NODE_ENV=production gates debug logging + HSTS/Secure (verified by headers.test.ts).
L2 V13.2.x Dependencies audited; no new high/critical in the runtime tree pass tests/security/deps.test.ts — pnpm audit --json --prod high/critical set exactly equals the documented allowlist exceptions (docs/security/license-allowlist.md §4); a new high (tar@4.4.16 fixture) fails the gate. CI runs pnpm audit --audit-level=high.
L2 V13.2.1 License allowlist enforced pass deps.test.ts — every distinct license in pnpm licenses ls --json is on the allowlist or a documented exception.
L2 V13.3.x Secrets out of source (gitleaks over full history + artifacts) pass tests/security/gitleaks-config.test.ts + the CI gitleaks protect over full git history with the pinned v8.18.4 config + gitleaks-baseline.json (each entry a tracked remediation). A new secret fails the build (proven by the planted-fixture test).
L2 V13.4.x Build artifacts / images free of secrets fixed (F-120) Root .dockerignore + the CI image-rootfs scan (4 images) assert no .env / no gitleaks finding.

V14 — Malicious Code Protection

L2 Control Status Evidence / justification
L2 V14.1.x No eval/Function/setTimeout(string) for user data pass Formula engine is a safe AST evaluator (rule 18); no arbitrary JS (grepped across apps/+packages/).
L2 V14.2.x XSS: content sanitized + server-rendered escaping pass The Phase 4 sanitizer matrix + server-side escaping (Next.js auto-escapes); re-verified by headers.test.ts (CSP default-src 'self' as a backstop).
L2 V14.3.x File upload cannot execute in a web context pass Uploads stored in S3/MinIO with stored-MIME + attachment disposition (V11); not served from an executable path.

V15 — Logging, Monitoring and Intrusion Detection

L2 Control Status Evidence / justification
L2 V15.1.x Security events audited (login, permission change, sharing, upload, key creation, automation run) pass Audit service writes structured events (rule 27); integration suite audit-completeness.integration.test.ts.
L2 V15.4.x No secrets/PII in logs fixed (F-121) log-scrubber.ts redacts Bearer/JWT/factory-token/cred-param/cookie from the request-coupled log boundary; regression test in apps/api.
L2 V15.2.x Centralized, tamper-evident logging pass Structured JSON to stdout/stderr, collected by the platform logger (worker audit export to S3, Phase 13).

V16 — Business Functionality Testing

L2 Control Status Evidence / justification
L2 V16.1.x Security-relevant functionality has E2E coverage pass tests/e2e (Playwright) covers the auth flow + the CSRF surface; the security suites add live black-box coverage.
L2 V16.2.x Rate limits + 429 contract verified end-to-end pass rate-limits.test.ts drives real requests to the live endpoints to the 429 boundary.

2. Test suites (the 10 deliverable suites)

# Suite Path Covers Live?
1 dependency audit + license allowlist tests/security/deps.test.ts pnpm audit high/critical gate, license allowlist, new-high fixture no (pnpm)
2 secrets scan config + baseline + CI tests/security/gitleaks-config.test.ts pinned ruleset unweakened, *_test_* pattern allowlist, baseline = tracked remediation, planted-secret detection + re-arm, CI wiring binary-gated
3 auth path review tests/security/auth-paths.test.ts alg-pinning, refresh-reuse family revocation, fixation, cookie flags, CSRF route-walk live
4 permission differential fuzz tests/security/permission-fuzz.test.ts 10,000 worlds vs the brute-force oracle oracle.ts no (engine)
5 headers / CORS / CSRF / CSP tests/security/headers.test.ts every crawled route: CSP, nosniff, referrer-policy, Permissions-Policy, HSTS(prod), CORS live
6 file-upload abuse tests/security/upload-abuse.test.ts polyglot MIME, zip-slip, 501 MB 413, slow-loris purge, ClamAV live
7 formula-engine fuzz tests/security/formula-fuzz.test.ts 10,000 expressions, 100k-op / 50 ms guard → FORMULA_TIMEOUT no (engine)
8 rate-limit verification tests/security/rate-limits.test.ts auth/API/webhook(60)/form(5) buckets → 429 + Retry-After at documented values live
9 image secret scan tests/security/images.test.ts 4 Dockerfiles copy no secret, .dockerignore present, CI rootfs scan, docker-gated live build+scan docker-gated
10 report cross-check tests/security/audit-report.test.ts this report exists, ASVS areas present, findings table complete + append-only + signed no (static)

All 10 run in the CI security stage (after build, before e2e), against a running dev stack with SEC_REQUIRE_LIVE=1 so a down stack fails rather than skips.


3. Rate-limit buckets (documented values)

Bucket Key Limit Source
auth (login/register/reset) rl:auth:<user|ip> 10/min apps/api/src/config/env.ts (default; raised in CI)
api (per user/IP) rl:api:<user|ip> 100/min apps/api/src/config/env.ts (default; raised in CI)
API key window per key 600/min or key.rateLimit public API (Phase 13)
incoming webhook (per webhookId) auto:webhook-rate:<id> 60/min (NEW) packages/shared/src/automation.ts (WEBHOOK_RATE_PER_MINUTE)
public form (per IP + form) form:rl:{slug}:{ip} 5/min (NEW) apps/api/src/modules/forms/rate-limit.ts (FORM_SUBMIT_LIMIT)

Spec delta (recorded, AGENTS rule 29): the spec's example value for public-form is 20/min/IP+form; this task ships the stricter 5/min (a public form accepting more than a handful of submissions per minute per IP is an abuse signal). The stricter value is pinned in rate-limits.test.ts and documented in docs/api/authentication.md §11. Weakening it would require a new finding + justification. The incoming-webhook bucket matches the spec (60/min).


4. Findings (append-only register)

Every finding has {id, asvs-ref, severity, status, fix-task, regression-test}. Rows are append-only: a status change is recorded with a date; deleting a row is forbidden (enforced by audit-report.test.ts). Status ∈ fixed | mitigated | accepted | N-A.

ID ASVS Ref Severity Status Description Fix task Regression test
F-107 V4.1.3 Medium accepted CSRF: no double-submit token. The spec assumed a Phase-1/4 double-submit CSRF token; the actual architecture is Bearer-in-header (in-memory, never a cookie) for all state-changing web routes + SameSite=Lax on the single cookie-auth route (POST /auth/refresh). A cross-origin page cannot read the in-memory Bearer and the Lax cookie is not sent on cross-site POST. Deviation recorded per AGENTS rule 29; the CSRF route-walk proves 100% coverage of the state-changing surface (exemptions: OAuth/SAML callbacks use state/nonce; API-key/OAuth/webhook routes are exempt by credential type). n/a (accepted deviation) tests/security/auth-paths.test.ts
F-118 V13.3.x Low mitigated 20 gitleaks findings in test fixtures / doc samples — secret-looking strings (sample API keys, webhook secrets, AES keys, a docs example password) that are not live credentials. Mitigation: (a) gitleaks.toml allowlists the reserved *_test_* test-value syntax by pattern so future fixtures need no baseline; (b) gitleaks-baseline.json suppresses the 20 pre-existing findings, each entry a tracked remediation (convert the fixture to reserved syntax). A new, non-baselined secret still fails the build. baseline + pattern allowlist (this task) tests/security/gitleaks-config.test.ts
F-119 V13.3.x Info accepted 4 gitleaks false positives — an X.509 cert-type identifier (saml.ts), env.S3_SECRET_KEY/identifier reads (worker), and a base64-of-a-literal-string nonce. Not secrets; allowlisted via gitleaks-baseline.json (each entry documented). baseline (this task) tests/security/gitleaks-config.test.ts
F-120 V13.4.x / V8.3.x High fixed Worker image shipped .env + .git history. apps/worker/Dockerfile does COPY . . and there was no root .dockerignore, so the worker build context (and image) contained the real .env (live dev/CI credentials) and the entire .git history (every secret ever committed). The other 3 images use explicit COPY <paths> (not blanket) and were unaffected. Fix: a root .dockerignore excluding .env*, .git, node_modules, dist, .next, key material, and tool caches; tests/packages are intentionally kept (they are pnpm-workspace.yaml members the Dockerfiles install from). Verified: the planted .env/.git are no longer in the context; the CI image scan asserts no .env in any of the 4 rootfs. root .dockerignore (this task) tests/security/images.test.ts
F-121 V15.4.x / V8.1.x Medium fixed No log scrubber on the request-coupled log boundary. The API's AllExceptionsFilter logged req.originalUrl (query strings can carry tokens) and exception message/stack verbatim to structured logs; there was no redaction of Bearer/JWT/factory-token/credential-param/cookie values. (The web/worker/realtime apps were audited and have no request-coupled HTTP log path that emits headers/cookies/auth values, so the exposure was API-only.) Fix: apps/api/src/common/log-scrubber.ts (pure, deterministic redaction) wired into AllExceptionsFilter. log-scrubber.ts + filter wiring (this task) apps/api/src/common/log-scrubber.test.ts
F-122 V13.4.x (image-scan scope) Info accepted (N-A) The spec's 5th "test image" has no Dockerfile. The task names five images (api, web, worker, realtime, and "the test image") but the repo builds exactly four (apps/{api,web,worker,realtime}/Dockerfile); there is no test-app Dockerfile anywhere. The image-scan step runs on all four that exist. Recorded N-A-with-justification (AGENTS rule 29). n/a (no such image) tests/security/images.test.ts

5. Pre-existing issues (out of scope — recorded, not fixed by TASK-0134)

These were observed during the audit but are not introduced by this task and are tracked elsewhere (other phase-15 agents / follow-ups). They are listed so the audit is complete; none blocks the L2 gate.

Item Observation Disposition
packages/database-engine tsc errors 54 pre-existing type errors (other agents' sync commits). Not TASK-0134; the tests/security typecheck is scoped to avoid them. Tracked under the engine's task.
apps/web tsc errors 124 pre-existing type errors (baseline). Not TASK-0134; unchanged by this task.
MinIO unreachable in the local sandbox Registry 401 (no pull) → the live S3 upload path could not be exercised locally. Environment limitation; the pure upload policy (cap, MIME, zip-slip, slow-loris) is fully covered; the CI integration/e2e jobs have a MinIO service and exercise the live path.
Dead route PUT /pages/:id/share A registered route with no handler. Cosmetic; not security-relevant; left for the page task.
sso-admin.service.ts:173 warning A lint/type warning in the SSO admin path. Not TASK-0134; tracked under the SSO task.
next lint broken in the web app The Next lint script errors in the current toolchain. Not TASK-0134; the security gate does not depend on web lint.
SSO SAML E2E flakiness Intermittent SAML E2E failure. Not TASK-0134; tracked under the SSO task.
Forms ReDoS time-flake A form-validation timing test is occasionally flaky. Not TASK-0134; tracked under the forms task.
Stale databases.integration spec A stale integration spec. Not TASK-0134; tracked under the database task.
Dev .env huge rate limits RATE_LIMIT_API=100000/RATE_LIMIT_AUTH=10000 in the local dev .env. Dev-only; CI sets its own values. Not a production exposure (the image never ships .env — see F-120).
Tool-layer \" corruption caveat The authoring environment drops backslashes before double-quotes in some generated file content. Authoring-tooling caveat, not a product defect; worked around in the test suites (no \" literals written to files).

6. Environment / methodology notes


7. Sign-off