think
16px
820px

Overnight PT Run — 2026-07-09 (Phase D autopilot report)

TL;DR: Phase D is COMPLETE. Every PT flow runs on the v2-generic engine (Axis A), every PT flow has a ReviewData projection with a V2 page (Axis B — new /review-v2 routes only, legacy pages stay canonical until your smoke), and the forgotten SABH merger flow (Penggabungan, id_aksi 11) exists end-to-end for the first time. Backend 2460 pass / 0 fail · frontend 965 pass / 0 fail · both tsc clean · one commit per step.

What landed (in commit order)

Step What How
D0 Red klasifikasi test fixed outdated fixture → KORAN
D1+D2 PEMBUBARAN_PT + BERAKHIRNYA_STATUS_PT ported from frozen feat/pt-flows-registry (committed together — routing-layer entangled: BERAKHIRNYA_PACKAGE predicate + ladder rungs + shared tests) 50 files ported verbatim; MODIFIED shared files reconciled onto tidy idioms (gateway chat client, createLogger, validateBody won; only behavioral fixes ported — e.g. telepon regex digit boundaries, rups-quorum comparator, merge-preserve RUPS matcher). Enum + additive migration; launch switches flipped; /recheck-likuidator; wizard doc-sets; FE pages + routes
D3 PERUBAHAN_PT flipped oracle-proven shadow promoted; fork processing half deleted; perubahan /submit v2 arm scoped to foreign types (family submit is route-owned by design)
D4 AKUISISI_PT flipped same; forcePeralihanOn stays live as the flow's mapChangeTypes hook
D5 PENDIRIAN_PT shadowed + flipped gather-extraction recipe; new pendirian-flow-parity oracle green BEFORE the flip; engine gained extraction.concurrency / extraction.docTimeoutMs / rematch.beforeMatchers seams (dormant defaults)
D6 PERBAIKAN_DATA_PT flipped as a custom-pipeline tenant customProcess (Phase-0-only dispatch) + new rematch.custom seam — its validator's dynamic per-correction instances don't fit the generic rule model, so the SHARED validator stays authoritative
D10 PENGGABUNGAN_PT built greenfield (order-swapped ahead of D7-D9 — see below) Rides the perubahan family end-to-end like AKUISISI (survivor lookup, PT_AKTA rules incl. akta nama/NIK × KTP, verifikator-staged); grounded 35B extraction of merging PTs into the shared source table; 3 merger rules (WARNING-first, FAIL only on a self-referential deed). All 8 akta taxonomy types are now built — UNSUPPORTED_AKTA_LABELS is empty.
D11 (partial) Roadmap + cleanup inventory written into tidyup/tasks.md code cleanup deferred until the smoke pass blesses the flips
D7 PERUBAHAN_PT projector + V2 page (/perubahan/:id/review-v2) per-jenis sections from appearingSectionKeys (the submit gate's own collapsed vocabulary) as DiffModel sections; s1-s5 + conditional syarat-utama attestations; full-state attestation POST (pinned — never a partial wipe)
D8 AKUISISI_PT projector + V2 page (/akuisisi/:id/review-v2) the perubahan projector became a tenant FACTORY; akuisisi = tenant #2 with the advisory legal-path radios. Also fixed a D10 gap: PENGGABUNGAN_PT joins the sections-only submit branch (it was falling through to the s1-s5 gate → permanently unsubmittable)
D9 PERBAIKAN_DATA_PT projector + V2 page (/perbaikan/:id/review-v2) one section per correction; roster corrections with per-row confirm (concatenated direksi+komisaris indexing, matching the gate's count); per-item attestation posts. Axis B for PT complete — APOSTILLE is the only null review-registry entry

Judgment calls to review

  1. D7–D9 were order-swapped after D10, then completed. All three V2 pages ship on NEW /review-v2 routes only — the legacy pages stay canonical, so your smoke exercises the proven surfaces and you can visit /review-v2 side-by-side to bless the flips (the PP tenant-#5 precedent).
  2. D11 code cleanup is gated on your smoke pass (not done): deleting the fork validation halves, parity oracles and dead dispatcher branches right before the smoke would trade regression safety for tidiness. The post-smoke worklist is inventoried in tasks.md D11.
  3. PENGGABUNGAN submit-gate fix (found during D8): the merger flow was falling through to the s1-s5 perubahan gate and could never submit; it now rides the akuisisi sections-only branch.

What to smoke (single pass, per your plan)

  1. Pembubaran PT: upload AKTA_PEMBUBARAN (+ surat likuidator → the re-check chip) → extraction → review → submit → verifikator page.
  2. Berakhirnya: the 6-PDF package (deed + BA + surat permohonan + laporan likuidasi + pengumuman 149/152) — the package predicate must route it to Berakhirnya even when the deed label reads AKTA_PEMBUBARAN.
  3. Perubahan / Akuisisi / Pendirian / Perbaikan: normal happy paths — these now run on the engine; behavior should be byte-identical (oracle-pinned), incl. select-company resume, retry, field-edit revalidation.
  4. Penggabungan: a sampel_merger deed → detect banner "Penggabungan PT (Merger)" → rides the perubahan pages; check the PENGGABUNGAN_* validation rows (sources listed from the deed).

Engine seams added this run (all dormant-by-default)

extraction.concurrency · extraction.docTimeoutMs · rematch.beforeMatchers · rematch.custom · customProcess now owns status writes.

Registry end-state

v1-fork tenants remaining: APOSTILLE only.