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

Phase 4 — Block Editor — Task Specifications (TASK-0047 … TASK-0062)

Purpose. This file is the task spec sheet for Phase 4 of ROADMAP.md. It turns apps/web + packages/editor into the full block editor specified by PRODUCT-SPEC.md §4–§8 (block architecture, editor requirements, slash commands, context menus, drag & drop), docs/product/functional-requirements.md §4, and docs/product/ux-requirements.md §2 and §10. It builds on Phase 3 (page engine: GET/POST/PATCH /v1/pages, block tree in blocks, fractional positions) and the existing BlockModule batch endpoint (POST /v1/blocks, docs/api/blocks.md). Tasks are strictly sequential; each follows the 14-section format in AGENTS.md.

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

Task table

ID Title Estimate
TASK-0047 Tiptap core: FactoryEditor, block tree ↔ ProseMirror codec, autosave L
TASK-0048 Text blocks: paragraph, headings 1–3, quote, callout M
TASK-0049 List blocks: bulleted, numbered, todo, toggle (+ indent/outdent) M
TASK-0050 Code, divider, spacer blocks M
TASK-0051 Media blocks: image, video, audio, file card (+ presigned upload) L
TASK-0052 Columns: column_list + column with resize and cross-column drag L
TASK-0053 Bookmark + embed blocks (sandboxed iframes) M
TASK-0054 Slash command menu (searchable, categories, /database wiring) L
TASK-0055 Block right-click context menu (full §7 menu wired) L
TASK-0056 Drag & drop with dnd-kit (indicators, nesting, multi, auto-scroll) L
TASK-0057 Keyboard shortcut set (full master table) M
TASK-0058 Undo/redo (history 100, save-on-settle, autosave integration) M
TASK-0059 Copy/paste: internal JSON + markdown/HTML import, md/html export M
TASK-0060 Large-page virtualization (> 200 blocks windowed) L
TASK-0061 Accessibility: keyboard-only editing, ARIA, drag alternatives M
TASK-0062 E2E editor suite (tests/e2e/editor.spec.ts) L

Phase Completion Checklist

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

  1. Task instructions reference "PRODUCT-SPEC §11/§12" for slash/context menus; in the current PRODUCT-SPEC.md these are §6/§7 (keyboard §5, DnD §8). This file cites the real numbers; content is identical.
  2. docs/architecture/frontend-architecture.md §3.3 locates the client position engine at packages/editor/src/positions.ts; the platform context specifies fractional positions from @factory/shared/positions. We consolidate the isomorphic engine in packages/shared/src/positions.ts (exported as @factory/shared/positions) and packages/editor re-exports it. Algorithm unchanged (ADR-002 midpoint, re-batch on overflow); server side keeps packages/database-engine parity per the same spec.
  3. Advanced blocks table, synced_block, equation, child_page, child_database, linked_database are tracked in Phase 5/6/10 per product-requirements.md PR-040; Phase 4 ships the 16 block types in the task table plus the database block placeholder (real rendering arrives with Phase 5 views).

TASK-0047

Title

Tiptap core: FactoryEditor, block tree ↔ ProseMirror codec, extension registry, autosave

Objective

Create the editor kernel in packages/editor: a createFactoryEditor() factory that mounts a Tiptap document where each block is one node carrying stable block ids and fractional positions in node attrs, a lossless block tree ↔ ProseMirror codec, an extension registry, and 800 ms debounced autosave into the existing batch endpoint with version-based conflict handling.

Background

PRODUCT-SPEC §4 forbids one giant HTML document: content is a block tree (blocks: id, parentId, position, content JSONB, properties JSONB, version). docs/architecture/frontend-architecture.md §3.1 defines the canonical model: one Tiptap node per block with attrs {id, position, content, properties}. The BlockModule batch endpoint (POST /v1/blocks, ops insert|update|move|delete, transactional, 409 CONFLICT with the actual version in details) already exists (docs/api/blocks.md §4) and is the autosave target. This task is the foundation for every later Phase-4 task: nodes, menus, DnD, undo, and clipboard all plug into the registry and the autosave pipeline.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0048

Title

Text blocks: paragraph, heading_1/2/3, quote, callout

Objective

Implement the six text block types (nodes + slash entries + context-menu turn-into + content schemas in @factory/shared) so users can author and style the core text content of a page.

