Files
dotfiles/claude/memory/reference-governance-files-are-dotfiles-symlinks.md
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

4.5 KiB

name, description, metadata
name description metadata
governance-files-are-dotfiles-symlinks ~/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.
node_type type originSessionId modified
memory reference 231bdbb9-ae7f-4be8-946d-2ddf952fb7a5 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.