[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
+25 -2
View File
@@ -212,9 +212,32 @@ Sync the thinking mirror to Obsidian vault:
- Source: `~/_Dev/CapableMind-AI/docs/thinking/David/`
- Destination: `~/Library/Mobile Documents/iCloud~md~obsidian/Documents/David, root-and-branch/08. Notes/CapableMind/thinking-mirror/`
Use rsync to copy new/modified files, preserving directory structure. Report what was synced.
Use rsync to copy new/modified files, preserving directory structure.
If the destination doesn't exist or the iCloud path isn't accessible, skip silently and note it.
⚠ **This wrap is now the ONLY writer of that mirror.** A launchd agent
(`com.dglidden.thinking-mirror`, every 48 h) used to mirror the same source into a *second* vault
folder, `00. Compass/00b. Constellations/CapableMind/thinking-mirror`. It had been failing since
roughly March 2026 — last exit 1, `rsync … > /dev/null 2>&1`, so its own log sat at 0 bytes and it
could not report its own death — and its tree had drifted 115 files behind. **Retired 2026-08-23**:
agent unloaded, plist and script removed, the stale duplicate tree deleted after verifying all 151
of its files were present in the live tree. Steward-authorized. Do not recreate a second writer.
⚠ **The destination is a MIRROR — a derived tree. Never edit it, and never apply a vault-wide pass
to it.** `rsync` overwrites it from source on the next wrap, so any vault-side edit there is void
the moment it is written. Frontmatter pass 2 (2026-08-19) learned this the expensive way: its edits
to this subtree were reverted by this very step on 2026-08-22 at 23:42, and the 09-item spec
end-state it reported for those notes had already ceased to be true. The Frontmatter Specification
declares mirrored trees out of scope for exactly this reason.
**Report the outcome explicitly in §8 — never skip silently.** This mirrors §6.5's rule for a
failed push, and for the same reason: a sync that fails quietly is indistinguishable from a sync
that had nothing to do, and that is how five months of silence went unnoticed.
- Success: name the count synced (`N files`), or `no changes` if the trees already agreed.
- Failure — destination missing, iCloud path unavailable, non-zero rsync exit: **say so in §8 with
the exit code.** Do not swallow it. If the failure looks like the launchd precedent (an iCloud
path unreachable from a restricted context), say that too; the diagnosis is in
`session-ledger-2026-04-16.md` and it is macOS Full Disk Access, not git and not rsync.
### 8. Output