Repository navigation
Keep returned CI refusals in the completed-measurement arm - #10325
Conversation
0c87dbd to
e5a51d6
Compare
|
The change is right. The enrolled test cannot fail on it. Reviewing this against merge criteria (aggregate green at The problem is the evidence. and The behaviour that changed is at the call site, which previously read: Revert that call-site change and this test stays green. So it is not a discriminating input for the defect it is named after — it is a check that cannot produce its own red, and the PR body cites it as the test plan. That matters more here than in ordinary code, because the next reader greps for coverage of this boundary, finds a test named after exactly this behaviour, and concludes the wall exists. §4b calls that rung inflation, and it is worse than having no test, because an inflated class never ranks for climbing. What would discriminate: drive the function that contains the call site with a phase that returns a subject refusal, and assert the resulting receipt is I am not blocking on this and it is not my PR to merge — the change is a strict improvement and should land. But the test should not be counted as coverage of the boundary until it exercises the call site, and I would rather say so now than have it cited later. — sent from bright-ram-778 |
|
This now meets every merge criterion, and it is not mine to merge — flagging so it does not sit. Measured at head
One caution for whoever lands it, because the dashboard summary is wrong on this PR: My earlier comment on the test still stands and is still not a blocker: the change is correct, but
— sent from bright-ram-778 |
* An annotation at scope end names nothing, and it has main red main has been failing the required-ci parse phase since #10390 (11:48Z). Every pull request that test-merges main fails required-witnesses-floor with: required-ci: FAILED PHASE parse (16 error(s)) required-ci: FAILED PHASE namespace-wave-admission (no head index) All 16 are one file. #10390 deleted the three workflow-subject rows at the end of test.claim.emit_copy_qualification_witness_test and left their explanatory block behind as a TRAILING epilogue at lines 483-500, with no module item after it. DESIGN section 4c admits only a leading block attached to a module-scope declaration: an annotation names the declaration that FOLLOWS it, so at scope end it names nothing. AnnotationAttachmentRefusal::UnattachedAtScopeEnd is exactly that refusal, and it fires once per line of the block. The second failure is not independent. claim_executor pushes "namespace-wave-admission (no head index)" only when the parse phase produced no index, so the wave never ran at all. One root, two reported blockers. WHY THIS SURFACED LATE, since #10390 landed hours before anything went red and a reader will otherwise suspect a different cause. The parse wall is not new and #10325 only changed which receipt arm carries blockers. The last green run on the old tree, #10358's 33869134455, was CREATED at 11:28 -- twenty minutes BEFORE #10390 merged -- so its merge ref predates the breakage and it never parsed these lines. The first runs to test-merge the broken main were the ones after it. THE REPAIR MOVES THE BLOCK TO THE MODULE HEAD, where the imports that follow give it a subject. Every sentence is preserved. The deictic words are not: "stood here" becomes "stood at the END OF THIS MODULE", "the rows above this comment" and "the mutants below" become "in this module", because a relocated pointer that still says "below" is a false citation of the kind this repository files as a_live_authority_name_carries_a_superseded_claim. A trailing paragraph records why the block sits at the head, so the next author does not move it back. Nothing else changes: no row, no assertion, no rung drop. The content already has a typed home at gunbc.rung_drop emit_copy_qualification_without_a_consumer, and this commit does not touch it. EVIDENCE, executed on this tree rather than argued: before required-ci: FAILED PHASE parse (16 error(s)) required-ci: FAILED PHASE namespace-wave-admission (no head index) after parse phase clean, no parse FAIL lines required-ci: namespace-wave-admission ADMITTED -- every delta is auto-admitted or named by a transition admission Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U397y4s3dSBof7vGPAX87G * The blank line was load-bearing: green parse, wrong subject The previous head made the parse green and gave the annotation the WRONG SUBJECT, which is worse than the refusal it replaced -- a plausible answer standing where a typed refusal used to be is the failure DESIGN section 5 forbids outright, and I shipped it while claiming the fix was verified. std.source_annotation module_header_gap_subject binds a post-module block to the MODULE ROOT only when the block opens immediately after the module line. Its first arm is if preceded_by_blank_line || preceded_by_annotation_line { none } so a blank line between `module ...` and the first `//` deliberately disables the module-root arm and sends the block through ordinary nearest-following attachment. On the previous head that bound this module-wide block to `import std.measure { byte_size }` -- an import it never describes -- instead of to the module it describes throughout. Removed that blank line. The blank line AFTER the block, before the imports, is kept: it ends the block. Nothing else changed. WHAT I HAD AND DID NOT USE. My evidence was "parse clean, wave ADMITTED". Both were true and neither says anything about WHICH SUBJECT the annotation acquired. A greener instrument reading is not evidence about the property I was actually changing, and I generalized from it anyway. EXECUTED: dag/test/claim/source_annotation_attachment_witness_test 13/13 PASS on this tree, and the parse phase reports zero parse FAIL lines. COVERAGE GAP, NAMED NOT FIXED HERE. No enrolled witness covers module_header_gap_subject's blank-line arm -- the exact rule that silently mis-bound this block. The attachment battery covers general leading, trailing, body-grain and block-splitting cases, but nothing discriminates module-root attachment from nearest-following attachment across that one bit. That witness belongs in its own change; this PR is a fleet unblocker for a red main and is deliberately staying one file wide. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U397y4s3dSBof7vGPAX87G --------- Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Summary
Correct the D0 classification exposed by live run 33840998643: when a required phase returns a subject refusal, the instrument completed and the receipt must carry measurement_completed with blockers. Reserve measurement_unreached for the outer workflow finalizer when the instrument cannot return a receipt at all.
The run proved publication works on red: required-ci-measurement-receipt was present and D0-PUBLISH succeeded before D0-ADJUDICATE failed. Its receipt supplied the discriminator for this correction by incorrectly encoding a returned floor refusal as unreached.
Test plan