Report
penster batch 20260911T234647, field report on #627, items D, F (unknown-ruling half), G. Three smaller defects around rulings, grouped because they share the "runtime should recognise a ruled gate" theme:
D — ruling-closed gates still trigger remediation + a fresh review
When the supervisor closes a REVISE-capped gate by ruling, the latest on-disk verdict stays REVISE; at .DONE the finalize sweep spawns a "review remediation" iteration and a fresh review (4 ledger reviews on TP-2103/TP-2054, ~1 iteration + 1 review each). ratify_gate (TP-198) is exactly the mechanism — but nothing prompts for it. Fix: the unresolved-verdict refusal alert and the remediation-spawn STATUS line should, when the task has a released hold whose ruling post-dates the REVISE file, name ratify_gate(taskId, gate, rulingId, …) as the remedy instead of "have the worker address the findings". Consider refusing to spawn remediation for a gate that already has a released ruling and alerting for ratification instead.
F — unknown-ruling flagged on a valid released ruling
The trailer cited a ruling id that is present in the agent's ack/ dir and has hold-released:<id> in the engine log, yet validateRulingCitations flagged unknown-ruling. Needs the commit (git show <sha>) and the hold record from batch-state.json to diagnose. Suspects: the citation used the escalation id rather than the ruling id; or the hold binding the unit was a segment hold and holdsForUnit scope didn't match the scanning unit; or the scan ran with a holdStore.list() snapshot taken before the release persisted. (The prose-claim half of F is fixed in #643.)
G — relaunch reset a struck step to open
After a split ruling on TP-1920, the relaunched worker's STATUS showed a previously struck step re-opened; the worker reverted it. Suspect: the lane-runner's updateStepStatus(firstStep, "in-progress") on the first remaining step, where "struck" (a ruling removed the step from scope) is not a status the parser recognises, so the step still counts as remaining. Fix: recognise a struck/waived marker (e.g. **Status:** ⛔ Struck (ruling <id>)) in parseStatusMd and exclude such steps from remainingSteps and from the finalize all-steps-complete check — the same predicate authorizeCompletion uses.
Acceptance
- D: fixture with REVISE latest + released later ruling → refusal alert names
ratify_gate; no remediation spawn.
- F: root cause identified from penster artifacts; regression added.
- G: struck-step fixture → not re-opened on relaunch, not counted as incomplete at finalize.
Report
penster batch
20260911T234647, field report on #627, items D, F (unknown-ruling half), G. Three smaller defects around rulings, grouped because they share the "runtime should recognise a ruled gate" theme:D — ruling-closed gates still trigger remediation + a fresh review
When the supervisor closes a REVISE-capped gate by ruling, the latest on-disk verdict stays REVISE; at
.DONEthe finalize sweep spawns a "review remediation" iteration and a fresh review (4 ledger reviews on TP-2103/TP-2054, ~1 iteration + 1 review each).ratify_gate(TP-198) is exactly the mechanism — but nothing prompts for it. Fix: theunresolved-verdictrefusal alert and the remediation-spawn STATUS line should, when the task has a released hold whose ruling post-dates the REVISE file, nameratify_gate(taskId, gate, rulingId, …)as the remedy instead of "have the worker address the findings". Consider refusing to spawn remediation for a gate that already has a released ruling and alerting for ratification instead.F —
unknown-rulingflagged on a valid released rulingThe trailer cited a ruling id that is present in the agent's
ack/dir and hashold-released:<id>in the engine log, yetvalidateRulingCitationsflaggedunknown-ruling. Needs the commit (git show <sha>) and the hold record frombatch-state.jsonto diagnose. Suspects: the citation used the escalation id rather than the ruling id; or the hold binding the unit was a segment hold andholdsForUnitscope didn't match the scanning unit; or the scan ran with aholdStore.list()snapshot taken before the release persisted. (Theprose-claimhalf of F is fixed in #643.)G — relaunch reset a struck step to open
After a split ruling on TP-1920, the relaunched worker's STATUS showed a previously struck step re-opened; the worker reverted it. Suspect: the lane-runner's
updateStepStatus(firstStep, "in-progress")on the first remaining step, where "struck" (a ruling removed the step from scope) is not a status the parser recognises, so the step still counts as remaining. Fix: recognise a struck/waived marker (e.g.**Status:** ⛔ Struck (ruling <id>)) inparseStatusMdand exclude such steps fromremainingStepsand from the finalize all-steps-complete check — the same predicateauthorizeCompletionuses.Acceptance
ratify_gate; no remediation spawn.