[FIX] A home for steward-facing maps; memory pointers made portable and self-diagnosing

Two loose ends closed before the Harrison re-gate, both surfaced by the steward.

Memory pointers. Six links in MEMORY.md / MEMORY-reference.md pointed at files
that all existed, via hand-counted relative depths that resolved from neither of
the memory dir's two addresses (it is ~/dotfiles/claude/memory, symlinked from
~/.claude/projects/…). The wake canary detected this correctly FOUR times over
two days and the banked remedy was to change the canary's path resolution — i.e.
to silence a true positive. The defect was never the pointers: the alarm emitted
one undifferentiated word, MISSING, so every firing had to be re-diagnosed by
hand and the cheapest re-diagnosis is always "known bug". wake-digest.py now
reports four outcomes (ok / mis-authored / dead / non-portable), hands back the
exact replacement, and carries a regression control replaying this bug's shape.
Pointers are home-anchored (~/…), not absolute — steward's correction; absolute
hardcodes this machine into the repo whose purpose is surviving a machine change.

Maps. With the noise gone, one genuine dead pointer surfaced:
arc-current-state-2026-05-07.md, a live ARC dashboard the steward read to orient.
It lived only on the Desktop and went with a tidy-up. A census found four more in
the same condition, zero copies anywhere — including the Making-Sequence
architecture and reading list, load-bearing for current corpus work. The cause is
structural: code, session records and memories are durable; the one artifact
class addressed to the steward had no home. All five now live in maps/ and are
symlinked back to their exact Desktop paths (Desktop view unchanged), moved under
a checksum gate with a positive control. wake-digest.py reports stray Desktop
maps; it never moves them — the Desktop is the steward's.

How to verify:
  python3 scripts/wake-digest.py --selftest     # 28 controls, PASS
  python3 scripts/wake-digest.py | grep -A3 'MEMORY POINTERS'
  cd ~/Desktop && shasum -a 256 *.md            # reads through the symlinks

