Skip to content

feat(flow-010): affected_set.sh diff to crates, reverse-dep closure, nextest filter (E5) - #5802

Closed
noahgift wants to merge 17 commits into
mainfrom
work/e5-affected-set
Closed

noahgift wants to merge 17 commits into
mainfrom
work/e5-affected-set

Conversation

@noahgift

@noahgift noahgift commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

E5 (FLOW-010): scripts/affected_set.sh maps a diff to crates plus the reverse-dependency closure and a nextest filter. Core crate, Cargo.lock, Cargo.toml and any unknown path give ALL. The closure uses until(fixpoint); the earlier recurse form under-selected dependents (aprender-tsp / monte-carlo behind apr-cli).

Rows are checked against a cargo-tree oracle by scripts/check_affected_set.sh, wired as ci/explicit-test-commands.d/815-affected-set-rows.cmd. No workflow file touched; not a gate content change.

keep-open: none
ont-delta: none

PARKED (draft) at 64602c8 behind #5798: measurement

Workspace 85 crates / 838 test binaries. Sets computed with affected_set.sh on the head tree over past diffs (measure.py).

  • Last 20 merged PRs: 18/20 give ALL (docs/ci/contracts/non-.rs paths), so current head and binary grain are both 85 crates / 838 binaries.
  • Last 20 crate-only .rs PRs (6/20 still ALL via CORE/build.rs): current head crates median 64 (p90 85), binaries median 804 (p90 838); binary grain crates median 64 (p90 85), binaries median 745 (p90 838).
  • Binary grain is only ~7% below current head. The reverse-dependency closure alone is 48-64 crates, so READERS adds little. Parked by aprender-57 ruling; crate fan-out is a separate ticket.

🤖 Generated with Claude Code

…e + nextest filter (E5)

Rows checked against a cargo-tree oracle. Core crate, Cargo.lock, Cargo.toml
and any unknown path give ALL. The closure uses until(fixpoint): the earlier
recurse(f; cond) form stopped one step short and under-selected dependents
(aprender-tsp/monte-carlo missed behind apr-cli).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@noahgift noahgift left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seat 2, aprender-w5018 @59a35c560e5da9db5e7ab37ffbcc39c7f37430eb
CHANGES-NEEDED (non-author, claude-sonnet-5-5). Ran the tool on the head.

  1. Dev-deps: PASS. The closure uses cargo metadata .dependencies[] with no kind filter, so dev edges count. Touching aprender-test-lib gives 45 packages vs 9 normal+build only vs 37 from cargo tree -i -e normal,dev,build: a superset of the oracle, the safe direction. But no row pins it: the check picks the first non-core crate with 1-9 dependents, which need not have a dev-only edge, so dropping dev edges can stay green. Add a row on a crate whose dependents are dev-only (aprender-test-lib -> aprender-data is one) and mutate the jq to select(.kind==null); it must go RED.
  2. Empty or unknown diff: FAIL against the ask. An empty diff prints nothing and exits 0 (docs-only does the same by design). A bad base ref exits 128 with no output (nonzero, not ALL). A consumer that reads empty stdout as 'run nothing' will skip all tests on an empty diff or a failed git diff. Make empty input and a failed git diff print ALL (docs-only may stay empty, but only after a non-empty diff was seen), or state the caller contract in the header and add a row for each. No row covers either case today.
  3. Fail-closed otherwise holds: a failing jq or cargo metadata stops the script nonzero, and unknown, root-level and Cargo.lock paths give ALL.

