diff --git a/docs/decisions/records/ci/script-tests-job.md b/docs/decisions/records/ci/script-tests-job.md index eb81d6b07..ba8360c6c 100644 --- a/docs/decisions/records/ci/script-tests-job.md +++ b/docs/decisions/records/ci/script-tests-job.md @@ -34,9 +34,14 @@ sibling job carries an ignore-rule. Same question, opposite answers, for stated **Unconditional, not path-filtered.** The suite's real input set spans more than `scripts/`: `test_post_review_verdict.py` and `test_merge_consent_exemption.py` execute the actual -`scripts/post-review-verdict.sh` and `.claude/hooks/pretooluse-merge-consent.sh`. A `scripts/**` -filter would silently miss a `.claude/hooks/**` edit — and at ~10s a filter buys nothing but a -drift surface. Default checkout depth is sufficient: every `git` call in the suite runs against a +`scripts/post-review-verdict.sh` and `.claude/hooks/pretooluse-merge-consent.sh`, and since #845 the +former also READS `.gitea/workflows/review-verdict.yml` — the verdict writer derives the H10 +allow-list from it, so editing that literal changes the suite's outcome. A `scripts/**` filter would +silently miss a `.claude/hooks/**` or `.gitea/workflows/**` edit. The enumeration is a lower bound +rather than a census, deliberately: the corpus tests read `docs/` too, and an exact list here is the +kind that goes stale — which it did, this way, before #845 extended it. The reason is the INPUT SET, +not the cost: a filter was cheap to skip when the suite ran in seconds and is still the wrong axis +now that it runs in minutes. Default checkout depth is sufficient: every `git` call in the suite runs against a temp repo it creates itself, never this repository's history. **Verified by measurement, not a green tick** (the #631 Done-when, and `ci.docs-only-detect-shallow-safe`'s diff --git a/scripts/lib/h10-reviewers.sh b/scripts/lib/h10-reviewers.sh index 9f1870ed5..d35639d55 100644 --- a/scripts/lib/h10-reviewers.sh +++ b/scripts/lib/h10-reviewers.sh @@ -108,10 +108,10 @@ unset _etv_h10_root # on that ground alone. # # THE SKIP-PAST-THE-GATE ROUTE IS REAL BUT NOT REACHABLE HERE, which is why the sentinel is kept -# without repeating that rationale. `review-verdict-vocabulary.sh` documents it: under `set -u` and +# without repeating that rationale. `review-verdict-vocabulary.sh` documents the mechanism; the +# scoping below is stated here and measured here, on bash 3.2.57 and 5.3.15. Under `set -u` and # WITHOUT `set -e`, a `${#arr[@]}` on an unset name or a scalar aborts the FUNCTION only, so an -# `if ! validate` gate takes neither branch and execution continues past it — measured on bash 3.2.57 -# and 5.3.15. That is its consumer's situation (`check-review-verdict.sh` runs `set -uo pipefail`). +# `if ! validate` gate takes neither branch and execution continues past it. That is its consumer's situation (`check-review-verdict.sh` runs `set -uo pipefail`). # It is NOT this file's: `post-review-verdict.sh` runs `set -euo pipefail`, where the shell exits on # any of those shapes. So the sentinel here earns its place on the data-dependency ground alone. ETV_H10_REVIEWERS_OK=0