Conversation
…ecks still report A new `change-class` job runs scripts/ci_change_class.sh once. class=docs means every path is an added/modified *.md outside .github/ that no Rust source compiles in (include_str!/include!/build.rs, resolved per file; env!/concat! literals matched by basename). Everything else, any non-PR event, and a failed decision mean the full set: every consumer tests == 'docs'. class=docs: x86-main runs only the doc-content sections (vendored-schemas, guard-tree, guard-cargo, pr-review-shadow, pr-review-sign); determinism and mac-check skip; workspace-test is unchanged. `gate` and `ci / gate` still run and print sov.gate / determinism-compare as "not-triggered: docs-only (<reason>)" by name; every other required section must still succeed. Also fixes guard_tree_job_test.sh row 5: its sed stopped matching gate.needs once that list grew past `determinism]`, so the mutant was never applied (RED on main too). Refs #4472 Agent: aprender-w4472 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift
enabled auto-merge
October 4, 2026 09:11
…gets a mutation-tested guard `gate` and `ci / gate` now excuse sov.gate / determinism-compare only when needs.change-class.result == success AND class == docs; a docs output from a failed classifier job judges every section as before. scripts/check_ci_gate_docs_class_rule.sh extracts both verdict steps from ci.yml and executes them over an 18-row table (docs passes only with guard-tree, guard-cargo, workspace-test / x86-main green; empty, failed or full class never excuses a section). --self-test plants three wrong rules (trust the output without the job result, excuse every section on docs, ci / gate trusting x86-main alone): each turns the table RED; a workflow with no verdict steps is ENV rc=2. Wired into guard-tree-steps beside the mutants-rule checker. Adopted from the review of #4639 (its changes-job SUCCEEDED requirement and its executed gate-block checker), in #4717's own terms; no commit of #4639 is moved. Refs #4472 Agent: aprender-w4472 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift
disabled auto-merge
October 4, 2026 09:36
Contributor
Author
|
Auto-merge disarmed by the cop: this changes what ci / gate accepts (docs-only skip), and a gate change waits for the operator's sign-off (C297). It is a row in the 0.70.2 sign-off batch. It re-arms on a signed yes. |
Contributor
Author
|
OPERATOR, verbatim: "yes, sign off #4717". Gate change signed off; auto-merge re-armed by the cop. |
noahgift
enabled auto-merge
October 4, 2026 09:42
|
§13.11 rung 1 — quorum shadow verdict Shadow mode: this records a verdict and merges nothing. A refusal |
… now run over a real history The independent review of 78551b0 blocked on B3: five planted mutants of the two guards survived, and so did one more found while fixing them. - ci / gate dropping guard-cargo from the sections a docs run still needs: a ci/gate row with guard-cargo missing, and a `cigc` self-test mutant. - gate ending the whole check at the first excused section instead of skipping it: the excused pairs now come first in the loop, so an `exit` there would skip the guards and the case table sees it; an `exit` self-test mutant plants it. - ci_change_class.sh's pull_request and merge_group paths were never executed by the self-test. Six rows now build a real history (main gains Rust, the PR adds a doc and renames one) and check: the PR alone on pull_request, the --base range on merge_group (main's Rust in and out of range), a rename read as a delete on both events, and merge_group without --base as ENV. Dropping the BASE guard is an equivalent mutant: an empty BASE gives an empty diff, which is already ENV. bashrs findings on both scripts equal the base. Refs #4472 Agent: aprender-w4472 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift
disabled auto-merge
October 4, 2026 16:32
noahgift
added a commit
that referenced
this pull request
Oct 4, 2026
…ry step Refs #4678 Round 3 left 13 mutants alive. Each edited a line that no row reads: a `|| true` or a dropped flag on the tree nextest, the docker SHARD env, the quick Σ shard test, the upload path and if-no-files-found, the keep step's target, the staging TIER, a continue-on-error on the quick Σ step or the upload, and the fan-in's name check. The job-level keys (if, needs, env, continue-on-error, matrix: the #4717 m18-m21 class) were outside every step. scripts/check_quick_tier_shard_sigma.sh now extracts four job blocks with awk, each scoped to its top-level parent: - ci.yml jobs.workspace-test-shard and jobs.workspace-test; - sections.yml matrix-pins.workspace-test-shard and jobs.workspace-test-shard. It compares their sha256 against ci/goldens/quick-tier-shard-sigma.sha256. Any change is RED until --update-golden re-pins it in the same diff. A missing job or golden is ENV rc=2. Table row 1 is the golden, so the table now has 26 rows. --self-test, run against this tree: - the 24 planted rules from rounds 1-3 are RED under a golden re-pinned to each mutant, so the semantic rows still kill them on their own; - 19 golden mutants are RED against the stale golden, each by the golden row: 13 round-3 survivors and 6 job-level (workspace-test if/needs/env, shard job continue-on-error, matrix [1, 2], a matrix-pins entry deleted); - the unchanged tree is GREEN; a pinned edit with a stale golden is RED; the same edit with the golden re-pinned is GREEN; an edit outside the pinned jobs is GREEN; a missing golden is rc=2. The tools are awk, sha256sum, comm and sort, all already on the gate path. bashrs reports 0 errors. Wiring is unchanged: guard-tree runs the table and --self-test report-only (L31). Agent: aprender-w4472 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
Superseded to clear the open-PR queue; the branch is kept, and aprender-w4472 reopens this when main's T43 change-class table allows the docs-only rule. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #4472. This PR does not close the issue; the live docs-only proof lands after it.
What changes
A new
change-classjob runsscripts/ci_change_class.shonce per run, after the classifier's own case table (--self-test, 14 rows) passes.The docs class requires every path in the diff to be:
AorM), and*.mdfile, and.github/, and.rsfile names it ininclude_str!,include!orinclude_bytes!(resolved against that file's own directory, with multi-line includes handled), or abuild.rsnames it. Anenv!/concat!literal is matched by basename.Everything else is
full. That covers any other diff, any non-PR event, and a classifier that fails. Every consumer tests== 'docs', so a failure always runs the full set.ci / gatesov.gate: not-triggered: docs-only change (<reason>)sov.gaterulegatenot-triggered: docs-only change, by nameAll three required checks (
ci / gate,workspace-test,gate) still run and still report on every PR. A section is absent only when the classifier said docs, and the verdict log names it.Why the skipped sections can be skipped. sov.* (test, lint, coverage, bench, security, provenance), mutants, determinism and provable-ladder all compile or run Rust. A Markdown file that no crate compiles in cannot change their result. The include rule exists because
crates/aprender-review-experiment/src/prereg.rsinclude_str!s and sha-pinsdocs/specifications/review-experiment-protocol.mdanddocs/audits/rex-001/analysis-plan.md. Those two files classifyfullon the real tree.Red/green proof
Classifier case table: 14/14. A mutation (removing the no-match fix for
build.rs) turns it red at 2/14.Merge-ref emulation on this commit (
--event pull_request, with HEAD^1..HEAD as on a PR's merge ref):class=docsclass=full(src/lib.rs: not a Markdown file)Verdict-branch guard, wired into guard-tree-steps:
scripts/check_ci_gate_docs_class_rule.shruns the realgateandci / gatestep scripts from ci.yml over 18 rows. Docs is accepted only from a change-class job that succeeded.Its
--self-testplants three wrong rules, and each one turns the table RED:ci / gatetrusting x86-main's job result alone.This PR's own run is the docs+code arm. It touches ci.yml and a .sh, so it must classify
fulland run every section.Live docs-only arm: after merge, a docs-only probe PR's run IDs will be posted on CI has no smart segmentation for docs-only PRs — full fat job + mandatory pr-review quorum run regardless of change type #4472. ci.yml only triggers for PRs against main, so it cannot run before then.
Guards
All of these are green:
guard_tree_job_test.shrow 5 ("x86-main dropped from gate.needs") was already RED on main. Its sed stopped matching oncegate.needsgrew pastdeterminism], so the mutant was never applied. The anchor is fixed here.Notes
This supersedes ci(#3668): docs-only PRs skip guard-cargo/determinism, fail-closed (PR-2b of #4588 split) #4639 (Docs-only PRs still spend ~45 min in guard-cargo (25) and guard-tree (15): gate them on a single docs_only decision so a roadmap PR's CI is < 10 min #3668). ci(#3668): docs-only PRs skip guard-cargo/determinism, fail-closed (PR-2b of #4588 split) #4639 skipped guard-cargo by moving three of its guards into guard-tree. Here guard-cargo keeps running on docs PRs, which is stricter. Two things from reviewing it are adopted in ci(#4472): docs-only PRs skip the Rust-only fat sections; required checks still report #4717's own terms: the classifier job must have succeeded, and the gate block is executed by a guard. No commit of ci(#3668): docs-only PRs skip guard-cargo/determinism, fail-closed (PR-2b of #4588 split) #4639 is moved. Its scope differed: it covered docs/roadmaps/** and docs/audits/** in any format, including roadmap YAML. This PR's docs class is Markdown only, so a roadmap-YAML-only PR still runs the full set. Widening the class to cover that is a follow-up.
fold(pr-review-ci): #4503 + #4533 + #4517 — diff classifier/docs tier, FLOW-003 v2.1, fork attest #4605 (
scripts/ci/diff_class.sh, the pr-review quorum docs tier) is separate. It decides the quorum tier, not the fat-job segmentation, and making the quorum lighter is out of scope here. Its classifier treatsdocs/**as docs and so misses the twoinclude_str!files above. That has been flagged to its owner, and the plan is to fold the include rule in so only one classifier remains.Mutants. While the MUTANTS-RATCHET early exit stands (MUT-RATCHET: mutants gate → ratchet mode (debt file shrink-only), C187/C188 #4646), mutants are report-only. When fix(ci): RESTORE mutants gate rules after 0.70 (#4646) #4648 restores the pull_request mutants rule, a docs PR's missing
mutantssection reads RED, which fails closed. fix(ci): RESTORE mutants gate rules after 0.70 (#4646) #4648 will need adocscase.Agent: aprender-w4472
🤖 Generated with Claude Code