Kervio — NCS Cutover Tracker

to the single #6 gate · decision [A] cutover = handover
v2.27 · anchored main 5670e6b · 2026-06-29 · DEPLOYED TO PROD
interim hand-maintained — 15/19 · prod on schema 0053 · NEXT FOCUS: get CH3 (projects.kervio.ai) live
15 / 19 to-#6 closed · 7 sprints merged this session, 0 escapes · DEPLOYED TO PROD 2026-06-29 — schema 0053 live, smoke-test pending
Session close — both lanes free, 15/19. A5 quote-from-template + Mfg-UI board + Scheduler Slice-1 all merged this session. B′ derived read-model RATIFIED for job stage: the job_stage_transitions ledger is sole truth, current-stage is a rebuildable projection behind getJobCurrentStage (no app-owned Job.currentStageId), invariant projection ≡ recompute(ledger). ADR to be drafted for docs/adr/. Post-handover roadmap W9–W12; per-W split deferred to handover.
DEPLOYED 2026-06-29: backup pre-0040-0053-deploy.dump verified in R2 (sha256 92934c2f…67566, 56MB, 1036 TOC) → railway up applied migrations 0040→0053 (16 incl 0038-39) clean → healthcheck green → prisma migrate status = "Database schema is up to date!", 0 pending. Collision check on edge_profiles(tenantId,lower(code)) was empty as predicted; 0049 unique index + 0050 OPERATOR enum both landed. PENDING: Sean smoke-test (/board · /schedule · open quote · quote-from-template) on app.kervio.ai.
NEXT FOCUS — get CH3 (projects.kervio.ai) live. The hand-board is interim; CH3 is the system that derives status from main automatically and becomes the source of truth at handover. Go-live chain: [0] rotate exposed CF token + Clerk secret (security precondition) → [1] provision 1b secrets (scoped CF API token + account id · Drive folder id · Google OAuth for Access) → [2] build + deploy Cloudflare Pages with Access in front → [3] DNS projects.kervio.ai → Pages → [4] wire the Drive feed → verify derived-from-main status renders behind Access. Gate-0 read of CH3's deploy config is the first action (exact commands depend on it). CH3-2 renderer = later follow-on, not a blocker.
Tracker now lives in Drive: Kervio Tracker folder (drive.google.com/drive/folders/1oLvAOqhVBAu_8o-6DQzgDdMp7p7HXRTX) — each version pushed there going forward. Until CH3 is live, this hand-maintained HTML + memory + the next-session brief are the interim system of record.

Live now — three file-disjoint lanes

CH1 — quote free
quote lane freenext sprint TBD
A5 quote-from-template merged + torn down · next quote sprint TBD (A6 / UI-Quote / right-column-IA) · pick after deploy
CH2 — mfg free
mfg lane freenext sprint TBD
Scheduler Slice-1 merged + (teardown owed) · next: deploy run (0040→0053, backup-first) OR next mfg cutover sprint · pick when A5 clears
CH3 — tools tracker
CH3projects.kervio.ai — GO LIVEactive focus
1a status engine green (derives from main) · go-live chain: [0] rotate exposed CF token + Clerk secret → [1] provision 1b secrets (scoped CF token + account id · Drive folder id · Google OAuth) → [2] deploy Pages + Access → [3] DNS projects.kervio.ai → [4] wire Drive feed → verify. Gate-0 read of CH3 deploy config owed first. CH3-2 renderer (W9–W12/tools-lane/wishlist) = later follow-on, NOT blocking live.

The push — CH1 ‖ CH2 to #6

