Important
Live pass/fail counts = GitHub Actions on this branch or PR. Numbers in docs drift; CI does not.
This page is the only test-status dashboard — route maps, inventories, and deep strategy live in the linked docs below (no separate archive).
Dashboard updated: 2026-08-23 — Honest 4-DB benchmark matrix 200/200 green on the hardware-profile build (SQLite 50/0 · MariaDB 50/0 · Postgres 50/0 · Mongo 50/0 — run 3, profile-backed pools/threads; run 2 was 199/200 with only the DX-formatting failure, now auto-fixed by the reporter; media preset dedup + deferred variant generation → SDK 210→116 ms (−45%), HTTP 208→105 ms (−50%); CacheService flat-key pattern invalidation 26→4.5 ms; @utils/hardware-profile single boot-time detection drives sharp/DB-pool/worker/compile/job concurrency with workload-prioritized CPU allocation + HARDWARE_CPU_BUDGET; benchmark seeder now provisions bench_index_pressure/bench_migration_large — fixes the 100k-row index audit SQLITE_ERROR no such table). Full unit suite 416 files / 3667 tests green; bun run check clean. Local SQLite adapter-level integration 161/161 pass (server-bound suites verified with TEST_MODE=true harness build).
1. Snapshot
| Question |
Answer |
| Are the gates healthy? |
Design A++: pre-commit (unit + risk:audit) → pre-push (build 4 adapters + tenant + SQLite integration) → CI multi-DB + E2E |
| Where to look first when red? |
Failing CI job name → matching hot area below or route control map |
| Biggest recent win |
Field write guards + real-time truth-pass (schema-level writeRoles enforced with 403 + audit; WS sessions share the HTTP resolution pipeline; SSE+Yjs collaboration actually round-trips; svelte-realtime dead layer removed) |
| Biggest open risk (product) |
Multi-tenant browser isolation (MULTI_TENANT=true env gate; E2E spec exists, needs dedicated CI job); E2E still CI-only (not pre-commit) |
2. Health by layer
| Layer |
Confidence |
What it proves |
How to run |
| Unit (Vitest) |
A++ |
428 files / 3778+ tests — auth, lanes/turbo cache, CacheService, page gates, widgets, security, field write guards |
bun run test:unit · coverage: test:unit:coverage |
| Security regression |
A++ |
Hooks + RBAC defense-in-depth + full risk:audit (security-risk, secrets, slop, OSV) on pre-commit |
bun run test:security · bun run risk:audit |
| Integration (black-box) |
A++ |
~65 files / ~617 tests SQLite local; multi-adapter matrix in CI; lane headers + session page-load canaries |
bun run test:integration (SQLite) · bun run test:matrix (all 4 DBs) |
| E2E (Playwright) |
A++ |
~44 specs — browser goldens / P0 journeys; hooks-lane smoke; CI-parity preview :4173 |
bun run test:e2e (not Vite). Dev-only: test:e2e:dev |
| Benchmarks |
Selective |
Perf matrix + lane-router attribution; full suite is long — not every PR |
See benchmarks |
3. Testing tiers
| Tier |
Command |
Time |
Coverage (approx., drifts — trust CI) |
| Pre-commit |
git commit / hooks |
~40–60s |
Unit (3530) + risk:audit + format/lint + SBOM when lock changes |
| Pre-push |
bun run gate |
~5–8min |
Build 4 adapters + backdoor/bundle gates + tenant + SQLite integ (~617) |
| Pre-CI (local) |
bun run test:matrix |
~8–15min |
All 4 DBs via Docker profiles |
| CI |
GitHub Actions |
~30min |
Whitebox + build + db-tests matrix + E2E + benchmarks |
Gates (local → CI) — source of truth: .githooks/pre-commit, .githooks/pre-push, .github/workflows/ci.yml
| When |
What runs (summary) |
| Pre-commit |
1. DB safety 2. Format + lint (check) 3. Lint-staged 4. risk:audit 5. Unit 6. SBOM sync (if lock/package changed) |
| Pre-push |
1. Build (COMPILE_ALL_ADAPTERS=true) 2. Backdoor verify (bench) 3. Bundle size 4. check 5. Secret scan 6. test:tenant 7. SQLite integration |
| Manual |
bun run test:doctor · bun run test:security · bun run test:e2e |
| CI |
Whitebox (format/lint/check/unit/tenant/secrets/probe) → build → db-tests (4 DBs) → E2E prep + groups → benchmarks |
CI smart reporting (job Summary tab + annotations):
| Job |
Reporter |
| E2E prep / E2E shards |
scripts/ci-report-playwright.ts — pass/fail counts, first error, fix hints, preview.log tail |
bun test tests/integration/ |
bun test native output — per-file ✓/×, summary, no custom JSON |
| All Green |
scripts/ci-report-all-green.ts — job matrix + fix order |
Details: git-workflow.mdx
3. Hot areas (recent)
Honest 4-DB benchmark matrix + hardware-adaptive tuning (2026-08-23)
|
|
| Status |
Shipped — full 4-DB matrix 200/200 on the hardware-profile build (run 3: SQLite 50/0 · MariaDB 50/0 · Postgres 50/0 · Mongo 50/0). Run 2 (pre-profile) was 199/200 — the lone dev-dependency-load failure was the DX toolchain flagging unformatted auto-generated benchmark MDX; the reporter now runs oxfmt on every written report, so bun run check stays green after runs. Benchmark-cheating bypass removed in Aug 12/14 commits kept all numbers honest (production-mode servers, real auth/rate-limit/WAF). |
| Product |
Hardware-adaptive profile (@utils/hardware-profile): ONE detection at process start published to the shared global registry — every module/chunk/worker reads the same object. Workload-prioritized CPU allocation (media > compile > workers > jobs > DB fan-out) under a global HARDWARE_CPU_BUDGET (default 0.75 all-in-one VPS, 1 for dedicated app servers) + per-knob env overrides (SHARP_CONCURRENCY, DB_POOL_SIZE, MODULE_WORKER_POOL_SIZE, COMPILE_CONCURRENCY, JOB_CONCURRENCY, MONGO_MIN_POOL_SIZE, UV_THREADPOOL_SIZE). Wired into hooks (sharp/threadpool), all 4 DB adapters (pools), module-loader workers, compile, job queue, compression (weak boxes cap gzip/brotli), setup wizard + dashboard (/api/dashboard/system-info exposes the profile). Media: preset (width,format) dedup (20→12 jobs) + deferred responsive-variant generation → SDK 210→116 ms (−45%), HTTP 208→105 ms (−50%), still emitting all variant records. CacheService: flat-key pattern invalidation now buckets under the namespace key → 26→4.5 ms. |
| Bench |
Matrix run 3 (2026-08-23, profile build): SQLite 50/0 · MariaDB 50/0 · Postgres 50/0 · Mongo 50/0 (200/200). Run 2 vs run 3 (pre-profile vs profile): no systematic regression — the feared GQL-100c pool regression from smaller DB pools did NOT materialize (GQL 100c flat-to-better: SQLite −4%, PG ±0%, MariaDB avg flat); media SDK −3%; notable Postgres gains (widget pipeline −44%, Yjs −37%, mixed workload −25%, SEO −17–27%) and Mongo gains (collection search −29%, uploads −17–20%). Remaining “degraded” flags are sub-5 ms run-to-run noise (cache pattern-invalidation, Yjs CRDT, small payloads). Restart overhead cut ~20%: post-destructive restarts are now data-driven — only graphql-stress (→ relational-performance) and large-payload-streaming (→ migration-scale) restart unconditionally (verified breakers); the other 5 destructive tests skip the ~12–16s boot, saving ~4 min of the ~22 min run. Cross-DB ledger vs Aug baseline: Full Journey @1c −89%/−65%/−67%/−82%, State Transition −64%/−36%/−72%, Bulk Migration 10k −46%/−64%, Cache Miss Cold −80%, Argon2id −48% (SQLite). MongoDB stress flakes fixed via pre-stress full readiness wait + bounded crash-retry in the matrix harness. New provisioning: bench_index_pressure + bench_migration_large collections seeded (kills the 100k-row SQLITE_ERROR no such table). |
| Unit |
Full suite 416 files / 3667 tests green; bun run check clean. Added statistics-accuracy.test.ts (raw-sample tail percentiles, t-distribution CI, IQR-trimmed mean) + cache pattern-invalidation case. |
| Docs |
benchmark-matrix · benchmark_sqlite · performance-architecture · Achievements Log · roadmap |
| Open |
Redis matrix variant (USE_REDIS=true, _redis reports) still to run. GPU: sharp/libvips has no GPU backend — media parallelism is CPU-tier capped by design. |
Cold-start write-path engine + WCAG-AA palette + media-tree click fix (2026-08-22)
|
|
| Status |
Shipped — cold-start/write-path optimizations verified green across gates; E2E contrast + media move regressions fixed (both were real product bugs, not test-only) |
| Product |
Widget registry registers pre-scanned widgets synchronously in the constructor; prewarmCollectionSchemas() pre-fills the SDK schema cache + adapter registries at READY; _provisionedTables fast-path skips repeated DDL on all 4 adapters (Postgres does a single information_schema.columns read + ALTER/backfill only missing columns — kills the 25k-row cold-start UPDATE); self-healing getModel reconstructs the wrapped model from the cached table def without request-thread DDL; lazy write-path modules pre-warmed at READY; cache-warming L1 re-warm every 4 min (before collection: TTL) |
| E2E |
mediagallery/move-remote.spec.ts — nested treeitem clicks bubbled to the root node whose onClick re-navigated to /mediagallery, cancelling the folder goto(); fixed with e.stopPropagation() in tree-view.svelte (5/5 pass). login/accessibility.spec.ts — primary/tertiary/success/warning-500 + preset-filled-surface-500 darkened to WCAG AA (was 1.94–3.74:1), login floating-label surface-500→surface-700, axe audit waits for the sign-in transition:fade to finish (opacity <1 blends colors → phantom 1:1 violations) (3/3 pass) |
| Unit |
Full suite 399 files / 3576 tests green; bun run check (format + lint + dead-classes + design-token checker + lockfile-sync) clean |
| Integration |
SQLite adapter-level tests/integration/databases/ 161/161 pass; server-bound API suites require a TEST_MODE=true harness build (plain bun run build deploy-strips /api/testing → API_ENDPOINT_NOT_AVAILABLE on every seed/reset) — use scripts/run-integration.ts or build with TEST_MODE=true |
| Docs |
performance-architecture · style-guide-gui · accessibility-audit |
| Open |
Full E2E chromium sweep + 4-DB integration matrix still CI-only; verify no visual-regression drift from the darkened palette (env-gated) |
Multi-DB batching/caching engine + turbo-cache tenant isolation (2026-08-21)
|
|
| Status |
Shipped — zero-allocation tenant clauses, memoized table-name/route classification, 4-DB parity on multi-row batch inserts; fixed mid-glob L1 cache invalidation and test-tenant header honoring in turbo GET + turbo-auth fast paths; 4 previously-red integration files now green (webhooks, automations, token, tenant-isolation) |
| Product |
EMPTY_TENANT_CLAUSE + ASCII-first JSON sniff in relational-utils; bounded memoization in collection-name / drizzle-sql-helpers / route-resource-state-machine; O(1) pointer-based BFS in content-utils; rawInsertManyReturning multi-row batches on MariaDB/PG/SQLite; clearLocalL1ByPattern glob support (res:*webhooks* now purges); handleTurboGet + handleAuthentication fast paths prefer x-test-tenant-id over cached session tenant (no cross-tenant turbo leaks) |
| Unit |
tests/unit/core/count-cache.test.ts (arg-count contract assertions) · tests/unit/plugins/commerce.test.ts (cart row hardening: NaN/currency-mismatch 500s) · GraphQL resolver context types now declare publicationFilter (4 files) · collections-namespace cast hygiene |
| Integration |
tests/integration/api/webhooks.test.ts · api/automations.test.ts · api/token.test.ts · databases/tenant-isolation.test.ts — 39/39 pass (previously 4 failing across all DB adapters) |
| Docs |
cache-system · performance-architecture · multi-tenancy |
| Open |
Full multi-DB integration matrix + E2E shards still CI-only (SQLite local green); Redis L2 multi-node still not part of the local gate |
Hooks hardening — field write guards, session dedup, real-time (2026-08-10)
|
|
| Status |
Shipped — field-level write guards wired into the mutation path; WS session resolution deduped onto the HTTP pipeline; 18-hook READY pipeline; real-time stack is SSE + Yjs; full unit suite green (366 files / 3302 tests) |
| Product |
assertWriteAllowed / hasGuardedFields / getCollectionFields (30s schema memo) in handle-api-requests — 403 + UNAUTHORIZED_ACCESS audit for guarded-field writes; resolveSessionForWebSocket shares the HTTP session pipeline (LRU→store→Redis→DB, negative cache, single-flight); yjs:sync SSE bridge makes multi-editor updates round-trip; /ws upgrades session-validated (fail-closed) |
| Unit |
tests/unit/services/field-write-guard.test.ts (15) · field-permission-service.test.ts (19) · tests/unit/live/client-import-boundary.test.ts (2) · hooks/auth/security suites (615) |
| Integration |
tests/integration/api/rtc.test.ts (SSE /api/events happy + 401) |
| Bench |
tests/benchmarks/hooks-performance.test.ts — full auth pipeline 0.612 ± 0.010 ms (3-run mean, ~1,363 RPS) vs 0.856 ms July baseline (~29% faster); post-tweak re-run within noise |
| Docs |
field-level-access-control · collaborative-editing · real-time updates · server-hooks |
| Open |
GraphQL mutations bypass the field write-guard (documented boundary) |
Request Lane Router + response cache (2026-08-06)
|
|
| Status |
Shipped — O(1) classifyRequest in hooks.server.ts; x-svelty-lane on responses; turbo GET + GraphQL/REST user-scoped responseCache; fixed session cookie name (auth_sessions, not svelty_session) for HYPER_TURBO |
| Product |
Lanes: FAST_STATIC, HEALTH, HYPER_TURBO, API_READ/WRITE, APP_SSR, BOOTSTRAP, FILES, PUBLIC_SITE; health/static fast-paths; handleTurboGet TURBO-HIT when warm turbo-auth + L1 body |
| Unit |
tests/unit/core/request-classifier-and-response-cache.test.ts · tests/unit/hooks/handle-turbo-get-lane.test.ts |
| Integration |
tests/integration/api/request-lane-headers.test.ts (x-svelty-lane, health JSON, dashboard __data.json) · session-page-load still P0 for auth→SSR |
| E2E |
tests/e2e/routes/system/hooks-lane-smoke.spec.ts — admin session shell + /health |
| Bench |
tests/benchmarks/lane-router-attribution.test.ts |
| Docs |
performance-architecture (operator guide + lane table) |
| Open |
Optional: assert TURBO-HIT under live integration with seeded turbo-auth warm path; multi-node Redis L2 load tests |
List / count product layer (2026-08-04)
|
|
| Status |
Shipped adapter + service wiring — not “full UI polish”; E2E only after more list surfaces adopt findPage |
| Product |
findPage (hasMore + keyset), CountMode, L1 count cache; CollectionService limit+1 + cached count; media getByFolder; users listUsers findPage; facets via crud.count |
| Unit |
tests/unit/core/page-utils.test.ts, count-cache.test.ts |
| Integration |
tests/integration/databases/find-page-count-contract.test.ts (SQLite local; multi-DB in CI matrix) |
| Bench |
tests/benchmarks/database-performance.test.ts (FIND PAGE / LIST+COUNT / COUNT ESTIMATE / CACHED / keyset) |
| Docs |
performance-architecture · database-tests · roadmap |
| Open |
Saved views on users/media; marketplace install pipeline; OIDC PKCE + login UI; published DB packages |
Marketplace + OIDC (2026-08-04)
|
|
| Status |
Partial product — in-app catalog tab + OIDC login/callback + JWKS verify |
| Product |
Extensions Marketplace tab; GET /api/marketplace; oidc-login / oidc-callback |
| Unit/E2E |
No dedicated E2E yet — add seed-backed golden when install + IdP UI ship |
| Docs |
roadmap-2026 |
Session & RBAC hardening (2026-08-04)
|
|
| Status |
Shipped — three hardening rounds; full unit suite green (3073) |
| Product |
Device policy (single-per-device / single-per-user / allow-multiple), SESSION_TTL_HOURS, SESSION_IDLE_HOURS, block propagation purge, credential-free session snapshots, log-only IP/UA anomaly detection, SESSION_MAX_PER_USER LRU cap, step-up re-auth for cross-session revoke, admin session console API |
| Unit |
tests/unit/auth/auth-lockout.test.ts (device policy, TTL, max sessions) · tests/unit/auth/session-user.test.ts (snapshot stripping, store hygiene, anomaly evaluation) · tests/unit/hooks/authentication.test.ts (stripping, warm-cache, anomaly) · tests/unit/api/user.test.ts (reauth proof, admin console) |
| Integration |
Covered by existing auth integration suites (session create/revoke/rotate) |
| Bench |
tests/benchmarks/hooks-performance.test.ts — full auth pipeline 0.612 ± 0.010 ms (3-run mean, ~1,363 RPS) vs 0.856 ms July baseline (~29% faster) |
| Docs |
login-security · cache-system · hook-test-coverage · roadmap |
| Open |
Admin session console UI (Access Management); browser golden for revoke flow; anomaly → alerting integration |
ContentSync / compilation / Collection Builder (2026-07-31)
|
|
| Status |
Unified coordinator — IDE edit + GUI save + boot share one path; soft HMR; surgical client patch when possible |
| Product |
syncContentState reasons: boot · watcher · collection-save · gui-save · sidebar-reorder; GUI compile lock; atomic .js; hash-backed drift; tenant paths via tenant.server |
| Unit |
sync-content-state (13+), collection-save-sync (2), schema-contract (6+ Valibot), compile-manifest (atomic/noOp/changedJsPaths), collection-store-reactive (patchActiveSchema) |
| E2E |
collection-builder/builder.spec.ts — shell + soft-refresh + structure (category create survives reload) + golden schema→entry→API |
| Docs |
compilation-pipeline · content-system · collection-builder |
/user — profile & management (2026-07-19)
|
|
| Status |
100% control map — product + unit + integration + E2E |
| E2E |
7 specs: smoke, profile, management, invite, complete-coverage, p0-journeys, coverage-100 |
| Product |
Profile update: command remote + email fallback when session user_id stale after re-seed; plain-text toasts for assertions |
| Docs |
routes/user.mdx · e2e-coverage-matrix §3 |
/dashboard — shell + licensing (2026-08-04)
|
|
| Status |
Shell 100% (widget catalog is install-specific — never fixed list) + server-side license gates |
| E2E |
dashboard.spec.ts — empty/grid, add/search/reset, pointer + keyboard reorder, toolbar, plugin slot |
| Unit |
page.server permissions, widget-defaults categories, dashboard-license-gate (map + 403 paths) |
| Integration |
dashboard.test.ts health/metrics/logs/… APIs widgets consume (premium endpoints pass during trial) |
| Docs |
routes/dashboard.mdx |
/mediagallery (2026-07-18)
|
|
| Status |
Shell + upload/delete + editor save + folders + bulk + move + remote upload |
| E2E |
mediagallery, image-editor, folders-bulk, move-remote |
| Unit |
mediagallery-page-server.test.ts |
| Docs |
routes/mediagallery.mdx |
/config/access-management (2026-07-19)
|
|
| Status |
Tabs + create role + save/reset + admin/tokens; sticky action .first(); tokens panel testids; permission-matrix toggle |
| E2E |
config/access-management.spec.ts — create-role outcome, tokens panel (website-tokens-panel); system/permissions.spec.ts — matrix toggle + persistence; system/language.spec.ts — language selector |
| Product |
Role modal response as 3rd trigger arg; website-tokens $effect loop fixed (density/columns sync + untracked fetch); fetchPageData must select the page __data.json node (not the layout’s) |
| Unit |
access-management-page-server.test.ts admin gate |
| Docs |
routes/access-management.mdx |
/config/system-settings (2026-07-18)
|
|
| Status |
Group nav/search, edit→save/discard, save+reload happy path, export/import, MT/GDPR |
| E2E |
system/settings.spec.ts (shell + edit/discard + persistence) |
| Unit |
page.server gate + settings-groups + settings-utils |
| Integration |
settings.test.ts export/import |
| Docs |
routes/system-settings.mdx |
/config/redirects (2026-07-19)
|
|
| Status |
Admin gate + golden create→search→delete; primary store = redirectsMV (aligned with middleware) |
| E2E |
config/redirects.spec.ts golden (MV list/search/delete) |
| Unit |
redirects.server (MV insert/update/delete + normalizeRedirectRow) + redirects-utils + page load |
| Product |
source/target on MV; content collection mirror best-effort; compound index idx_redirects_mv_lookup (tenantId, source, active) |
| Docs |
routes/redirects.mdx |
/config/queue + /config/monitor (2026-07-18)
|
|
| Status |
Admin gates, testids, queue filter URL + showConfirm; monitor resilient load |
| E2E |
config/operations.spec.ts |
| Unit |
queue-page-server + monitor-page-server |
| Docs |
queue, monitor |
/config/webhooks — Testing 2026 reference (2026-07-18)
|
|
| Status |
ADR reference — full three layers: unit + HTTP integration + golden E2E |
| E2E |
config/webhooks.spec.ts (shell guard + golden journey only) |
| Unit |
page.server + webhooks-utils + webhooks-api + fetchApi CSRF |
| Integration |
tests/integration/api/webhooks.test.ts — list/create/delete + 401 unauth + editor deny |
| ADR |
adr-testing-2026.mdx |
| Docs |
routes/webhooks.mdx |
/config/extensions (2026-07-18)
|
|
| Status |
Admin via isAdmin, tabs + plugins testids, toggle CSRF/toast |
| E2E |
config/extensions.spec.ts |
| Unit |
extensions-page-server.test.ts |
| Docs |
routes/extensions.mdx |
/config/automations (2026-07-19)
|
|
| Status |
automations-api + fetchApi CSRF; golden builder create→list→edit→delete; seed-search |
| E2E |
config/automations.spec.ts — open editor via card link (not bare text / checkbox label) |
| Unit |
page.server + automations-api |
| Docs |
routes/automations.mdx · ADR |
/config/workflows (2026-07-19)
|
|
| Status |
Shell + seed-workflow golden; name NOT NULL safe; states JSON normalized on read |
| E2E |
config/workflows.spec.ts (toolbar/canvas + seed→GET by collectionId) |
| Product |
workflow-service.saveWorkflow default name; testing API passes name; builder name fields |
| Docs |
routes/workflows.mdx |
/config/sync + /config/trash (2026-07-18)
|
|
| Status |
Admin gates, sync tabs/status testids, trash empty/table + restore confirm |
| E2E |
config/data-ops.spec.ts |
| Unit |
sync-trash-page-server.test.ts |
| Docs |
routes/sync-trash.mdx |
Ultra-smart auth & client safety (2026-07-18)
|
|
| Status |
P0 hardened — loopback cookies, testing dual-write, exhaustive import-boundary, session→18 admin pages |
| Unit |
session-cookies, client-import-boundary (full client-root walk), login-cookie contract, page-guards, builder page.server, totp-encryption, registry-auth-hooks |
| Integration |
session-page-load · webhooks · automations · config-admin-surface · collection-structure · security-negative config matrix |
| Docs |
headless-test-inventory.mdx · auth.mdx |
2FA Hardening & Plugin Auth Hooks (2026-07-30)
|
|
| Status |
35 new unit tests — AES-256-GCM TOTP encryption (round-trip, tamper detection, legacy compat), trusted device tokens (gen/verify/reject), afterAuthenticate hook (deny/requires2FA/fail-open/skip disabled), configurable TOTP window |
| Unit |
tests/unit/auth/totp-encryption.test.ts (20 tests), tests/unit/plugins/registry-auth-hooks.test.ts (15 tests) |
| Product |
TOTP secrets encrypted at rest; pending setup state (resumable enrollment); __Host-2fa-trusted-device cookie; plugin auth hooks in signInInternal |
| Docs |
auth.mdx · authentication-system.mdx · plugin architecture |
Databases whitebox + enterprise storage (2026-07-20)
|
|
| Status |
tests/unit/databases/ green (0 skip for soft-delete under Bun; magic-link + CacheService fixed). Real proofs — not mock-only theater for Auth lockout, credential cache, boot helpers |
| Unit |
cache-service (always-tenant keys, pattern clear), credential-auth-cache (real L1), auth-lockout (real Auth), soft-delete (mongoose stub), database-resilience / CORRUPT_CONFIG, magic-link privacy |
| Product |
CacheService set/get tenant default alignment; clearByPattern wildcard tenant; fail-fast CORRUPT_CONFIG → MISSING_CONFIG |
| Enterprise |
Transactional outbox, plugin storage, schema lifecycle hooks (beforeValidate/afterValidate), media jsonPath — unit + integration seeds |
| Manifest |
tests/critical-test-paths.ts (replaces p0-manifest/registry) · runners: scripts/run-integration.ts, run-e2e.ts, test-doctor.ts |
| Docs |
database-tests.mdx · plugin-storage · outbox · schema hooks |
Other solid areas (summary)
| Area |
Notes |
| Auth & users API |
Strong integration (login, batch, avatar, sessions, 2FA) + page-load session |
| Security hooks |
Dedicated regression suite in pre-commit/push |
| Collection builder |
E2E = shell + soft-refresh + golden (builder.spec.ts); structure/utils unit+integ; ContentSync unit suite |
| Content / compile |
ContentSync coordinator + schema contract + compile manifest; see hot area above |
| Site starter / preview |
Smoke E2E + unit; deep iframe edit still open |
| Data operations |
Strong unit; thin browser E2E |
| Multi-tenant |
Unit/guard coverage; E2E isolation spec exists, gated behind MULTI_TENANT=true |
| Stores unit |
tests/unit/stores/ (reactivity, patchActiveSchema, structure fingerprint, floating-nav-store 22) |
| Admin chrome |
command-palette (18) + floating-nav-store (22) + logger (7) + widget-naming (12) unit tests; hotkeys Mod+K/Alt+G unified |
Deeper inventories: headless-test-inventory · e2e-coverage-matrix · three-layer-completeness.
4. Open gaps (actionable only)
Only open product/test risks. Closed items stay in route docs / ADR changelog — not duplicated here.
| Gap |
Priority |
Why it matters |
| Multi-DB contract without asterisks |
🟠 High |
Headless ship gate — all adapters must match contract suite |
| Lane TURBO-HIT live warm path |
🟢 Lower |
Unit covers TURBO-HIT; full HTTP warm turbo-auth seed in integration optional |
| Multi-tenant browser isolation |
🟡 Medium |
E2E spec exists (isolation.spec.ts), gated behind MULTI_TENANT=true env |
| Session vs DB identity after wizard reset |
🟡 Medium |
Phase-1 wizard can race firstuser; profile has email fallback — harden setup order |
| Redirects/queue remotes (no REST) |
✅ Closed |
Remote admin + redirectsMV primary + unit; queue-actions |
| Config residual goldens (access/auto/wf) |
✅ Closed |
Local focused chromium 16/16 (2026-07-19) after product fixes |
| Data operations deep E2E |
🟢 Lower |
Sync/trash shells covered; migration wizard still plugin-gated |
| Cache L2 (Redis) integration |
✅ Closed |
L2 contract suite (cache-service-l2-contract.test.ts) — FakeRedis always-on + real Redis via TEST_REDIS_URL; fixed untagged delete propagation to remote L1 |
| GraphQL browser E2E |
❌ Skip |
Integration only — do not add browser GraphQL as a gate |
| SSO/OAuth real IdP |
🟡 Medium |
OIDC login/JWKS code landed; still mock/no live IdP in CI; PKCE + login UI open |
| List UI full findPage adoption |
🟡 Medium |
Service/adapters ready; users/media saved views + more goldens still thin |
| Marketplace install path |
🟢 Lower |
Browse/catalog in-app; one-click install still incomplete |
| Session revoke browser golden |
🟢 Lower |
Re-auth proof + admin console API unit-covered; E2E golden when Access Mgmt UI ships |
/ws collaboration auth |
✅ Closed |
/ws upgrades session-validated via ws-auth-registry → hooks.ws upgrade() (same pipeline as HTTP); fail-closed 401; session-authoritative tenant keying |
| Awareness over SSE |
✅ Closed |
Awareness POSTs to /api/collaboration/yjs (awareness: true) → yjsService applies + broadcasts yjs:awareness over SSE; client applies remote state with origin: "server" (no echo loop); yjs-awareness.test.ts covers the round-trip |
| Builder E2E sprawl |
✅ Closed |
Consolidated to shell + golden; 8 specs removed |
| Plugin deep E2E, breadcrumb media drag-move |
🟢 Low |
Optional polish |
5. What to run locally
# Pre-commit parity (format + risk + unit)
bun run check
bun run risk:audit
bun run test:unit
# Before push (mirrors .githooks/pre-push)
bun run gate
# Unit only
bun run test:unit
# Lane router + turbo cache (2026-08-06)
bun run test:unit -- tests/unit/core/request-classifier-and-response-cache.test.ts tests/unit/hooks/handle-turbo-get-lane.test.ts
# After build: lane HTTP headers
bun run scripts/run-integration.ts --no-build tests/integration/api/request-lane-headers.test.ts
# Turbo-cache tenant isolation + cache glob invalidation (2026-08-21)
bun run scripts/run-integration.ts --no-build tests/integration/api/webhooks.test.ts tests/integration/api/automations.test.ts tests/integration/api/token.test.ts tests/integration/databases/tenant-isolation.test.ts
# Field write guards + field permissions (2026-08-10)
bun run test:unit -- tests/unit/services/field-write-guard.test.ts tests/unit/services/field-permission-service.test.ts
# Ultra-smart unit slice (auth, boundary, queue/redirects remotes)
bun run test:unit -- tests/unit/auth/session-cookies.test.ts tests/unit/live/client-import-boundary.test.ts tests/unit/api/testing-login-cookie-contract.test.ts tests/unit/utils/page-guards.test.ts tests/unit/routes/collectionbuilder-page-server.test.ts tests/unit/routes/queue-remote-admin.test.ts tests/unit/routes/queue-actions.server.test.ts tests/unit/routes/redirects-remote-admin.test.ts tests/unit/api/namespace-ownership.test.ts
# Databases whitebox + Auth lockout (real CacheService / Auth / boot)
bun test tests/unit/databases/ tests/unit/auth/auth-lockout.test.ts
# List/count product layer (pure + SQLite integration contract)
bun test tests/unit/core/page-utils.test.ts tests/unit/core/count-cache.test.ts
bun test --timeout 300000 tests/integration/databases/find-page-count-contract.test.ts
# 2FA encryption + trusted devices + plugin auth hooks (35 tests)
bun test tests/unit/auth/totp-encryption.test.ts tests/unit/plugins/registry-auth-hooks.test.ts
# ContentSync / compile / schema contract / builder soft-HMR slice
bun run test:unit -- tests/unit/content/sync-content-state.test.ts tests/unit/content/collection-save-sync.test.ts tests/unit/content/schema-contract.test.ts tests/unit/compilation/compile-manifest.test.ts tests/unit/stores/collection-store-reactive.test.ts tests/unit/collectionbuilder/
# Integration (SQLite) — session-page-load, lane headers, webhooks, security-negative
bun run test:integration
# reuse build: bun run scripts/run-integration.ts --no-build
# E2E CI-parity (preview :4173 — not Vite)
bun run test:e2e
# Hooks/lane smoke (needs auth-setup admin.json):
# bun run test:e2e:quick -- tests/e2e/routes/system/hooks-lane-smoke.spec.ts
# Collection Builder shell + soft-refresh + golden
bun run test:e2e --project=chromium tests/e2e/routes/collection-builder/builder.spec.ts
# Focused residual config/user goldens (example)
bun run test:e2e --project=chromium "--grep=redirects|Edit User Details|website tokens|automations|workflows|webhooks|Dashboard shell|create role"
# Smart test selector (auto-detects from git diff)
bun run test:smart
Safety: tests must never point at production DBs — see test-config safety guards in git-workflow.mdx.
6. Where to dig deeper
7. How to keep this page honest
When you ship a meaningful test or stability change:
- Update this file if health, open gaps, or hot areas change (few sentences + table rows).
- Put deep control maps and file-level inventories in route docs or headless-test-inventory — not a separate archive.
- Never treat static totals as CI truth — GitHub Actions is the live board.