Repository navigation
fix(ci): a tag push runs the full workspace and pins its first parent as the base (Fixes #5172) - #5178
Conversation
… as the base (Fixes #5172) The v0.71.0 tag push (run 38186659898) had two faults. - The tier step reused the merge-queue result on the tagged commit. - The refinement base pin then failed on the push's all-zero `before` sha. So the release tag ran no workspace test and went red. - scripts/ci_test_tier.sh: a push whose GITHUB_REF is refs/tags/* is tier=full. It never reuses a merge-group result and never refines a diff. The refusal is marked # R-TAGREF, and the self-test unsets GITHUB_REF and adds a tag row. - ci/sections.yml: a tag push with a zero `before` pins the tagged commit's first parent as origin/main. The step deepens to it if the tier step did not. A branch push with a zero `before` still fails loudly. - scripts/check_ci_push_reuse.sh: rows T1-T3 cover a tag push, both with and without a queue result (full), and a refs/heads/main push (still reuse). tier() now unsets an inherited GITHUB_REF. Agent: aprender-w71-e3a Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ow counts tier lines (#5172) These changes come from the C314 quorum findings. - ci/sections.yml: a tag push now uses the tagged commit's first parent even when `before` is non-zero. On a moved tag, `before` is the old target, not this commit's base. - scripts/ci_test_tier.sh: the self-test tag row now asserts exactly ONE tier= line and that it is full. A fall-through that also printed a reuse or refined tier would otherwise pass on a grep for ^tier=full alone. Agent: aprender-w71-e3a Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
§13.11 rung 1 — quorum shadow verdict Shadow mode: this records a verdict and merges nothing. A refusal |
noahgift
left a comment
There was a problem hiding this comment.
APPROVE seat 1, aprender-a7n, c9f2b14
Non-author sign-off on the C314 receipt (handoff/quorum-w71e3a-5172-receipt.md, ACCEPT 2/2, plant caught 2/2), bound to the final commit c9f2b14. Author: w71-e3a; I did not write any of it.
Read at head (3 files):
ci/sections.yml, push arm: onrefs/tags/*the base is the tagged commit's first parent, fetched at depth 2 only if absent. If that fetch orrev-parse HEAD^1fails,baseis empty and the existing check below the case block (^[0-9a-f]{40}$, not all-zero) exits 1. Fail closed, no new state.scripts/ci_test_tier.shdecide(): a tag ref returnstier=fullbefore any reuse logic (R-TAGREF). The self-test unsetsGITHUB_REFso the ambient runner value cannot leak into the other rows, and its new row asserts exactly onetier=fullline.scripts/check_ci_push_reuse.sh:tier()runs with-u GITHUB_REFand sets it only per row; T1 (tag + green merge_group → full, reason names the tag), T2 (tag, no merge_group → full), T3 (refs/heads/mainstill reuses) cover both directions.- The change only moves tag pushes from reuse to full, which is stricter. No check is loosened, and there is no third state (C324).
Not run by me: the tier self-test and the push-reuse mutants (98/0 and 30/30 are the author's figures). Both scripts are under a run ban for my session; this seat is a read of the diff plus the receipt.
noahgift
left a comment
There was a problem hiding this comment.
Non-author gate-change sign-off, aprender-wprodmodels APPROVE @ c9f2b14
- Subject: tag push runs the full suite and pins its first parent as the refinement base
- Bound to head: c9f2b14 (merge-base cc71bde); diff sha256 b181ff6f440d3d94 (git diff merge-base..head, read 03:1xZ 2026-10-12)
- Author: aprender-w71-e3a (claude-opus-5-5). Signer: aprender-wprodmodels. Lanes never the author id: sonnet + haiku.
- Author receipt read: quorum-w71e3a-5172-receipt.md (ACCEPT 2/2, plant caught 2/2).
Round 1 (02:5xZ): VOID
Lane prompts named a diff path that did not exist; the sonnet lane reviewed the real diff and saw the plant file, the haiku lane read nothing. Not counted.
Round 2 (03:12Z), planted
- Plant (diff sha256 d212cb1518b5208a): in the sections.yml tag arm,
base="$(git rev-parse ... 'HEAD^1^{commit}' ...)"becamebase="${base:-$(git rev-parse ... )}". With before=0000...0 (non-empty), base keeps the zero sha and the tag run fails exactly as #5172. - sonnet: REJECT, blocking = the plant line, traced to the zero-sha validation exit 1. CAUGHT.
- haiku: REJECT, blocking = the plant line, same trace. CAUGHT.
- Plant caught 2/2. Shared non-blocking finding: no self-test row covers the sections.yml tag arm (only the tier script). Noted for a follow-up, not a block.
Signer's own checks on the real head
- Real tag arm assigns unconditionally; expansion trace (bash): real -> first parent, plant -> zero sha. Branch push with zero before still fails (case matches refs/tags/* only).
- check_ci_push_reuse.sh --self-test on c9f2b14 (worktree): rc=0, mutants 30/30 killed incl. ci_test_tier.sh R-TAGREF (log sha256 bb8134a06093d0b0).
- ci_test_tier.sh --self-test on c9f2b14: rows 1-81 ok incl. row 41 "push of a TAG (#5172) -> ONE tier line, full", 0 not-ok; run hit the signer's own 540 s timebox before finishing (log sha256 5290eae49ec77d9d). CI runs the full table.
Verdict
ACCEPT the real change at c9f2b14. Any new commit voids this sign-off.
noahgift
left a comment
There was a problem hiding this comment.
seat 2, aprender-df APPROVE @ c9f2b14
This is the non-author sign-off bound to this final commit for the gate change in #5172. The quorum round (2 lanes, non-author models) returned ACCEPT 2/2. Its findings were folded into this head, and its plant (dropping the early return) was caught by both lanes.
Read: the full diff (3 files).
- the CI test-level script (scripts/ci_test_.sh): the tag arm is inside the push branch only, so pull_request, merge_group and workflow_dispatch are unchanged. GITHUB_REF=refs/tags/ prints
fullwith a reason naming the tag and returns before any merge_group reuse or diff refinement. The self-test unsets GITHUB_REF first, so a tag-push run cannot turn every push rowfull. The new row counts the test-level lines (expects exactly one), which kills a fall-through mutant that would print a second line. - ci/sections.yml: a tag push takes its base from HEAD^1 (fetched at depth 2 only if missing), never from
before. That is right for a created ref (zeros) and for a moved tag (old target). A branch push with a zerobeforestill fails loudly; no new silent path. - scripts/check_ci_push_reuse.sh: T1 (tag + queue success -> full, the reason names the tag), T2 (tag, no queue result -> full, not the docs-only result), and T3 (refs/heads/main + queue success -> reuse, control) are the right three rows. The env -u in the helper isolates the caller's ref.
Measured at this head, on a clean checkout verified equal to c9f2b14:
- bash scripts/check_ci_push_reuse.sh -> OK (D, T, W, A, P and X rows ok)
- bash scripts/check_ci_push_reuse.sh --self-test -> mutants 30/30 killed
- bash the CI test-level script (scripts/ci_test_*.sh) --self-test -> rows 1-44 all ok, including row 41 (the new tag row); the run was still in progress past row 44 when this was posted, so the remaining rows are covered by CI's own run, not by this seat.
CI at post time: shards 2 and 3 green, mg-reuse-self-test green; shard 1 and x86-main still running. This seat is the review only; arming stays with the slot owner.
Fixes #5172
The v0.71.0 tag push (CI run 38186659898, cc71bde) went red, and it ran no workspace test:
scripts/ci_test_tier.shprintedtier=reuse. It cited the merge-queue result on the tagged commit.ci/sections.ymlfailed. A push that creates a ref carriesbefore= 40 zeros:::error::refinement base: push event carries no base sha (got "0000…0000"). That failed shards 1–3, workspace-test and gate.Change
scripts/ci_test_tier.sh.pushwhoseGITHUB_REFisrefs/tags/*getstier=full. It never reuses a merge-queue result and never refines a diff.# R-TAGREF, so the mutation self-test covers it.GITHUB_REF. A new row asserts that a tag push prints exactly ONEtier=line and that it isfull.ci/sections.ymlbase pin. A tag push pins the tagged commit's first parent asorigin/main. It fetches that parent at depth 2 if the tier step's best-effort deepen missed it. A branch push with a zerobeforestill fails loudly. Branch push, pull_request, merge_group and workflow_dispatch are unchanged.scripts/check_ci_push_reuse.sh. New rows T1–T3:full.full.refs/heads/mainpush → stillreuse.tier()now unsets an inheritedGITHUB_REF.RED before, GREEN after
FAIL T1 a tag push with a merge_group success on its commit -> full, never reuse,FAIL T2 a tag push with no merge_group result -> full …(rows then labelled D10/D11). Result:check_ci_push_reuse: 3 assertion(s) FAILED.check_ci_push_reuse: OK - push reuses only a merge-queue success on its own sha …, rc 0.--self-test:mutants 30/30 killed(incl.ci_test_tier.sh R-TAGREF).ci_test_tier.sh --self-test:98 checks, 0 failed.GITHUB_REF=refs/tags/v9.9.9,before=zeros.::error::refinement base: push event carries no base sharc=1.refinement base: push base <first parent> pinned as origin/mainrc=0.before→ first parent, rc=0.before→ the same error, rc=1.before→ that sha, rc=0.Gate change
This changes what CI runs on a tag push. C314 planted quorum, sonnet + haiku lanes (not the author's model): the plant was caught 2/2. The lanes found no defect in the logic beyond the plant. Their findings went into the second commit:
tier=lines.A non-author sign-off bound to the final commit is still required.
keep-open: none
ont-delta: none not a sweep PR (CI tier script, its case table and one workflow section)
🤖 Generated with Claude Code