CH1 — quote / correctness
A2UI-Quote pricing parityclosed
SLUG-wireEdge-profile resolver + FKclosed
L30CONS-2b outline-identityclosed
F1BUG-004 F1 angled-endclosed
A3G-shape + layoutsclosed
main 75956ee · fork [A] u_shape backbone + peninsula
F2BUG-004 duplicate-spawnclosed
PR #175 · a228037 · join-graph removal + A3 seam §8.3
A4Quote Template Creator UIclosed
5ed99fa · 13 files · kervio-quote-template-v1 contract
A5Quote-from-templateclosed
5670e6b · A4 snapshot → live quote · invariant regression caught+fixed (same-line guard) · 40/40 invariants + A4+A5 oracles green on merged main
A6Starter templates seedafter A4
tenantId+roomTypeId NULL (C2 supports)
§23Quote UI overhaulqueued
§30Stonewright drawing analyzerdesign done
last CH1 · s30 parked · RECONCILE-R1 filing answer
CH2 — mfg / migrations
0049Edge-profile catalogueclosed
0050L40 sign-off rails (OPERATOR)closed
enum one-way door
0051 / C2QuoteTemplate schemaclosed
main c99c08a · 8/8
CH2-2Floor-identity credentialsclosed
54db0e8 · mig 0052 · 6 models · facial off-pending-legal
CH2-3Floor sign-off — ack gatesclosed
f69db7c · mig 0053 · pure-core gateCheck · default-off
Mfg-UIManufacturing board (board-only)closed
7f7be8a · B′ derived read-model · getJobCurrentStage · no migration · A–E ✓
SchedProduction scheduler · Slice-1 (EDD view)closed
328d77c · EDD-on-install-date, no migration · A–D ✓ · [B] gates → Handover window · cutover-blocker banked
Mfg-UISchedule + board finishqueued
#6 bar 4 · Job.currentStageId dual-write removal owed
OPSDeploy 0040→0053 + R2 backupDEPLOYED
2026-06-29 · backup sha256-verified in R2 · 16 migs applied clean · healthcheck green · schema up to date · smoke-test pending
#6NCS cutover + Jay UATthe gate
6 bars below

#6 gate — six measurable bars

NCS off FileMaker · core loop live · Jay signs off

Oracle: CH-CUTOVER6-NCS-HANDOVER-GATE-0.md
1 · Pricing parity47-quote harness GREEN; protected-18 ±5%
2 · Loop end-to-endquote→accept→route→handoff→cut-card→DXF
3 · Data cutoverItems/Parts/Workflows reconcile vs source
4 · Mfg-UI loopboard+jobs+schedule + operator sign-off (CH2-2/3)
5 · Jay UATincl floor sign-off under operator identity
6 · Deploy ✓backup verified; 0040→0053 applied; schema up to date

Handover window — runs during NCS handover · not in the #6 cutover gate, not post-handover W9–W12

Sprints scheduled for the handover period (between cutover and post-handover roadmap)
first-class sprints that ship while NCS is onboarded · earn lane + oracle like any cutover sprint
Scheduler hard-gates [B]
slab-on-site + on-hold eligibility gating before EDD ranking (cutover ships gateless EDD [A]) · = Scheduler Slice 2 (schema spine: slabsOnSite / onHold) + Slice 3 (blocked pool) · CH2 mfg · carries migration · Sean directive 2026-06-26 · sync to docs/tracker/manifest.yaml next docs push

Post-handover roadmap — W9–W12 · frozen for #6 · nothing here is in the cutover

