v2.3.0 — gate contradictions
A review-only pass over all 19 skills found eight defects, all of them contradictions between
files that read correctly in isolation. This release closes all eight.
Blockers
duck-plan's naming rule broke duck-scan's read-only guarantee. It said "a skill named
inside another skill's step is an instruction to invoke it, not a citation" — absolutely, which
turned duck-scan's mention of duck-cut into a dispatch two lines above where duck-scan says
"the skills do the acting". Nine citations across the corpus sat under the same rule. Now scoped
to imperative steps.
A converging third review round was undispatchable. duck-review refused every N≥3 dispatch
without a committed loop-diagnosis:, but duck-run only minted one when the loop was diverging.
Both now turn on the same predicate, and a converging loop is an exit like the other four.
duck-run's Verify stage inverted its own scratchpad rule — "never the scratchpad, which is
where the gate looks". The relative clause attached to the scratchpad.
Gaps
duck-race's receipt was the only one homed in$SP, which dies before the stage that reads it.- The receipt commit path was unstated corpus-wide. It goes on a records branch, never base — a
receipt landed on base advances whatduck-landre-verifies and voids the authorization the
receipt exists to support. duck-reviewnamed the model-pin proof and declined to enforce it whileduck-racemandated the
same control, deferring to "the soul" — a reference resolving nowhere in the corpus. Now binding
in both.duck-plandeferred a co-author count toduck-review's bar without stating it. Now two.REQUIRED_REFERENCEScovered 1 of 8 load-bearing delegations, so five of the pipeline's own
links could be deleted with the validator green. Each new row is mutation-tested.
Minor rather than patch: behaviour tightened rather than only repaired.
How it was reviewed
Two rounds against a roster-proven different model family. Round 1 rejected the change on a
defect in the fix itself — the rewritten breaker claimed to fire "earlier than" its round count,
which is impossible, since remediation-born blockers need three rounds to occur twice. Deleted
rather than repaired. Round 2 approved.
Reviewed by one family rather than two: the second outaged on credits and the owner waived the
two-family requirement for round 2 only.
Full changelog: v2.2.0...v2.3.0