Skip to content

Wave 6: decision-council surface fixes, standing every-test-wired check, locale-stable gates, audit-pr footer markup - #2147

Merged
remigiusz-antczak merged 1 commit into
mainfrom
land/wave-1030w6s
Oct 30, 2026
Merged

remigiusz-antczak merged 1 commit into
mainfrom
land/wave-1030w6s

Conversation

@remigiusz-antczak

Copy link
Copy Markdown
Collaborator

Wave 6, assembled from independently reviewed lanes into one commit (fc265cede) on main.

What changes

  1. Decision-council surface (refs veche: unvalidated --option names make seats fail silently (COULD_NOT_DECIDE) unless they are short tokens #2136, veche: a seat reply with a brace in the surrounding prose, or with scores as a second JSON object, is dropped as unparseable #2137, veche: add --json-out PATH, and say so on stderr when the gate skips the council (the twin is silently ignored) #2139, veche: make the decision record explain itself (verdict vs tally, duplicated dissent, near-duplicate kill criteria) #2140). veche.py --help states the --option name rule, the real skip gate behind --stakes and --reversibility, and how --json-out writes. --json-out writes through a temp file in the same directory and os.replace on every outcome, so a reader or a crash never sees half a record; a read-only file is replaced, while a read-only directory or a bind-mounted file exits 2. A --json-out write that fails at the end keeps exit 3 for COULD_NOT_DECIDE and exit 4 for NOT_CONVENED. A decided record carries kill_criteria_by_lens, each seat's own wording before near-duplicates collapse. The kill-criteria dedupe key folds the Unicode comparison signs, so one tripwire written both ways is kept once. references/council.md states the reply contract a custom --cmd must meet, as the parser accepts it, and scripts/test_veche_doc_claims.py pins that wording and the help text.
  2. Every test wired into CI (refs Audit and retire stale guard rails and tests #1592). scripts/ci-gates.sh tests-wired fails when a scripts/test_*.py or scripts/test-*.sh file is run by no CI step and has no row with a reason in scripts/ci-test-allowlist.tsv; a stale row also fails, so the list only shrinks. Its first run found 71 tests no CI step ran: 59 now run in four suites, and the 12 corpus re-scores of 30 s or more are allowlisted with their measured runtimes. Four of the newly registered tests timed a guard against 0.5 s or 0.2 s and now allow 2.0 s, so a loaded runner does not fail them.
  3. Locale-stable gates. ci-gates.sh rules and tests-wired run their comm calls in the C locale, like the sort -u calls that feed them. Under en_US.UTF-8 a short baseline could report a baselined rule as new; the shipped baseline is empty, so nothing had failed yet. Both locale tests print a SKIP line and still run the C-locale cases where en_US.UTF-8 is missing.
  4. Faster, offline tests. test_auto_update_legacy_marker.py skips docs/bench and runs in about 4 s instead of about 326 s; it and two other tests set DCR_NO_PROBE=1, so none of them calls github.com.
  5. Audit PR-body footer. comms_lint --kind audit-pr accepts the attribution footer inside bounded markup (<sub>, <sup>, <small>, *, _); any other wrapped line and anything after a footer are still checked.
  6. Scan-summary test. test-review-checks-scan-summary.sh unsets REVIEW_SEMGREP_REGISTRY, so a host that sets it still passes, and a new suite runs it with the variable set.

Verification

  • All 41 CI suites this change can affect pass locally, run one at a time through the scrub_env.sh wrapper that run-ci-tests.sh uses, on da58c6b9e: the same changes before the 1.622.0 release stamp was merged under them. 39 passed in the batch run. secret-rule-waves.sh failed there because the worktree lacked the gitignored .banlist.local.txt that the privacy gate requires when the main checkout has one, and security-gate-waves.bg.sh failed once when the wall-clock case of test_destructive_guard_w21.py did not end within its 20 s wait at a 15-minute load average near 13. Both passed when re-run alone, with no code change.
  • On this head (fc265cede, rebased onto the 1.622.0 release merge 5ebd7ea8b): the commit-identity gate, the size ratchet against 5ebd7ea8b, the changelog fragment check, git diff --check and tests-wired (480 tests: 468 run by CI, 12 allowlisted) pass. Outside the regenerated SHA256SUMS, its diff has the same git patch-id as the tested da58c6b9e.

test-ci-gates.sh is left to CI. Each lane was independently reviewed, and the wave review's one yellow (sub-second wall-clock pins in newly registered tests) and three blues were fixed before assembly.

🤖 Generated with Claude Code

…ck, locale-stable gates, audit-pr footer markup

Decisions (idea-critic):
- veche.py --help: --option states the exact name rule (the TOKEN pattern,
  which the refusal for a bad name now quotes too); --stakes and
  --reversibility state the real gate (the council is skipped only when stakes
  are low or medium and reversibility is easy, and either flag alone
  convenes); --json-out says how the file is written (refs #2136, #2139).
- --json-out writes through a temp file in the same directory and os.replace,
  at the early write and the final one and on every outcome, so a reader or a
  crash never sees half a record. A symlinked path keeps pointing at its
  target, an existing file keeps its mode, a device or FIFO target is written
  in place, and an unwritable path still exits 2 with the
  "--json-out: cannot write" message. The write needs a writable directory:
  a read-only file in one is replaced, while a read-only directory or a
  bind-mounted file exits 2, and --help says so (refs #2139).
- A --json-out write that fails at the end of the run no longer turns a
  blocking verdict into exit 2: COULD_NOT_DECIDE keeps exit 3 and NOT_CONVENED
  keeps exit 4; only a verdict that would exit 0 becomes exit 2.
- A decided record carries kill_criteria_by_lens ({lens: text}), each seat's
  own kill criterion as worded before near-duplicates collapse. It is
  additive: kill_criteria and validate_verdict.py are unchanged, and the evil
  twin's criterion stays in minority_report.twin (refs #2140).
- The kill-criteria dedupe key maps the Unicode comparison signs to <= and >=
  first, so the same tripwire written both ways is kept once, while opposite
  or strict-versus-inclusive comparisons stay two.
- council.md states the reply contract a custom --cmd must meet, as the parser
  really accepts it: a JSON object with a verdict and string-only claims
  items, prose and stray braces around it skipped, the first object with a
  valid verdict wins, and the scores map may sit under scores in that
  verdict object or in any other object (refs #2137).
- New scripts/test_veche_doc_claims.py pins the --help text, the read-only
  file and directory behaviors and the council.md wording.

Delivery checks:
- scripts/ci-gates.sh tests-wired: a standing check that every
  scripts/test_*.py and scripts/test-*.sh is run by CI (a ci-tests.d suite, a
  workflow step, or a test those run names it on a non-comment line);
  otherwise it needs a name<TAB>reason row in scripts/ci-test-allowlist.tsv. A
  row without a reason, for a missing file, or for a test CI already runs also
  fails, so the list only shrinks (refs #1592).
- Its first run found 71 tests no CI step ran: 59 are now registered in four
  suites (one of them a background suite), and the 12 corpus re-scores of 30 s
  or more are allowlisted with their measured runtimes.
- Four of the newly registered tests timed a guard on 100 KB lines against
  0.5 s or 0.2 s (test_destructive_guard_w20.py and
  test_secret_extra_rules_w12/w13/w14.py); they now allow 2.0 s, so a loaded
  CI runner does not fail them, while a backtracking regression still takes
  far longer.
- scripts/ci-gates.sh rules compares its sorted rows in the C locale, like the
  sort -u calls that feed them. Under en_US.UTF-8 its comm calls saw unsorted
  input, so a short baseline could report a baselined rule as new or a shrunk
  baseline as grown. The shipped baseline is empty, so nothing failed yet. The
  tests-wired comm calls use the same locale. Both locale tests print a SKIP
  line and still run the C-locale cases on a runner without en_US.UTF-8.
- test_auto_update_legacy_marker.py skips docs/bench (about 90k files) and
  runs in about 4 s instead of about 326 s; it, test_install_canonical_global.py
  and test_peer_pains_5.py set DCR_NO_PROBE=1, so none of them calls github.com
  through the sandbox probe.

Communication structure:
- comms_lint.py audit-pr: the attribution footer may sit in bounded markup
  (<sub>, <sup>, <small>, *, _), so a compliant body that ends with one no
  longer fails "Not fixed carries detail". A wrapped line that is not a
  Generated or Co-Authored-By line, a Generated line with no rule or robot
  line before it, and anything after a footer are still checked.
  artifact-templates.md states the rule.

Review hub:
- test-review-checks-scan-summary.sh unsets REVIEW_SEMGREP_REGISTRY, so a host
  that sets it to 0 still passes; a new suite runs it with the variable set.

Tests: 41/41 affected CI suites pass, run one at a time through
scrub_env.sh on da58c6b9e (these changes before the 1.622.0 stamp was merged
under them). 39 passed in the batch run. secret-rule-waves.sh failed there
because the worktree lacked the gitignored .banlist.local.txt that the
privacy gate requires when the main checkout has one (it fails closed), and
security-gate-waves.bg.sh failed once when the wall-clock case of
test_destructive_guard_w21.py did not end within its 20 s wait at a
15-minute load average near 13. Both passed when re-run alone, with no code
change. test-ci-gates.sh is left to CI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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