W9–W12 — per docs/research/ROADMAP-POST-HANDOVER-W9-W12-2026-06-24.md
complete item set · #6 cutover remains the launch gate · all built on existing assets · per-W sequencing in source doc (not re-bucketed here)
Facial-recognition activation
opt-in tenant-enabled sign-off input method (#5), same credential→TenantUser resolver · gated on AU biometric/consent legal review · PIN/barcode remain the non-biometric path · scaffolded OFF in CH2-2
Per-tenant user types + invitations
role-builder + capability UI (e.g. HR Admin granting capabilities); backbone seeded in CH2-2 · needs L#
Mobile floor login for operators
Clerk mobile sign-in surface · morning floor login
Slab optimiser
COWORK-9 research ready
Mobile / Kervio Measure
existing packages/core measurement primitives
ML fine-tuning loop
capture shipped (mig 0010 + 0037 + correction-capture lib); extraction partly built · NO end-to-end capture→train→fine-tune→eval spec yet · needs L# · POST-#6 (during/after handover, not parallel to cutover sprint)
Email-to-quote
COWORK-7+8 · AWS SES→S3→Lambda ap-southeast-2
Treatment-compat gap
needs L# (COWORK-5 proposed L29, taken by dwgLayerMapJson)
Quote / vision expansion
exotic primitives (circle / radius ends), quick-setup wizard, client-facing comms · from prior Cowork packs
RECONCILE-R1 build
embargoed · patent provisional not yet filed · gates §30 · do not surface in demos / public repos

Wishlist — raw intake, not yet sprints

Floor-login "other idea"Sean to recall · likely a credential_type row, not a migration
promotion = assign lane + phase + oracle + estimate, Sean ratifies. Folds into the CH3 manifest wishlist: once the auto-tracker is live.

Decisions owed (Sean)

Merge CH2-3 (CH2, mig 0053)done ✓ f69db7c
A5 oracle (Tests A–D) + invariant regressionCLOSED ✓ · caught skipped-suite, fixed same-line guard, 40/40 green on merged main
Mfg-UI read-site scopeRESOLVED ✓ [B] all stage-reads derive · schedule cut → own sprint
Scheduler — cutover-blocker or fast-follow?RESOLVED ✓ CUTOVER-BLOCKER · #1 mfg-lane successor
Scheduler Slice-1 oracle (EDD-on-install, no migration)approved ✓ · spawns after board
Gates in cutover slice?RESOLVED ✓ [A] gateless EDD ships at cutover · [B] slab+hold gates → Handover-window sprint
FILED follow-on: u_shape only composes at frozen centrepiece dimsCONS-2b + u_shape layout don't generalise · PRODUCT Q: does NCS quote U-benches at arbitrary dims? · not A5's bug
DEPLOY 0040→0053 — DONE ✓2026-06-29 · collision check empty · backup verified · 16 migs clean · schema up to date · only smoke-test pending
Deploy sequence (each gated)pre-flight (local pg_restore + 4 R2 creds) → collision check empty → backup exits 0 (sha256 verify) → railway up → smoke
0050 one-way (TenantRole OPERATOR enum)additive, not failure-prone · 0049 backfills before SET NOT NULL + re-points FKs before DELETE — SAFE · residual: collision check on (tenantId,lower(code))
FILED follow-on: dedup Brisbane-date parsercore owns pure parser · db/normalise imports it + parity test (drift risk)
Job.currentStageId — dual-write [A] vs derive [B]RESOLVED ✓ [B′] derived read-model · ADR owed
A4 follow-up: shape-catalogue-seed-rows.ts dup checkverify not 2nd catalogue source
FILED follow-on: snapshot unitType vs DB LogicalUnitTypereconcile · A4 contract quirk
FILED follow-on: job-stage sign-off still role-literalown sprint · not CH2-3
CH3 hosting [A] Cloudflare Pages + Accessselected ✓
Rotate exposed Cloudflare token + Clerk secret in Drive docbefore minting new
RECONCILE-R1 — filed or owed?gates §30
Draft ADR for B′ derived read-model (docs/adr/)owed · awaiting Sean go

Quality signal — caught vs escaped (this session)

A3 overstated-green + 3 build defectscaught pre-merge
A3 8-file uncommitted implementationcaught pre-merge
Accidental Cloudflare Workers deploy of main appcaught + aborted
v1.8 / "Wave H1–H5" truncate + renamecaught (Sean) · fixed v2.0
F2 + CH2-2 + A4 + CH2-3 merged clean — content-verified, A4-survives proven, worktrees torn down5ed99fa · f69db7c
escape rate this session = 0 — gate held every time. This is the metric CH3 makes first-class.

Deploy debt — backup-first, always

Migrations 0040→0053 (16 w/ 0038-39)APPLIED 2026-06-29 ✓ · schema up to date
railway.json preDeployCommandauto-runs migrate deploy on PROD
Backup before any railway uppg-dump-to-r2.mjs · sha256-verify
0050 OPERATOR enumone-way door
closed Gate-1 running Gate-1 building verify+merge unblocked queued gate