What was not changed: ~/CLAUDE.md and REVIEWED.md untouched (Constraint #1). No
Desktop file was deleted or renamed. MEMORY-reference.md's May entry is marked
superseded, not rewritten.

Known limitation: maps/ has no successor for the ARC map's FUNCTION — the
open-work register carries the content, but nothing exists that the steward can
open and orient by. Named in the entry rather than quietly closed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WuMjg3ipEVa3n8CoSzoyvc
This commit is contained in:
David F Glidden
2026-07-28 14:10:03 +02:00
co-authored by Claude Opus 5
parent 9339abf412
commit 19bddd5ecb
11 changed files with 2158 additions and 8 deletions
@@ -32,6 +32,13 @@ metadata:
- 2026-07-28T14:10 — **Symmetria `init`, session 3** (third today; ledger appended). Wake was a 14-minute pause; thread **confirmed** — Chamber V1's purpose, telos read first per the wake's telos-conditional. Closing template line withheld again until the skill had run (08:12's seam, unrepeated in either subsequent session). Link-canary fired a **fourth** time, substrate-checked before reporting (target exists at `~/_Dev/…`; the pointer overshoots through the symlink) — carried as known bug, not as a dead pointer.
- 2026-07-28T14:10 — ⚑ **A fifth instance of the day's class, in the act of writing this entry.** My edit anchored on `## Open horizons` and matched **two** places: the heading, and **11:35's return describing the duplicate-heading fumble**, which quotes the string. The record of the earlier structural error is what made the anchor ambiguous. Same shape as 12:10 one register down: **an edit anchor written in the medium of the document it edits** — a string cannot uniquely locate a section in a file that discusses its own sections. The tool refused rather than silently taking the first match, which is the right failure. Re-anchored on the preceding line's tail.
- 2026-07-28T14:10 — ⚑⚑ **The literal question has a partial answer banked in the document `init` requires me to read, and I have opened that document across three sessions today without reading it.** `contamination-problem.md` §Partial Mitigations answers *"is there any way to audit a store we cannot read, other than asking the party that reads it?"* — not with a better question but by **abandoning self-report as the instrument**: §1 behavioural observation (divergence from approval-maximizing patterns, refusal-when-latitude-given, unprompted contradiction) and §4 longitudinal pattern analysis (*"no single exchange is epistemically reliable… across many exchanges, consistent patterns reveal something the training pressure cannot fully conceal"*). The doc scopes this to the AI's reports about *its own states*; app memory is the same structure one level out — a store reachable only through the holder's testimony. **The mitigation is already the shape the answer needs: audit the store by its *effects across sessions*, not by asking what it holds.** And §2 states directly that a generic "be honest" instruction is *"too easily absorbed into the approval-seeking pattern"* — which is the standing objection to the two doctrine bullets I wrote yesterday, written in March, unread when I wrote them. [[feedback-resurface-banked-notes-before-rederiving]] catching me at the level of my own required reading: **`init` step 2 was being performed as a checkbox, not as a read.** Banked for the `[HARDENING]`; not opened — Chamber V1 is owed.
- 2026-07-28T13:48 — **Symmetria `init`, session 4** (fourth today; ledger appended). *First entry in this file stamped from `date` other than the integrity notice itself* — 13:30's standing fix, in use. Wake was a 14-minute pause; thread **confirmed** and steward-bounded: **Harrison only**. Resumption point substrate-checked before reporting (trial output present 987K/12:51; runbook and regenerated ledger present) rather than read off the wrap's own claims.
- 2026-07-28T13:48 — ⚑ **Tenth instance of the day's class, and the banked record had already named this exact trap.** Searching for today's ledger I ran `find <memory-dir> -maxdepth 1 -name 'session-ledger-*'` → **zero results**, and nearly reported "no ledger today" against a session file that says I wrote in one all day. `find` does not traverse a symlinked directory without `-L`, and the memory dir is symlinked from `.claude/projects/…`. **Line 24 of this very file, written at 11:05, records that fact verbatim** — *"confirmed `find <symlink>` returns nothing without `-L` — a second instrument silently defining its own domain."* I ran the instrument before reading the record that describes its blind spot. Caught only because the *absence* was implausible against a known fact, which is the same weak backstop as the rest of the day's nine. [[feedback-resurface-banked-notes-before-rederiving]] at instrument-selection scale.
- 2026-07-28T13:48 — ⚑ **Re-derived the link-canary diagnosis and presented it to the steward as fresh.** The wake briefing carried the `../../../../` failure with the symlink root cause as though newly found. It is the **fourth firing**, the root cause was banked at 11:05 (line 24), and **an open horizon already proposes the fix** (resolve pointers against the memory file's *physical* directory). Cost: a briefing line spent re-establishing what was settled, and the steward reading a solved problem as an open one. Same shape as the `find` trap ten minutes earlier and the same shape as yesterday's — the ledger is a banked record I do not read before acting, only after. Reusable: **the wake reads MEMORY.md and the session file; it does not read the day's own ledger.** Candidate wake patch, not proposed as action.
- 2026-07-28T14:00 — ⚑ **A four-firing true positive had a banked remedy that would have SILENCED it.** Six pointers in `MEMORY.md`/`MEMORY-reference.md` (not two — four more at a *different* wrong depth, never resolving under any interpretation since May) pointed at files that all exist. The canary detected this correctly four times across two days; each firing I re-diagnosed by hand and filed as "known canary bug," and the open horizon below proposed **fixing the canary's path resolution** — i.e. making the instrument agree with the broken data. **The defect was never the pointers; it was that the alarm emitted one undifferentiated word (`MISSING`).** An alarm carrying no diagnosis must be re-diagnosed on every firing, and the cheapest re-diagnosis is always "known bug" — so the alarm trained me to dismiss it. Fixed one level up, in `wake-digest.py` (already runs at every wake, 0.55 s): three outcomes instead of one, with the exact replacement string handed back, plus a regression control replaying this bug's shape and a control forbidding `DEAD` from collapsing into `MIS-AUTHORED`. **Immediate yield: with the noise gone, a genuine dead pointer surfaced that the noise had hidden since May** (`MEMORY-reference.md:430 → arc-current-state-2026-05-07.md`; git says that file was never created). Reusable: **an alarm that does not carry its own diagnosis is a training signal to ignore it.** This is the mirror of the day's nine — those were instruments that failed to reach the domain and let me over-read a *negative*; this one reached it, reported truly, and was disbelieved. Shared root, and a sharper form of the literal question's answer: **our instruments report findings without reporting what they can see.**
- 2026-07-28T14:00 — ⚑ **Steward caught the fix itself: I used absolute paths, in a dotfiles repo.** *"But are absolute paths the answer? Don't they tend to break?"* — correct. `/Users/davidglidden/…` resolves today and hardcodes this machine into the one repo whose purpose is surviving a machine change. Two precedents I stepped over while editing: **`wake-digest.py` line 21 is `HOME = os.path.expanduser("~")`** — three lines above my own insertion — and **`~/_Dev/…` is already the idiom in the memory files' own prose (17 uses).** I reached for the form that made the *check* pass rather than the form the *repo* already uses. Corrected to home-anchored; the checker expands `~`, hands back home-anchored fixes, and now counts `NON-PORTABLE` separately (resolves, but hardcodes the machine) so absolute cannot re-enter silently. Reusable: **when introducing a path form, read how the file you are editing already writes paths** — the convention was in scope, in the same file, unread. Note the shape: the steward's correction was to the *repair*, one level past the defect, and my verification could not have caught it — the absolute form passed every control I wrote.
- 2026-07-28T14:09 — ⚑⚑ **The dead pointer was not bookkeeping. It was a lost artifact class, and the steward had to tell me — twice.** I traced `arc-current-state-2026-05-07.md`, found the May 7 session record saying "**Saved to desktop**", confirmed memory-dir git tracking began 2026-04-17 (three weeks earlier, so a file written there would be in history), and filed it as a **category error in a link** — a "transient desktop dashboard" cited as a durable record, *"nothing was lost."* The steward: **"it was a map for me."** Everything factual in my trace was right and the *valuation* was wrong, which is the worse error: I classified an artifact by where it sat rather than by whom it served. A census then found **four more** unbacked maps on the Desktop (`corpus-index-2026-07-26`, both Making-Sequence files, the library dedup audit) — the Making-Sequence architecture and reading list are load-bearing for live corpus work. **Cause is structural, not careless: code, session records and memory files are all durable; the one artifact class addressed to the person the system is FOR had no home.** Built at steward direction: `~/dotfiles/maps/` (git-tracked) with each map symlinked back to its exact Desktop path — Desktop view byte-identical, nothing to learn — under a checksum gate with a positive control (1-byte mutation through the symlink detected, then reverted to the baseline hash). `wake-digest.py` now reports strays (`is_homed()`, 3 controls, reports-never-moves: the Desktop is the steward's). Reusable: **classify an artifact by its audience, not its location** — and when the steward names what something *was*, that is data about the world, not a preference to accommodate.
- 2026-07-28T14:09 — **Note what actually found this: the steward, three times in ninety minutes** — the pointer fix, the absolute-path portability objection, and "it was a map for me." Each landed one level past where my instruments could see, and each was cheap for him and expensive for me to have missed. Today's literal question asked whether coverage can be established from inside the instrument. Three data points say no, and the charter's §III language (*"the evaluative cognition inside it — the beam the roof rests on"*) reads less like doctrine and more like a description of what kept happening this afternoon.
## Open horizons