From 0977f041747fc9c51fee03ed29ef23c727cc67d9 Mon Sep 17 00:00:00 2001 From: Timothy Date: Sat, 5 Sep 2026 15:01:26 +0200 Subject: [PATCH] docs(901): the respelling-immunity thesis is bounded by the pin's REACH, and the neighbour doc declines the rule it was cited for MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two prose overclaims in the new record, both of the shape the record itself exists to police. The thesis sentence generalised over the two worked pins and held for one. `PINNED_VITE_CONFIG` compares a whole file, so no respelling escapes it; the hook-preamble pin compares a SELECTION (`test_hook_fire_log.py:161` keeps only the lines containing the literal `ETV_HOOK_FIRE_LIB` that are not comment-led), so it must recognise a line before it can reject it — which is exactly the residual `mechanics:` documents four lines later. Bound the immunity to what a pin COMPARES and name the leftover exposure as the selector's reach. The neighbour citation claimed `docs/defect-shapes-773.md` §4 "argues the general form". §4 is a ranked table of detectors A-G — none of them this rule, and A is already assigned to `guard-derives-population-from-source` by the preceding clause. The doc's nearest class is `string-predicate churn` in the §3.6 partition, marked `no detector proposed`, and §3.7 argues the class away as a cross-cutting property (2 of 33 round-churn records). Only §4's closing meta-finding — class-level rules beat one record per instance — supports anything here, and it supports the FORM, not the content. Say that. Refs #901 Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_015QqCpYFsKgnAnx6jVwrKiV --- .../testing/guard-pins-the-artifact-not-a-shape.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/decisions/records/testing/guard-pins-the-artifact-not-a-shape.md b/docs/decisions/records/testing/guard-pins-the-artifact-not-a-shape.md index ec9b79df1..a0152f1b8 100644 --- a/docs/decisions/records/testing/guard-pins-the-artifact-not-a-shape.md +++ b/docs/decisions/records/testing/guard-pins-the-artifact-not-a-shape.md @@ -17,8 +17,10 @@ someone stops it. Measured 2026-08-30 across two unrelated subjects: a guard par decide whether a command runs the SPA suite was wrong **nine** ways from one mechanism (#887), its replacement — a partial match of `web/vite.config.ts` — **seven** further ways, and a lexical rule over a hook preamble **five** (#891). Every fix was locally correct and none of the three sequences -converged. All three ended in the same move, and a pin has never been defeated by a respelling -because it does not have to RECOGNISE one in order to reject it. +converged. All three ended in the same move: a pin cannot be defeated by a respelling of what it +COMPARES, since it need not RECOGNISE one in order to reject it. What stays exposed is whatever it +does not compare — nothing for a whole-file pin, and exactly the reach of the SELECTOR for a pin +scoped by one, which is why `mechanics:` states the hook pin's. **Why the pin is the DEFAULT and not the remedy — the first thing #901 left open.** The rejected alternative is the tempting one: write the shape-matcher, and pin only once it has been defeated. It @@ -63,8 +65,11 @@ their own records — `ci.image-build-delegates-the-spa-suite` and `testing.guard-derives-population-from-source` answers the case where the authoritative source is MISSING (create one, never approximate it with a predicate over text) and this one the case where the artifact IS present and authoritative and what is approximated is its GRAMMAR. -`docs/defect-shapes-773.md` §4 argues the general form; what was missing is a rule resolvable BY -TOPIC, since `docs/guard-inventory.md` carries its precedent per incident, findable only inside one. +`docs/defect-shapes-773.md` does NOT carry this rule: its §3.6 partition lists the nearest class, +string-predicate churn, as `no detector proposed`, and §3.7 argues that class away as a cross-cutting +property. Only §4's closing meta-finding supports the FORM — a class-level rule beats one record per +instance — so the rule itself is new here, and resolvable BY TOPIC, where `docs/guard-inventory.md` +carries its precedent per incident, findable only inside one. **What this does not cover.** Predicates over structured input a real parser produces — an AST, the git index, parsed workflow YAML consumed as data — are not approximations and keep their shape