[FIX] The link canary was blind to code spans, to wikilinks, and to its own class
The steward's 2026-08-09 to-do read "the gap is neither knowledge nor home but
the absence of an EXECUTABLE." The premise was false: classify_pointers has
existed since 19bddd5 (2026-08-08), wired to SessionStart, with controls. The
gap was that the executable was incomplete, and the incompleteness had already
produced a false positive.
Four defects, three named in the spec and one found by building it:
1. CODE SPANS. `](file.md)` inside backticks read as a pointer, so the single
DEAD pointer reported on 2026-08-09 was the link pattern written inside
MEMORY.md's own specification of this canary. An instrument that flags its
own documentation flags it every wake forever, and the real signal drowns —
the same "known canary bug" dismissal the 2026-07-28 block was written to
end, arriving by a second route. Fences and inline spans are blanked with
offsets preserved; inline spans may not cross a newline and an unterminated
fence does not match, so a stray backtick can never blank the file and HIDE
dead pointers.
2. WIKILINKS. reference-verification-ladder.md has specified this canary as
covering "every `](file.md)` and `[[wikilink]]`" since 2026-07-06. Only the
first half was ever built. 31 wikilinks now checked.
3. BREAKAGE AGE, derived from git rather than a stored prior run — a state file
would make this the one cached section in a digest whose governing property
is that it is computed. Where git cannot answer, it says so.
4. Found by running it: the first wikilink pass reported only UNWRITTEN, and
both live hits were [[trust-prior-pass-frame]], whose file EXISTS as
feedback-trust-prior-pass-frame.md. That is precisely the one-word alarm the
comment ten lines above it was written to forbid. Wikilinks now report three
outcomes and hand back the replacement slug. Both are repaired here.
The wake-up skill and the ladder now POINT AT the executable instead of
describing the check — the described-not-invoked gap is why it kept being
retyped by hand on 2026-08-08 and 2026-08-09.
Verify: python3 scripts/wake-digest.py --selftest (61 checks, exit 0)
python3 scripts/wake-digest.py | grep 'MEMORY POINTERS'
Induced red: blank_code reverted to a no-op (behaviour, not the symbol) →
exit 2, five named failures, no traceback; direction controls held.
Not changed: the wrap_inside detector, which announced "PREVIOUS SESSION DID
NOT WRAP" for a session that wrapped at 19:48 and kept working until 21:54 —
a two-valued detector over a three-case state. Named in the ledger, not fixed.
This commit is contained in:
@@ -23,7 +23,7 @@ Proven gates, each earned from a real catch. Reach for the one the claim's shape
|
||||
- **Delayer-diff** (2026-06-08) — for an `@layer`/structural-wrap refactor where the compiled output gains uniform wrappers: strip the `@layer X{`/closing-`}` wrappers from the compiled CSS (brace-aware script), diff vs the true baseline; byte-identical proves nothing *moved, dropped, or changed* — only got wrapped. Proven 3× in W3R Stage 2a. **CAUTION — byte-identical ≠ rendered-identical under `@layer`:** `@layer` overrides specificity, so a structural-wrap byte-proof is *necessary but not sufficient*; render-review is the gate when the cascade *basis* changes (a 5-layer wrap was byte-true yet produced 3 render inversions the diff could not see — the steward's eye caught them). Rendered-identity is then argued *by construction* (only already-winning rules promoted) AND render-reviewed — not inferred from the byte-diff.
|
||||
- **Hold or exclude volatile build-stamps** — a build-date/commit stamp (colophon `_build_info`) differs between baseline and post builds and falsely flags a byte-diff. Hold it constant or exclude it, and say which (2026-06-10, Stage-G close).
|
||||
- **Two-hat commit separation** — name the hat each commit wears: a *refactor* commit's compiled output is byte-identical (or carries a pre-stated classified delta); a *feature* commit is where rendered values change. Makes the gate above applicable per-commit instead of per-session (2026-06-08, from Fowler).
|
||||
- **Lossless-relocation gate** — restructuring an index or moving prose between files: line-range **slices, never retyping**, + md5-conservation per moved slice + a link-resolution canary over every `](file.md)` and `[[wikilink]]`. Proven on the MEMORY.md two-file split (2026-07-06) and again on the skill-harvest split (2026-08-01, archive byte-identical over 166,027 bytes).
|
||||
- **Lossless-relocation gate** — restructuring an index or moving prose between files: line-range **slices, never retyping**, + md5-conservation per moved slice + a link-resolution canary over every `](file.md)` and `[[wikilink]]`. Proven on the MEMORY.md two-file split (2026-07-06) and again on the skill-harvest split (2026-08-01, archive byte-identical over 166,027 bytes). **The canary is an executable — `python3 ~/dotfiles/scripts/wake-digest.py` (both link forms, four outcomes each, breakage dated from git; `--selftest` proves it). Never hand-type it: the hand version cannot strip code spans, and on 2026-08-09 its one "finding" was the link pattern inside its own specification** (2026-08-10).
|
||||
|
||||
## Mechanical text transforms ("strip/replace token X across the file")
|
||||
- **Token-strip hits prose** (2026-06-08) — a whole-file `sed s/…!important…//` (or any token strip) also removes the token from comments, code-refs, and docstrings, silently mangling prose. Scope the transform to declaration lines, OR compare raw-before vs clean-declaration counts and verify comment integrity after (caught 4 mangled comments via the 56-vs-70 count mismatch; restored). Same family as *Count first, then look* — the word lives in prose too.
|
||||
|
||||
Reference in New Issue
Block a user