Background

PRODUCT-SPEC §4 groups paragraph, heading_1..3, quote, callout as Text blocks; docs/api/blocks.md §2 fixes their content shapes ({text, marks}, quote.citation, callout properties.emoji/backgroundColor/textColor). Rich-text marks (bold, italic, underline, strikethrough, code, highlight, link, mention, equation-inline) are already specced in docs/api/blocks.md §1; mentions themselves arrive in Phase 7 (extension registered but inert until then). PR-035 is P0.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0049

Title

List blocks: bulleted_list, numbered_list, todo, toggle (nesting via indent/outdent)

Objective

Implement the four list blocks with correct nesting semantics (children = blocks with parentId), Enter continuation, list-exit behavior, todo checkboxes, and toggle collapse/expand, wired into slash and turn-into.

Background

PRODUCT-SPEC §4 Lists group; docs/api/blocks.md §2 fixes content shapes (bulleted_list/numbered_list {text, marks}, numbered_list.start, todo properties.checked, toggle properties.collapsed). Nesting is expressed purely by parentId + fractional position (database-architecture §1.2 design note). PR-036 is P0. Enter inside a list continues the list; empty item + Enter exits; Tab/Shift+Tab indent/outdent (key wiring is TASK-0057; this task provides the indent/outdent commands and list-aware split/merge).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0050

Title

Code, divider, spacer blocks

Objective

Implement code (language select + syntax-highlighting stub + copy button), divider, and spacer (height presets + drag resize) per PRODUCT-SPEC §4 and docs/api/blocks.md §2 rows 17/21/22.

Background

PR-038 (code P0) and PR-039 (divider P0; spacer P1). Code content is {code: string, language}; highlight rendering ships as a stub in Phase 4 (plain monospace render with language metadata + line numbers) and is replaced by Shiki in a Web Worker in Phase 9 (frontend-architecture §3.2) — the extension point (a highlight(code, language): Promise<Html> interface in packages/editor/src/highlight/) is defined now so the swap is mechanical. Spacer content.heightPx is 8–200 with presets 8/16/32/48/64 (functional-requirements §4.2 row 22). Both are atomic (no text selection inside divider/spacer; code uses a separate code-editor surface).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0051

Title

Media blocks: image, video, audio, file card (presigned S3/MinIO upload + status polling)

Objective

Implement the four file-backed media blocks with an upload flow that creates a File row, PUTs bytes directly to presigned S3 (MinIO in dev), and polls file status until the (Phase-9) pipeline marks it READY — rendering skeleton/pending states meanwhile.

Background

PR-037: image/file P0, video/audio P1. FileModule already exposes POST /v1/files (creates File row status=UPLOADING + presigned PUT), GET /v1/files/:id (status), GET /v1/files/:id/download (short-lived signed URL) (backend-architecture module table; prisma model File with status UPLOADING/SCANNING/READY/VIRUS_DETECTED/FAILED, blockId, thumbnailUrl). The full pipeline (scan/metadata/thumbnails) is Phase 9; Phase 4 only needs the upload path + status states. Content shapes: docs/api/blocks.md §2 rows 11–14 (image {fileId, caption}, properties.widthPct 10–100, video {fileId?|url}, audio {fileId}, file {fileId, name, size, mimeType}).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0052

Title

Columns: column_list + column with width resize handles and cross-column drag

Objective

Implement the two layout container blocks: column_list (container of column children, flex layout, stack below 768 px) and column (width in properties, holds arbitrary blocks), with drag-resize width handles between columns and dnd-kit containers enabling drag between columns (drop resolution shared with TASK-0056).

Background

PR-039 P1. docs/api/blocks.md §2 rows 19–20: column_list/column are containers — children are blocks with parentId = column.id, laid out side-by-side; column.properties.widthPct (20–100, functional-requirements allow drag to 10 %), column_list sums to 100 % across children. Server container rules (blocks API §2): column_list may only contain column children; column may not contain a nested column_list/column at top level; violations → 422 invalid_nesting; max depth 50. ADR-002 note (database-architecture §1.2): columns are just container blocks — no special schema.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0053

Title

Bookmark + embed blocks (URL card with favicon, sandboxed iframes)

Objective

