[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
File diff suppressed because one or more lines are too long
+4 -3
View File
@@ -16,6 +16,7 @@ permalink: claude-memory/memory
- [Chamber work: ground in constitution + charter + runbook FIRST](feedback-chamber-work-ground-in-constitution-charter-runbook.md) — steward directive 2026-07-28: **any chamber work *or talk about it*** begins by reading the **library constitution** · the **engine charter** · the **conversion runbook** (incl. `reanchor:` — a new hash invalidates bindings in BOTH repos). Repo CLAUDE.mds are pointers, not state. Corpus claims come from a self-tested tool, never a hand grep. **Enforcement mechanism owed** (hook/skill/wake-conditional; `verify-before-compose` is the precedent).
- [CapableHands standing authorization](reference-capablehands-standing-authorization.md) — M4 mini david@10.0.1.136 durably authorized for remote OCR/inference; don't re-ask permission to use it (steward 2026-07-01).
- [Every canon doc's source lives in Chamber Sources](feedback-resolve-source-through-chamber-sources.md) — a canonical's source = whatever `resolve_archived_source` returns (the **Chamber Sources** folder; NEVER the master library or a path in a plan/doc/frontmatter); read the banked source record before calling a mismatch a defect; fix wrong/missing pins to golden standard. (Steward, 2026-07-24, after 3 corrections on the Levi omnibus source.)
- [Steward maps live in ~/dotfiles/maps](reference-steward-maps-home.md) — a **map** = an artifact David reads *directly* to orient (dashboard, corpus index, reading list). Write it into `~/dotfiles/maps/` and symlink to the Desktop, **never** straight onto the Desktop. Est. 2026-07-28 after one was lost and four more found unbacked; `wake-digest.py` reports strays.
- [Governance files are dotfiles symlinks](reference-governance-files-are-dotfiles-symlinks.md) — `~/PENDING.md`/`~/REVIEWED.md`/`~/CLAUDE.md` → `~/dotfiles/…`; Edit/Write refuse to write through a symlink, so **edit the real dotfiles path** when appending PENDING/REVIEWED.
- [Typography palace — query via CLI](reference-typography-palace-cli.md) — type masters (~20-21 sources) in a dedicated MemPalace at `~/.mempalace/palace-chamber-typography`; query `mempalace --palace <that> search "…"` (CLI). For ARC typography — don't re-ask where it lives.
- [Fowler's rules for quotation](feedback_fowlers_rules_quotation.md) — single quotes primary, double for nested, logical British punctuation order. Apply across all writing.
@@ -41,13 +42,13 @@ permalink: claude-memory/memory
- [Tool review after each use](feedback-tool-review-after-each-use.md) — steward directive (2026-06-16): review every tool we built after each run (success OR failure), capture what it taught, iterate until reliable; PASS-BUT-FALSELY is the priority signal. Log at `chamber-library/_curation/tool-evolution-log.md`. Proven same day (audit_cruft hardening → 160 hidden-dirty files surfaced).
- [Engine sources graduate to the permanent chamber](feedback-engine-sources-become-permanent-chamber-collection.md) — steward policy (2026-06-28): any work added for the engine ALSO becomes permanent chamber collection unless expressly stated; take it ALL the way (clean→verify→graduate→catalogue→sidecar); never leave staged. The chamber accumulates. ⇒ all ~30 Making sources graduate in.
- [Notes are part of the work](feedback-notes-are-part-of-the-work-keep-footnotes-endnotes.md) — steward directive (2026-06-28): footnotes/endnotes are integral — KEEP+CONVERT them (`<sup><a>`→`[^N]`), never drop on graduation. (Caught dropping Taylor's endnotes — wrong.)
- [The maturation of the chamber — a dialogue](../../../../_Dev/studium-engine/docs/the-maturation-of-the-chamber-a-dialogue-2026-06-28.md) — the pivotal 2026-06-28 exchange on the chamber's telos (fidelity-without-trust; reading-is-unsolvable-is-the-feature; L2/engine=answerable-not-pure). Companion to [[project-studium-engine-telos-chamber-of-voices]].
- [The maturation of the chamber — a dialogue](~/_Dev/studium-engine/docs/the-maturation-of-the-chamber-a-dialogue-2026-06-28.md) — the pivotal 2026-06-28 exchange on the chamber's telos (fidelity-without-trust; reading-is-unsolvable-is-the-feature; L2/engine=answerable-not-pure). Companion to [[project-studium-engine-telos-chamber-of-voices]].
## Canonical Workstream Trackers
*Read the tracker for any active workstream at /wake-up before composing the briefing. Append substantive moves at /wrap-up. Per `feedback-canonical-workstream-tracker-discipline.md`.*
- **[Chamber as versioned releases (the governing frame)](project-chamber-versioned-releases.md) — steward reframe 2026-07-25: the full 2000-year Chamber (incl. image-based Warburg/Jung, Berger, Alexander) is the HORIZON; realize it as versioned releases with soft borders — "Chamber V1 = constitution vX + engine vY + a bounded voice-set, serving a specific PURPOSE" (Making Sequence · violin/XXI-century treatise · ARC). Purpose-first re-bounds the library work: the V-TEXT wave needn't all clear for V1. PENDING-75 kind-scoping = the enabler of additive version growth. Scope every library bite through this. Open decision: which purpose anchors V1.**
- [The Chamber touchstone — the *why*, and it does not move](../../../../_Dev/studium-engine/docs/the-chamber-touchstone.md) — seven questions to **test work against** when lost in the trees (one clause · answerable-not-pure · the seam · the gap stays open · inside-not-receiving · reading-not-concluding · for whom). Est. 2026-07-28; every quote source-verified verbatim. **Read at Step 0 of any chamber work**, before constitution/charter/runbook — those are operational and say nothing about why. Points at its seven sources; holds no state, so it does not decay.
- [The Chamber vision is NOT in one place](project-chamber-vision-is-not-in-one-place.md) — honest answer to the steward's 2026-07-28 hope: it lives in **seven** sources across two repos + memory (one behind a dead pointer), and the two newest maps (**boundedness gradient** · **convocation ladder = who convokes**) exist only in a session record. Census + what a single home would need. **Not yet proposed as a document** — a grand synthesis would become an eighth scattered source unless it supersedes or points.
- [The Chamber touchstone — the *why*, and it does not move](~/_Dev/studium-engine/docs/the-chamber-touchstone.md) — seven questions to **test work against** when lost in the trees (one clause · answerable-not-pure · the seam · the gap stays open · inside-not-receiving · reading-not-concluding · for whom). Est. 2026-07-28; every quote source-verified verbatim. **Read at Step 0 of any chamber work**, before constitution/charter/runbook — those are operational and say nothing about why. Points at its seven sources; holds no state, so it does not decay.
- [The Chamber vision is NOT in one place](project-chamber-vision-is-not-in-one-place.md) — honest answer to the steward's 2026-07-28 hope: it lives in **seven** sources across two repos + memory (one was behind a broken pointer; all pointers repaired 2026-07-28), and the two newest maps (**boundedness gradient** · **convocation ladder = who convokes**) exist only in a session record. Census + what a single home would need. **Not yet proposed as a document** — a grand synthesis would become an eighth scattered source unless it supersedes or points.
- [MemPalace wind-down](project-mempalace-winddown.md) — DONE (steward 2026-07-07): `palace-memory` wound down, wake/wrap rewired to the files layer; KG exported (`knowledge-graph.jsonl`). Typography palace KEPT (separate instance).
- [ARC open-work register](project-arc-open-work-register.md) — **the single code-verified source of truth for what is OPEN on ARC** (post-Stage-G, built 2026-06-11). Read THIS for remaining ARC work (A1 Vignette, A2 cul-de-lampe, content sweeps, Phase-2/held set, REVIEWED-placement debt), not the chronological tracker.
- [ARC](project-arc-rework.md) — canonical ARC workstream tracker (chronological record 2026-04-16 →). **Status: STAGE G DONE/SEALED (GPG `ac0a7ee`, 2026-06-10) — reactive mode governs.** Open work → [[project-arc-open-work-register]] (A1 Vignette · A2 cul-de-lampe · content sweeps · Phase-2 held set). Chronological detail in the tracker file.
@@ -0,0 +1,39 @@
---
name: reference-steward-maps-home
description: Maps — artifacts the steward reads directly to orient — live in ~/dotfiles/maps (git-tracked) and are symlinked to the Desktop; write them there, never straight onto the Desktop.
metadata:
type: reference
---
A **map** is an artifact addressed to the steward and read *directly* by him: a
current-state dashboard, a corpus index, a reading list, an architectural sketch,
an audit he opens rather than asks about. Distinct from session records (written
for the next session) and memory files (written for the next Claude) — David does
not browse the memory dir, so a map filed there is a map that is not read.
**Home:** `~/dotfiles/maps/` (git-tracked, pushed with dotfiles). Each map is
symlinked back to its original Desktop path, so the Desktop is unchanged — same
names, same place. Tidying the Desktop now deletes a symlink, not the map.
**The rule:** write a map into `~/dotfiles/maps/` and symlink it to the Desktop —
never the other way round. A map authored straight onto the Desktop is untracked
from the moment it exists.
**Enforcement:** `wake-digest.py` reports any top-level Desktop `.md` that is not
a symlink into `maps/` (`stray_maps()`/`is_homed()`, 3 controls). It reports only
— the Desktop is the steward's, and nothing moves without him.
**Why it exists:** `arc-current-state-2026-05-07.md` was a live ARC dashboard the
steward read to orient. It lived only on the Desktop, went with a tidy-up, and
its only trace was a `MEMORY-reference.md` link that read as noise for three
months — I nearly deleted it as a stale pointer. The census then found **four
more** in the same condition (Making-Sequence architecture + reading list among
them, load-bearing for live corpus work), every one with zero copies anywhere.
The cause was structural: code, session records and memories were all durable,
and the one artifact class addressed to the person the system is *for* had no
home. Steward-directed 2026-07-28; all five relocated byte-identically under a
checksum gate with a positive control.
Related: [[feedback-resurface-banked-notes-before-rederiving]] (the register that
holds ARC's *content* successor is [[project-arc-open-work-register]]; the map's
*function* — something he opens and orients by — had no successor until this).
@@ -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