{"service":"dwellmark-production-readiness","status":"ready","ready":true,"environment":"production","appOrigin":"https://www.dwellmark.io","checks":[{"id":"env-required","label":"Required Vercel environment","status":"ready","detail":"11 required environment variable(s) are configured."},{"id":"env-url-shape","label":"Environment URL shape","status":"ready","detail":"App, Supabase, and database URL values are well formed."},{"id":"preview-backend-isolation","label":"Preview backend isolation","status":"ready","detail":"This deployment is not a Vercel Preview environment."},{"id":"supabase-auth","label":"Supabase Auth reachability","status":"ready","detail":"Supabase Auth settings endpoint is reachable."},{"id":"supabase-storage","label":"Private Supabase Storage","status":"ready","detail":"2 expected private Dwellmark bucket(s) are configured."},{"id":"supabase-storage-rls","label":"Supabase Storage RLS policies","status":"ready","detail":"4 private Storage object polic(ies) are installed."},{"id":"supabase-database","label":"Supabase database contract","status":"ready","detail":"14 required table(s) are reachable through Supabase REST."},{"id":"backend-policy-records","label":"Backend policy records","status":"ready","detail":"2 storage policy row(s), 6 sensitive field row(s), and 8 audit capture(s) are ready."},{"id":"supabase-migration-history","label":"Supabase migration history","status":"ready","detail":"10 committed migration version(s) are present in remote Supabase history."},{"id":"supabase-tenant-rls","label":"Supabase tenant RLS policies","status":"ready","detail":"14 household isolation polic(ies) are installed."}],"cutover":{"status":"ready","readinessPercent":100,"readyLaneCount":9,"reviewLaneCount":0,"blockedLaneCount":0,"deferredLaneCount":1,"launchDecision":"ready_for_controlled_cutover","nextAction":"Production cutover cockpit is ready for controlled account rollout; billing can remain deferred.","lanes":[{"id":"environment","label":"Production environment","status":"ready","detail":"Required Vercel and Supabase environment values are present and secret-safe.","nextAction":"Keep production variables scoped to the correct Vercel environment."},{"id":"production-apis","label":"Production API coverage","status":"ready","detail":"Authenticated production API routes exist beside demo routes.","nextAction":"Keep demo routes separate from production routes."},{"id":"supabase-auth","label":"Supabase Auth","status":"ready","detail":"Supabase Auth is reachable for session bootstrap.","nextAction":"Proceed with controlled auth UI wiring after UX approval."},{"id":"database-contract","label":"Supabase database contract","status":"ready","detail":"Required tenant-scoped tables are reachable through Supabase REST.","nextAction":"Keep migrations as the source of truth."},{"id":"private-storage","label":"Private storage","status":"ready","detail":"Evidence and packet storage buckets are private and reachable.","nextAction":"Use signed upload and download flows for production evidence."},{"id":"tenant-and-advisor-access","label":"Tenant and advisor access","status":"ready","detail":"tenant access ready; advisor access ready","nextAction":"Keep owner, household, and advisor access explicitly scoped."},{"id":"privacy-redaction","label":"Privacy and redaction","status":"ready","detail":"Exact-location redaction, encrypted sensitive fields, and data controls are represented.","nextAction":"Keep exact location hidden by default in advisor flows."},{"id":"production-smoke","label":"Production smoke","status":"ready","detail":"Production readiness smoke can validate the deployed endpoint without exposing secrets.","nextAction":"Keep smoke checks in the release gate."},{"id":"demo-mode-boundary","label":"Demo mode boundary","status":"ready","detail":"Public demo/design mode remains separate from authenticated production routes.","nextAction":"Preserve demo mode after login is added."},{"id":"billing","label":"Billing","status":"deferred","detail":"Billing remains deferred; paid-beta packaging can be reviewed without real checkout.","nextAction":"Keep real checkout disabled until paid-beta packaging is approved."}]},"services":{"status":"ready","readinessPercent":100,"readyServiceCount":32,"reviewServiceCount":0,"blockedServiceCount":0,"databaseBackedCount":21,"tenantScopedCount":19,"sessionRequiredCount":21,"storageBackedCount":8,"auditRequiredCount":15,"auditLoggedCount":15,"demoBoundaryCount":32,"nextAction":"Production service namespace is ready for controlled authenticated cutover; keep demo routes separate.","services":[{"id":"dashboard","label":"Database-backed dashboard summary","route":"/api/dashboard","category":"dashboard","accessMode":"read","auditRequired":false,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/dashboard is production-backed, session-gated, tenant-scoped, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/dashboard/demo"},{"id":"ledger-days","label":"Database-backed ledger and day rows","route":"/api/ledger/days","category":"ledger","accessMode":"read","auditRequired":false,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/ledger/days is production-backed, session-gated, tenant-scoped, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/ledger/demo/days"},{"id":"ledger-corrections","label":"Manual correction writes","route":"/api/ledger/corrections","category":"ledger","accessMode":"write","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/ledger/corrections is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"evidence-vault","label":"Evidence vault inventory and private storage","route":"/api/evidence/vault/records","category":"evidence","accessMode":"read","auditRequired":false,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":true,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/evidence/vault/records is production-backed, session-gated, tenant-scoped, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"evidence-upload-url","label":"Evidence signed upload URL","route":"/api/evidence/vault/uploads","category":"evidence","accessMode":"write","auditRequired":false,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":true,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/evidence/vault/uploads is production-backed, session-gated, tenant-scoped, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"evidence-upload-completion","label":"Evidence upload completion","route":"/api/evidence/vault/uploads/complete","category":"evidence","accessMode":"write","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":true,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/evidence/vault/uploads/complete is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"evidence-download-url","label":"Evidence signed download URL","route":"/api/evidence/vault/downloads","category":"evidence","accessMode":"read","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":true,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/evidence/vault/downloads is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"evidence-record-download","label":"Evidence record-backed signed download","route":"/api/evidence/vault/downloads/by-record","category":"evidence","accessMode":"read","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":true,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/evidence/vault/downloads/by-record is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"evidence-readiness","label":"Evidence lifecycle readiness aggregate","route":"/api/evidence/readiness","category":"validation","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/evidence/readiness is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"mobile-capture","label":"Mobile capture production ingestion","route":"/api/mobile/capture","category":"mobile","accessMode":"write","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/mobile/capture is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/mobile/demo/capture"},{"id":"operations","label":"Household and business operations","route":"/api/operations","category":"operations","accessMode":"write","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/operations is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/operations/demo"},{"id":"operations-readiness","label":"Production operations readiness","route":"/api/operations/readiness","category":"operations","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/operations/readiness is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/operations/readiness/demo"},{"id":"advisor-issue-queue","label":"Advisor issue queue","route":"/api/advisor/issue-queue","category":"advisor","accessMode":"write","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/advisor/issue-queue is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/advisor/demo/issue-queue"},{"id":"advisor-readiness","label":"Advisor handoff readiness aggregate","route":"/api/advisor/readiness","category":"validation","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/advisor/readiness is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"privacy-controls","label":"Privacy and data controls","route":"/api/privacy/controls","category":"privacy","accessMode":"write","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/privacy/controls is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/privacy/demo/controls"},{"id":"privacy-readiness","label":"Privacy and data-control readiness aggregate","route":"/api/privacy/readiness","category":"validation","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/privacy/readiness is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"auth-bootstrap","label":"Auth bootstrap and account receipts","route":"/api/auth/bootstrap","category":"auth","accessMode":"write","auditRequired":true,"accountScoped":false,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":false,"storageBacked":false,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/auth/bootstrap is production-backed, session-gated, scope-reviewed, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"auth-session","label":"Auth session and tenant scope probe","route":"/api/auth/session","category":"auth","accessMode":"read","auditRequired":false,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/auth/session is production-backed, session-gated, tenant-scoped, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"advisor-invites","label":"Advisor invite management","route":"/api/advisor/invites","category":"auth","accessMode":"write","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/advisor/invites is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"advisor-invite-acceptance","label":"Advisor invite acceptance","route":"/api/advisor/invites/accept","category":"auth","accessMode":"write","auditRequired":true,"accountScoped":false,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":false,"storageBacked":false,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/advisor/invites/accept is production-backed, session-gated, scope-reviewed, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"household-members","label":"Household member inventory and onboarding","route":"/api/household/members","category":"auth","accessMode":"write","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/household/members is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"validation-readiness","label":"Production validation readiness","route":"/api/validation/readiness","category":"validation","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/validation/readiness is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/validation/demo/readiness"},{"id":"launch-readiness","label":"Production launch readiness","route":"/api/launch/readiness","category":"launch","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/launch/readiness is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/launch/readiness/demo"},{"id":"audit-packet","label":"Audit packet generation and files","route":"/api/audit-packet","category":"packet","accessMode":"export","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":true,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/audit-packet is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/audit-packet/demo"},{"id":"audit-packet-file-request","label":"Audit packet artifact request","route":"/api/audit-packet/files","category":"packet","accessMode":"export","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":true,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/audit-packet/files is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"audit-packet-files","label":"Audit packet artifact signed URLs","route":"/api/audit-packet/files/[artifact]","category":"packet","accessMode":"export","auditRequired":true,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":true,"auditLogged":true,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/audit-packet/files/[artifact] is production-backed, session-gated, tenant-scoped, audit-logged, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/audit-packet/demo/files/[artifact]"},{"id":"annual-review","label":"Annual closeout and export history readiness","route":"/api/annual-review","category":"packet","accessMode":"read","auditRequired":false,"accountScoped":true,"implemented":true,"databaseBacked":true,"sessionRequired":true,"tenantScoped":true,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/annual-review is production-backed, session-gated, tenant-scoped, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"launch-readiness","label":"Production launch readiness aggregate","route":"/api/launch/readiness","category":"validation","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/launch/readiness is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification.","demoRoute":"/api/launch/readiness/demo"},{"id":"launch-operations","label":"Production launch operations aggregate","route":"/api/launch/operations","category":"validation","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/launch/operations is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"trust-readiness","label":"Advanced trust readiness aggregate","route":"/api/trust/readiness","category":"validation","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/trust/readiness is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"jurisdiction-readiness","label":"Jurisdiction module readiness aggregate","route":"/api/jurisdictions/readiness","category":"validation","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/jurisdictions/readiness is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."},{"id":"beta-offers","label":"Paid beta offer readiness","route":"/api/beta/offers","category":"validation","accessMode":"aggregate","auditRequired":false,"accountScoped":false,"implemented":true,"databaseBacked":false,"sessionRequired":false,"tenantScoped":false,"storageBacked":false,"auditLogged":false,"demoBoundaryPreserved":true,"secretSafe":true,"status":"ready","blockers":[],"detail":"/api/beta/offers is production-backed, public-safe, scope-reviewed, audit-reviewed, and demo-separated.","nextAction":"Keep this route in production smoke and tenant-boundary verification."}]},"phase6Deliverables":[{"id":"phase6-production-namespace","label":"Production API namespace beside demo routes","status":"ready","detail":"32 production routes are inventoried with explicit demo boundaries and secret-safe responses."},{"id":"phase6-dashboard","label":"Database-backed dashboard summary","status":"ready","detail":"/api/dashboard is database-backed, bearer-session gated, tenant-scoped, and separated from /api/dashboard/demo."},{"id":"phase6-evidence-storage","label":"Private evidence upload and download routes","status":"ready","detail":"/api/evidence/vault routes cover inventory, signed upload URLs, upload completion, signed downloads, and record-backed downloads through private Storage."},{"id":"phase6-ledger","label":"Database-backed ledger and day rows","status":"ready","detail":"/api/ledger/days and /api/ledger/corrections cover read rows plus audited correction writes."},{"id":"phase6-advisor-queue","label":"Database-backed advisor issue queue","status":"ready","detail":"/api/advisor/issue-queue is production-backed, tenant-scoped, audited, and demo-separated."},{"id":"phase6-privacy-auth","label":"Database-backed privacy and auth controls","status":"ready","detail":"/api/privacy/controls, /api/auth/bootstrap, /api/auth/session, advisor invites, invite acceptance, and household member inventory/onboarding cover the auth cutover boundary."},{"id":"phase6-packet-export","label":"Database-backed packet generation and export","status":"ready","detail":"/api/audit-packet, packet file routes, and /api/annual-review cover export records, private artifact URLs, and annual closeout readiness."},{"id":"phase6-readiness-endpoint","label":"Production readiness endpoint","status":"ready","detail":"/api/backend/production-readiness exposes environment, Supabase, route, tenant, storage, audit, demo, and secret-safe evidence."},{"id":"phase6-tenant-rls","label":"Tenant RLS policy inventory","status":"ready","detail":"Committed Supabase migrations define household isolation policies with authenticated scope, write with-check protection, and live policy inventory smoke coverage."}],"authCutover":[{"id":"auth-cutover-supabase-auth","label":"Supabase Auth reachable","status":"ready","detail":"Supabase Auth is reachable for email/password, magic-link, owner, household member, and advisor session verification."},{"id":"auth-cutover-owner-bootstrap","label":"Owner bootstrap","status":"ready","detail":"/api/auth/bootstrap creates encrypted user, household membership, auth-session, and audit records."},{"id":"auth-cutover-session-probe","label":"Session and tenant probe","status":"ready","detail":"/api/auth/session verifies bearer sessions and returns tenant scope without emails, tokens, or encrypted receipts."},{"id":"auth-cutover-advisor-invites","label":"Advisor invite management","status":"ready","detail":"/api/advisor/invites creates, updates, and revokes encrypted advisor invites with audit receipts."},{"id":"auth-cutover-advisor-acceptance","label":"Advisor invite acceptance","status":"ready","detail":"/api/advisor/invites/accept binds an authenticated advisor to an unexpired invite and records encrypted session receipts."},{"id":"auth-cutover-household-members","label":"Household member inventory and onboarding","status":"ready","detail":"/api/household/members lets owner/member sessions review household membership and lets owners add encrypted household member profiles and membership records."},{"id":"auth-cutover-prototype-separation","label":"Public prototype separation","status":"ready","detail":"Public design-review routes remain no-auth and separate from authenticated production account routes."}],"accountRollout":{"mode":"controlled_accounts_before_billing","status":"ready","readyPhaseCount":5,"totalPhaseCount":5,"nextAction":"Run owner, household, advisor, private-evidence, and public-demo rehearsal before enabling real user accounts.","phases":[{"id":"owner-controlled-account","label":"Owner controlled account","audience":"owner","status":"ready","entrypoint":"/production-app","requiredEvidence":"Owner bootstrap, session probe, tenant access, dashboard, ledger, evidence, privacy, advisor, and packet probes pass without rendering secrets.","nextAction":"Enable owner account rehearsal with a seeded household and no billing."},{"id":"household-member-access","label":"Household member access","audience":"household","status":"ready","entrypoint":"/api/household/members","requiredEvidence":"Owner-scoped household member creation is encrypted, tenant-scoped, audited, and excluded from public review routes.","nextAction":"Rehearse household member onboarding after owner account rehearsal passes."},{"id":"advisor-invite-access","label":"Advisor invite access","audience":"advisor","status":"ready","entrypoint":"/api/advisor/invites","requiredEvidence":"Advisor invite create, update, revoke, acceptance, queue access, redaction, and audit receipts are verified.","nextAction":"Rehearse individual advisor invites with explicit owner permission and no firm-level tenancy."},{"id":"private-evidence-and-packet","label":"Private evidence and packet files","audience":"operations","status":"ready","entrypoint":"docs/PRODUCTION_CUTOVER_REHEARSAL.md","requiredEvidence":"Private upload, authorized download, signed packet artifacts, cross-household denial, audit events, and retention controls are captured privately.","nextAction":"Run the manual production cutover rehearsal before accepting real evidence."},{"id":"public-demo-boundary","label":"Public demo and design boundary","audience":"public-demo","status":"ready","entrypoint":"/","requiredEvidence":"Homepage, owner command center, design handoff, prototype, sitemap, robots, and llms routes remain no-auth and demo-safe.","nextAction":"Preserve public demo/design mode after authenticated routes launch."}],"deferredUntilAfterRollout":["Billing and checkout","Advisor firm tenancy","Concierge fulfillment automation","Production mobile background uploads"]},"contract":{"requiredTables":14,"requiredStorageBuckets":2,"requiredStorageObjectPolicies":4,"requiredStoragePolicyRows":2,"requiredSensitiveFieldPolicies":6,"requiredAuditCaptures":8,"requiredTenantRlsPolicies":14,"requiredMigrationVersions":10},"checkedAt":"2026-07-27T14:30:13.500Z","secretPolicy":"No secret values are returned by this endpoint."}