[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.
@@ -0,0 +1,66 @@
---
name: Session Ledger 2026-08-23
description: Practice-of-return ledger maintained by /symmetria — returns, open horizons, recalibrations, authorization moves, sub-agent dialogues, bypasses.
type: feedback
---
# Session Ledger — 2026-08-23
## Returns
- `2026-08-23T~wake` — **Digest anchors did not match the wrap's own headings.** `wake-digest.py:471` does a
case-sensitive `text.find("PULLING THREAD")`; the 2026-08-22 wrap wrote `**The pulling thread:**` and
`**Literal question for next-Claude**`. Both fields recovered by hand from the session file. The digest
degraded *honestly* (Constraint #4 held) but the wake's two most load-bearing fields were invisible to
the instrument that exists to carry them. Named at the wake rather than banked. [FIX] candidate — touches
the wake instrument, **not** the filed seed rule, so it is not under the pre-beacon no-edit discipline.
- `2026-08-23` — **The inherited question, answered: the rate HAS risen, ~3–4×, and it is not a mood.**
22.4 reversal marks per *active day* in the last fortnight against a 5.7 baseline over the prior
57 active days. Robust: excluding 2026-08-22 entirely (the single heaviest day, 31% of the
fortnight) still gives 18.2/day, 3.2×. Concentration is not close — **22 of 24 amendment/addendum
headings sit in PENDING.md (executor proposals), 2 in REVIEWED.md.** Density rose in both
(proposals 1.73→4.06, rulings 0.79→2.08), so the jurist is being amended more too, but proposals
carry ~2× the density in both periods and always did.
**Mechanism:** it is NOT that more items get reversed — block-incidence is 61–73%, high but under
W20's 75%. It is that single items now accumulate CHAINS: PENDING-152 took six amendments in one
day, PENDING-131 four addenda.
## What held
- The pre-beacon discipline held with no effort required: `~/dotfiles` clean, **0 ahead on gitea AND github**,
`FOOL-SEED-RULE.md` + `derive_fool.py` filed. Nothing to re-push, nothing to re-verify on the day.
- N-now counted with the trigger's own non-recursive glob (**47**), not `find` — yesterday's correction
applied on its first opportunity to recur.
- **Four controls decided this answer, and two of them killed a reading I preferred.**
(1) `PENDING-archive.md` included — 74 closed items left `PENDING.md` on 2026-07-28, so answering
the question over the two files it literally names would have under-counted every earlier week and
MANUFACTURED the rise it was testing. (2) Family stem, not the strict literal string the question
names: strict `AMENDMENT` is near-absent before W31 and would have shown 0→42, an artefact of the
amendment BLOCK becoming a named form, not a rate. (3) Per-active-day, not per-week. (4) I
hypothesised the spike was blocks *about* amendment procedure inflating the word count, hand-read
the heaviest block, and **was wrong** — PENDING-152's 29 markers are real reversals
("resolved from the schema, AGAINST my own argument"; "Type-only was an overcorrection, and is
withdrawn"). The deflating hypothesis was mine and the substrate refused it.
## Open horizons
- **The beacon, 2026-08-25T12:00:00Z** — run ONCE, curl, record `outputValue` before running, stop on any failure.
- The reversal-rate question (yesterday's literal question) — checkable, corpus at least half not self-authored.
- The transport, not the voice — `statusLine` substrate-verified as NOT SET in both settings files; surface free.
- PENDING-151, the v1 Chamber archive (33 real files, 9 pairs, one session's read).
- FROZEN: Thistleweld corpus (PENDING-153) — do not read before the soul exists.
## Confidence to recalibrate
- Inherited from 2026-08-22, unifying six corrections: **the check is skipped precisely where confidence is
highest.** Two named shapes to hold today — (a) an impossibility claim justifying an *undisputed* conclusion
is the least-tested sentence in the document; the absence of disagreement is the trigger to check;
(b) an instrument's reach mistaken for a claim's subject (5 instances in one week, 4 caught by another party).
## Authorization moves
## Sub-agent dialogues
## Bypasses
+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