fix(roadmap): PMAT-1072 — main RED: drop 12 legacy nested subtask records pmat 3.39.0 refuses as duplicate ids; in-repo pin-independent id-uniqueness guard - #3030
Conversation
…fuses as duplicate ids; in-repo pin-independent id-uniqueness guard; G-6 treats subtasks as lifecycle (PMAT-1072, #3028) Pmat-Ticket: PMAT-1072
|
§13.11 rung 1 — quorum shadow verdict Shadow mode: this records a verdict and merges nothing. A refusal |
|
Re-ran the failed jobs ( |
Fixes #3028. Fleet drift: paiml/infra#468.
Ticket
PMAT-1072 (mint rides the session docs commit — A is the only minter there). Andon: main @ 3792afa push run 34049248452 is RED at the upstream
roadmap-validstep (sovereign-ci.yml:1207, bare PATHpmat work validate, now 3.39.0 on every runner host); the merge queue evicted #3021 and will evict every entry until main is green.Claim
Every
id:indocs/roadmaps/roadmap.yamlnames one ticket, nested records included — and the rule lives in the repo through the parsed tree, so the version of pmat on a runner's PATH is never the only guard between main and a duplicate id.Root cause (measured)
git diff --stat b0a0a51b2 3792afa3d -- docs/roadmaps/roadmap.yamlempty$PMAT work validate→ passed ·pmat work validate→ 12 duplicates, the CI log verbatim~/.cargo/bin/pmat3.39.0 mtime 17:30:02Z (auditdcargo install pmat17:26–17:30Z); lambda 17:33:38Z; green PR run 34041439234 at 15:10Z, red main run at 17:38Zid:line, subtask ids includedsubtasks:records{id, github_issue, title: <id>, status, completion}under APR-ANTIGRAVITY-PARITY-001 (2), PMAT-710 (5), PMAT-716 (4), PMAT-719 (1); pmat 3.39.0work addhas no parent/subtask flagRED test
bash scripts/check_roadmap_ids_unique.shon main @ 3792afa's roadmap →FAIL 12 duplicate id(s)naming each path and line (e.g.PMAT-719: $.roadmap[505].subtasks[3] (line 10498), $.roadmap[508] (line 10560)). On this branch →PASS 809 ids, all unique.Acceptance
bash scripts/check_roadmap_ids_unique.sh --self-test→ 6/6 rows (nested dup RED, top-level dup RED, block-scalar id ignored, unparsable = 1, missing = 2)pmat work validate(3.39.0) and$PMAT work validate(3.37.0 pin) →Validation passedbash scripts/check_roadmap_diff_additive.sh origin/main HEAD→added=0 lifecycle=4 reserialised=0 deleted=0 PASS; its self-test 18/18 (row 3b new)check_guards_are_wired.sh,check_baseline_ratchets.sh,check_complexity_ratchet.sh,check_shell_lint_ratchet.sh(8 → 8),check_no_claim_literals.sh,check_perf_claims_cite_receipts.sh,check_roadmap_completion_is_cited.sh,check_row_pr_write_set.sh(orchestrator branch) → all PASSMutation
walk()skips lists → self-test rows 1–4 RED (restored)check_guards_are_wired.shRED:NEW: check_roadmap_ids_unique.sh(restored)roadmap-valid) → this PR's run (GREEN, same step) — the second id lands in a comment when the run completes.Contract
contracts/apr-roadmap-ids-unique-v1.yaml(kind: pattern; RMID-OB-001..003 ↔ RMID-F-001..003);pv validatethroughscripts/pv_bin.sh: valid.Quorum
NOT RUN — andon hotfix to restore main (the queue is blocked); the case table and two RED mutations above are the evidence. A review-only lane on this diff is queued in the session docs.
Receipt
docs/audits/impl-PMAT-1072-receipt.md—status: complete(written .tmp then mv).Writes
docs/roadmaps/roadmap.yaml(64 deletions, 0 insertions: the 12 nested records →subtasks: []on four parents),scripts/check_roadmap_ids_unique.sh(new),contracts/apr-roadmap-ids-unique-v1.yaml(new),scripts/lib/roadmap_diff.py(+subtasksin LIFECYCLE_KEYS),scripts/check_roadmap_diff_additive.sh(+row 3b),.github/workflows/ci.yml(+2 steps in guard-runner-labels, after the roadmap-citation case table),docs/audits/impl-PMAT-1072-receipt.md.Overlap with #3027
#3027 (
PMAT-246-roadmap-repair, 17:12Z, the BSE-001 convergence brief's H4) carries the identical byte-for-byte dedup of the same twelve ids plus a PMAT-1060 mint; I opened this PR without re-listing PRs (an I0 miss, recorded). The two deletions are the same bytes, so they merge cleanly in either order. What only this PR carries: the pin-independent guard, its contract, the G-6 lifecycle change (which is also what #3027's guard-runner-labels currently fails on), and the receipt. PMAT-1060 collides with #3025's hand-minted PMAT-1060 (R-0b); #3025 renumbers its own.Not in this PR
The upstream step still runs bare PATH
pmat(infra#468 decides the pin);scripts/pmat_bin.shPMAT_PIN=3.37.0 is now behind the fleet — moving it is a G-10a re-stamp, its own ticket.🤖 Generated with Claude Code