From 65a36f286761b341844a7566e440828fa1362a4f Mon Sep 17 00:00:00 2001 From: Timothy Date: Sun, 30 Aug 2026 04:11:09 +0200 Subject: [PATCH] docs(845): the canonical record this PR's own doc rule points at was left behind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Round 9 returned MERGEABLE with four LOW/NIT observations; these are the two that are actionable in the tree. `docs/decisions/records/ci/script-tests-job.md` still enumerated the `script-tests` input set as TWO top-level directories after this branch raised both derived copies (`docs/ci-cd.md` and the comment in `pr-checks.yml`) to three. Nothing was contradicted — "spans more than `scripts/`" is a true lower bound — but CLAUDE.md says convention lookups resolve at the record, and the `.gitea/workflows/**` member was missing from exactly the place a reader is told to look. This branch created that gap, so it closes it. The enumeration is now explicitly a lower bound rather than a census, since the corpus tests read `docs/` as well, and the stale present-tense "~10s" is reframed as the figure at decision time rather than a current one. `scripts/lib/h10-reviewers.sh`: a colon attributed the `-e` scoping and the bash-version measurement to `review-verdict-vocabulary.sh`, which documents neither. That library documents the MECHANISM; the scoping is stated and measured here. Reworded. The two NITs not acted on, and why: the "CORRECTION to the two previous commit messages" in `c03717f72` actually spans three commits, and a `rc=127` cited there is invocation-dependent (127 under `bash -c`, 1 from a script file). Both are commit-message-only and immutable. The same figure appeared in the ersatztv#886 closing comment, which IS editable — it now reports the stable outcome (which arm ran, whether execution continued) instead of an exit code, with the invocation dependence stated. Full suite 1278 passed / 2 skipped; catalog in sync; decisions-validate OK; doc-narrative clean. fixes #845 Decisions-Edit: yes Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_019zUmJZHhVP7kXg5DV237TW --- docs/decisions/records/ci/script-tests-job.md | 11 ++++++++--- scripts/lib/h10-reviewers.sh | 6 +++--- 2 files changed, 11 insertions(+), 6 deletions(-) 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