Skip to content

V1 Completion Sequence — the ordering board (HISTORICAL)

V1 Completion Sequence — the ordering board (HISTORICAL)

Section titled “V1 Completion Sequence — the ordering board (HISTORICAL)”

⚠ HISTORICAL — frozen at S462 (2026-07-11). Do NOT read this as current state or update it. The forward surface for what remains of v1 is v1-closeout.md (lean, load-bearing-only, finishing with the ID-45 first-client ingest); post-v1 planning lives in the initiatives ledger + the Intent workspace. Known drift since freeze (see the closeout doc): ID-145 is DONE, the OKF chain (id-131/133/134/135/136) landed, bl-106/OQ-45-1 was long RATIFIED (cv 13, S377), and ID-45 gained subtasks {45.7}–{45.11}. This board is retained for its S299→S462 ordering history.

READ FIRST each session. This is the live “where are we / what’s next” surface for the canonical-pipeline → first-client re-ingest → V1 launch. It is ordering-first and edited in place (never append-a-block-per-session — that is what made the predecessor unreadable).

  • History + architecture + per-stage write model: canonical-pipeline-sequencing.md (its S272→S298 refresh stack is frozen as historical; this doc supersedes it as the forward map).
  • cocoindex 1.0.3 write constraints + live-ops/burn runbook: cocoindex-write-model.md.
  • On-prem deploy + rollback + backup/monitor runbook: docs/runbooks/onprem-b1-deploy.md.
  • V1.1 / V2 / post-launch deferrals: deferral-register.md.
  • Deployment topology (servers, DBs, OKF layers, goose, per-client rollout): reference/deployment-architecture.md (authoritative, S436).

Last updated: S462 (2026-07-11). S462 headline — procurement form-first pivot (ID-145) + house-in-order: ID-130 is CLOSED (S458, 30/31; {130.18}→bl-435) — its “12-step migration before ID-45 GO” gate is SATISFIED — but DR-038 (S452) + the owner ruling (2026-07-11) supersede its workspace-umbrella half: a procurement item IS one form instance. → ID-145 opened (procurement form-first re-architecture, must, FULL spec chain; RESEARCH consolidated S462 at specs/id-145-procurement-form-first/RESEARCH.md; owner OQ register gates PRODUCT) — runs as its own track on the /procurement worktree. ID-145’s DDL batch (bl-435 re-key + workspace-layer retirement) must land BEFORE ID-45 GO — same pre-launch model-cement window that governed id-130. id-128 is PAUSED excl {128.3} (owner ruling S462) until ID-145 lands — {128.10}/{128.14} e2e + snapshot work would otherwise encode the legacy UI. id-127 is 30/36 (remaining: {127.18} CRON-secret split in_progress → its webhook-completion fix also unblocks {127.34} [title reworded S462: the pipeline route-tag manifest .kh-workspace-map.json, NOT an app-side concept]; {127.20} private-ingress task-close blocker; {127.24}; {127.35}; {127.19} deferred). id-132 29/30 ({132.15} publish finale runs in a parallel session). Manifest claim corrected (S462): .kh-workspace-map.json survives ONLY as an empty-mappings mandatory walk guard — route:"forms" is now a load-time ManifestLoadError and qa_sidecar is superseded-pending under id-131; plan full retirement together. Prod verified S462: id-58 citations DDL + the {57.9} clamp are both ON PROD (stale “rides ID-45” / “rides parity batch” status notes corrected).