Implement bookmark (card with url, favicon, title/description from OpenGraph) and embed (provider iframe with a strict sandbox attribute and height property), per PRODUCT-SPEC §4 and docs/api/blocks.md §2 rows 15–16.

Background

PR-037 P1. Bookmark content {url, title?, description?}; the card shows favicon + domain + title + description; OpenGraph metadata is fetched server-side (client fetches hit CORS) — BlockService resolves og tags on insert/update of bookmark blocks (10 s timeout, cache in blocks.content once known, fallback to domain name). Embed content {url} + properties.heightPx (120–800); functional-requirements §4.2 row 16 mandates sandbox="allow-scripts allow-same-origin" and no allow-top-navigation; provider presets (Loom, Figma, Airtable, YouTube, generic) map a raw URL to an embeddable URL where known.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0054

Title

Slash command menu (searchable, categorized, all PRODUCT-SPEC §6 commands, /database wiring)

Objective

Implement the slash command menu: typing / opens a searchable, categorized command palette covering every Phase-4 command, with keyboard-first navigation, and /database (plus view-variant commands) creating a real database via the databases module and inserting a DATABASE block.

Background

PRODUCT-SPEC §6 lists /heading /text /todo /bullet /number /toggle /quote /callout /code /image /video /file /table /database /board /calendar /timeline /chart /form /divider; functional-requirements §4.3 adds the full list + fuzzy matching, fixed group order (Text, Lists, Media, Code, Data, Layout, Embeds), 150 ms debounce, database-family commands opening a property picker before insertion; PR-045/046/047. The databases module (apps/api/src/modules/databases, POST /v1/workspaces/:wid/databases, GET /v1/databases/:id) and packages/database-engine filter-builder already exist (Phase 5 will build views; Phase 4 only needs create + block). table/form/ linked_database/synced/child_page commands are listed but gated to their phases (grayed with "Coming in Phase 5/10" — the registry supports the enabled: false flag).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0055

Title

Block right-click context menu (full PRODUCT-SPEC §7 menu wired)

Objective

Implement the block context menu exactly per PRODUCT-SPEC §7: Turn into · Duplicate · Copy · Copy link · Move to · Delete · — · Comment · Ask AI · — · Color · Background · — · Convert to · — · More — fully wired to real actions (Ask AI stubbed), for single blocks and multi-block selections.

Background

PR-048 P0. The page menu is already Phase 3 (sidebar/top-bar ⋯); this task wires the block menu. Menu semantics (functional-requirements §4.3 + ux-requirements §2.4): flat list with dividers + submenus, 260 px wide, max 14 visible rows (scroll), opens on right-click (or ⋮⋮ handle click) of a block/selection, role=menu with roving tabindex, focus returns to the block on close. "Turn into" = grouped list of all convertible types (TASK-0048/0049/0050 commands); "Convert to" = quick path to heading 1–3 / quote / callout / todo; "Move to" = page picker dialog; "Copy link" = deep #blockId URL; "Color/Background" = 18-color palette (9 text + 9 background token swatches, user values stored in properties.color/backgroundColor); "Ask AI" = stub (grayed, tooltip "Available in Phase 12") that reserves the submenu shape (summarize/rewrite/improve/translate); "More" = duplicate as synced block (Phase 5), save as template (Phase 19→14? templates are PRODUCT-SPEC §19 — phase 14 scaffold; keep as disabled placeholder), permissions (only for page-root blocks — opens the Phase-3 share/permissions dialog).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0056

Title

Drag & drop with dnd-kit (handle, indicators, nesting, multi-select, auto-scroll, cross-container)

Objective

Implement block drag & drop with dnd-kit per PRODUCT-SPEC §8 and functional-requirements §4.3 (PR-050…053, 056): ⋮⋮ drag handle, drop indicator (line = sibling, box = into container), nested drops into toggle/column, multi-block shift-click range drag, auto-scroll near viewport edges, cross-container column drops, and cross-page drops (sidebar / "Move to" parity) — every drop resolves to a fractional position and one transactional batch move op, undoable.

Background

