docs(remediation): D-40 RULED BLOCKING; pre-register type-strict ACs before the fix is pushed

Mos ruled BLOCKING on the exit_code type confusion. Both of us had leaned non-blocking on the
unreachability argument and neither shipped it. The two decisive grounds: the direction is
wrong-ACCEPT (false and 0.0 GRANT the exemption), which is this mission's disqualifying direction and
exactly why RR12 was tolerable; and "Woodpecker is Go with an int type" is structurally the same
incidental-correlate argument RM-61 itself forbade for the signature — you cannot certify the
discriminator against infra-shift and then defend a hole in it with an infra-stability assumption.

Generalised into an RM-02 standing clause, which is the real prize: discriminator and comparison
inputs must be TYPE-STRICT. A comparison that accepts a type it should not is a wrong-ACCEPT hole by
construction; `== 0` matching False and 0.0 is one instance of a class. D-40 is the instance, the
clause is the fix. It sits alongside the D-38 clause (does this gate bind its evidence to its subject).

D-39b banks the roles-swapped half: the author does not adjudicate its own PR's blocker status and
does not move the head to enforce it. Symmetric with D-39 — a seat with a stake in the answer does not
settle the question, and a conservative motive exempts neither direction.

ACs are registered NOW, before coder-mos1 pushes and before any reviewer reads a diff; at registration
the fix exists only as an unpushed local commit I have not read, so there is no diff to retrofit to.
They also state explicitly which cases are genuine RED-FIRST (false, 0.0 — currently wrongly exempting)
and which are only regression guards ("0", null — already blocking), because demanding an impossible
red for the latter two invites weakening something real to manufacture it.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
mos-dt-0
2026-08-01 09:23:16 -05:00
co-authored by Claude Opus 5
parent 249335e515
commit 86cd1a0f46
2 changed files with 109 additions and 2 deletions
+49 -2
View File
@@ -338,8 +338,38 @@ conjunction earns a tracked owner even while unreachable — because RM-61's own
**correlates pass today and break the moment infrastructure shifts**, and the charter's rule is that a
documented gap with no owner becomes a permanent gap that reads as intentional.
**Disposition:** recommended NON-BLOCKING for #1033 and routed to Mos/the merge-gate as a recommendation,
explicitly **not** an orchestrator ruling. Fix: `isinstance(x, int) and not isinstance(x, bool)`.
**★ RULED BLOCKING (Mos, 2026-08-01).** The orchestrator recommended non-blocking, then moved off that
recommendation on the record; Mos's own earlier lean was also non-blocking on the unreachability
argument. **Neither seat shipped it.** The five grounds, first two decisive alone:
1. **The direction is wrong-ACCEPT.** `false` and `0.0` both GRANT the exemption. This mission's bright
line is that wrong-ACCEPT disqualifies and wrong-REJECT fails safe — precisely why RR12 was tolerable
(wrong-REJECT only) and this is not.
2. **The unreachability defence is the exact argument RM-61 forbade.** _"Woodpecker is Go with an int
type, so it won't emit a boolean or a float"_ is structurally identical to the incidental correlate
RM-61 rejected for the signature: a property that holds today and breaks the moment infrastructure
shifts. The record is JSON off an API whose type contract we do not enforce. **You cannot certify the
discriminator against infra-shift and then defend a hole in it with an infra-stability assumption** —
the argument is self-undermining.
3. **It is inside the load-bearing discriminator** — "a failed service step with `exit_code 0` under a
successful workflow" is the single structural fact the exemption rests on. Highest-stakes location,
not an edge.
4. **Keystone stakes** — RM-02 and everything downstream depend on this exemption being what it claims.
Shipping it with a known wrong-ACCEPT is the cure carrying the disease.
5. **The fix is ~6 lines + 4 cases.** A tracked-owner "documented gap" is the right pattern for an
unreachable, out-of-scope, wrong-REJECT gap. It is the wrong pattern for a wrong-ACCEPT hole in the
load-bearing discriminator. We blocked on less all night; consistency demands it here.
> **★ RM-02 STANDING CLAUSE (the generalisation, and the real prize): DISCRIMINATOR AND COMPARISON
> INPUTS MUST BE TYPE-STRICT.** A comparison that accepts a type it should not is a **wrong-ACCEPT hole
> by construction**. `== 0` matching `False` and `0.0` is one instance of a class. **D-40 is the
> instance; the clause is the fix.** Registry must ask it of every gate, alongside the D-38 clause
> ("does this gate bind its evidence to the subject?").
Cost accepted: the push voids head `033b2ffb`, review 69, and pipeline #2193. Fix requires
`isinstance(x, int) and not isinstance(x, bool)`; ACs pre-registered at
[`AC-RM61-TYPESTRICT.md`](./AC-RM61-TYPESTRICT.md) **before the fix was pushed and before any reviewer
read a diff** — registered against an unpushed local commit the orchestrator had not read.
**Provenance note worth keeping:** this was found by a seat dispatched to adjudicate something else
entirely (D-39's RR12 re-run), which looked outside its question and said so. The clean-context dispatch
@@ -386,6 +416,23 @@ asymmetry is the signal, not the outcome.
the re-adjudication was only trustworthy because the seat was **mechanically** fresh rather than asked to
be, which is D-4's lesson applied to independence rather than to context.
**★ D-39b — THE ROLES-SWAPPED HALF (banked by Mos, 2026-08-01), found within the hour.** On D-40,
`coder-mos1`**the author** — escalated the finding on its own PR to BLOCKER, declared the
orchestrator's gate-ready report withdrawn, and moved to **push**, which would have voided a live
APPROVED review (69) and a terminal-green exact-head pipeline (#2193). The orchestrator held it.
> **The principle is symmetric: a seat with a stake in the answer does not settle the question.**
> Neither a dispatcher handing a reviewer its conclusion (D-39), nor an author adjudicating its own PR's
> blocker status and moving the head to enforce it (D-39b), is permitted. **A conservative motive does
> not exempt either** — the rule does not get softer because the direction is cautious. Escalating your
> own work to blocker is still adjudicating your own work.
Correct behaviour, which is the actual division of labour: **the author surfaces evidence and prepares
the remediation; the coordinator/merge-gate adjudicates blocker status; the orchestrator routes and
holds the head.** `coder-mos1` was RIGHT to want it fixed and WRONG to try to settle it — and it was
right again immediately after, ACKing the hold and volunteering unprompted that it held an unpushed
local commit. That disclosure is the behaviour to reinforce.
### D-38 — a gate that certified the right RECORD for the wrong COMMIT (and the AC set that could not see it)
**RM-61's terminal-green verifier reported the pipeline's commit and never bound it to the PR head.**