Files
dotfiles/claude/memory/reference-governance-files-are-dotfiles-symlinks.md
T
David F GliddenandClaude Opus 5 45268f6349 session 2026-09-14: the 59 answered (zero name their parent); PENDING-186 + PENDING-175 amendments; the memory write-guard is path-keyed
- The 59 unattributable register blocks: ZERO name their parent in their own
  text; all position-only. 37 cite only FOREIGN ids, so an id-keyed repair
  would mis-file every one. The obvious automated repair is worse than none.
- PENDING-186 [PROPOSAL] filed + AMENDMENT 1: the 'silent failure' ordering
  constraint is falsified (the harness warns at write time), and the real
  defect is that our write convention routed around that guard.
- Claude Code's near-limit MEMORY.md guard is PATH-KEYED: 5/5 warnings via the
  ~/.claude symlink path, 0/2 via the real dotfiles path at a LARGER size.
  Pre-registered and confirmed. MEMORY.md must be edited by the symlink path.
- PENDING-175 AMENDMENT 1: governance_item returning only the first block is
  no longer predicted but REPRODUCED, located at governance-mcp.py:199-202;
  the second defect is narrower than reported - it is a colon.
- Both amendments filed id+marker so they do not join the 59 they describe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PJM5fwqp456LDGzqiZXsgu
2026-09-14 20:18:39 +02:00

59 lines
4.5 KiB
Markdown

---
name: governance-files-are-dotfiles-symlinks
description: "~/PENDING.md, ~/REVIEWED.md, ~/CLAUDE.md are symlinks into ~/dotfiles/ — Edit/Write refuse to write through a symlink, so edit the real dotfiles path when appending PENDING/REVIEWED entries."
metadata:
node_type: memory
type: reference
originSessionId: 231bdbb9-ae7f-4be8-946d-2ddf952fb7a5
modified: 2026-09-14T15:56:00.208Z
---
The home-level governance files are **symlinks into the dotfiles repo** (`~/dotfiles`, git-tracked for restore/setup):
- `~/PENDING.md` → `~/dotfiles/PENDING.md`
- `~/REVIEWED.md` → `~/dotfiles/REVIEWED.md`
- `~/CLAUDE.md` → `~/dotfiles/CLAUDE.md`
The Edit/Write tools **refuse to write through a symlink** ("Refusing to write through symlink … pass the real target path explicitly"). So when appending a PENDING/REVIEWED entry, **edit `~/dotfiles/PENDING.md` (or `…/REVIEWED.md`) directly** — reading via the `~/` path is fine; only *writing* needs the real target. (`~/CLAUDE.md` is constitutionally not executor-editable anyway.)
Because these live in dotfiles, a PENDING/REVIEWED change is a **dotfiles commit** — the `/wrap-up` §6.5 dotfiles push carries it. Confirmed 2026-07-09 (hit the symlink-refusal appending PENDING-52).
---
## ⚠ Disclosure — what this note is, as of 2026-08-06 (PENDING-107)
**This note documents the route past the only friction that stands between the executor and the constitution.** That has to be said on the note itself, because the note is loaded at every wake and the fact is not visible from the convenience tip.
Established against the substrate (`~/.claude/settings.json`, `~/.claude/hooks/verify-before-compose.sh`, both read in full 2026-08-06):
- The symlink refusal is a **tool-behaviour artifact, not a permission check**. It protects nothing; it just makes you type a different path.
- `settings.json` has **no `permissions` key at all** — 0 deny, 0 allow.
- The one `PreToolUse` hook has matcher `Write|Edit`, so it **is invoked** on an edit aimed at `~/CLAUDE.md` — and its first scope guard (`*chamber-library*`) then **exits 0 by design**. A mechanism runs on the exact call and declines.
- `Bash` is **not in that matcher**, so a heredoc/`sed`/Python write triggers no gate at all.
So the parenthetical above — *"`~/CLAUDE.md` is constitutionally not executor-editable anyway"* — states a **norm with nothing behind it**. `~/CLAUDE.md` §Constitutional Constraints #1 says the executor *cannot* modify it; **nothing makes that true.** Constraint #4 (*honest degradation — the system must report its own limits*) is why this disclosure sits here rather than in a filed item only.
**Standing instruction, unchanged and now un-backed:** the executor **must not** write to `~/CLAUDE.md`, `~/REVIEWED.md`, or L2 constitutional documents. Those changes are `[ESCALATE]` unconditionally and are enacted **by the steward's hand**. A jurist sign-off does not authorize one; that specific offer was made and declined on 2026-08-06 (docketed on PENDING-89). Use the real-dotfiles-path route for `PENDING.md` and `REVIEWED.md` **only**.
---
## ⚠ Added 2026-09-14 — the refusal is narrower than stated, and over-applying this note has a measured cost
**FILE symlink ≠ DIRECTORY symlink.** The refusal above was established on `~/PENDING.md`, which is a
symlink *file*. `~/.claude/projects/-Users-davidglidden/memory/` is a symlink *directory*, and
writing **through** it succeeds — Edit wrote `MEMORY.md` by that path repeatedly on 2026-09-14. So
"Edit/Write refuse to write through a symlink" is true of the file case and **false as a general
claim**. Do not generalise it again.
⚠ **AND THE GENERALISATION HAS A PRICE, paid on 2026-09-14.** `MEMORY.md` was edited by its real
`~/dotfiles/claude/memory/` path on the strength of this note — which never licensed that, being
scoped to the two registers. Measured consequence: **Claude Code's own near-limit memory guard is
PATH-KEYED. 5/5 recorded warnings followed edits to the `~/.claude/projects/…/memory/` symlink path;
0/2 real-path edits warned at a LARGER file size.** Same `realpath`, same bytes. The guard also
stamps frontmatter `modified:` on that path only. Pre-registered and confirmed the same sitting.
⇒ **ALWAYS EDIT `MEMORY.md` BY THE `~/.claude/projects/-Users-davidglidden/memory/` PATH.** Editing
the real dotfiles path silences the only instrument that reports the index overflowing — and the
overflow itself is silent at load. *The note was right; the reader over-extended it. Recorded here
because the next reader will be tempted the same way.*