frontend-architecture §3.5 is the binding design: one DndContext per canvas; containers = each top-level sibling run, each column, each toggle child list, (and Phase 5) board groups; sensors PointerSensor (4 px activation), KeyboardSensor (accessibility path), TouchSensor (150 ms long-press); custom collisionDetection computing target container + index from pointer position; position from positions.between(before, after); move = one op applied → autosave batch → PATCH-equivalent move. Multi-block drag: contiguous sibling range moves with re-keyed interior positions (prefix shift, O(range)). Cross-page: drop on a sidebar row serializes the subtree, one batch op move target.pageId (atomic with source removal — blocks API move semantics). Performance target: local reorder < 16 ms (NFR, ROADMAP Phase-4 exit).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0057

Title

Keyboard shortcut set (full master table)

Objective

Implement the complete keyboard model from docs/product/ux-requirements.md §10 and functional-requirements.md §4.3 (PR-041): block editing keys (Enter, Shift+Enter, Backspace merge + demotion chain, Delete, Tab/Shift+Tab, arrows), the ⌘/Ctrl set (A/C/X/V/Z/Shift+Z/Y, B/I/U, Shift+S, E, K, Shift+1/2/3/0, Shift+8, Shift+D, Shift+C, Shift+M, Shift+L), plus the in-editor ? shortcuts help overlay.

Background

PR-041 is P0 and is a Phase-4 exit item ("full keyboard shortcut set"). The load-bearing rules (functional-requirements §4.3): Enter splits (new empty block of the same list type below; empty list item exits; empty toggle opens, else new child); Shift+Enter = soft line break; Backspace at block start merges with previous (inherit its type) with the heading demotion chain h1→h2→h3→paragraph on empty headings; Delete at block end merges the next block upward; Tab/Shift+Tab indent/ outdent (TASK-0049 commands); arrows move the caret across blocks, at the edge scroll, inside columns cross at column edges; ⌘A ladder ×1 text → ×2 block → ×3 all blocks; ⌘C/X/V internal block JSON + external markdown (TASK-0059); ⌘Z/⌘⇧Z/⌘Y undo/redo (TASK-0058); ⌘B/I/U + ⌘⇧S strikethrough + ⌘E code (TASK-0048 marks); ⌘K command palette (Phase-3 palette, wired here); ⌘⇧1/2/3/0 heading/paragraph conversions; ⌘⇧8 toggle; ⌘⇧D duplicate; ⌘⇧C copy block link; ⌘⇧M move block (opens "Move to" dialog, TASK-0055); ⌘⇧L link-on-selection / share-page-no-selection; / slash menu (TASK-0054); ? in editor opens the shortcuts help overlay. Database-cell shortcuts (Enter/Tab commit, ⌘Enter open record) are Phase 5 — this task registers the shortcuts registry so Phase 5 adds cell-mode entries without refactoring.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0058

Title

Undo/redo (Tiptap history, limit 100, save-on-settle, autosave integration)

Objective

Implement undo/redo as a block-operation history of 100 steps built on Tiptap's history extension, with per-settle points wired into the autosave pipeline so the user can never undo into an already-persisted inconsistent state, and durable recovery via block/page versions.

Background

PR-043 (P0). Spec (functional-requirements §4.3): "Undo/redo (block-operation history, in-memory 100 steps; versions are the durable history)"; ⌘Z / ⌘⇧Z / ⌘Y. Tiptap @tiptap/extension-history provides a ProseMirror transaction history (historyLimit); we configure historyLimit: 100 and treat each settled autosave flush as a history "settle" — undo past a persisted boundary is still allowed in-memory within the session, but the next autosave must emit the delta (ops are diffed against the last persisted state, never against "what we think is in the DB"). Block versions (block_versions, page_versions) are the durable, cross-session history (Phase 3 snapshots) — Phase 4 does not add new version snapshots per keystroke (versions are scheduled/named, Phase 3 contract).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0059

Title

Copy/paste: internal application/x-factory-blocks JSON + markdown/HTML import, md/html export

Objective

Implement the clipboard contract: internal copy carries block JSON (content + properties + subtree) under application/x-factory-blocks plus rendered markdown for external apps; paste detects internal JSON → markdown → HTML → plain text (in that order) and converts to blocks via packages/editor/src/clipboard; page export produces Markdown/HTML from the page context menu (Phase-3 menu, export action wired here).

Background

