Repository navigation
Wave 6: decision-council surface fixes, standing every-test-wired check, locale-stable gates, audit-pr footer markup - #2147
Merged
Conversation
…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>
This was referenced Oct 30, 2026
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.
Wave 6, assembled from independently reviewed lanes into one commit (
fc265cede) onmain.What changes
veche.py --helpstates the--optionname rule, the real skip gate behind--stakesand--reversibility, and how--json-outwrites.--json-outwrites through a temp file in the same directory andos.replaceon 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-outwrite that fails at the end keeps exit 3 for COULD_NOT_DECIDE and exit 4 for NOT_CONVENED. A decided record carrieskill_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.mdstates the reply contract a custom--cmdmust meet, as the parser accepts it, andscripts/test_veche_doc_claims.pypins that wording and the help text.scripts/ci-gates.sh tests-wiredfails when ascripts/test_*.pyorscripts/test-*.shfile is run by no CI step and has no row with a reason inscripts/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.ci-gates.sh rulesandtests-wiredrun theircommcalls in the C locale, like thesort -ucalls 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.test_auto_update_legacy_marker.pyskipsdocs/benchand runs in about 4 s instead of about 326 s; it and two other tests setDCR_NO_PROBE=1, so none of them calls github.com.comms_lint --kind audit-praccepts the attribution footer inside bounded markup (<sub>,<sup>,<small>,*,_); any other wrapped line and anything after a footer are still checked.test-review-checks-scan-summary.shunsetsREVIEW_SEMGREP_REGISTRY, so a host that sets it still passes, and a new suite runs it with the variable set.Verification
scrub_env.shwrapper thatrun-ci-tests.shuses, onda58c6b9e: the same changes before the 1.622.0 release stamp was merged under them. 39 passed in the batch run.secret-rule-waves.shfailed there because the worktree lacked the gitignored.banlist.local.txtthat the privacy gate requires when the main checkout has one, andsecurity-gate-waves.bg.shfailed once when the wall-clock case oftest_destructive_guard_w21.pydid 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.fc265cede, rebased onto the 1.622.0 release merge5ebd7ea8b): the commit-identity gate, the size ratchet against5ebd7ea8b, the changelog fragment check,git diff --checkandtests-wired(480 tests: 468 run by CI, 12 allowlisted) pass. Outside the regeneratedSHA256SUMS, its diff has the samegit patch-idas the testedda58c6b9e.test-ci-gates.shis 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