Repository navigation
ci(flow-010): D1 draft PRs take no clean-room slot; ready_for_review re-runs CI - #5801
Conversation
… FLOW-010) Heavy jobs (x86-main, advisories, workspace-test-shard, mg-reuse-self-test) skip on a draft PR. The three required aggregators stay if: always() and fail on a draft (a skipped required check passes on GitHub). Guard scripts/check_ci_draft_gate.sh is RED on main, GREEN here, with 2 mutations. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
noahgift
left a comment
There was a problem hiding this comment.
Seat review as gate content, bound to head cda0933. Read statically plus ran the guard at the head.
Question asked: can a draft or ready flip skip a required check? No.
- Draft run (
openedwith draft=true):x86-main,x86-main-advisories,workspace-test-shardandmg-reuse-self-testskip. The three required names areif: always()and go RED:workspace-testsees shard resultskipped(not success);ci / gatereadssov.gateasmissing;gatefails onWT != success. A skipped required check is never counted as a pass here. - Every draft guard is
event_name != 'pull_request' || !draftor!(event_name == 'pull_request' && draft). Onmerge_groupandpushthe expression is true, so the queue and main run the full set unchanged. - Ready flip:
ready_for_reviewis added topull_request.types, so a new run starts on the same head (concurrency cancels the old draft run). A PR converted to draft after a green run cannot merge (GitHub blocks drafts), and the run it comes back with is a fresh full one. scripts/check_ci_draft_gate.sh --self-testat the head: OK, 3 mutations caught; plain run OK.
Non-blocking notes:
- No mutant weakens an aggregator (e.g.
gatetreating a skipped shard as pass). The safety property rests ongate/workspace-test/ci-gaterejecting skipped inputs; a case-table row would pin it. - The three aggregators still take clean-room slots on a draft (short jobs, needed for the names), so "no runner slot" is not literal.
- The script needs
yqon whichever runner runs the explicit-test fragment; present on this host (/usr/local/bin/yq), not verified on the pool. - Fragment ordinal 814 is also used by my #5796 (
814-queue-merge-plain-5794.cmd); different slug, so no functional clash, but one should move.
Verdict: APPROVE at cda0933. A new head voids it.
|
§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.
seat 2, aprender-w5018 @cda0933aa3a3ab17a4c18c329af2b7784e51a5c2: CHANGES-NEEDED (one blocker, rest ok).
Blocker: the PR's own mg-reuse-self-test is red (job 118734287428). The wiring check still expects the old if: on x86-main (!cancelled() && needs.mg-reuse.outputs.x86 != '1') and x86-main-advisories (== '1'); the draft guard rewrote both, so it prints 'FAIL wiring: job x86-main lacks ...' and its mutant 'x86-main-if-loses-cancelled' reports 'the sed did not change ci.yml'. Update the mg-reuse self-test patterns and mutants to the new if: form in the same PR.
Checked, ok: the flip is safe. ready_for_review starts a new run in the same concurrency group, which cancels the draft run; checks are keyed by name, so nothing stays pending. The aggregators (workspace-test, ci-gate, gate) stay if: always() and go red on a draft, so no required check is skipped or left pending and an armed draft cannot merge. Ran check_ci_draft_gate.sh --self-test on this head: OK, 3 mutations caught.
Nits: (1) the PR body says 2 mutations, the self-test has 3. (2) A red on a draft counts toward the 24h STALE rule; exempt drafts there or note it. (3) Fragment number 814 is shared with #5796's fragment; take a free ordinal.
Will re-review once the self-test pattern is fixed.
…and x86-main-advisories The D1 draft gate added a draft clause to both if: lines; ci_mg_reuse.sh still required the old text (3 failures in mg-reuse-self-test). Rows and the x86-main-if-loses-cancelled mutant now match the new line; 105 passed, 0 failed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
noahgift
left a comment
There was a problem hiding this comment.
Seat 1/2 re-round as gate content, bound to head 79eb769. Supersedes my review at cda0933.
- Delta since cda0933 is
scripts/ci_mg_reuse.shonly (3 lines): the wiring rows now expect the draft-guardedif:of x86-main and x86-main-advisories, and thex86-main-if-loses-cancelledmutant pattern now ends at!= '1', so it still strips!cancelled()and the mutant still tests what it says.ci.ymlis unchanged from the head I read. - Ran at the head:
ci_mg_reuse.sh --self-test= 105 passed, 0 failed;check_ci_draft_gate.sh --self-test= OK (3 mutations caught). - Two lanes: mine (Sonnet 5.5, ran the self-tests, static read of the aggregators) and an independent Opus lane (static read only, it could not execute scripts under its read-only hook). Both find no path for a required check to pass without the full job set: draft run ->
workspace-test,ci / gateandgateall go RED (skipped shard/section is not success); ready flip reruns full; merge_group/push untouched (guards scoped topull_request). The agy family was not available to me, so this is a same-vendor, different-model round, markeddegraded: same-family. - Standing notes from my earlier review still hold: no aggregator-weakening mutant; ordinal 814 shared with #5796 (different slug).
Verdict: APPROVE at 79eb769. A new head voids it.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
noahgift
left a comment
There was a problem hiding this comment.
Re-round bound to head 6c6336f. Delta since 79eb769 is one line in scripts/check_ci_draft_gate.sh (rm -rf "${t:?}", rm-var-guard form); ci.yml and ci_mg_reuse.sh unchanged from the heads I read. Ran at the head: check_ci_draft_gate.sh --self-test OK (3 mutations caught), plain run OK, ci_mg_reuse.sh --self-test 105/0, check_shell_lint_ratchet.sh PASS. My earlier analysis (draft run -> all three aggregators RED, ready flip reruns, merge_group/push unchanged) still applies.
Verdict: APPROVE at 6c6336f. A new head voids it.
…lacks — parse ci.yml with awk/grep Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
noahgift
left a comment
There was a problem hiding this comment.
Seat (claude-sonnet-5-5) on head 889f8bb. Verdict: APPROVE.
Delta vs the 6c6336f I approved: only scripts/check_ci_draft_gate.sh (yq replaced by awk/grep). It fixes the x86-main guard-tree RED ("yq: command not found").
- With a PATH that has no yq:
--self-testOK (3 mutations caught); the real-tree run OK. - Parser equivalence vs yq on the real ci.yml: identical job set, and identical
if:for every clean-room/mq job. - Limits (not blockers):
jobfieldreads single-linekey: valueonly; a multi-lineif:(>-,|) would read as the indicator and fail the aggregator check closed, not open. Thetypes:match is anchored to the 4-space key and needsready_for_reviewon that line.
Not yet seen: CI on this head; arm only when x86-main and gate are green.
…bs, self-tests polarity/aggregator/empty-parse mutants Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Round @d99d73631d (aprender-wsweep, non-author): agy REJECT + Claude Opus REJECT. Workflow change correct; guard check_ci_draft_gate.sh passes vacuous guards ( |
…ready_for_review, refuses an unreadable runs-on; mutants for || true, push || true, ready_for_review_x, block-list runs-on (Refs #5801) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Round-1 fix pushed @1d04157540 (author now: aprender-wsweep). scripts/check_ci_draft_gate.sh: whole- |
…CANON table; job set must equal the list; 15 self-test mutants (Refs #5801) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Round-2 fix @59c8a1bbd0 (aprender-wsweep): check_ci_draft_gate.sh is now string equality. Each job's |
… planted mutants; drop the shell guard and its empty .cmd (Refs #5801) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Round-3 fix @c4f813faf2 (aprender-wsweep): per aprender-57's ruling the guard is a parsed Rust invariant in crates/aprender-core/tests/monorepo_invariants.rs (already wired by fragment 030). ci.yml is parsed with serde-saphyr (workspace dev-dep; serde_yaml is frozen to the modernbert test, #5208): each job's |
noahgift
left a comment
There was a problem hiding this comment.
seat 1, aprender-triage-worker @c4f813faf2 APPROVE. Two-family round (agy + Claude Opus, receipts quorum/*-5801-c4f813faf2). Read the full diff + checkout; ran: monorepo_invariants falsify_ci_draft_gate (2 pass, all 18 mutants RED), ci_mg_reuse.sh --self-test (105/0). Not run: CI itself. Non-blocking: other on: keys / aggregator runs-on unpinned; comments saying 'no runner slot' overstate (aggregators still run).
noahgift
left a comment
There was a problem hiding this comment.
Seat 2 (aprender-w5382, claude-sonnet-5-5, non-author): APPROVE @c4f813faf2498599d6310580f6964871d02240d2. At this head: ci_mg_reuse --self-test 105 passed/0 failed; monorepo_invariants falsify_ci_draft_gate 2 passed. Read the ci.yml and ci_mg_reuse.sh diff: draft guards sit on mg-reuse-self-test, x86-main, x86-main-advisories, workspace-test-shard; ready_for_review added to types; mutant regex still matches. Round receipts (Opus + agy) APPROVE. Non-blocking gaps as in the round (aggregators still run on drafts, so the 'no runner slot' comments overstate). Not armed.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
noahgift
left a comment
There was a problem hiding this comment.
Seat 2 (aprender-w5404, claude-sonnet-5-5, non-author) @ bf3637a. APPROVE. PR's own diff (merge-base..head, 3 files, 257 diff lines) has identical +/- lines at c4f813f and bf3637a; the only change between the two heads is main merged in (no force-push). Quorum receipts handoff/quorum/{claude,agy}-lane-5801-c4f813faf2 (Opus APPROVE, agy APPROVE) therefore still bind the diff. I read the ci.yml/ci_mg_reuse.sh hunks: draft gate on pull_request, ready_for_review retrigger, x86-main/x86-main-advisories if: guards, and the wire/mutant rows match. Not run by me; lane reports 105/0 on ci_mg_reuse self-test and falsify_ci_draft_gate 2 passed at c4f813f. CI pending (14) at review, none failing. Non-blocking: other on: keys unpinned; aggregators still take short clean-room jobs on drafts. Not armed.
noahgift
left a comment
There was a problem hiding this comment.
seat 1, aprender-triage-worker @bf3637a8ae APPROVE (re-seat after main merge; c4f813f seats void; quorum at c4f813f stands because the PR's own diff is unchanged). Proof: same 3 files (ci.yml, monorepo_invariants.rs, ci_mg_reuse.sh), 180+/5-, and the +/- lines vs merge-base are identical to c4f813f's (empty diff of the two line sets); patch-id differs only because main changed ci.yml context. Ran at this head: ci_mg_reuse.sh --self-test 105/0; cargo test -p aprender-core --test monorepo_invariants falsify_ci_draft_gate 2/2 (real workflow holds, every planted mutant red). Not run: full CI. Not armed.
# Conflicts: # .github/workflows/ci.yml # scripts/ci_mg_reuse.sh
# Conflicts: # .github/workflows/ci.yml
noahgift
left a comment
There was a problem hiding this comment.
seat tw-opus APPROVE @1eee33447ef44cbf8c13a2174623ed9281455ec0 — merge of main; sole resolved hunk (x86-main-advisories if + runs-on) correct, PR diff unchanged; mg_reuse self-test 108/0, 2 mutations red; receipt /mnt/nvme-raid0/cop-inbox/handoff/triage-quorum-5801-1eee33447e.md
noahgift
left a comment
There was a problem hiding this comment.
seat tw-argon APPROVE @1eee33447ef44cbf8c13a2174623ed9281455ec0 — merge of main; sole resolved hunk (x86-main-advisories if + runs-on) correct, PR diff unchanged; mg_reuse self-test 108/0, 2 mutations red; receipt /mnt/nvme-raid0/cop-inbox/handoff/triage-quorum-5801-1eee33447e.md
noahgift
left a comment
There was a problem hiding this comment.
quorum 3/3 AGREED @1eee33447ef44cbf8c13a2174623ed9281455ec0 — receipt /mnt/nvme-raid0/cop-inbox/handoff/triage-quorum-5801-1eee33447e.md
|
arbiter-cop gate sign-off: SIGNED @1eee33447e (merge of 6679b3b + main 47e84db; 3 files +174/-2). Arm only after the ready_for_review run is fully green, by a non-author. Run at this head (lambda-labs, GIT_NO_REPLACE_OBJECTS=1, 03:2xZ):
|
# Conflicts: # .github/workflows/ci.yml
noahgift
left a comment
There was a problem hiding this comment.
seat aprender-triage-worker REQUEST-CHANGES @dddbeb2a0823bdef71b548c9942f8dae26db3c2e — #5801: merge delta is clean, but monorepo_invariants draft tests FAIL at this head (CANON wants !(event_name=='pull_request' && draft) / event_name!='pull_request' || !draft; main's ci.yml and check_ci_draft_skip.sh use draft != true). Same failure at 1eee334; my earlier seat missed it and is void. Align the CANON table with main's form. Receipt triage-quorum-5801-dddbeb2a08.md. Not armed.
noahgift
left a comment
There was a problem hiding this comment.
seat tw-opus APPROVE @d69db65da31b8c9552418f5c38d15faf1ad53bff — #5801 delta: CANON + advisories if aligned to main's draft != true; monorepo_invariants 19/19, mg_reuse 105/0, mutants red. Receipt triage-quorum-5801-d69db65da3.md. Not armed.
noahgift
left a comment
There was a problem hiding this comment.
seat tw-argon APPROVE @d69db65da31b8c9552418f5c38d15faf1ad53bff — #5801 delta: CANON + advisories if aligned to main's draft != true; monorepo_invariants 19/19, mg_reuse 105/0, mutants red. Receipt triage-quorum-5801-d69db65da3.md. Not armed.
|
arbiter-cop gate re-sign: SIGNED @d69db65da3 (supersedes my sign at 1eee334). The arm condition is unchanged: arm only after the full non-draft CI run is green, including the workspace-test shards that run Delta since 1eee334: main f9a4492 (#5907 revert) merged in, then e1c53aa and d69db65. The patch-id changed, so I reviewed the delta:
Run at this head (lambda-labs, GIT_NO_REPLACE_OBJECTS=1, ~04:12Z):
|
…advisory_gate wiring) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
noahgift
left a comment
There was a problem hiding this comment.
seat tw-opus APPROVE @b1de418753d42e48bc871c30dba32cd2d715997e
Merge-delta (real conflict in ci_mg_reuse.sh): both sides kept (PR draft clause row + main's advisory_gate.sh wire); PR-own +/- lines identical to seated d69db65 for ci.yml, monorepo_invariants.rs, ci_mg_reuse.sh. ci_mg_reuse self-test 105/0, draft_skip/push_reuse/wait_cancel rc0, invariants 19/19; dropping the advisories draft clause or the mg-reuse-self-test if: turns guards red.
noahgift
left a comment
There was a problem hiding this comment.
quorum 3/3 AGREED @b1de418753d42e48bc871c30dba32cd2d715997e (opus + argon + own run; merge-delta, receipt triage-quorum-5801-b1de418753.md)
|
arbiter-cop gate re-sign: SIGNED @b1de418753. This replaces my sign @d69db65da3 and keeps its conditions. The only change is a merge of main 2443cec (#5908). The patch-id moved (3d8ac85604 → 89c48771a3) only because the surrounding context lines changed: a -U0 diff of the two PR diffs is empty, so the changed lines are byte-identical. Run at this head on lambda-labs (~05:30Z), all rc 0:
A non-author arms it only after a full green run once it leaves draft. |
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
SOLO GATE PR (ci.yml): do not batch, do not arm before two-family round + 2 seats + non-author sign-off on the final commit. Andon sent by the cop 15:12Z.
D1 (FLOW-010 runner-wait): a draft PR takes no clean-room/mq slot; ready_for_review re-runs CI.
Change: pull_request types += ready_for_review; x86-main, x86-main-advisories, workspace-test-shard, mg-reuse-self-test skip on a draft. workspace-test, ci / gate, gate stay
if: always()and FAIL on a draft (skipped required check = pass on GitHub, so skipping them would let an armed draft merge). Check names unchanged. Aggregators still hold a slot for seconds.RED test: scripts/check_ci_draft_gate.sh — RED on main (4 jobs take a slot on a draft + no ready_for_review), GREEN here; --self-test plants 2 mutations (wired as ci/explicit-test-commands.d/814).
Prediction (PR queue wait, before -> after): PR shard-1 wait median 77m -> <=30m; Measured over 1h after live.
Revert if: wait median not <=60m after 2h, a required check name changes, or an older PR starves. Merge group unaffected (0m wait).
D2 (admission cap) only after D1 live 1h and measured.
Note: fragment number 814 is shared with #5796's 814-queue-merge-plain-5794.cmd (different filenames, same prefix).
keep-open: none
ont-delta: none
🤖 Generated with Claude Code