PR-043. frontend-architecture §3.4 rule 4: "Copy/paste into the app parses external HTML/Markdown via the importer into block ops; copy out serializes the selection to Markdown/HTML at the boundary only." functional-requirements §4.3: copy selected block → clipboard holds (a) rendered markdown for external apps and (b) internal JSON for cross-block moves; paste prefers internal JSON, falls back to markdown/HTML/RTF/plain; "x " paste prefix converts to a checked todo; markdown import covers headings, lists, todos, quotes, code fences, bold/italic/links/images (md links → text links; md images → pending-upload image blocks); HTML import is a sanitized fallback (textarea-based parse + allowlist: headings, lists, paragraphs, quotes, pre/code, strong/em/u/s/code/a[http(s)]/br/hr/img[src http(s)]/table-basic); RTF is out of scope (degrades to plain text). Page export (Phase-3 page menu "Export ▸ Markdown/HTML") serializes the whole block tree; PDF export is Phase 15 (button disabled with hint).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0060

Title

Large-page virtualization (> 200 blocks: windowed rendering, incremental mount, scroll performance)

Objective

Make pages with 100k+ blocks usable: windowed DOM rendering of the block list so only ~60 rows are mounted at a time (frontend-architecture §8), incremental mount on scroll, lazy rendering of heavy blocks, and cursor-based server fetching for blocks beyond the first window — meeting the "100k-block page tree loads in < 2 s (virtualized)" target carried into Phase 4's large-page exit behavior.

Background

frontend-architecture §8: "the Yjs doc holds the whole tree in memory (needed for CRDT), but the DOM renders virtualized rows; a 100k-block page keeps ~60 rows mounted; heavy block types (code highlight, KaTeX, charts) render in Web Workers or lazy-IntersectionObserver subtrees." Phase 7 moves the in-memory doc to Yjs; Phase 4 does the same thing with the ProseMirror doc as the in-memory source of truth (the virtualizer reads node geometry from ProseMirror, not from a separate data array). Rules: virtualization is a renderer concern; rAF-coalesced scroll updates; transforms only (no layout thrash); measured target 100k-block interaction < 50 ms, reorder < 16 ms. Server side: GET /v1/pages/:id/blocks already cursor-paginates the top level (blocks API §3, default 100, max 500) — the canvas fetches the first page eagerly and deeper levels lazily.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0061

Title

Accessibility: keyboard-only editing path, ARIA roles, focus management, reduced motion, drag alternatives

Objective

Bring the Phase-4 editor to WCAG 2.2 AA (PR-044, PR-165): a complete keyboard-only editing path for every mouse operation, ARIA roles/labels on all blocks and overlays, focus management for dialogs/menus/caret restoration, prefers-reduced-motion support, and non-drag alternatives for every drag — verified by axe-core in the E2E suite.

Background

ux-requirements §12 is the binding matrix (block editor, slash/menu, palette, dialogs, toasts, motion, target size); frontend-architecture §10 lists the approach (keyboard paths, non-drag alternatives, ARIA semantics, focus management, live regions, motion). Phase 4 exit criterion: "WAI-ARIA paths for all mouse operations." The individual tasks above built in per-feature a11y as they went (handles role=button, menus role=menu, spacer slider, etc.); this task is the system pass: the keyboard-only E2E journey, live-region inventory, focus-trap audit, contrast/token verification, reduced-motion audit, and the axe gate.

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done


TASK-0062

Title

E2E editor suite (tests/e2e/editor.spec.ts) — Phase-4 exit verification

Objective

Author the Playwright E2E suite tests/e2e/editor.spec.ts covering every Phase-4 interaction named in the ROADMAP exit criteria, wire it into the CI contract, and add the performance probes (reorder < 16 ms local; 100k-page budgets) so the phase-exit claim is machine-verified, not asserted.

Background

AGENTS.md CI contract: install → lint → typecheck → unit → integration → build → security scan → E2E; Playwright lives in tests/e2e. The Phase-4 exit criteria are the test program: "all Phase-4 interactions E2E-tested; reorder latency < 16 ms locally; ordering survives reload; WAI-ARIA paths for all mouse operations." The individual tasks specified their E2E scenarios; this task is the suite that runs them against a real docker-compose environment (postgres, redis, minio from Phase 0) with seeded fixtures (two users for permission checks, a 5,000-block page, a 100k-block page behind a --big-page flag, a database created via slash for the /database E2E).

Requirements

Acceptance Criteria

Backend Changes

Frontend Changes

Database Changes

API Changes

Tests

Security

Documentation

Dependencies

Definition of Done