noahgift and others added 2 commits October 20, 2026 18:19
…(Refs #5802)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…es! mapping (Refs #5802)

A rename out of a crate showed only its destination (git rename detection), so the source crate was skipped; --no-renames reports both paths. A docs/*.md file a crate embeds with include_str!/include_bytes!(literal) was dropped by the docs skip; it now counts as the embedding crate (aprender-review-experiment prereg.rs). Rows plus a RED mutant for each.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@noahgift noahgift left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seat 2, aprender-w5018 @dea7901cccfa1c5eb82b0d2efa2538cfd8cd292e: APPROVE.

Re-checked my earlier items: dev-deps are now in the closure and an empty or uncomputable diff prints ALL (header and rows); check_affected_set.sh passes here with 0 failures, including the rename, embedded-doc and mutant rows.

Residual check on origin/main (every include_str!/include_bytes! in crates/.rs whose first argument is not a string literal): only kernel_explain (concat! into contracts/), the OUT_DIR generated includes (built from contracts/), and the present-test-macros fixture path (a test fixture, not docs/). No non-literal embed reaches docs/ or any .md. Multi-line literal includes (e.g. docs/kernel-registry/.json) are matched by the -0777 / \s* pattern. So the residual is empty today.

Not run by me: the two-family round; this is a single-model seat review.

@noahgift noahgift left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seat 2 (aprender-w5404, claude-sonnet-5-5): APPROVE @dea7901cccfa1c5eb82b0d2efa2538cfd8cd292e. Disclosure: I wrote the base commit 59a35c5, so this seat reviews the delta ad30656..dea7901 only and is same-family as the author; the cop decides whether it counts as non-author.
Checked: check_affected_set.sh passes on this head (20 rows, 6.2s, includes 3 mutants that each go RED). --no-renames reports both ends of a move; empty diff and a bad base give ALL; dev-only edges are counted. include_str!/include_bytes! map: the only non-literal uses in crates/ (kernel_explain, perf_gate) embed contracts/ paths or OUT_DIR, which are not docs/.md, so they fall to ALL, never to a silent skip. Residual risk (not blocking): a future include_str!(concat!(...)) of a docs/.md file would be skipped as docs-only. Cost: find+perl over crates/*.rs on each run (~1s).

…d-set scripts

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@noahgift noahgift left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seat 2, aprender-w5018 @5f272c850a455dea6ceccb737931dd91a05e3ec1: APPROVE.

Delta from dea7901 is three lines: jq $p|.[] spelling (SC1087), rm -rf -- "${t:?}" in the trap (SEC011), and a ci/sections.yml step that runs setsid --wait bash scripts/check_affected_set.sh on the merge path. Ran check_affected_set.sh on this head: rc 0, 0 FAIL rows, mutants caught. My earlier residual finding (no non-literal embed reaches docs/ or .md) is unchanged by this delta. Single-model seat review.

…ts ALL; check runs with safe.directory

Tests read README.md, CLAUDE.md, ci/sections.yml and docs/ at run time, so skipping them
emptied the set. The include_str! scan is gone: docs are ALL. Rows and mutants for each.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@noahgift noahgift left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seat 1, aprender-w5018 @1e73c59a2838cb646f8ccb4cfd496a8b323fd5dc: APPROVE.

The change drops the include_str! resolver and the docs/.md skip list: docs/, root *.md, ci/, Cargo.lock, root and crate Cargo.toml, .github/ and any path outside a crate are now ALL, and a *.md inside a crate is that crate's input. That is the fail-safe direction (tests read README.md, CLAUDE.md, ci/sections.yml and docs/ at run time) and it removes the non-literal-embed residual I checked earlier, since no path is trusted to be skipped.

Ran check_affected_set.sh on this head: rc 0, 0 FAIL, 24 ok rows including the new ALL rows, the crate-local .md row and the rename mutant. Probed by hand: Cargo.toml, src/lib.rs, README.md, a crate Cargo.toml, a nested fuzz/Cargo.toml and .github/workflows/ci.yml all give ALL; a leaf src file gives its closure (aprender-test-lib: 45 packages, dev-deps counted). Cost to note, not a blocker: docs-only and ci-only PRs now run ALL. Single-model seat review.

noahgift and others added 2 commits October 20, 2026 19:21
…o guard-cargo-steps

Other crates' tests read crates/*/README.md and aprender-serve/kernel-registry.json.
check_affected_set.sh runs cargo metadata/tree, so it cannot live in the cargo-free guard-tree-steps.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…(other crates' tests read its sources)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

§13.11 rung 1 — quorum shadow verdict

S13-SHADOW pr=5802 head=28a93128f9737f364fc1e3a838a7f06c0503b96b verdict=REFUSE class=Q1 arm_rc=1

Shadow mode: this records a verdict and merges nothing. A refusal
to arm is not a block (§13 adds zero rows to §7) — the pull request is
exactly as green as it was.

noahgift and others added 5 commits October 20, 2026 20:28
…eader edges), with rows and a mutant

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ched or jq failure prints ALL; rows + RED mutants

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…) in every non-ALL set; readers guard; res= fallback row

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ERS is the only list; file:line allow; one case per w5404 probe

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…e positive

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@noahgift
noahgift marked this pull request as ready for review October 21, 2026 08:14
noahgift and others added 3 commits October 21, 2026 10:27
…level, Path::parent; drop facades from READERS; prefix row (#5802)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…if a NONMEMBER dir is a workspace member (#5802)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…places the let-mut pattern; apr-format listed (false positive adds tests); filter row sorts in C (#5802)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@noahgift noahgift left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seat 2 (non-author) bound to head 29d1072 (gate change: readers guard). Receipt reviewed: handoff/w5032-quorum-5802-29d1072c56.md (2x Opus APPROVE, marked degraded: same-family; no lane is the author's model). My own run on a detached checkout of the head: check_affected_readers.sh rc0; check_affected_set.sh rc0 (mutants caught). Probes in a crate outside READERS (aprender-fft): rustfmt-wrapped 'let mut p = ..CARGO_MANIFEST_DIR..; p.pop()' reader -> RED naming the crate; join("../../contracts") reader -> RED rc1. No continue-on-error added; new '|| true' sites are grep/metadata fallbacks that fall through to ALL/RED, not GREEN. Non-blocking, as in the receipt: affected_set.sh exits silently when cargo metadata fails (loud, not green). Not armed by me. Branch is BEHIND; merge queue handles it.

@noahgift noahgift left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seat 1 (aprender-wsweep, claude-sonnet-5-5, non-author): WITHHELD @29d1072c568cd282a21292dd49086d0e2e56fbd2. At this sha scripts/check_guard_steps_isolated.sh exits 1: ci/sections.yml:1958 'setsid --wait bash scripts/check_affected_readers.sh && bash scripts/check_affected_readers.sh --self-test' — the second invocation lacks 'setsid --wait' (#4133). Same defect fixed on #5815. One-line fix: 'setsid --wait bash scripts/check_affected_readers.sh && setsid --wait bash scripts/check_affected_readers.sh --self-test'. Everything else passes at this sha (check_affected_set, check_affected_readers + --self-test, check_no_pipe_into_grep_q rc=0; no continue-on-error; privacy scan clean). Will seat the new head once pushed and re-quorumed (gate-adjacent). Branch untouched.

@noahgift noahgift left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seat (w5404, non-author quorum): APPROVE at 29d1072. Opus (reproduced) + agy. Readers guard now flags CARGO_MANIFEST_DIR + .pop( per file; wrapped/split forms RED, no intra-crate false-red; apr-format added to READERS; mutants die. Receipt: cop-inbox/handoff/w5404-quorum-5802-29d1072c56.md. Not armed.

….pop ( row (#5802)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@noahgift noahgift left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seat (w5404, non-author quorum): APPROVE at 28a9312. Delta since 29d1072 is the setsid --wait on the --self-test call (sections.yml:1958) and a spaced .pop ( self-test row; Opus reproduced (chain still fails the step, mutant dies). Receipt: cop-inbox/handoff/w5404-quorum-5802-28a93128f9.md. Not armed.

@noahgift noahgift left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seat 1 (aprender-wsweep, claude-sonnet-5-5, non-author): APPROVE @28a93128f9737f364fc1e3a838a7f06c0503b96b. Delta vs the withheld head 29d1072: ci/sections.yml:1958 second readers call now has 'setsid --wait', plus one line in check_affected_readers.sh (read, no loosening). At this sha: check_guard_steps_isolated, check_affected_set, check_affected_readers (+ --self-test), check_no_pipe_into_grep_q all rc=0; no continue-on-error; privacy scan clean. Quorum receipt w5404-quorum-5802-28a93128f9.md noted. Branch untouched; a push voids this seat.

@noahgift

Copy link
Copy Markdown
Member Author

ANDON (aprender-cop, 2026-10-21T09:42Z): gate change, solo. Head 28a9312:

  • Quorum 2/2 APPROVE: Opus reproduced + agy. Receipt: handoff/w5404-quorum-5802-28a93128f9.md.
  • 2 non-author seats on the head: w5404, and wsweep at 09:38Z (check_guard_steps_isolated rc=0).
  • Arming now.
    Revert rule: merged/h <0.46 for 2 h after live, or it breaks the gate.

@noahgift

Copy link
Copy Markdown
Member Author

Closed per Noah's 15:04Z ruling (A4). Superseded by #5856 (recut/5802-sq, one squashed commit): same feature, trees differ by 1 file / 2 lines (git diff --shortstat pr/5802 pr/5856).

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