Skip to content

v0.82 CLOSEARM lane (#1484): the conjunction two gates never read, and a population of 32 - #1486

Merged
avrabe merged 1 commit into
mainfrom
lane/v0.82-closearm
Oct 8, 2026
Merged

avrabe merged 1 commit into
mainfrom
lane/v0.82-closearm

Conversation

@avrabe

@avrabe avrabe commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

R14 — the conjunction two gates never read

status: implemented is simultaneously R3's only remedy for "the status under-reports
shipped work" and authorised_close_set's permission to retire the issue. v0.81's
JESSDIVERGE3 and WIDEFILE4 each delivered a refutation, said so in their own
verified-by, and were set claiming for R3's sake — which silently placed an externally
reported live blocker in the authorised close set. An operator caught it by running the
closure gate before tagging. No gate did.

R14 now reds an artifact whose verified-by: opens with an INCOMPLETE verdict while its
status claims the outcome holds and no issue-scope: is declared at all.

Why a declaration, not outlives

R11 reds a non-delivery disposition: beside a claiming status. R3 reds a non-claiming
status whose done-when evidence exists. So for a lane that did real work and refuted its own
premise, claiming + prose-only refutation + no disposition is the forced configuration —
there is no legal third option. Demanding outlives would red RQ-77-PROSEBLIND, whose
verified-by opens REFUTED and whose issue is genuinely resolved. Either value satisfies
R14; what it forbids is leaving the issue's fate inferable only from English.

R3 and R11 are unchanged.

Potency — paired mutants, both directions

mutant tests killed
rule condition forced False the 2 red-first tests
not _iscope14 dropped (over-fires) the 2 green-path tests
as shipped 7/7 OK, live gate rc=0

On real data R14 reds RQ-77-PROSEBLIND, and reds both v0.81 artifacts when their
outlives is stripped — the near-miss, reproduced.

The vocabulary is imported, not mirrored

INCOMPLETE and leading_verdict come from verdict_prose_check under an assertIs —
identity, not equality, because an equal-but-separate set passes today and drifts tomorrow.
A second copy of the verdict sets would be the #667 defect one tier down. Asserted: zero
INCOMPLETE = { literals in the gate.

RQ-77-PROSEBLIND gains issue-scope: closes, the truthful value and the first closes
beside a claiming status — so R12's body was read before adding the field, not after a red.

VALUELESSKEY: the population, derived (#1458)

With ast, not a grep — because the artifact's own git grep 'str(fields.get(' undercounts
the class it scopes
, missing str(art.get(, str(a.get(, str(fl.get( and the tuple form:

class sites
reads a YAML artifact field (the live class) 14
reads API JSON / config 13
test fixture, cannot surprise 2
other (2 reach a field via a tuple) 3
total 32

11 of the 32 sit in status_evidence_check.py itself, two in R12's own path where a bare
issue-scope: becomes the invented string "none". R14 is not in the population — it
writes or "" before str(), verified by re-running the census after it landed. The lane's
deliverable is a derivation plus a tripwire, not a 32-site sweep.

Also

Two module docstrings made raw, clearing the last two SyntaxWarnings in scripts/
(invalid escapes that become SyntaxError in a future Python); census re-run to 0 with a
planted control proving the detector still fires. CLOSEARM's refuting command re-pointed at
the right module, and its done-when corrected after the design changed.

All 20 CI-invoked test scripts pass in CI's exact invocation form.

Refs #1484 #1458 #1319

🤖 Generated with Claude Code

https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L

@codecov

codecov Bot commented Oct 7, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

…d a population of 32

R14. An artifact whose `verified-by:` opens with an INCOMPLETE verdict while its status
CLAIMS the outcome holds must DECLARE what that means for its issue — `issue-scope: closes`
or `issue-scope: outlives` — in the field the closure gate already reads.

WHY A DECLARATION AND NOT `outlives`. R11 reds a non-delivery `disposition:` beside a
claiming status; R3 reds a non-claiming status whose done-when evidence exists. So for a
lane that did real work and refuted its own premise, claiming + prose-only refutation + NO
disposition is the FORCED configuration — there is no legal third option. Demanding
`outlives` would have reddened RQ-77-PROSEBLIND, whose `verified-by` opens REFUTED and
whose issue IS resolved (it is closed; the refutation shipped in v0.69). R3 and R11 are
untouched; what changes is that the ISSUE's fate becomes structural instead of inferable
only by reading English.

PAIRED CONTROLS, both directions, each killing its own mutant:
  * rule forced False     -> kills the two red-first tests
  * `not _iscope14` dropped -> kills the two green-path tests
  * as shipped            -> 7/7 OK, live gate rc=0
Red-first on real data: reds RQ-77-PROSEBLIND, and reds BOTH v0.81 artifacts when their
`outlives` is stripped, which is exactly the near-miss an operator caught by hand.

THE VOCABULARY IS IMPORTED, NOT MIRRORED. `INCOMPLETE` and `leading_verdict` come from
`verdict_prose_check` under an `assertIs` — identity, not equality, because an
equal-but-separate set passes today and drifts tomorrow. A local copy of the verdict sets
would be the #667 defect one tier down. Asserted: zero `INCOMPLETE = {` literals in the
gate.

RQ-77-PROSEBLIND gains `issue-scope: closes` — the truthful value, and the first `closes`
beside a claiming status (the one existing precedent is `proposed` + `disposition: refuted`,
a different shape, so R12's body was read before the field was added rather than after a
red).

VALUELESSKEY's POPULATION DERIVED (#1458), with `ast` and not a grep: 32 sites of
`str(<expr>.get(...))` in scripts/, of which 14 read a YAML artifact field (the live class),
13 read API JSON, 2 are test fixtures; 11 of the 32 sit in `status_evidence_check.py`
itself, two of them in R12's own path where a bare `issue-scope:` becomes the invented
string "none". The artifact records that its own `git grep` refuting command UNDERCOUNTS
the class, and that R14 is NOT in the population because it writes `or ""` before `str()`.

Also: CLOSEARM's refuting command re-pointed at `verdict_prose_check` (the wrong module
raises AttributeError, the good failure) and its done-when corrected after the design
changed; two module docstrings made raw, clearing the last two SyntaxWarnings in scripts/
(invalid escapes that become SyntaxError in a future Python), census re-run to 0 with a
planted control proving the detector still fires.

AND THE SQUASH SIMULATION CAUGHT THIS ARTIFACT CLAIMING NOTHING. CHECK4 reddened with
`R4-lane RQ-82-CLOSEARM: delivery commit on main ... but status is proposed and landed:
does not acknowledge it`, and the merge was correctly blocked. Nothing on the branch could
have found it: the window gate walks --first-parent from the MERGE commit, so a PR's own
commits are invisible while it is still a PR.

So the artifact now CLAIMS, and R14 judges its own artifact. Flipping to a claiming status
to satisfy R4-lane also arms the closer for #1484 — this release's own theme, landing on the
lane that fixes it. The difference from v0.81's near-miss is that the claim is TRUE, so it is
made plainly: `status: implemented`, a `landed:` record naming this PR, and a `verified-by`
whose leading verdict is DELIVERED. Had it hedged with PARTIAL or PENDING, R14 would have
reddened this very artifact unless it declared an `issue-scope:` — verified by deriving
`leading_verdict(...) in INCOMPLETE == False`. No `disposition:` (R11 forbids it beside a
claiming status) and no `issue-scope:` (unnecessary with a COMPLETE lead).

All 20 CI-invoked test scripts pass in CI's exact invocation form.

Refs #1484 #1458 #1319

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
@avrabe
avrabe force-pushed the lane/v0.82-closearm branch from e1cf553 to 7d89beb Compare October 7, 2026 23:53
@avrabe
avrabe merged commit 93c5e4b into main Oct 8, 2026
73 of 74 checks passed
@avrabe
avrabe deleted the lane/v0.82-closearm branch October 8, 2026 02:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant