[FIX] Retire the dead thinking-mirror agent; one writer, and it reports

The vault held two mirrors of docs/thinking/David/ in two folders, neither
aware of the other. /wrap-up §7 writes 08. Notes/CapableMind/thinking-mirror
at every wrap and is byte-current with upstream. The launchd agent
com.dglidden.thinking-mirror wrote 00. Compass/00b. Constellations/... every
48h, and had been failing since roughly March 2026: last exit 1, ending in
`rsync … > /dev/null 2>&1`, so its own plist StandardOutPath received nothing
and its log has been 0 bytes since 10 Mar. Its tree was 115 files behind.

Nobody noticed the archive job had died because a second, undocumented writer
was quietly doing the same work to a different folder. That is the failure the
duplication caused: not a lost archive, but a lost signal.

The steward asked a previous executor to build that script. Option A chosen:
keep the wrap, retire the agent. Agent unloaded, plist and deployed script
removed. Removing the plist from config/capablemind/ is load-bearing, not
tidiness — setup-capablemind.sh:135 copies every *.plist there into
LaunchAgents, so leaving it would resurrect the retired job on the next setup.

Stale tree deleted from the vault after three independent checks that nothing
was lost: all 151 of its .md files present in the live tree by basename, all
five files that `diff -rq` reported as unique present in both the live tree and
the repo (they only looked unique because the stale tree is flat and upstream
reorganised into l2-constitution/, amendments/, chamber/), and 156 files
tracked in the vault mirror's git HEAD at a58fc00. Siblings daily-log/,
sessions/ and l2-design-narrative.md preserved.

§7 rewritten: it now states it is the only writer, that the destination is a
derived tree no pass may edit, and that the outcome is reported in §8 with the
exit code — never skipped silently. The file already required exactly that of a
failed push in §6.5 and contradicted itself eight lines later.

Frontmatter Specification bumped to v1.0.1 in the vault (steward-authorized,
scoped to this amendment): principle 7 and a new §1a declare mirrored trees out
of scope. Pass 2 brought that subtree to v1.0.0 and reported an end state for
it; the 2026-08-22 wrap rewrote it from source at 23:42 and every edit vanished.
A derived tree cannot hold an edit.

Tracker: the mechanism claim filed earlier today named the launchd agent as the
writer, on nothing stronger than matching upstream content. Wrong agent,
explicitly superseded in place.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQKeKY9T9d95KpvHwwok8T
This commit is contained in:
David F Glidden
2026-08-23 10:35:07 +02:00
co-authored by Claude Opus 5
parent 5a350c7059
commit f1c91d9866
5 changed files with 148 additions and 35 deletions
@@ -85,6 +85,59 @@ not render — into top-level `parents/children/peers`, which **made 194 already
render as clickable-and-broken in the properties UI.** The breakage was surfaced, not created. The
pass report did not predict this, and it should have.
### 2026-08-23 — status check: four items verified against substrate, and one NEW regression found
Asked where the workstream stood; verified rather than relayed. **Items 1–4 confirmed live**, with
two unit corrections: `related` was counted by the tracker in *targets* (194 unresolvable) and a
file-count (122 notes / 213 targets now) is not comparable to it; and `canonical: 159` is a
**frontmatter** count — a naive `grep '^canonical:'` returns 239 because it also catches body text.
The tracker was right and the quick instrument was wrong. YAML parse errors independently
re-measured at **16**, matching.
⚠ **NEW — the vault has a write path the spec does not govern, and it silently reverted pass 2.**
Mirror sync `a58fc00` (2026-08-22 23:52) changed 14 files and ran *against* the spec:
`owner` **0 → 9**, `change_log` **0 → 9**, `revisions` **90 → 81**, and `canonical: true` was
replaced by pointer-form paths. All 9 sit in one subtree,
`08. Notes/CapableMind/thinking-mirror/chamber/archive/orientation/`.
**Mechanism — SUPERSEDES the first reading filed earlier the same day.** The earlier entry named
*"a job mirrors `docs/thinking/David/`"* and pointed at the launchd agent. **Wrong agent.** Matching
upstream content is not evidence of which path wrote it, and the launchd job targets a different
folder entirely. The actual writer is **`/wrap-up` §7**, which rsyncs
`~/_Dev/CapableMind-AI/docs/thinking/David/` → `08. Notes/CapableMind/thinking-mirror/` **at every
wrap**. The 2026-08-22 wrap ran it at 23:42; vaultsync committed the result at 23:52 as `a58fc00`.
⚠ **There are TWO mirrors of the same source into two different vault folders, and neither knows
about the other:**
| writer | destination | state |
|---|---|---|
| `/wrap-up` §7 (every wrap) | `08. Notes/CapableMind/thinking-mirror` | **live** — 251 files, 0 diff from upstream |
| `com.dglidden.thinking-mirror` (launchd, 48 h) | `00. Compass/00b. Constellations/CapableMind/thinking-mirror` | **dead** — 151 files, 115 behind, frozen since 2026-03-13 |
**The launchd job is failing and cannot say so.** `launchctl list` reports last exit **1**; the
script ends `rsync … > /dev/null 2>&1`, so its own plist `StandardOutPath` receives nothing and the
log has been 0 bytes since 10 Mar. Precedent for the cause is in `session-ledger-2026-04-16.md`:
the *vaultsync* agent failed the same silent way for weeks — **macOS TCC / Full Disk Access, rsync
under launchd against an iCloud path, exit 23** — and was fixed by granting FDA. Same shape here,
never fixed. ⚠ **Exit 1 is not exit 23, so the TCC diagnosis is a strong hypothesis, NOT
established.** A manual `--dry-run` of the exact command succeeds (exit 0) when run interactively,
which is consistent with TCC but does not prove it.
**The reframe that resolves this: you do not edit a mirror.** Applying the frontmatter spec to a
derived tree is a category error — the edits cannot survive their next sync, and pass 2's edits to
both mirror trees were void the moment they were written. This is not misbehaviour by the mirror.
**Not fixed — the disposition is a design choice, not a [FIX]:** exclude the subtree from the spec's
scope · apply the spec upstream in CapableMind-AI · or declare mirrored notes not-spec-governed and
say so in the spec. Steward's call.
**Item 5 sharpened.** `01. Daily/` holds **11 notes, the most recent 2025-09-04** — nearly a year
old, and the Daily-Notes plugin is not configured. There is no dormant capture habit to revive; the
practice would be built from nothing. `00a. _inbox` holds 11 notes.
---
## Current state — OPEN
@@ -103,3 +156,7 @@ pass report did not predict this, and it should have.
workflow to have the important parts of our work captured there"* — the capture practice, the
thing that would make the vault a practice rather than a tidier archive — **has not been
designed.** Do not let the frontmatter tail stand in for it.
6. ⚠ **The `thinking-mirror` write path is ungoverned** (found 2026-08-23). 9 notes carry retired
keys again after mirror sync `a58fc00`; any future pass over that subtree is undone on the next
sync. **Fix the path before re-applying the spec there** — otherwise the work is re-done, which
is what the Prime Directive exists to prevent.