Completion Review: Switch to Local Postgres
Review state
- Parent change: ANU-5, In Progress
- Implementation children: ANU-6 and ANU-7, Done
- Implementation pull requests:
anuvax-cms#30 and #31, merged - Product acceptance decision: Approved by Girish on 2026-07-21 at 17:33 UTC
- Canonical publication: Not published
The functional product outcome is delivered. Product Main explicitly accepts
one repository-quality limitation: repository-wide pnpm lint remains failed
on five files unchanged by ANU-7. Focused ANU-7 lint and all required typecheck,
integration, unit, selected Chromium, documentation, migration, and runtime
checks passed. This review does not reclassify the full lint result as a pass.
Reviewed delivery evidence
| Child | Delivery | Durable evidence |
|---|---|---|
| ANU-6 | CMS PR #30, merged as ff5d1502986739307ddecc748d7dc3f2b72018d5 |
Local-stack completion report |
| ANU-7 | CMS PR #31, merged as 154137e1b3224588f48707e8592907527099eab5 |
Migration completion report |
Product acceptance evidence
| Product criterion | Result | Evidence reviewed |
|---|---|---|
| Tracked Compose validates without embedded secrets | Passed | Compose validation exited successfully; secrets and database artifacts remain in ignored local paths. |
| One command starts the CMS, PostgreSQL, and pgAdmin | Passed | stack:up brought all three services healthy with loopback bindings on ports 3000, 5432, and 5050. |
| Required runtime versions and immutable images are recorded | Passed | PostgreSQL 17.10, pgvector 0.8.2, pgAdmin 9.16, Node 22.5.1, pinned repository digests, and the final web image ID are recorded in the ANU-6 report. |
| Existing RAG vectors work through the application path | Passed | The restored target contains 786 RAG chunks and vectors; the vector index is present and nearest-neighbor behavior passed. |
| Supabase application data was exported safely | Passed | Supabase CLI 2.109.1 produced separate checksummed schema and data artifacts in ignored storage; credential and Git-absence checks passed. |
| Restore excludes hosted-only state and preserves application semantics | Passed | Hosted ownership and ACL statements were reviewed and removed; no managed schemas or blanket grants were imported. Counts, hashes, constraints, indexes, sequences, Payload state, Mastra data, workspace boundaries, RAG data, and vectors matched. |
| Containerized CMS, workers, and primary flows work locally | Passed with documented lint exception | Payload, Mastra, worker API, all three bounded workers, typecheck, 103 integration/unit tests, and six selected Chromium flows passed. Full Biome remains failed on the unchanged baseline described below. |
| Restart preserves local state and destructive operations are guarded | Passed | Restart and down/up cycles preserved PostgreSQL and pgAdmin state; reset and non-empty restore paths require explicit target confirmations. |
| Rollback to the untouched Supabase source remains available | Passed | Source inventory/export stayed read-only, the source URI was retained, rollback connectivity passed, and the accepted local volume remained intact. |
| Repository ownership and external contracts remain bounded | Passed | Only anuvax-cms changed. Python and Unity protocols did not change; the authenticated CMS worker API returned 200 from the containerized runtime. |
Accepted implementation limitation
ANU-7's full pnpm lint run checked 441 files and returned six errors and six
warnings in these five files, all unchanged by ANU-7:
docs/_stale/archive/globals.cssdocs/stylesheets.csssrc/app/(payload)/admin/importMap.jssrc/mastra/tools/presentation/index.tssrc/payload-types.ts
Biome 2.3.9, its lock entry, and biome.json are unchanged from main. Focused
lint passed for the ANU-7 implementation files. The user accepted this as an
out-of-scope exception for ANU-7 only. Girish explicitly accepted the documented
limitation for Product Main completion on 2026-07-21 at 17:33 UTC. The exception
does not waive these findings for future work or describe repository-wide lint
as passing.
Security, privacy, and recovery review
- Supabase exports, checksums, restore logs, credentials, and row contents stay in ignored machine-local storage and are absent from Git and durable docs.
- The Supabase source was queried read-only and remains unchanged.
- The local restore uses a fresh loopback-only database and transactional failure behavior; unsuccessful attempts left zero accepted tables.
- Normal stop and restart commands preserve the accepted named volume.
- A later source write makes this point-in-time snapshot stale and requires a new export, restore, and parity cycle before another accepted cutover.
Release impact
This is a Development-environment change in anuvax-cms; it does not deploy or
alter Production, the Python server, or Unity. Local CMS development now runs
through Docker Compose against the restored PostgreSQL 17.10/pgvector 0.8.2
database with pgAdmin 9.16. Canonical aggregate documentation remains unpublished
until a separate explicit publication request.
Remaining follow-ups and limitations
- Restore the repository-wide Biome baseline in separately owned work.
- Clean up non-fatal Better Auth 401 diagnostics in the mocked E2E harness.
- Provider-backed presentation generation, Python rendering, and Unity rendering were not run because they are outside the CMS child scope; the unchanged worker API boundary passed.
- Repeat the migration cycle if Supabase receives writes after the accepted snapshot.
Completion decision
The delivered behavior, migration evidence, release impact, and documented lint-baseline limitation are accepted for Product Main completion. Deliver the completion-phase Product Main PR while ANU-5 remains In Progress. Only the guarded Linear completion command may then mark ANU-5 Done.
Approval record
- Reviewed and approved by: Girish
- Approved at: 2026-07-21 17:33 UTC
- Approval scope: CompletionReview as written, including the documented product-level repository-wide lint baseline exception