[HARDENING] PENDING-122 + PENDING-123, and two corrections to my own filings
122 splits the fleet census out of 119 for the reason condition 5 of REVIEWED-101 gave for 118: it is a standing correction to what fleet-green certifies, owed to anyone reading a green fleet, and inside a PROPOSAL it dies with its host. It sits with PENDING-96 as one family — a green that attests less than its surface suggests. 123 is new, and it answers a question 120 only raised. The hook cannot distinguish "nothing to check" from "I am disarmed": five disarming faults tested against a positive control, each staging a real corpus/ change the hook must catch, all five silent at exit 0. A pathspec typo disarms the gate permanently and invisibly. It is also why eecc8bb running no suite went unremarked — that output is what a fully disarmed hook prints. Two corrections to my own record, both struck visibly rather than swapped. 119 gains the narrowing of condition 6 as a RULING, not a charitable reading, with the recorded reason for rejecting (ii) being that it reintroduces the coupling REVIEWED-100 rejected, in the name of a condition written to prevent coupling. 120's scope-honesty note was wrong: REVIEWED-100 did not rule the pathspec, but PENDING-116's own Costs section committed to scoping it tightly, so this revises a stated cost-control rather than filling a gap — which raises the bar the widening must clear. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A35wiD55yRHj5U1ECZAX4t
This commit is contained in:
co-authored by
Claude Opus 5
parent
e31ad027b3
commit
779e3417ca
+108
@@ -1706,6 +1706,24 @@ This is harmless today only because voice ⟺ source: measured, **max distinct v
|
||||
|
||||
---
|
||||
|
||||
### AMENDMENT 1 — 2026-08-08, on the ruling's conditions
|
||||
|
||||
*Appended, not substituted. The body above is what was ruled on.*
|
||||
|
||||
**§A — The fleet-census finding is SPLIT OUT to PENDING-122** (*"a green that attests less than its surface suggests"*, filed with **PENDING-96** as one family). The ruling's reason is the same one condition 5 of REVIEWED-101 gave for splitting PENDING-118: it is a standing correction to what fleet-green certifies, owed to anyone who reads a green fleet, and **filed inside this [PROPOSAL] it dies if this item is deferred.** The paragraph stays above as the record of what was argued; **PENDING-122 is now its home.**
|
||||
|
||||
**§B — Condition 6 is NARROWED ON THE RECORD, not charitably read.** Ruled: condition 6 governs consumers that must **enumerate the cross-repo binding surface** — (a) and (c). (e) follows the engine's own declared pointers and enumerates nothing, which was already the stated basis for severing it from the spec amendment; the same severance carries the placement. Recorded as a ruling so the next reader does not relitigate it.
|
||||
|
||||
**§C — The recorded reason for rejecting (ii) is the inversion, and it is the decisive one.** A `~/dotfiles/scripts/check-source-binding.sh` whose body is one `exec` of `engine/ingest_gate.py --check-only` puts an **engine path and an engine flag into the global layer** — the coupling REVIEWED-100 rejected, reintroduced in the name of a condition written to prevent coupling. **A rule that produces the outcome it exists to forbid is being read at the wrong grain.**
|
||||
|
||||
⚠ **Kept in view — the causal order.** The placement question became live *because* (e) delegated to `ingest_gate` instead of duplicating the sha comparison. Had it duplicated, condition 6 would have been straightforwardly correct. **The better implementation is what made the condition misfit** — worth holding, because the reflex is to read a rule's misfit as an implementation error.
|
||||
|
||||
**§D — CONDITION ON (i): declare the cost threshold now, with its action.** `0.218 s over 14 sources` is honest about being burst-sized; (e) is unconditional and scales with sources × file size. **When it exceeds ~1 s, (e) re-scopes or hands off to (a)'s scheduled job.** Stated now because *a per-commit cost that grows unremarked converts a tripwire into a `--no-verify` habit* — this thread's own failure class arriving by the back door.
|
||||
|
||||
**Awaiting:** placement of the ruling. Build on placement: one line in `.precommit-triggers`, the §D threshold recorded beside it, tagged REVIEWED-N.
|
||||
|
||||
---
|
||||
|
||||
## PENDING-120 — The fleet trigger covers `corpus/` but not the engine code the fleet exists to test
|
||||
|
||||
**Date:** 2026-08-08
|
||||
@@ -1735,6 +1753,96 @@ This is harmless today only because voice ⟺ source: measured, **max distinct v
|
||||
|
||||
---
|
||||
|
||||
### AMENDMENT 1 — 2026-08-08, on the ruling's conditions
|
||||
|
||||
*Appended, not substituted.*
|
||||
|
||||
**§A — My scope-honesty note was WRONG, and the correction raises the bar rather than lowering it.** I wrote that REVIEWED-100 *"did not rule the pathspec, which was my implementation choice."* True **of the ruling** — verified: REVIEWED-100 authorizes the mechanism and the both-halves acceptance and says nothing about paths. **But PENDING-116's own Costs section does**, and I checked it today, quoting in full:
|
||||
|
||||
> **Every triggering commit gets slower.** The seven engine suites run in seconds, not minutes, but the trigger paths must be scoped tightly (`corpus/`, `corpus/sidecars/`) so ordinary docs commits do not pay it.
|
||||
|
||||
So the pathspec was **not silence — it was a cost commitment inside the authorized item.** ~~in-scope repair rather than an amendment~~ is struck. This is **revising a stated cost-control with its justification intact**, and the widening must therefore be *shown* to preserve the discrimination that commitment bought. That is exactly why **(b) is correctly rejected and (a) is not.** ⚠ Noted for the class: *in-scope repair* was the more comfortable framing and the less accurate one.
|
||||
|
||||
**§B — The acceptance test DECOMPOSES; one fixture cannot meet it.** *"Neither may be a synthetic probe if a real one is available"* is right in principle and unmeetable as a single case:
|
||||
1. **Fires on a real engine change** — replay `eecc8bb` against the widened pathspec. Genuinely real, genuinely available, and it is the commit that demonstrated the gap. ⚠ **`eecc8bb` was green, so it proves FIRING only.**
|
||||
2. **Refuses on red** — needs an induced red unless history holds a real red `engine/` commit. If one exists, use it; **if not, say the fixture is synthetic** rather than letting *"real fixture"* cover both halves.
|
||||
3. **Docs-only still runs nothing** — unchanged, and the half that proves discrimination.
|
||||
|
||||
**§C — The adjacent gap was checked, and the answer is NO. Filed as PENDING-123.** Asked whether the hook distinguishes *"no trigger path matched"* from *"the declaration is malformed"*: it does not, and the exposure is wider than the question. **Five distinct disarming faults, each tested against a positive control while staging a real `corpus/` change the hook must catch — all five silent, all exit 0.** A typo'd pathspec disarms the gate permanently and invisibly. **This is also why `eecc8bb` running nothing went unremarked: its output is byte-identical to a fully disarmed hook's.**
|
||||
|
||||
**§D — Interaction with PENDING-119, if both land.** `.precommit-triggers` would carry two lines with overlapping paths; an engine commit pays ~2 s (fleet) + 0.218 s (binding). **Declare the order in the file** so a red is attributable to one check without reading both.
|
||||
|
||||
**Awaiting:** placement of the ruling.
|
||||
|
||||
---
|
||||
|
||||
## PENDING-122 — What a green fleet certifies, and what it does not: no suite validates live binding
|
||||
|
||||
**Date:** 2026-08-08
|
||||
**Tag:** [HARDENING]
|
||||
**Related:** **PENDING-96** (the engine's `SILENCE — ✓ warranted` certifying the index and claiming the answer) — **one family: a green that attests less than its surface suggests.** · Split out of PENDING-119 §A on the ruling's direction, for the reason REVIEWED-101 condition 5 gave for PENDING-118.
|
||||
|
||||
**Summary.** Censused all seven engine suites 2026-08-08: **only `tests/test_ingest_gate.py` invokes the gate, and all six invocations build a synthetic corpus under `tmp`.** `tests/test_navigate.py:95` asserts that a span *carries* `source_sha256` — **presence, not correctness.** No suite compares a declared sha to a live file. **A green fleet is evidence the gate works on fixtures; it has never been evidence that the corpus is bound.**
|
||||
|
||||
**Why it is filed alone.** It is not evidence for a placement dispute and does not belong to one. It is a standing correction to what fleet-green certifies, owed to anyone who reads a green fleet — including the two `.precommit-triggers` items, which run *these* suites and would otherwise inherit an unearned assurance.
|
||||
|
||||
**Rationale.** The engine's whole design premise is *trusted because it can be checked*. A test floor that exercises the checker on fixtures it authored, and never on the corpus, certifies the **decision rule** while claiming the **result** — the layer-error REVIEWED-83 A1 named for the PDF-origin classifier and REVIEWED-84 named for order. Same shape, third subsystem.
|
||||
|
||||
**Options.** **(a)** Add a live-corpus binding assertion to the fleet (cheap: the gate already runs in 0.218 s; `--check-only` makes it side-effect-free). **(b)** Leave the fleet fixture-only and rely on the commit-time check from PENDING-119 — ⚠ which is exactly the *"a named risk is not a mechanized check"* argument, and would leave the fleet's green still overstating. **(c)** Do nothing beyond documenting it (already done in the engine's `CLAUDE.md`).
|
||||
|
||||
**Recommendation: (a)**, and it is nearly free once `--check-only` exists. ⚠ Deliberately **not** bundled with PENDING-119: that item wires a *commit* hook, this one changes what the *suite* attests, and they should be able to land or fail independently.
|
||||
|
||||
**⚠ What this does not establish.** Adding a live assertion does not make the fleet see **anchor correctness** — every hash it would compare is whole-file, which is the gap PENDING-121 puts to the jurist. This closes the distance between *"the gate works"* and *"the corpus is bound"*, not between either and *"the anchors land."*
|
||||
|
||||
**Files affected:** `~/_Dev/studium-engine/tests/` (one suite gains a live-corpus case).
|
||||
|
||||
**Awaiting:** Steward authorization.
|
||||
|
||||
---
|
||||
|
||||
## PENDING-123 — The pre-commit hook cannot distinguish "nothing to check" from "I am disarmed"
|
||||
|
||||
**Date:** 2026-08-08
|
||||
**Tag:** [HARDENING]
|
||||
**Related:** REVIEWED-100 / PENDING-116 (the hook this concerns) · PENDING-120 §C (where the question was raised) · PENDING-98 (firing history recorded only where a human is in the invocation path) · the *silent net is uninformative* ladder entry, now turned on the net itself.
|
||||
|
||||
**Summary.** The global hook (`~/dotfiles/git/hooks/pre-commit`) produces **identical output — and exit 0 — whether no declared check matched, or the declaration is malformed, mis-typed, empty, or absent.** A single typo in `.precommit-triggers` disarms the gate permanently and invisibly.
|
||||
|
||||
**Measured, not reasoned — 2026-08-08, throwaway repo, positive control first.** Each case staged a **real change under `corpus/`** that a correctly-armed hook must catch:
|
||||
|
||||
| case | declared check ran? | warned? | exit |
|
||||
|---|---|---|---|
|
||||
| well-formed, matches *(positive control)* | **yes** | – | 0 |
|
||||
| pathspec typo (`corpuss/`) | **no** | no | 0 |
|
||||
| no `\|` separator | **no** | no | 0 |
|
||||
| pathspec present, command empty | **no** | no | 0 |
|
||||
| file is only comments | **no** | no | 0 |
|
||||
| file empty | **no** | no | 0 |
|
||||
|
||||
Five disarming faults, five silences, indistinguishable from each other **and** from the legitimate docs-only case the acceptance test celebrates.
|
||||
|
||||
**Mechanism, from the hook's own source.** `[ -n "$cmd" ] || continue` silently drops a line with no command; `[ -z "$(git diff --cached --name-only -- $paths 2>/dev/null)" ] && continue` silently drops both a genuinely-non-matching pathspec **and** one git could not resolve, because `2>/dev/null` discards the difference.
|
||||
|
||||
**Rationale — this is the thread's own failure class, one level up.** `.precommit-triggers` was built because *naming a risk is not mechanizing a check on it*. A mechanism that cannot report its own disarmament re-opens the same hole: the operator's evidence that the gate is armed is a silence the disarmed state also produces. ⚠ **It is also why `eecc8bb` running no suite went unremarked** — *"Running pre-commit checks…"* with nothing after it is exactly what a fully disarmed hook prints.
|
||||
|
||||
**Options.**
|
||||
- **(a) Parse-and-report.** On every run, print one line per declared rule: `rule 1: corpus/ — no staged match` / `— running`. Silence becomes impossible; a typo shows as a rule that never matches. ⚠ Adds output to every commit in every repo with a triggers file.
|
||||
- **(b) Validate the declaration, stay quiet when clean.** Refuse the commit on a malformed line (no `|`, empty command) and on a pathspec git cannot resolve; otherwise unchanged. Cheaper output; still silent on the *correct-but-never-matching* typo, which is the subtlest case.
|
||||
- **(c) Both** — (b) refuses malformed declarations, (a)'s per-rule line prints only under an env flag or on `--verbose`.
|
||||
- **(d) Do nothing.** Refuted by the table above.
|
||||
|
||||
**Recommendation: (b) now, (a) behind a flag.** (b) removes four of the five silences at no output cost. The fifth — a syntactically valid pathspec that matches nothing, ever — is not mechanically distinguishable from a correct rule awaiting its first match, which is precisely why it needs (a)'s per-rule line available on demand rather than a guess.
|
||||
|
||||
**Check that it worked — both directions required.** Every row of the table above becomes a fixture: each malformed form must refuse or report, and the well-formed control must stay byte-identical in output and exit code. ⚠ The **valid-but-never-matching** case needs a *third* state, not a pass or a fail — it is honestly unknown until something matches.
|
||||
|
||||
**⚠ What this does not establish.** `--no-verify` still steps over everything: tripwire, not boundary. And nothing here makes anyone *read* the extra line — PENDING-98's gap, one layer out.
|
||||
|
||||
**Files affected:** `~/dotfiles/git/hooks/pre-commit`.
|
||||
|
||||
**Awaiting:** Steward authorization.
|
||||
|
||||
---
|
||||
|
||||
## PENDING-121 — `engine_source_binding`: prose → declared surfaces, and the fingerprint that is specified but never recorded (REVIEWED-101 condition 1)
|
||||
|
||||
**Date:** 2026-08-08
|
||||
|
||||
Reference in New Issue
Block a user