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
- D7–D9 were order-swapped after D10, then completed. All three V2 pages ship on NEW
/review-v2routes only — the legacy pages stay canonical, so your smoke exercises the proven surfaces and you can visit/review-v2side-by-side to bless the flips (the PP tenant-#5 precedent). - 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.mdD11. - 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)
- Pembubaran PT: upload AKTA_PEMBUBARAN (+ surat likuidator → the re-check chip) → extraction → review → submit → verifikator page.
- 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.
- 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.
- 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.