Prior (S436, 2026-07-02) — the OKF re-architecture landed/advanced: id-131 L-records refactor (eliminates content_items; embeddings → record_embeddings, freshness/governance → record_lifecycle; umbrella MERGED to main, PR #110) → id-132 producer/L-concepts + id-133 ontology linter + id-134 promotion-confidence release gate (the {127.4} reframe) + id-135 search surfaces; forms are manual-upload app-side (DR-014). Authoritative topology: reference/deployment-architecture.md. The S419 detail below is retained as prior context.

Prior (S419, 25/06/2026): V1.0.0 IS CUT; the only remaining client v1 gate is still the re-ingest (ID-45, unchanged in_progress — {45.3} TECH/{45.4} PLAN unwritten + bl-106/OQ-45-1 + Liam GO). ID-127 (Platform pipeline standup) is essentially COMPLETE — 15/16 subtasks done: the two-server split is LIVE (Server A 88.208.255.178 = client pipeline · Server B 87.106.72.59 = platform pipeline + the single Coolify 4.1.2 control-plane that manages both), both platform cocoindex apps run :healthy on Server B (ca-pipeline-platform-production → prod DB zjqbr · ca-pipeline-platform-staging → staging DB rbwqew), the E2E confirmation walk is PROVEN on BOTH staging + prod (POST /walk → 202 → pipeline_runs; prod created genuinely-new content [ref_items 2→3], idempotency + converge-by-walk-2 backlink proven, item_failures 0, DB isolation held — closed 127.11+127.13), and LMDB→S3 backups are armed + self-healing (a Coolify force_docker_cleanup had pruned the backup-tools sidecar off BOTH hosts → silent no-op nightlies; rebuilt, re-proved, added a build-if-missing guard, PR #89 524bb4f6; datapath-watch monitor wired). Only the id-134 promotion-confidence E2E gate remains — the S436 reframe of the old “{127.4} synthetic corpus + manifest” task ({127.4} is now CANCELLED in the ledger; the manifest’s forms-sense is removed per DR-014, though the route-tag .kh-workspace-map.json itself is KEPT) — plus the deferred v1.1.0 release-tag re-pin (below). ID-130 (procurement / form domain-model) is now in ACTIVE IMPLEMENTATION (a parallel session) — a must-priority pre-launch lane whose 12-step staging-first migration must land before ID-45 GO. Supabase types regenerated from the Platform DB (S419, 78ffe6b0) — now carries the id-130 form-domain schema (form_outcome_types, form_questions.form_template_id) that had drifted onto staging. main HEAD → 78ffe6b0. Deferred to next session: cut v1.1.0 + re-pin client-prod to it (client-prod currently on an INTERIM sha-b92aee5e pin, not a release tag — finishing the id-127 “correct release tag tracked by the client” goal), held back to avoid racing ID-130.

  • v1.0.0 RELEASED: tag v1.0.0 @ cb3c5919 + branch release/v1.0.0 (origin + local); ghcr kh-cocoindex-pipeline:v1.0.0 aliased from sha-cb3c5919 (no rebuild); AGPL LICENSE + THIRD-PARTY-NOTICES; release crib + runbooks/per-client-release-pins.md. ID-113 (per-client release/version pinning) DONE.
  • ID-68 DONE (S372–S375): the migration squash landed (143 migs → single baseline 20260617130000; identity-guard now GREEN); the history purge was EXECUTED via repo delete-recreate into ai-solution-hub/canonical (S373); the repo is PUBLIC; the knowledge-hubcanonical rename is complete; the client project-ref scrub shipped (refs are runtime-only via scripts/lib/project-refs.ts + .env.local/PLATFORM_PROJECT_REF — never committed). (ID-68 Task + all subtasks now flipped done in the ledger (S379) — the prior in_progress/HELD lag is cleared.)
  • ID-104 (eval engine) DONE → ID-71 Waves 2/3 unblocked (Wave-1 already on canonical, 2f169545b, surface 58→42 + bid→forms rename; W2/3 not yet built). The old “id71-id104 FF carries two unapplied migrations” debt is RESOLVED (absorbed into the squash baseline).
  • Lane B carried (still accurate): ID-57 done (question_match RPCs prod-promoted), ID-58 closed, ID-59 core + corpus-promotion on prod/canonical ({59.19} route-i flipped DONE S378; {59.15} UC8 still gated); ID-95 closed-out.
  • ID-112 (worker-side HTML/URL extraction cutover) SHIPPED (S379): impl wave {112.5}–{112.12} — shared Trafilatura extract.py + POST /extract pure-cleaner endpoint, worker HTML branch re-pointed to in-process clean_html, reference_ingest server-side extraction_method derivation, manual-URL route rewired, normaliseUrl relocated, golden-fixture parity — recovered from the S378 subo-112 worktree, cherry-picked to main, both migrations applied foreground to the Platform DB. Only {112.13} (DELETION set: drop firecrawl/readability/jsdom + dead Vercel Surface A/B tiers) remains, deferred/gated on ID-45. ★S382 correction: the cutover shipped to code/main but the on-prem worker deployment lagged — the /extract Traefik route + EXTRACT_API_TOKEN + a /extract-capable image were never released to the Coolify staging/prod pipeline, so deployed URL-ingest extraction 503’d until S382 released it (deploy branches staging/release/v1.0.0 synced from main: staging e1785490, prod 8b2bdab8; Coolify+Vercel env set both envs; image→sha-b92aee5e; both redeployed + verified). bl-346 tracks the drift root cause.★
  • Pre-reingest DB hardening (ID-116, S378): tryQuery refactor + 8 RLS policies wrapped in initplan select-form + 11 FK indexes (advisors auth_rls_initplan 8→0, unindexed_foreign_keys 11→0). New infra backlog BL-342/343/344/345 (advisory follow-ups; BL-345 = auth_insufficient_mfa_options, the still-red Supabase-advisors lane — re-baselining declined, accept or resolve MFA to clear it).
  • The Spine is unchanged and still the gate: re-ingest (ID-45) is PENDING — {45.1}/{45.2} done, {45.3} TECH + {45.4} PLAN still UNWRITTEN, {45.5}/{45.6} cutover-wiring pending, bl-106/OQ-45-1 ingestion_source list still awaiting Liam ratification. Prior (S404→S419, id-127 arc): S413/S414 greenfield two-server split (old IONOS box cancelled → 2 hardened VPS; client apps on Server A, platform wave on Server B) · S417/S418 Coolify env-topology fix (staging apps into dedicated staging envs, NEW app UUIDs) + real EXTRACT_API_TOKEN wired platform prod+staging + prod pipeline_runs webhook unblocked (CRON_SECRET aligned) · S419 E2E walk both envs + LMDB backup fix (PR #89) + types regen. Note a platform-prod redeploy fragility (BACKLOG-candidate): the 10.7 GB cocoindex image re-pull on the 4 GB Server B failed mid-redeploy (→ transient prod 503; recovered by pre-pull). ID-129 PullMD full decommission DONE (S413). Older: S402 ID-120 CODE wave + bl-301→ID-127 promoted + ID-126 closed · S400/S401 CI-green baseline · S382 (ID-111 + /extract incident) · S349 canonical→main · S336 (S0a prod cutover) · S323 (ID-75 closed) · earlier sessions → §0.

Deploy topology — TWO targets (do not conflate)

Section titled “Deploy topology — TWO targets (do not conflate)”

Older docs say “prod” as if there is one. There are two distinct deploy targets, and the v1 work splits cleanly along them:

  • PLATFORMkh.aisolutionhub.co.uk · Vercel project canonical-platform · tracks main · Platform Supabase DB pair (prod zjqbr + staging rbwqew — the id-127 standup feeds them separately). This is our own dev / CI / showcase instance — NOT a client. Platform now HAS its own ingestion pipeline (ID-127 — both ca-pipeline-platform-{production,staging} cocoindex apps live :healthy on Server B 87.106.72.59, E2E-proven S419, 15/16 done).
  • CLIENT (Phew, first client)kh.phew.org.uk · Vercel project canonical-phew · production tracks release/v1.0.0 · its own client DB pair (prod + staging). The on-prem Coolify cocoindex stack is the client’s pipeline, now on its own dedicated Server A 88.208.255.178 (ca-client-pipeline[-staging].aisolutionhub.co.uk; domain flips at handover); ID-45 re-ingest fills THIS client’s DB. (One Coolify 4.1.2 control-plane on Server B manages BOTH servers.)

Implication for the Spine: “cut over to prod as the client handover DB” means the client DB, fed by the on-prem (client) pipeline. The Platform DB never “goes live” for a client — clients live on client DBs, each receiving migrations via a deliberate per-release supabase db push (never auto-push). ID-127 (Platform’s own ingestion, ex-bl-301) is parallel and post-client-launch, not a Spine gate.


  • S306Task 82 DONE: fixed the preview-branch migration replay + re-ingest branch-creation strategy (the blocker that gated the ID-62/64 cutover). Prod cocoindex rolled to the pandoc-capable image. (ID-72/73/74/77/78/79/81 cocoindex hardening wave also landed across S304–S307.)
  • S308 — BRANCHES ALIGNED at 2f70f766 (canonical-pipeline-setupmain FF → staging FF). The months-long held-branch hold is released; the pandoc durability caveat is resolved (main now carries the pandoc layer). Schema parity verified perfect (staging + prod both migration-complete, byte-identical to repo). ID-66.11/66.12/66.13 done. ID-76 ratified (Option A). Verified headline: PullMD/ID-75 does NOT gate the re-ingest cutover (only {62.10} + new-URL/RSS ingest need it); the run-record webhook is best-effort observability, NOT a content-cutover gate (content writes via COCOINDEX_DB_DSN regardless; prod observability proven {66.16}).
  • S309ID-76 DONE ('cancelled' is now a first-class pipeline_runs.status; migration #106 20260604113356 applied + verified on staging AND prod → both at 106, parity held). bl-224 fixed inline (PipelineRunRowSchema/PipelineRunRow now admit 'in_progress' — the row schema matched to the DB constraint). ID-66.14 (LMDB→S3 backup) + ID-66.15 (datapath monitor) DONEID-66 is now fully complete (all 23 subtasks done); the two new artefacts are built + runbooked but activation is operator-gated (S3 creds/schedule for 66.14; schedule/alert sink for 66.15). bl-222 done (staging on-prem Coolify deploy arm) · bl-218 done (cocoindex idle-boot skipif guard) · bl-221 spec authored (docs/specs/bl-221-cocoindex-walk-trigger/TECH.md, ready). ID-71 (MCP) RESEARCH kicked off (Liam handover in progress).
  • S311ID-66.15 datapath monitor ARMED as a Vercel cron (app/api/cron/datapath-watch, */15; reuses the tested detectStalls predicate; Sentry-fallback sink) — live on next prod deploy; Gotcha-A resolved (migration #106 → condition A live). ID-66.14 backup target = Supabase Storage (corrected the stale “Coolify DB-bucket” premise — Coolify manages 0 DBs; creds host-stored, never the public repo); bucket + S3 keys provisioned by Liam, remaining = host cron + tooling container + one test run. bl-221 → ID-83 DONE (walk-trigger decoupled: lifespan-only boot + bearer-gated POST /walk + single-flight; 5 subtasks, Checker PASS, cherry-picked; OQ-1 Coolify scheduled-task cadence = operator step). New backlog: bl-224 (IONOS de-co-locate), bl-225 (de-Cloud-Run sweep). 5 superseded test files removed (Liam).
  • S312ID-66 FULLY CLOSED: {66.14} LMDB→S3 backup ARMED + verified — the mdb_copy hot design is unusable (cocoindex’s bundled LMDB rejects every distro mdb_copy, MDB_VERSION_MISMATCH on 0.9.24+0.9.31, though the data file is standard LMDB magic 0xBEEFC0DE), so it pivoted to a cold snapshot (stop→cp→start→ship; lmdb-backup-cold.sh + kh-lmdb-backup-tools sidecar
    • restore-verify.sh; host cron 30 3 * * *, bucket onprem-backups, restore round-trip verified). OQ-1 /walk Coolify scheduled task created — disabled both envs (enable at cutover). COCOINDEX_SOURCE_PATH set on both Coolify apps (burn-safe; boot-never-walks). bl-225 done (de-Cloud-Run sweep, 8 files). Spec chains authored (parallel planners): ID-75 {75.1} RESEARCH (Option A — cocoindex custom-source — empirically viable; B2 fallback not triggered), ID-80.2 forms/content separation architecture, ID-52.22 catalogue-idempotency design (found a real template_version-NULL bug that defeats the upsert). Next-session recon written: s312-id62-readiness.md + s312-id61-bl45-reconcile.md.
  • S313ID-62 advanced + ID-61 decomposed + housekeeping: {62.7} verify_driver.py (stage-only loopback /stage POSTer; no-Supabase-import AST-enforced) + {62.6} ID-83-corrected manifest seed (server.main() seeds {schema_version:1,mappings:[]} before the first POST /walk; the retired boot-watch framing was NOT implemented) both DONE (Checker PASS_WITH_NOTES; 5caf05bb/e3685a3e). Fixed 2 ID-83 stale docs (server.py /stage docstring dropped the walk_dir(live=True) watcher claim; cocoindex-write-model.md §6 burn-valve → boot is burn-safe regardless of SOURCE_PATH). ID-61 DECOMPOSED → 8 subtasks (61.1–8; PRE-reingest 61.1 prompt-cache / 61.2 tracked-changes DOCX / 61.4 bl-165 error-class / 61.8a /walk cadence; POST-cutover 61.3/61.5/61.6/61.7; status imp_deferred; bl-166 struck — closed S309). bl-45 RETIRED (already-shipped — SECDEF→INVOKER batch-5 migration 20260507134407 applied pre-#106; recon wrongly assumed it unwritten). KH_SMOKE_TEST dead Cloud-Run env path struck from ingest.py (--smoke-test CLI kept; 663c7162). New bl-225 = /walk non-JSON-body regression test (Curator, from the {62.6} import json latent-NameError fix). {62.9} (build-ready: trigger + /walk threading) and {62.10} (blocked on ID-75) remain.
  • S314ID-61 PRE-reingest set DONE ({61.1} prompt-cache passthrough on the 3 extractors [cache-usage log added — observable on first live run]; {61.2} tracked-changes DOCX regression [no production leak found — resolver correct]; {61.4} bl-165 fine Pydantic error-class → pipeline_runs.result.error_detail + the ID-63.8 taxonomyMisses silent-strip FIXED as a rider [route BodySchema was dropping it]; {61.8a} /walk cadence DECIDED = nightly 0 2 * * * → sign-off register authored). ID-62 {62.9} DONE (deploy/onprem/verify/live-verify.sh: driver → bearer POST /walk → Vitest go-live tier with a WALK PUMP [Tier-1/2 files self-stage mid-run]; Tier-3 2 live / 6 deferred-with-evidence; Tier-1b 0/3 [incomplete substrates → bl-227]; Inv-29 marker committed; live proof operator-gated). ID-80 fork architecture SHIPPED: {80.2} ratified (OQ-A zero content rows for forms / OQ-B manifest route tag / OQ-C completed+item_failures) → {80.6} route tag, {80.7} branch extraction, {80.8} the fork (forms skip Markdown+LLM entirely), {80.9} per-item isolation (bl-224 cascade inverted; itemFailures in the run record), {80.10} 8-row test sweep — all Checker-PASS; {80.11} runbook note in flight; {80.12} versioning investigation done (option (b) superseded_by pointers; 10 decision points PENDING Liam). ID-75 {75.2} PAUSED — Liam reframe: what should content_items MEAN post-pivot (client-canonical knowledge vs external-source material; cross-activity availability for the item-06 tooling surface) — options paper at docs/research/s314-id75-reframe-options.md (5 options); D1/D2 NOT ratified. Curator: bl-226 (worktree tooling gap), bl-227 (9 live-tier test substrates), bl-228 (ontology doc drift).
  • S316Liam decision queue LANDED: {80.12} versioning RATIFIED option (b) (pointer columns superseded_by/superseded_at/superseded_reason outside FORM_TEMPLATES_SCHEMA; currency derived; linear chains; hidden-by-default + include_superseded; heuristic v1.1 suggest-only; no auto catalogue effect; family = Path-C catalogue [mechanism 3]; operator new-file contract ratified + ID-56.12 cross-ref; implementation = NEW v1.1 Task — deferral V11-11/V11-12; investigation doc §11). ID-75 reframe DECIDED O4 (reference layer + explicit adoption/derivation; D4 client-adopted knowledge; client subjects get the one-canonical-record practice, external gets one reference per URL; two retrieval surfaces; external global/ workspace-less + extensible beyond URL/RSS; decision record s314-id75-reframe-options.md §7) → {75.2} PRODUCT RESUMED under O4. {52.22} hold RELEASED (sentinel collision structurally impossible under (b); design doc §8 re-review note; executor dispatchable). Execution same session: {52.22} DONE (UPSERT on the natural key + ‘v1’ sentinel; ID-52 all 22 subtasks done — end-of-task passes pending); {75.2} PRODUCT authored + Checker PASS_WITH_NOTES (nit fixed) + OQ-75-1..4 ratified, OQ-75-5 items 1+3 (item 2 → TECH with the pre-live alignment steer); SPINE S1 re-smoke run TWICE — round 1 FAILED and surfaced three real defects (D1 stage-5 cross-op collision; D2 forms memo-hit data loss; D3 tally gap = deployment skew), fix wave {80.13}/{80.14} shipped-checked-merged + image rebuilt + round 2 PASS 4/4 (two-walk protocol; memo-hit rows survive); {80.15} deferred (tally re-verify at align); {62.11} opened (live-verify.sh unrunnable as shipped: buildpack python3 PATH + fixtures-not-in-image).
  • S318ID-75 LANDING PATH CODE-COMPLETE in one session: {75.3} TECH ratified (reference_items M1
    • two-step RPC M2 + WP-A..G; OQ-T1 CV-13 re-homing / OQ-T2 poller nudge + hourly fallback / OQ-T3 ingestion_source all ratified) + {75.4} PLAN (11 subtasks) + Waves 1-4 shipped-checked-merged: {75.5} M1 staging · {75.6} M2 RPCs (REVOKE-FROM-PUBLIC discovery → bl-231) · {75.7} parity modules · {75.8} url_source (memo-over-frozen-dataclass verified on real engine) · {75.9} adapters (epoch memo + localfs HTML retired) · {75.10} ingest_url (8-step) · {75.11} app_main wiring · {75.14} ontology register entry. Also: {56.18} NO-GO ratified (no AST metadata in cocoindex 1.0.3; keep-nullable stands) · {62.11} live-verify defects fixed · {62.12} opened. ingest_url mounted but undeployed at session end.
  • S319THE ALIGN LANDED + ID-75 LIVE-PROVEN: main/staging FF’d, 4 deploy surfaces rolled; three Tasks closed: ID-52 (form-extraction, 23/23), ID-80 (Path-B fork, with {80.15}/{80.16} riding the align), ID-84 (post-align CI restoration — opened and closed same session). {62.10} O4 landing-set proof GREEN on B1: DRIVER_EXIT=0 (seed → walk → sd+ri landed → Inv-9 round-trip → idempotency walk) + Vitest live suite 9/9 + §5 SQL set green, two evidence pairs. Live discoveries fixed same session: {75.16} engine consumption contract (watch() must update_all-then-mark_ready) + {75.17} backlink deferred-flush race (FK-tolerant, converge-by-walk-2) + pullmd static-bearer bootstrap (PULLMD_AUTH_TOKEN) + driver /s/:id header contract. {62.12} + {75.12} (cadence ops) done. {75.13} gate OPENED. Curator: bl-232..238 + bl-223 priority raised (gates nudge delivery).
  • S321ALIGN ×2 (cad10004 + d9b86aee mini-align) + ID-62 CLOSED (end-of-task passes complete; bl-227 re-homed as standalone backlog follow-on) + ID-86 opened-and-closed (bl-236 in-job change detection — live-proven on the align push: 1,500+-file compare, relevant=true, no silent skip) + ID-87 opened-and-closed (advisors security review: 27 findings dispositioned; REVOKE migration 20260607121924 closed the PUBLIC-inheritance EXECUTE exposure on grant_standard_public_table_access/rls_auto_enable, verified false×6 on staging AND prod; baseline 29 records green-by-construction) + {75.18} persistence PROVEN through a full Coolify recreate + {75.15} ALL scope verified live (ID-75 now 18/18 — Task close awaits end-of-task passes) + staging deploy leg GREEN for the first time since S309 (bl-248: COOLIFY_BASE_URL secret value was the defect) + S319 burn root-caused (align-CI integration jobs — Sonnet 4.6 + Haiku 4.5 — NOT memo re-burn; hourly walks 4–5 s, zero LLM; bl-239 evidence, bl-246 opened).
  • S331LANE-A + LANE-B canonical track LANDED ON STAGING (prod-push Liam-gated): {64.14}+{64.16} bid→form rename COMPLETE (tables + search_for_bid_response + all get_bid_*get_form_* RPCs; staging-applied, Checker-verified; {64.14} REVOKE re-verified — snapshot_form_response_history has no PUBLIC EXECUTE) · ID-58 citations polymorphic REPLACE COMPLETE ({58.5}–{58.12}: polymorphic citations table [cite-target enum + one-of CHECK + per-kind partial-unique indexes + RLS + REVOKE-anon] + native-Anthropic span cols + update_citation_count() trigger + 4 win-rate RPCs re-pointed + draft-stream per-CitationEntry cardinality + cite_content arg bid_response_idform_response_id + GDPR-export key rename + DROP content_citations; staging-applied, 14/14 live-staging checks PASS) · ID-59 per-UC write-back CORE COMPLETE ({59.5}–{59.13}: edit_intent/arbitration_inputs storage + pure arbitrate()/coerceIntent() module + items-route + UC6 Q&A-route stamps + file-first write-back adapter with compensating restore + source-less guard [bl-266] + UC3 sweep + whole-sweep rollback + minimal user-edit Diff-UI; {59.14} UC5 promotion UNBLOCKED-deferred, {59.15} UC8 still GATED) · ID-101 specs authored ({101.2} PRODUCT 16 invariants + {101.3} TECH 7 PCs — cocoindex entity-relationship + holder-rule extraction PARITY, a C1 pre-re-ingest gate for ID-45; {101.4} PLAN deferred to impl; key risk surfaced: the TS + Python canonicalisers DIVERGE today — must be built into agreement before re-ingest, not merely verified). All this session’s DDL is STAGING-ONLY — prod-push handoff (in order): 20260609185728 ({64.16}) → 20260609192337 ({58.5}) → 20260609195444 ({59.5}) → 20260609201651 ({58.11} DROP); breaking app↔DB contract → the TS deploy must land WITH the DDL.
  • S336–S341S0a prod cutover COMPLETE (S336): 7 canonical-track migs on prod WITH the TS deploy; main FF’d; parity restored; first full-CI-on-main surfaced bl-285 (→ ID-105, fixed) + bl-286 (C1/C2 → {59.18}). S337–S340 (subo wave + reconciliation): ID-101 impl cherry-picked ({101.5}–{101.8} done); ID-102 string-id flag-day + ID-90 server-ledger DONE and operational; ID-103/ID-105 done; clash-free ledger-write protocol encoded after a 3-way backlog-id collision. S341 (this refresh): ID-93 decision queue fully dispositioned (OQ-64-2/7/9 closed; bl-106 + ID-57 spec-slice are the residuals); historic-doc review distilled into historic-reingest-doc-review.md; bl-273/274 promoted to {59.16}/{59.17}; bl-286-C1/C2 + bl-282 fixes dispatched ({59.18}/{92.24}).
  • S348 — canonical-pipeline SPEC FAN-OUT (5 cmux sub-orchestrators): ID-57/45/46/109/110 specs authored + Checker-gated + Liam-ratified (19 OQs); docs-site cv13 pushed. ID-46 scope COLLAPSED (core already deleted under ID-68.23). ID-108 platform tail DONE. 3 greenlit build items held for go: {57.5} G6 landing · {110.2}/{109.2} PRODUCT · ID-46 {46.5}{46.10} deletions.
  • S349 — INTERIM BASELINE · canonical→main LANDED: PR #80 admin-override merged (96 commits S337–S348 → main 659829241 + prod deploy; only required check on main = identity-guard, gated on id-68 de-ID). docs-site cv13 merged→main (branch deleted). Canonical-introduced CI reds FIXED: lint (requireimport), knip (dead-orphan sweep — baseline restored), Supabase types parity ({95.11} content_propagation_version regen). IP leak removed (main_session_output.md transcript; full history purge stays id-68.10). Workflow fixes: imp_deferreddeferred (id-46 TECH), cmux per-SID final_report (SKILL.md), sandbox github-host allowlist. id68-p23 worktree+branch removed (superseded); id-68 status_note refreshed; 19 OQs verified persisted in ledger. bl-106 = OPEN (read-side ingestion_source 8→9 canonical-list ratification, OQ-45-1, Liam — NOT closed by 107.3, which narrowed the write-side enum for security). Overridden reds (gated/pre-existing): identity-guard (id-68 de-ID), E2E (bl-240), eval l3/l4 (bl-242→id-71), Quality-precheck pytest test_lifespan_only_boot (FLAKY real-engine → de-flake backlog).
  • S-canonical-baseline (15/06/2026)SOLID BASELINE + spec/build fan-out. Canonical CI green again after the {59.25} type-only build fix (717a4b201). ID-101 {101.9} parity CLOSED proven-artifact (S348) — no longer an ID-45 gate. ID-57 done ({57.6}/{57.7} RPCs prod-promoted). ID-59 {59.22}→{59.25} done (corpus-promotion loop + CAS + embed-decouple/self-heal + active-retirement + admin/editor HTTP route) — the S359 cutover blocker is cleared. id71-id104 FF’ing canonical (ID-71 Wave-1 surface 58→42 + bid→forms rename on canonical 2f169545b; ID-104 {104.5} contract = the ID-71 W2/3 unblock + {104.6}/{104.7}/{104.8} — the id104 eval-engine migration 20260615170612 lands + needs type-regen on the FF/merge; W2/3 hard-gated on ID-104 build). ID-95 closed-out (only {95.8} prod-redeploy confirm + cutover remain). ID-42 closed → ID-112 (worker-side HTML/URL cutover). ID-113 / ID-114 spec chains advancing ({113.3}/{114.3} TECH authored, awaiting Liam ratify; neither flip-blocking). ID-45.5/45.6 cutover-wiring subtasks added (promoteCorpusExtractions auto-invocation host; alternate_question_phrasings source via ID-94.1).
  • S371–S377 — SQUASH · ID-68 FLIP · v1.0.0 CUT (these supersede the forward-looking claims in the older §0 bullets above): S371 native migration squash (143 migs → single baseline 20260617130000) — this greened identity-guard (red→green) and absorbed the previously-”unapplied” {104.6}/{71.13} migrations, dissolving the id71-id104 FF db-push/type-regen debt; ID-104 DONE → ID-71 Waves 2/3 unblocked. S372–S373 the ID-68 history purge was EXECUTED via repo delete-recreate into ai-solution-hub/canonical (not force-push). S374–S375 flip readiness shipped: repo is now PUBLIC; knowledge-hubcanonical rename complete; client project-ref scrub landed (refs runtime-only); the Platform DB stood up as the DEV/CI target (seeded client-clean, auth triggers installed, schema_migrations ledger repaired on Platform + client-prod + client-staging). S377 v1.0.0 CUT (tag v1.0.0 @ cb3c5919 + branch release/v1.0.0; ghcr image v1.0.0 aliased from sha-cb3c5919; AGPL LICENSE + THIRD-PARTY-NOTICES; release crib + runbooks/per-client-release-pins.md); ID-113 DONE.
  • S378 — pre-reingest hardening + Lane B/spec wave: ID-116 DONE (tryQuery refactor + 8 RLS initplan-wraps + 11 FK indexes; advisors auth_rls_initplan 8→0 / unindexed_foreign_keys 11→0; migrations applied to Platform). ID-59 {59.19} corpus-promotion route-i flipped DONE (verify-done-first: {59.21}–{59.25} already shipped + ancestor of main). ID-71.16 ledger/spec amend (file-backed create via stageAndWalk; OQ-71.16-1 ratified). ID-111 reference-UI spec chain PRODUCT+TECH+PLAN complete — {111.5}–{111.11} added, impl deferred (Liam). {59.15} investigated → DEFER (Spike#10 + UC8 ratification pending). New infra backlog BL-342/343/344/345. Session died at an API socket failure with the ID-112 worker mid-flight (commits made, not yet merged).
  • S379 — ID-112 cutover wave LANDED + ledger reconciliation: recovered the S378 subo-112 worktree (8 unmerged commits {112.5}–{112.12}), cherry-picked to main, fixed a migration-timestamp collision with the parallel 116 wave (both picked 20260619120000/120100 → renamed the 112 pair to 130000/130100), applied both foreground to the Platform DB (CHECK extension + reference_ingest derivation), gate GREEN (tsc + Vitest 13840 + pytest 1337). Task 112 CLOSED (only {112.13} deletion tail deferred). ID-68 Task + subtasks flipped done (ledger lag cleared).
  • S382 — ID-111 CLOSED + on-prem /extract PROD incident fixed: recovered the S381 interrupt ({111.10} was on main + Checker-PASS but its ledger flip never ran → reconciled), then closed {111.11} = bl-119 create→read E2E (un-skipped + round-trip; 5/5 green). Task 111 DONE ({5}–{11}); pushed to origin/main. ★The E2E surfaced a silent PROD incident: the ID-112 /extract worker cutover was never released to the on-prem pipeline — deployed URL-ingest extraction 503’d (Traefik “no available server”) on staging AND prod (3 stacked gaps: stale deploy-branch compose, unset EXTRACT_API_TOKEN, pre-/extract image). Released both envs via Coolify API + git: compose sync to staging (e1785490) + release/v1.0.0 (8b2bdab8); distinct EXTRACT_API_TOKEN on Coolify+Vercel both envs; COCOINDEX_IMAGE_TAGsha-b92aee5e (latest /extract-capable image, no build needed); redeployed both Coolify apps + the prod Vercel app; verified /extract 200 (verdict warn) + 401-fail-closed on both FQDNs. Root cause (deploy branches don’t auto-sync from main) → bl-346 (infra: CI parity guard + token runbook).★ P5 = Option C (born-in-DB provenance = typed record-lineage; recorded on {45.2}, feeds ID-45 — lands last). Next track (Liam): ID-59 Q&A-sidecar impl wave ({59.26}–{59.33} decomposed; {59.26} freeze __qa__/ = the ID-45 walk gate, dispatch-ready).
  • S383–S399 — ID-59 Q&A-sidecar wave + ID-120 framing: the {59.26}–{59.32} Q&A-sidecar set landed (FK-less q_a_pairs.source_document_id col live on the Platform DB, __qa__/ freeze + a 3rd walk branch, shared helpers, corpus+user-direct emit, re-walk mark-stale, round-trip golden fixture; {59.33} DEFERRED on UC8+Spike#10; follow-up bl-350). ID-120 (cross-workspace Q&A dedup) FRAMING CORRECTED (S391): workspace ≠ tenant (1 DB/client = the tenant boundary) — dedup is INTRA-tenant across a client’s workspaces & forms, cross-tenant is never-v1; OQ-120-2a resolved; specs/glossary/ontology/prompt updated and {120.3} TECH unblocked. ID-115/116/117/125 hygiene
    • DB-hardening tasks closed across this arc.
  • S400–S401 — consolidation + CI-green baseline: all open PRs merged, branch reset to a CI-green main; a clean baseline re-established before the ID-120 code wave.
  • S402 — ID-120 CODE wave shipped + Platform-pipeline standup promoted: the ID-120 implementation set shipped to main ({120.5} q_a_pair_dedup_proposals table+RLS+migration · {120.6} Python proposer post-pass + pipeline attach · {120.7} approve/reject API routes + mergeDedupPair · {120.8} curator review surface [admin pages + components + query keys]). bl-301 promoted → ID-127 (Platform pipeline standup; theme 3, linked). ID-126 test-audit tier CLOSED. Interim merges (PRs #58–62): ID-70 opaque-Json RPCs → typed RETURNS TABLE (+2 drops) — DONE; jscpd dedup Wave-5 C2 (drafting-loop extraction + bl-361 seed --reset fold); ID-126 DB/prod test-audit tier (S399); QaDedupResolveResult type-drift rebaseline; ID-115 {115.15} grant-guard baseline repair. main → a1986bb6.
  • S403 (23/06/2026) — ID-120 CODE-COMPLETE + ID-127 PRODUCT/TECH + jscpd/hygiene: {120.9} (PR #68, 800c0a71) the api.q_a_pair_dedup_proposals security_invoker view + types regen → ID-120 CODE-COMPLETE ({120.5}–{120.9} shipped; Task close pending end-of-task passes) + cleared the inherited supabase-types-parity drift. ID-127 PRODUCT ratified + {127.3} TECH authored (NEXT was {127.4} PLAN). jscpd Wave-5/6 + intelligence-guide-generator rename + test-hygiene merged. No Spine movement.
  • S404→S419 — id-127 standup BUILT + PROVEN (the LANE PLATFORM arc); ID-130 opened + driven into impl: two-server greenfield split (S413/S414) — old IONOS box cancelled, 2 hardened VPS (Server A 88.208.255.178 client · Server B 87.106.72.59 platform + the single Coolify 4.1.2 control-plane); client + both platform cocoindex apps stood up; ID-129 PullMD full decommission DONE. {127.4} PLAN→impl wave (S415→) built 127.1–3/5–16 (composes, seed scripts, parity guards, runbooks, deploy parameterisation). Coolify env-topology fixed (S417/S418) — staging apps moved to dedicated staging envs (NEW UUIDs), real EXTRACT_API_TOKEN wired platform prod+staging, prod pipeline_runs webhook unblocked. S419: E2E confirmation walk PROVEN both envs (POST /walk → 202 → pipeline_runs; prod made genuinely-new content, idempotency + backlink + isolation proven → closed 127.11+127.13); LMDB backup defect fixed (sidecar pruned off both hosts by force_docker_cleanup → silent no-op nightlies; rebuilt + self-heal guard, PR #89 524bb4f6); types regen from Platform DB (78ffe6b0, folds in the id-130 form-domain schema). id-127 now 15/16 done — only the id-134 promotion-confidence gate (the reframed/CANCELLED {127.4} corpus work — DR-014) + the deferred v1.1.0 re-pin remain. ID-130 (procurement/form domain-model): spec chain RESEARCH/PRODUCT/TECH ratified (S411/S416) → in active impl ({130.5}/{130.6} done, {130.7} in_progress).
  • Next critical-path session — finish id-127 (cut v1.1.0 + re-pin client-prod off the interim sha-b92aee5e to the release tag; the id-134 promotion-confidence corpus [reframed {127.4}]), let ID-130 land its 12-step staging-first migration (the timing gate before ID-45 GO), then drive the cutover spine (below). The squash, ID-68 flip/purge, v1.0.0 cut, ID-101 parity (S0b), ID-64 {64.7}/{64.8}, and ID-56→{56.12} are all DONE — the cutover is no longer gated on any of them. The remaining gates before ID-45 are exactly: (a) {45.3} TECH + {45.4} PLAN (cutover mechanism — still UNWRITTEN), (b) bl-106 / OQ-45-1 (canonical ingestion_source list) — NB the ID-45.1 ledger journal records this RECONCILED/ratified as cv13 at S377, but the standing forward-map framing still lists it as a Liam residual; confirm before GO, (c) explicit Liam GO, and (d) ID-130’s migration landed. Then spec + execute ID-45 (T7) full-corpus re-ingest into a fresh CLIENT Supabase target → cut over as the client (Phew) handover DB. (S0a ✅ S336 · S0b ✅ S348 · S1 ✅ S319.)

V1 completion = a clean full-corpus re-ingest (ID-45/T7) runs end-to-end on the on-prem (client) cocoindex stack into a fresh CLIENT Supabase target; every stage writes correctly; schema is migration-complete; the result is cut over as the client (Phew) handover DB (NOT the Platform DB — see the Deploy topology block above). ID-46/T14 (retire the OLD scripts/kb_pipeline/) is the final cleanup. Single tenant (Phew) for V1.

Current pipeline truth: Path-A content write = GREEN, live-proven. Path-B blank-FORM write = DONE (ID-80 closed S319) — forms route via the manifest route tag down a dedicated branch (zero content rows, zero LLM calls, per-item failure isolation); smoke gate satisfied S316, tally skew resolved at the align. URL/reference path (ID-75) = ✅ DONE — Task 75 CLOSED (S323)reference_items + two-step RPCs + FeedUrlSource + ingest_url, live-proven on B1 since S319. bl-239 file-branch memo re-burn proven SAFE. On-prem host (ID-66) = DONE. Schema = migration-complete on staging AND prod, PARITY RESTORED (S336): the canonical-track set — 20260609185728 (bid→form tables/RPCs incl. {64.16} get_form_*), 20260609192337 (citations polymorphic REPLACE + span cols), 20260609195444 (edit_intent/arbitration_inputs storage), 20260609201651 (DROP content_citations) + the {64.17} G5 pair (20260609225144/20260609230521) — landed on prod WITH the TS deploy in the S336 cutover window. Advisor baseline green-by-construction (ID-87, S321). Pre-re-ingest parity GAP — CLOSED: ID-101 is DONE (S348) — {101.9} adjudicated proven-artifact (Liam): post-{101.10} (point-of-use client entity_aliases generation, fail-closed at pipeline deploy) coco holder=self matches legacy + prod-doc ground truth; residual = a benign predicate-label synonym (holds/complies_with, same endpoints/holder); the pre-registered symmetric like-for-like gate is blocked by a harness gap (legacy --path is a persisted-row reader vs the destructive --mode=run) → bl-300. ID-101 is no longer an ID-45 gate — relationship triples + holder metadata are captured and proven at parity on the cocoindex path. Cocoindex bytes/Docling/embedding/max-tokens/Stage-5-stability bugs = all fixed (ID-72/74/78/79/81). CI (S377): canonical main is fully GREEN. The S371 migration squash (143 migs → single baseline 20260617130000) deleted the migration that named the superseded client hook, so identity-guard is now GREEN (red→green first time in many sessions); the ID-68 flip/purge is DONE. The old “id71-id104 FF carries two AUTHORED-but-UNAPPLIED migrations” debt is RESOLVED — those migrations were absorbed into the squash baseline. Remaining push-CI reds (gated/pre-existing, none required): bl-240 E2E seed, bl-242 eval TE-02, Integration (real-API), + a FLAKY pytest test_lifespan_only_boot (real cocoindex-engine/threading — de-flake backlog).


Six lanes. Only the Spine gates cutover. Everything else is parallel, after-cutover, or hygiene. Mode tags: FOCUS = Liam + me direct (live-ops/decisions) · MONITOR = cmux sub-orchestrators end-to-end.

SPINE — re-ingest critical path · FOCUS · the only cutover gate

Section titled “SPINE — re-ingest critical path · FOCUS · the only cutover gate”
#ItemStatusNext action
S0aCanonical-track prod DDL push + TS deploy ({64.16} rename + ID-58 citations + ID-59 edit_intent + {64.17} folds)✅ DONE (S336) — the 7-mig push landed on prod WITH the TS deploy; main FF’d + deployed; parity restored— none. (First full-CI-on-main fallout tracked: bl-285→ID-105 fixed; bl-286 C1/C2→{59.18})
S0bID-101 cocoindex relationship + holder-rule extraction parity (C1 pre-re-ingest gate)✅ DONE — Task 101 CLOSED (S348). {101.9} adjudicated proven-artifact (Liam): after {101.10} (point-of-use client entity_aliases generation at pipeline deploy, fail-closed) coco holder=self matches legacy + prod-doc ground truth; residual = a benign predicate-label synonym (holds vs complies_with, same endpoints/holder). The S340 holder defect (coco=supplier/null) was root-caused to the canonicaliser shipping baseline aliases only, never loading DB entity_aliases — FIXED.— none. The symmetric like-for-like gate needs a --legacy-fresh harness leg (bl-300, backlog); the internal-function holder coverage gap (7e511dbc class) re-homed to ID-109. No longer an ID-45 gate.
S1ID-80 Path-B form-write productionise + live-smoke (form_templates/form_template_fields)✅ DONE — Task 80 CLOSED (S319). Smoke gate satisfied S316 (re-smoke PASS 4/4, two-walk protocol; {80.13} memo round-trip + {80.14} stage-5 cross-op collision fixed live); {80.15} tally skew + {80.16} rider resolved at the S319 align; end-of-task passes complete. {80.12} RATIFIED (option (b); impl → v1.1 V11-11/12)— none. Versioning implementation is v1.1 (V11-11/12)
S2Re-ingest target (OQ-64-8) — the CLIENT DB (Phew), NOT Platformthe client Coolify cocoindex stack EXISTS (runs under the aisolutionhub domain today; domain flips at handover)Wire a fresh Supabase Preview branch off the client DB into the Coolify cocoindex env at re-ingest time (Task 82 proved the git-integrated preview-branch path replays guarded repo migrations cleanly)
S3{64.7} retention export/re-link✅ DONE (ID-64 CLOSED S352). OQ-45-1 keep-set = v2 source-driven (the keep-set is the source corpus, NOT gated on the full ingestion_source enum — that list ratification is the pending Liam residual below); retention runbook authored (retention-export-relink-plan.md) — keep-set = source corpus for the cocoindex walk (RE-WALK qa_import 440 / url_import 55 / python_markdown 23; MIGRATE-CARRY in-KH manual ~23; DROP-58); content_items + q_a_extractions truncated pre-walk (INV-6), regenerated fresh; clears ID-45 INV-7— none. (bl-106 / OQ-45-1 canonical ingestion_source ratification remains a Liam residual — read-side Zod narrowing, pending next session, see the s361 packet; does not block the runbook, keep-set is source-driven)
S4{64.8} readiness surface + types regen + cutover runbook✅ DONE (ID-64 CLOSED S352) — readiness surface authored (reingest-readiness-surface.md, 28-gate go/no-go board) + cutover-mechanism runbook (reingest-cutover-runbook.md, hybrid-c: schema via migration-replay + data via pg_dump --data-only); gates: G1 ✅ · G2 dropped · G3 ✅ · G4 ✅ · G5 ✅ (bl-106 ratification pending — Liam, s361 packet) · G6 ID-58/59 ✅ prod + ID-57 ✅ now prod-promoted— none. The ID-56→{56.12} chunking-UI folder-drop wrapper (the last board RED) is now DONE. Board residual: bl-106/OQ-45-1 canonical ingestion_source ratification (Liam, next session — see the s361 packet). types-parity GREEN. The cutover gen types is the clean regen window (Lane C ID-70)
S5ID-45 (T7) full-corpus re-ingest — into the CLIENT DB (Phew)in_progress — S0b ({101.9}) gate CLEARED; S3/S4 DONE; UNCHANGED through S419The headline run; with S0b + S3/S4 + ID-56/{56.12} all cleared, the open gates are now (a) {45.3} TECH + {45.4} PLAN (cutover mechanism — still UNWRITTEN, not near-ready), (b) bl-106/OQ-45-1 ingestion_source (the ID-45.1 ledger journal records this RECONCILED as cv13 at S377; the standing forward-map prose still lists it a Liam residual — confirm before GO), (c) explicit Liam GO, (d) NEW: ID-130’s 12-step domain-model migration must land first (pre-launch model-cement window). {45.1} RESEARCH + {45.2} PRODUCT done (33 invariants); {45.3} TECH/{45.4} PLAN still deferred. {45.5}/{45.6} cutover-wiring subtasks pending (promoteCorpusExtractions auto-invocation host — the {59.25} 10s webhook cannot host a full-corpus batch, fn EXPORTED for ID-45 to wire async/service-role; alternate_question_phrasings source via ID-94.1). Deps ID-28 (done) + ID-36/41/69. Spec inputs: quality-gate seed = the first-arc 8-dimension must-pass profile (historic-reingest-doc-review.md §3)
opsID-66 on-prem host (this is the CLIENT pipeline — domain flips at handover)✅ DONE — all residuals ARMED (S312){66.14} LMDB→S3 backup ARMED (cold-snapshot pivot — mdb_copy can’t open cocoindex’s LMDB; host cron 30 3, bucket onprem-backups, restore-verified) · {66.15} datapath monitor live (Vercel cron, S311) · OQ-1 /walk task created disabled both envs · COCOINDEX_SOURCE_PATH set both envs · bl-221→ID-83 done. Nothing operator-pending. NB: Platform has no ingestion pipeline of its own — that is ID-127 (in_progress, ex-bl-301), separate from this client stack.

LANE P — parallel pre-cutover (in-flight tasks; land before launch; do NOT block re-ingest)

Section titled “LANE P — parallel pre-cutover (in-flight tasks; land before launch; do NOT block re-ingest)”
TaskWhat remainsStatusMode
ID-62 fixture-staging live-test harness✅ CLOSED (S321) — end-of-task passes complete: simplification 647da484 (2 cleanups) + quality-review PASS_WITH_NOTES with both nits fixed 90614d0c (named-400 content-type guard + explicit client_max_size). bl-227 re-homed: stays ready as a standalone follow-on (Curator S321)done
ID-75 wire PullMD into cocoindex (remote URL/feed)✅ CLOSED (S323) — end-of-task passes complete: gate-1 simplification NO-OP PASS (20-commit surface clean across all four hunt areas); gate-2 quality-review PASS_WITH_NOTES (20/20 per-commit PASS; CRON_SECRET guard nit fixed 13c9a6fb; fyi findings curated bl-250/bl-251). Live-proven on B1 since S319; {75.15} prod scope verified S321; {75.18} persistence proven through full Coolify recreatedone
ID-9 docs-site + docubot✅ DONE — docs-site live (the private-docs bridge is the working corpus home)done
ID-68 repo private→public + IP separation✅ DONE (S372–S375) — migration squash landed (143→1 baseline 20260617130000); history purge EXECUTED via repo delete-recreate into ai-solution-hub/canonical (S373); repo is PUBLIC; knowledge-hubcanonical rename complete; client project-ref scrub shipped (refs runtime-only via scripts/lib/project-refs.ts + .env.local/PLATFORM_PROJECT_REF). (ID-68 Task + all subtasks flipped done in the ledger S379 — lag cleared.)doneFOCUS (irreversible)
ID-95 per-client Supabase/infra topology + ownership boundaryCLOSED-OUT — {95.1}–{95.7}, {95.9}–{95.16} done (tenant_config table + RLS + prebuild branding fetch + re-seed manifest + PI-18 fan-out worker + deploy runbook to tenant_config model + demo-bootstrap archived); only {95.8} (AC-E3 prod-redeploy confirm) remains, Liam-gated/optional. Task close pending {95.8} + cutover (ID-45/68).done (close pending)MONITOR (subo)

LANE A — pre-re-ingest schema cleanup (window BEFORE S2 Preview-branch wiring — cleanest)

Section titled “LANE A — pre-re-ingest schema cleanup (window BEFORE S2 Preview-branch wiring — cleanest)”

ID-93 intent-gap evaluation (S-untracked, 07–08/06/2026) ratified 4 additions — register: specs/ID-93-pre-reingest-intent-gap/RESEARCH.md (decision queue §6, gates G1–G6 written into {64.8} details). Headline: the whole bid_* surface was at 0 rows on prod → rename window open until UAT/promotion.

ItemFold targetWhatRe-ingest
bl-189 A+BID-64 {64.12}/{64.13}✅ DONE (S348). {64.12} dropped 5 AI-telemetry token cols + rewrote lib/provenance/item-provenance.ts (kept classification_model/embedding_model); {64.13} dropped 4 orphan cols (notes/parent_id/source_bid/source_document) + rewrote ~8 display readers. Migs 20260612101132/20260612102255, staging+prod parity.pre — done
OQ-64-3 RATIFIEDID-64 {64.14}+{64.16}✅ DONE — ON PROD (S336). bid→form rename: bid_responses/bid_response_history/bid_questions tables + search_for_bid_response RPC + all get_bid_*get_form_* RPCs ({64.16}) + consumers; Checker-verified; {64.14} REVOKE re-verified. content_citations excluded (ID-58 owns — also DONE, on prod). Migration 20260609185728.prelanded inside the window
ID-94 (new Task)standalone, gated G4 in {64.8}✅ DONE. Q&A alternate-phrasings capture at ingest (QAFormExtraction + q_a_extractions.alternate_question_phrasings text[]) — ratified capture-at-ingest over post-hoc batchpre (must be in the run)
ID-101 (new Task)C1 pre-re-ingest gate for ID-45 — also Spine S0b✅ DONE — Task 101 CLOSED (S348). {101.9} proven-artifact (see Spine S0b); {101.10} point-of-use entity_aliases generation (fail-closed) landed the fix live. Residual symmetric-gate harness leg → bl-300; internal-function holder gap → ID-109.pregate cleared
bl-92/93 port-check→ {64.8} gate G1✅ G1 SATISFIED (08/06) — bl-93 recall guidance ported to ENTITY_MENTION_PROMPT (df4463cd; truncation half already satisfied); bl-92 N/A on the cocoindex path — ID-101 supersedes it as the C1 gate; both backlog items retiredpre — done
bl-42 / bl-43 / bl-106→ Lane-A batch, {64.8} gate G5bl-42 + bl-43 ✅ DONE via {64.17} (coercion INSERT-OR-UPDATE + PK rename; migs 20260609225144+20260609230521, on prod S336). bl-106 ESCALATED — no canonical ingestion_source list ratified (8 observed values); pending Liampre — bl-106 is the G5 tail
bl-74{64.15}→ before ID-45 promotion step, {64.8} gate G3✅ DONE. q_a_pair_history snapshot superseded_by + source_workspace_id lineage cols — history append-only; late = lineage lostpre-promotion
bl-166 in_progress row-type gappartially closed (S309 bl-224)The PipelineRunRow/PipelineRunRowSchema in_progress omission is fixed. Any remaining as PipelineRunStatus narrowing cast is an ID-61 fold-in.hyg (done for the read schema)
bl-169→ ID-61 (parked)Re-target the error_class/monitoring note Cloud Run → Coolify ({66.15}/{64.8})hyg

LANE B — parallel feature build (zero second-re-ingest risk — verified; build alongside cutover prep)

Section titled “LANE B — parallel feature build (zero second-re-ingest risk — verified; build alongside cutover prep)”

The pipeline writes q_a_extractions (derived cache), never q_a_pairs (guard flow.py). ID-57/58/59 are downstream of q_a_pairs → they capture nothing at ingestion → building them after re-ingest forces no re-run. S-canonical-baseline update: ID-58 CLOSED, ID-57 DONE (RPCs prod-promoted), ID-59 core + corpus-promotion ({59.5}–{59.13}, {59.16}–{59.25}) ON PROD/canonical. ID-59 tail: {59.14} UC5 done · {59.15} UC8 gated · {59.19} route-i promotion flipped DONE (S378) · {59.20} TECH done · Q&A-sidecar wave {59.26}–{59.32} DONE (S383→) — FK-less q_a_pairs.source_document_id, __qa__/ freeze + 3rd walk branch, corpus+user-direct emit, re-walk mark-stale, golden fixture; {59.33} DEFERRED (UC8+Spike#10).

OQ-64-5 RESOLVED 08/06/2026 ({64.8} gate G6): handover DB = structurally complete, based on ratified specs. S336: ID-58’s schema slice (polymorphic citations REPLACE + DROP content_citations) and ID-59’s edit_intent storage slice APPLIED ON PROD (S0a cutover). S-canonical-baseline: ID-57’s question_match RPCs ({57.6}/{57.7}, the G6 schema slice + WP2) are now PROD-PROMOTED — G6 fully satisfied. ID-60 stays post-cutover (alt mechanism via ID-71). ID-58 owned the content_citations disposition — DONE.

TaskWhatStatusFold-ins (consume at spec time)
ID-57/T10 question_matches + retrieval + scoring (1st)spec chain {57.1}–{57.4} done; {57.5} table (G6 slice) staging+prod; {57.6} writer question_match_recompute + {57.7} reader question_match_search RPCs — PROD-PROMOTED + types regen (was staging-only, now applied to prod this session); B7-hardened (anon EXECUTE revoked) + 20/20 live testsdone ({57.8} ts_rank calib deferred post-T7 corpus)bl-76 (ts_rank) → {57.8}
ID-58/T11 citations polymorphic REPLACE + native-Anthropic spansPolymorphic citations table (cite-target enum + one-of CHECK + per-kind partial-unique indexes + RLS + REVOKE-anon) + span cols + update_citation_count() trigger + 4 win-rate RPCs re-pointed + draft-stream per-CitationEntry cardinality + cite_content arg rename + DROP content_citations✅ DONE — Task 58 CLOSED (12/12); ON PROD (S336)bl-74, bl-136
ID-59/T9 per-UC write-back + Diff-UI sidecar re-pointCore ({59.5}–{59.13}) on prod S336; {59.14} UC5 promote + {59.16} Q&A history route + {59.17} UC4 citation re-anchor + {59.18} /api/items 500 fix all DONE. Corpus-promotion (route-i) {59.19} PRODUCT + {59.20} TECH + {59.21}–{59.25} BUILT this session: idempotency index + eligibility RPC, promoteCorpusExtractions() loop + atomic CAS, embed-decouple/self-heal, active-retirement pass, admin/editor HTTP route (/api/q-a-pairs/promote-corpus) + INV-23 assertion. {59.25} next build/tsc break fixed type-only (717a4b201).in_progress (Task open on {59.15}/{59.33} only). {59.19} route-i FLIPPED DONE (S378) — verify-done-first found {59.21}–{59.25} already shipped + ancestor-of-main; {59.19} was the parent acceptance subtask. Q&A-sidecar wave {59.26}–{59.32} DONE (S383→): FK-less source_document_id col (live on Platform DB) + __qa__/ freeze + 3rd walk branch + corpus/user-direct emit + re-walk mark-stale + round-trip golden fixture; follow-up bl-350. Remaining: {59.15} UC8 dedup + {59.33} (GATED on Spike#10 + UC8 ratification + bl-74). ID-45 auto-invocation host for promoteCorpusExtractions ESCALATED → ID-45.5 (the 10s cron webhook cannot host a corpus batch; fn EXPORTED for the cutover)
ID-120 cross-workspace Q&A dedup (UC8 substrate)Intra-tenant (1 DB/client = tenant boundary) dedup across a client’s workspaces & forms, cross-tenant never-v1 (framing corrected S391). Substrate = the cocoindex Stage-5 pgvector pass repointed to q_a_pairs as a walk-time PROPOSER (post-pass BESIDE cocoindex), merge fires only on curator approval. {120.5} q_a_pair_dedup_proposals table+RLS+migration · {120.6} Python proposer + pipeline attach · {120.7} approve/reject API + mergeDedupPair · {120.8} curator review UI · {120.9} api.q_a_pair_dedup_proposals security_invoker view + types regen (PR #68, cfc4fff3also cleared the inherited supabase-types-parity drift on q_a_pairs.source_document_id from ID-59.27)✅ CODE-COMPLETE (S402–S403); all {120.5}–{120.9} shipped to main. Ledger Task still in_progress ({120.9} flip + parent close handled by the orchestrator on main)
ID-130 procurement / form domain-model + IAResolved the form-vs-workspace altitude via the C/Hybrid model (S411/S416). Built + live on all four DBs: form_templates engagement columns + per-form workflow_state, form_outcome_types CV (counts_toward_win_rate), win-rate engine rewrite, form_type picker, forms POST/PATCH + advisory-lock mint, Q&A promotion lineage.✅ DONE — Task 130 CLOSED (S458, 30/31; {130.18} cancelled → bl-435). The pre-ID-45 migration gate is SATISFIED. ⚠️ Its workspace-umbrella half is SUPERSEDED (DR-038 S452 + owner ruling 2026-07-11) — spec files bannered S462; per-form machinery is the keeper. Successor: ID-145.ID-61 Unit F (copy half re-opened under ID-145)
ID-145 procurement form-first re-architecture ⚠️ pre-ID-45-GO gate (DDL)Retire the workspace umbrella from procurement UX: item = ONE form instance. Keep id-130 per-form machinery; retire procurement_workspaces roll-up + umbrella routes + workspace-keyed question reads (bl-435, now must); build the missing pieces (DR-014 manual form-upload UX — never built, id-136 was pipeline-retirement only; form-first create path — POST currently mints formless workspaces, the “Couldn’t load the drafting session” root cause; dashboard re-wire; question_matches callers — zero production callers; Unit F copy sweep; MCP re-key/rename).OPENED S462 (must, pending). {145.1} RESEARCH done (S462 dossier: specs/id-145-procurement-form-first/RESEARCH.md — keeper/retire/missing inventories, error root-causes, 12-item owner OQ register gating PRODUCT). {145.2} PRODUCT → {145.3} TECH → {145.4} PLAN on the /procurement worktree track. DDL batch lands BEFORE ID-45 GO.bl-435 (must), bl-370/bl-349/bl-420, UNIT-F-SCOPE-MAP §1(a)/(g)

LANE C — after-cutover (need a real corpus, or the post-cutover types-regen)

Section titled “LANE C — after-cutover (need a real corpus, or the post-cutover types-regen)”
ItemWhatGate
ID-60/T12 Mempalace KGneeds one clean re-ingest observation window (ID-53 dep already done)after cutover; consumes bl-74, bl-127
ID-70 opaque-Json RPC (bl-27, Tier 1+2, theme 8)5 RPCs migrated opaque-Json → typed RETURNS TABLE (+2 drops); none on the re-ingest read-path✅ DONE (S402, PRs #58/#60) — landed ahead of the cutover gen types window (the “wait for {64.8} regen” gate was advisory, not blocking; types-parity held). dep ["64"]
{52.22} (bl-204) Path-C catalogue idempotency✅ DONE (S316) — UPSERT on the natural key + ‘v1’ sentinel + resolveRequirementEmbedding; ID-52 CLOSED (S319), all 23 subtasks + end-of-task passesshipped
bl-165 pydantic error-class persistenceOption B fold-in for ID-61 (Option-D PII redaction already LANDED)→ ID-61; low-pri observability

LANE D — final cleanup (LAST — hard-gated on T7 re-ingest complete + stable)

Section titled “LANE D — final cleanup (LAST — hard-gated on T7 re-ingest complete + stable)”
TaskScopeNote
ID-46/T14 cocoindex absorption cleanupretire scripts/kb_pipeline/ (core ~5.8k LOC already gone under ID-68.23) + lib/extraction/ + procurement-library-ingest + dedup + batch-reclassify CLI scripts + OLD markdown-import pathspec chain {46.1}–{46.3} done; deletions {46.5}–{46.8} + {46.10} + {46.11} (markdown_batch ~11k LOC) DONE (S351, ff-merged). Remaining: {46.9} (retire lib/extraction/{og-metadata,extraction-result}.ts) now couples to {112.13} (ID-112’s deletion tail; ID-112’s cutover wave SHIPPED S379, {112.13} deferred/gated on ID-45), NOT ID-42; {46.11}→{56.12} fold pending
ID-112 (new Task, ex-ID-42)Worker-side HTML/URL extraction cutover — in-house Trafilatura cleaner (extract.py + POST /extract), worker HTML branch in-process, reference_ingest derives extraction_method server-side; then ({112.13}, deferred) retire Vercel Surface A (content-extractor.ts tiers + feed-poller Firecrawl) + Surface B (extraction/url.ts HTML branch + html.ts) + deps (firecrawl/readability/jsdom; verify unpdf)✅ CUTOVER WAVE DONE — Task 112 CLOSED (S379). Specs {112.1}–{112.4} + impl {112.5}–{112.12} shipped to main; both migrations (CHECK extension 130000 + reference_ingest derivation 130100) applied foreground to the Platform DB; gate GREEN (tsc + Vitest 13840 + pytest 1337). Only {112.13} DELETION set remains, deferred/GATED on ID-45 (drop the dead extractors only once re-ingest proves the in-house path on a stable corpus). Substrate from url_source.py (ID-75 WP-C). Cross-links ID-110/bl-298 + ID-45

AI-tooling rationalisation — ID-71 + eval engine ID-104 (theme 6/4) · parallel pre-launch · not a re-ingest gate

Section titled “AI-tooling rationalisation — ID-71 + eval engine ID-104 (theme 6/4) · parallel pre-launch · not a re-ingest gate”

Outcome-first redesign of the full AI-consumption layer (58 MCP tools + resources + prompts + apps + commands + skills), verdicts attached to OUTCOMES not tool names. Spec chain {71.1}→{71.4} COMPLETE + Liam-ratified (S354/S356); 23 impl Subtasks {71.6}–{71.28}. Wave-1 code COMPLETE on canonical (2f169545b): surface 58→42 (ONE find + get/assign/ find_duplicates one-or-many + where_are_we_exposed five-layer + whats_in_my_queue faceted queue + ontology-grounding) and the bid→forms AI-surface rename (code symbols + MCP literals + plugin bundle + queue form_draft_all + fixtures/evals). {71.15} M-DOCS client-doc refresh pending (next session, docs-site/docubot lane); Waves 2/3 now UNBLOCKED (the ID-104 build gate has cleared — ID-104 is DONE) and not yet built; {71.16} M-CREATE create-into-store leg coupled to ID-59. Absorbed bl-186/bl-26 (outputSchema).

ID-104 (eval engine, theme 4) — DONE. The bottom-up “evaluate everything” substrate that was HARD-UPSTREAM of ID-71 Waves 2/3. Spec chain {104.1}→{104.4} ratified; {104.5} lib/eval/contract.ts (AgentEvalContract) shipped; {104.6} eval-engine migration (4 tables + outcome_signal enum), registry/recordAiCall/baseline-store/graduation, and {104.7}/{104.8} severity→exit + variance regression all landed. The {104.6} migration was absorbed into the S371 squash baseline — no separate db-push/type-regen FF debt remains. With ID-104 done, ID-71 Waves 2/3 are unblocked.

LANE H — hygiene, closeable anytime (low-risk)

Section titled “LANE H — hygiene, closeable anytime (low-risk)”

Large ready/parked backlog of test/lint/runbook hygiene (see product-backlog.json). Non-gating. S383→S403 closures (all DONE, none on the Spine): ID-115 (Data API schema isolation — public unexposed → api exposed PostgREST isolation; {115.15} grant-guard baseline repair, PR #62) · ID-117 (unified document/revision diff surface over the extend-ui viewers) · ID-125 (ESLint 10 toolchain fix unblocking lint + eslint-rules CI) · ID-126 (test-audit DB/prod deferred tier, S399 WS1–WS4) · the jscpd dedup waves (roadmap 13: Wave-5 C2/C3 + Wave-6 S0 intelligence-guide-generator rename) + bl-356/bl-75 test-hygiene. S-canonical-baseline additions: bl-323/bl-324 (q-a-pairs follow-ups, kept as backlog) · bl-325 (citations stale flag — its migration is to be TIMED with the ID-45 re-ingest zero-row window; cutover-coordinated, see §2) · bl-326 (parked) · bl-327 (narrowed bl-282 ledger-server leg-2 port; leg-1 superseded by bl-296) · bl-300 (--legacy-fresh eval harness leg for the ID-101 symmetric parity gate). bl-221 → ID-83 DONE (S311) — cocoindex SOURCE_PATH boot-walk burn-valve retired: lifespan-only boot + bearer-gated POST /walk (single-flight, one-shot update_blocking(live=False)); 5 subtasks Checker-PASS, cherry-picked to canonical. OQ-1 scheduled task CREATED (disabled) both envs S312 — enable (pick cadence / event-driven) at cutover. bl-223 (ready, priority RAISED S319) — DNS/SSL HTTPS ingress for the on-prem cocoindex host: now also gates {75.13}/{75.15} walk-nudge delivery (worker port 8080 ufw-closed; nudges undeliverable until it lands — hourly fallback bounds latency to 1h). Operator task, not a cutover gate.

LANE PLATFORM — our own (kh.aisolutionhub.co.uk) ingestion + dev/CI · parallel · NOT a client v1 gate

Section titled “LANE PLATFORM — our own (kh.aisolutionhub.co.uk) ingestion + dev/CI · parallel · NOT a client v1 gate”

Two on-prem cocoindex stacks now run on a two-server split (S413/S414): the client’s pipeline on Server A 88.208.255.178, and Platform’s own pipeline on Server B 87.106.72.59 (one Coolify control-plane on B manages both). Platform (our dev/CI/showcase instance, tracks main) now has its own ingestion path — id-127 is 15/16 done, E2E-proven both envs (S419); only the id-134 promotion-confidence gate (the reframed {127.4} synthetic-corpus work — CANCELLED in the ledger, DR-014) + the deferred v1.1.0 re-pin remain.

ItemWhatStatus
ID-127 (was bl-301) Platform pipeline standupPlatform-owned cocoindex deployment feeding the Platform DB. AMENDED model (S408+, BUILT): prod + staging on a two-server split — Server A 88.208.255.178 = client pipeline · Server B 87.106.72.59 = platform pipeline + the single Coolify 4.1.2 control-plane managing both; ca-named composes; PullMD retired (cocoindex /extract, ID-129 DONE); promote via the shared kh-cocoindex-pipeline GHCR image (ID-113 substrate). Origin ID-108 (S348); promoted from bl-301 (S402); AMENDMENT ratified S408.15/16 done (standup essentially COMPLETE). Two-server split LIVE (S413/S414); both platform apps :healthy on Server B (ca-pipeline-platform-production→zjqbr prod · ca-pipeline-platform-staging→rbwqew staging); env-topology fixed S417/S418 (staging→staging env, NEW UUIDs); real EXTRACT_API_TOKEN + prod webhook wired; E2E /walk PROVEN both envs (S419) → 127.11+127.13 closed; LMDB→S3 backups armed + self-healing (PR #89 524bb4f6) + datapath-watch monitor wired. Remaining: the id-134 promotion-confidence E2E gate (S436 reframe of “{127.4} synthetic corpus + manifest”; {127.4} CANCELLED in the ledger, manifest forms-sense removed per DR-014, route-tag .kh-workspace-map.json KEPT; gate truth in specs/id-134-promotion-confidence-e2e/TECH.md [bannered stale] + the {134.6}/{134.7} journals + DR-014 + BL-392) + deferred v1.1.0 release-tag re-pin (client-prod on interim sha-b92aee5e; cut v1.1.0 + re-pin next session, held off ID-130). New backlog: the OKF chain has landed/advanced (id-131 L-records refactor [umbrella MERGED, PR #110] → id-132 + id-133 + id-134 + id-135) — it supersedes the old bl-367 “OKF spike” placeholder; bl-368/image-rename; platform-prod redeploy fragility (10.7 GB image on 4 GB box). Parallel, post-client-launch — NOT a Spine gate.
Platform-seed follow-upseed-platform-from-staging.ts / propagateAllToTarget excludes client-provenance tables but not client-provenance rows in canonical tables, so a re-seed re-introduces the scrubbed client taxonomy → filter provenance='client' (or stop propagating taxonomy; baseline = ontology).backlog (non-blocking)

  • S1 (ID-80 Path-B smoke) is independent of S3/S4 — it can run as soon as the productionisation lands + a form file is staged; it does not wait on the retention list. Do it early to de-risk the form half.
  • Lane A bl-189 ({64.12}/{64.13}) ✅ DONE (S348) — the telemetry/orphan content_items columns are dropped on prod, so the fresh corpus writes into the cleaned schema (zero backfill).
  • Lane B feature build neither blocks nor is blocked by the Spine — fully parallel. S-canonical-baseline: ID-58 CLOSED, ID-57 done (RPCs prod-promoted), ID-59 core + corpus-promotion on prod/canonical. Their schema slices landed pre-cutover (OQ-64-5 gate G6 fully satisfied — ID-57 question_match RPCs now on prod).
  • Spine gates status (unchanged through S419): S0a ✅ (prod cutover S336) · S0b ✅ (ID-101 CLOSED proven-artifact S348) · S1 ✅ (S319) · S3/S4 ✅ (ID-64 CLOSED S352) · ID-56→{56.12} chunking-UI ✅ DONE. The headline ID-45 run now awaits {45.3} TECH + {45.4} PLAN (unwritten), bl-106/OQ-45-1 (cv13-reconciled per the ID-45.1 journal; prose still lists it a Liam residual — confirm), explicit Liam GO, and NEW: ID-130’s domain-model migration landing first (pre-launch model-cement window).
  • Lane C ID-70 must wait for S4’s gen typesID-70 is DONE (S402); it landed ahead of the cutover regen with types-parity held, so the double-regen concern did not materialise.
  • ID-60 (Lane C) is the only feature gated after cutover (observation window).
  • Lane D ({46.9} + ID-112 {112.13} deletion tail) is the terminal step — ID-112’s cutover wave SHIPPED (S379); the dead-extractor deletions stay hard-gated on a stable re-ingested corpus.
  • bl-325 (citations stale flag) migration must be TIMED with the ID-45 re-ingest zero-row window — coordinate its DDL with the cutover so it lands while the affected tables are quiescent.
  • The migration history is now a single squashed baseline 20260617130000 (S371). The schema_migrations ledger was repaired (143 pre-squash rows → the single baseline) on all three DBs: Platform, client-prod, and client-staging (S374/S375). The old “id71-id104 FF carries two AUTHORED-but-UNAPPLIED migrations” parity debt is RESOLVED — those migrations were absorbed into the squash baseline. Going forward each client DB receives migrations via a deliberate per-release supabase db push (never auto-push); the re-ingest itself targets a fresh client DB. Always cat supabase/.temp/project-ref first before any CLI db push to confirm which DB you are pointed at (client vs Platform).

⚠️ S436 lynchpin — ahead of the ID-45 Spine. Current critical path is the OKF/id-131 landing, not yet re-ingest: deploy the id-131-lockstep cocoindex image → re-walk both Platform DBs → {131.11} G-SEARCH → dispatch id-135; id-134 {134.6} validates after the re-walk. Goose track (id-71) re-established via continuation-prompt-ca-s435. The ID-45 re-ingest (items 1–8 below) sequences AFTER this. See reference/deployment-architecture.md §10. Also S436: ID-127 gained a hardening wave {127.17-19} (walk rate-limit, CRON_SECRET split, rotation runbook) and a task-close blocker {127.20} (private ingress — tunnel/mTLS before multi-client GA, DR-015), so the “15/16 done” framing in this doc reads 16/20 with task close gated on {127.20}.

  1. Drive the cutover spine — all the prior gates are DONE: ✅ S0a (S336) · ✅ S0b (ID-101 CLOSED S348) · ✅ S1 (S319) · ✅ S3/S4 (ID-64 CLOSED S352) · ✅ ID-56/{56.12} chunking-UI · ✅ migration squash (S371) · ✅ ID-68 flip/purge (S375) · ✅ v1.0.0 cut (S377). The remaining gates in front of ID-45 are exactly three: (a) {45.3} TECH + {45.4} PLAN (cutover mechanism — still UNWRITTEN), (b) bl-106/OQ-45-1 canonical ingestion_source ratification (Liam, s361 packet), (c) explicit Liam GO. Then author {45.3} TECH + {45.4} PLAN and execute ID-45 (T7) full-corpus re-ingest (S5) into a fresh client Preview-branch target — wiring in the new {45.5} promoteCorpusExtractions auto-invocation host (async/service-role, NOT the 10s webhook) + {45.6} alternate_question_phrasings source — then cut over as the client (Phew) handover DB. (NB: the S383→S403 arc moved Lane B / LANE PLATFORM / hygiene only — the Spine is untouched and these three gates are exactly as they were at S382.)
  2. ID-71 AI-tooling + ID-104 eval engine — spec chains COMPLETE + ratified (S354/S356). ID-71 Wave-1 code landed on canonical (2f169545b, surface 58→42 + bid→forms rename); ID-104 is DONE (eval engine landed; its migrations were absorbed into the S371 squash baseline — no separate FF/db-push debt remains). Next: ID-71 Waves 2/3 are now UNBLOCKED (the ID-104-build gate cleared) and not yet built. reference/platform-direction.md is read-at-session-start for both.
  3. ID-61 PRE-reingest set DONE (S314) — {61.1} prompt-cache (+ live cache-usage log), {61.2} tracked-changes DOCX regression (resolver verified leak-free), {61.4} bl-165 error-detail persistence (+ ID-63.8 taxonomyMisses strip fixed), {61.8a} /walk cadence nightly 0 2 * * *. POST-cutover remain: 61.3 terminology audit, 61.5 runbook re-target (fold the now-decided cadence into checklist item (f)), 61.6 case-align, 61.7 bl-70 defer-rename, 61.8(d) once-live kill-switch drill. Operational pre-decisions (a)–(d) sign-off register (61.8; /walk cadence DECIDED 05/06/2026 = nightly 0 2 * * *, enable at cutover): operational-pre-decisions-register.md.
  4. Lane B feature build — ✅ ID-58 CLOSED · ID-57 done (RPCs prod-promoted, G6 fully satisfied) · ID-59 core + corpus-promotion on prod/canonical ({59.5}–{59.13}, {59.14}, {59.16}–{59.25}) + Q&A-sidecar wave {59.26}–{59.32} DONE (S383→) · ID-120 cross-workspace Q&A dedup CODE-COMPLETE (S402–S403, {120.5}–{120.9} shipped to main). ID-59 tail = {59.15} UC8 + {59.33} (gated). ID-101 (parity, S0b) is CLOSED — no longer a Lane-B or pre-re-ingest gate.
  5. ID-46 cleanup + ID-112 deletion tail — ✅ spec chain {46.1}–{46.3} done + deletions {46.5}–{46.8}/{46.10}/{46.11} executed (S351, ff-merged); ✅ ID-112 cutover wave SHIPPED (S379). Remaining {46.9} + ID-112 {112.13} (drop the dead firecrawl/readability extractors + Vercel tiers) stay gated on a stable re-ingested corpus.
  6. ID-66 residuals — DONE (S312) ({66.14} cold-backup armed + {66.15} Vercel cron + OQ-1 walk task created disabled + SOURCE_PATH set). This is the CLIENT on-prem stack. At cutover: enable the /walk scheduled task (pick cadence / event-driven) + set INGESTION_EXPECTED=true so the {66.15} monitor’s silence-condition (C) goes live.
  7. PLATFORM ingestion pipeline (ID-127, 15/16 done — essentially COMPLETE) — both platform cocoindex apps run :healthy on Server B feeding the Platform DBs (zjqbr prod / rbwqew staging), E2E /walk PROVEN both envs (S419), LMDB→S3 backups armed + self-healing. Remaining: the id-134 promotion-confidence gate (reframed {127.4}; CANCELLED in the ledger, manifest forms-sense removed per DR-014, route-tag KEPT) + cut v1.1.0 + re-pin client-prod off the interim sha-b92aee5e to the release tag (finishing the “correct release tag tracked by the client” goal — deferred to next session to avoid racing ID-130). New backlog: the OKF chain (id-131 [umbrella MERGED, PR #110] → id-132 + id-133 + id-134 + id-135) supersedes the old bl-367 OKF-spike placeholder; bl-368/image-rename; platform-prod redeploy fragility. Parallel and post-client-launch — NOT a Spine gate.
  8. ID-130 procurement/form domain-model — ✅ DONE (Task CLOSED S458, 30/31). The pre-ID-45 migration gate is SATISFIED (12-step staging-first migration landed; per-form machinery live on all four DBs). Superseded on its workspace-umbrella half by DR-038 + the owner ruling 2026-07-11 — spec files bannered S462.
  9. ID-145 procurement form-first re-architecture (must, OPENED S462) — the NEW pre-ID-45-GO DDL gate. Item = ONE form instance; retire the workspace layer (bl-435 re-key now must; procurement_workspaces/rollup retirement; domain_metadata drop), build DR-014 manual form-upload UX + form-first create path + dashboard re-wire + question_matches callers + Unit F copy sweep + MCP re-key. {145.1} RESEARCH done (S462 dossier with the 12-item owner OQ register gating PRODUCT); {145.2}/{145.3}/{145.4} authored on the /procurement worktree track. Its DDL batch must land before the ID-45 first-client re-ingest cements the live model (pre-launch = cheapest window — the same logic that governed id-130). id-128 stays PAUSED excl {128.3} until ID-145 lands (owner ruling S462).