A checkable number stated from memory rather than counted. Corrected in the item and the ledger, and the correction is left visible in the item text — a governance record that quietly repairs its own numbers teaches the reader to trust numbers that were never checked. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WuMjg3ipEVa3n8CoSzoyvc
462 lines
46 KiB
Markdown
462 lines
46 KiB
Markdown
# PENDING.md — Authorization Boundary Log
|
||
|
||
**Protocol:** Claude Code appends here at every authorization boundary. David and Claude.app
|
||
review; decisions are recorded in `REVIEWED.md`. An item is **closed** when a matching
|
||
`REVIEWED-N` exists there, or when its own header says so.
|
||
**Scope:** all workstreams — L1/BMF, chamber-library, studium-engine, ARC, Be, governance.
|
||
**Item families:** `PENDING-<n>` (numeric, the main series) · `PENDING-S<n>` (skill/protocol
|
||
series) · `PENDING — <name>` and `COMPLETED — <name>` (early unnumbered items) ·
|
||
`SESSION-LOG-<n>`. An item is any `## ` header — a parser that assumes one family will miss
|
||
twenty items, as one did on 2026-07-28.
|
||
**Archive:** closed items live in `PENDING-archive.md`, original order and numbering preserved.
|
||
This file carries only what is still open. Numbering is continuous across both files: the next
|
||
item is one above the highest `## PENDING-<n>` in either — a stated number goes stale, a rule
|
||
does not.
|
||
|
||
---
|
||
|
||
<!-- Claude Code: append new PENDING items below this line. Do not edit existing entries. -->
|
||
|
||
## PENDING-4 — Bug D: Idle stall + batch embedding during replay
|
||
**Date:** 2026-03-22
|
||
**Tag:** [FIX] — reclassified from next-PR to this-PR by steward authorization
|
||
**Summary:** Idle state machine transitions during replay freeze async operations. Batch embedding and vector replay skip reduce Phase 1 from 83 hours to ~10 minutes.
|
||
**Files affected:** replay-coordinator.ts, bootstrap.ts, ollama-embeddings.ts, vector/index.ts, idle-state-machine.ts
|
||
**Status:** Implemented and verified.
|
||
|
||
## PENDING-5 — Recall query path returns 0 results
|
||
**Date:** 2026-03-22
|
||
**Tag:** [FIX]
|
||
**Summary:** After Phase 1 completes, recall() returns 0 results despite modules reporting ready and vector processing live events. Module dispatch timeouts in query-router. Write path works; read path has separate issue.
|
||
**Rationale:** This is the next critical blocker after Phase 1 completion. The query dispatch timeout (2000ms for background latency) may be too short, or facet_id filtering mismatches between observe and recall paths.
|
||
**Files affected:** `src/core/keystone/query-router.ts`, `src/core/keystone/query-types.ts`, possibly `src/modules/vector/queries.ts`
|
||
**Awaiting:** Investigation — likely needs Seb's input on the query dispatch architecture.
|
||
|
||
## PENDING-10 — Skip vector embedding during replay (architectural)
|
||
**Date:** 2026-03-22
|
||
**Tag:** [PROPOSAL]
|
||
**Summary:** Currently implemented as simple early return in handleEvent. For production: should be a formal replay contract where vector stores content metadata during replay without embedding, then a background re-embed pass populates the HNSW index. Paired with Bug D idle stall fix, this makes Phase 1 fast by design.
|
||
**Awaiting:** Steward + Seb architectural review.
|
||
|
||
## PENDING-11 — Approve I15 (ICP-9 Pilot Registry Entry: The Accusative Default)
|
||
**Date:** 2026-03-23
|
||
**Tag:** [PROPOSAL]
|
||
**Summary:** Approve I15 as the pilot registry entry, validating both the invariant (The Accusative Default) and the `l1_contamination_profile` schema field. Full entry drafted in `relational-gap-registry-amendment.md` §2 since 2026-03-09.
|
||
**Rationale:** I15 is architecturally upstream — it defines the system's default relational posture (answerable, not sovereign or neutral). It had the cleanest adversarial performance (promoted Tier 2 → Tier 1). The `l1_contamination_profile` field carries real content: monotonic pressure from accusative toward authoritative as memory deepens. Approving I15 unblocks: (1) I16 and I17 drafting (Cluster A), (2) schema validation through a real entry, (3) the `residual_risk` field decision (which can now be made based on evidence from the pilot rather than anticipation).
|
||
**Registry entry location:** `CapableMind-AI/docs/thinking/David/l2-constitution/amendments/relational-gap-registry-amendment.md` §2
|
||
**Jurist recommendation:** YES (from March 8 conversation). Required field for all non-contingent principles.
|
||
**Steward declaration:** Steward verbally approved 2026-03-23. Awaiting formal record in REVIEWED.md.
|
||
**Downstream unblocked:** I16 (Asymmetry Obligation), I17 (Precedence of Present Expression), Cluster B entries, `residual_risk` field decision.
|
||
**Files affected:** Registry (governance metadata, not code).
|
||
**Awaiting:** Steward entry in REVIEWED.md.
|
||
|
||
## PENDING-12 — Lodge Design Notes DN-GOV-01 through DN-GOV-04
|
||
**Date:** 2026-03-23
|
||
**Tag:** [HARDENING]
|
||
**Summary:** File four design notes from the Governance Velocity seed brief into `l2-constitution/`:
|
||
- **DN-GOV-01**: Constitutional Immunity Specification — governance amendment pace decoupled from capability pace. Candidate for new ICP.
|
||
- **DN-GOV-02**: Rate-of-Change as Governance Trigger — external acceleration triggers mandatory constitutional review (not amendment). Constitutional emergency clause analog.
|
||
- **DN-GOV-03**: Baseness Examination Elevation — promote motive examination from practice to formal obligation. System records attestation, not judgment. Requires steward declaration.
|
||
- **DN-GOV-04**: Pace Governor Artifact — structured weekly PENDING.md digest. Pure tooling.
|
||
**Rationale:** These emerged from the March 23 jurist conversation on recursive self-improvement and governance velocity. All four address gaps identified when stress-testing L2 governance against I.J. Good's acceleration scenario. Filing as DESIGN NOTE preserves them for cross-strand synthesis without premature constitutional commitment.
|
||
**Files created:** `DN-GOV-01-constitutional-immunity-specification.md`, `DN-GOV-02-rate-of-change-governance-trigger.md`, `DN-GOV-03-baseness-examination-elevation.md`, `DN-GOV-04-pace-governor-artifact.md`
|
||
**Steward authorization:** Steward authorized filing 2026-03-23. DN-GOV-03 (baseness elevation) requires separate steward declaration before advancing beyond DESIGN NOTE. DN-GOV-04 (pace governor) is tooling and can iterate without further authorization.
|
||
**Awaiting:** Steward entry in REVIEWED.md.
|
||
|
||
## PENDING — ICP-19 Remit Expansion (Observer Problem)
|
||
**Date opened:** 2026-04-07
|
||
**Action required:** Steward-reviewer conversation with the External Auditor before Observer Problem mechanisms advance to constitutional language.
|
||
**Blocking:** OP-03 (mechanism design phase)
|
||
**Notes:** Bring OP-02 findings in full. Specifically:
|
||
- Fault Line 5 (epistemic diversity question)
|
||
- Fault Line 3 (inquiry examining steward with steward's own tools)
|
||
- Fault Line 4 (CD-03 Gadamer risk)
|
||
- The incommensurability named in OP-CN-01
|
||
**Status:** PENDING — steward to initiate
|
||
|
||
## PENDING — Fault Line 1 Response
|
||
**Date opened:** 2026-04-07
|
||
**Action required:** Steward decision on whether to address PENDING/REVIEWED pipeline gap now or await the External Auditor's input first.
|
||
**Notes:** Jurist assessment: most actionable fault line; does not require external review before mechanism design begins. Steward judgment required.
|
||
**Status:** PENDING — awaiting steward decision
|
||
|
||
---
|
||
|
||
## PENDING — ICP-19 Remit Expansion
|
||
|
||
**Title:** ICP-19 External Review — Human-Side Governance Scope
|
||
**Date opened:** 2026-04-07
|
||
**Tag:** [ESCALATE]
|
||
**Status:** PENDING — requires direct steward-reviewer conversation
|
||
|
||
**Summary:** The Observer Problem inquiry opens human-side governance questions that the current ICP-19 reviewer remit does not cover. Before any mechanisms proposed through this inquiry advance to constitutional language, the human-side governance question should be explicitly added to the External Auditor's reviewer remit, or addressed by a successor reviewer.
|
||
|
||
**Prerequisite:** Direct conversation between steward and reviewer about their incommensurable foundational positions (see Context Note OP-CN-01 §The External Auditor's Comment). This conversation is load-bearing before remit expansion.
|
||
|
||
**Blocking:** Constitutional advancement of Observer Problem mechanisms. Not blocking OP-02 synthesis.
|
||
|
||
---
|
||
|
||
## PENDING — CD-03 Operative
|
||
|
||
**Title:** Constitutional Declaration CD-03 — The Observer Condition and the Limits of Constitutional Architecture
|
||
**Date authorized:** 2026-04-07
|
||
**Tag:** [CONSTITUTIONAL]
|
||
**Status:** OPERATIVE — immediate effect
|
||
|
||
**Summary:** CD-03 reorients the purpose of the architecture from infrastructure-toward-solution to infrastructure-toward-honest-inheritance. The architecture can support the conditions under which the sufficient condition (genuine observer calibration) becomes possible, but cannot produce the sufficient condition itself.
|
||
|
||
**Impact:** All subsequent work that proposes mechanisms must be assessed against CD-03 §IV.4: does this mechanism support the conditions, or does it claim to produce the sufficient condition? The latter is a constitutional failure mode.
|
||
|
||
**File:** `CapableMind-AI/docs/thinking/David/observer-problem/Constitutional Declaration — CD-03.md`
|
||
|
||
---
|
||
|
||
## PENDING-S2 — Hook-aware deposit detection in wake-up (awaiting Q1 hooks contract)
|
||
**Date:** 2026-05-18
|
||
**Tag:** [PROPOSAL]
|
||
**Phase 4 — awaits Jurist contract definition.**
|
||
|
||
**Summary:** Wake-up detects whether the previous session ended via wrap-up or via Stop hook alone. Surfaces a warning when hook-only: *"Previous session ended without wrap-up — pulling thread may be absent or incomplete."* Calibrates confidence accordingly.
|
||
|
||
**Rationale:** Audit A4 — the strongest single gap in the ligature. A hook-only deposit lacks pulling thread / literal question / pause statement, but currently looks identical to a wrap-up deposit from wake-up's perspective. Jurist (2026-05-18 shape-review): the hooks/skills contract is *doctrinal, not tooling*. It determines what the unborn session can trust about its inheritance.
|
||
|
||
**Files affected:** `~/.claude/skills/wake-up/SKILL.md` §2.b.1 + §3.
|
||
|
||
**Awaiting:** Jurist shape-review of contract language (candidate text in Jurist shape-review document: *"The authoritative deposit is a wrap-up deposit. A hook-only deposit is an emergency fallback, not a complete inheritance. Wake-up must detect which it received and calibrate accordingly."*). Then steward authorization.
|
||
|
||
---
|
||
|
||
## PENDING-S4 — Post-compression marker; cross-repo with mempalace (awaiting Q1)
|
||
**Date:** 2026-05-18
|
||
**Tag:** [PROPOSAL]
|
||
**Phase 4 — cross-repo coordination.**
|
||
|
||
**Summary:** PreCompact hook (`~/_Dev/mempalace/hooks/mempal_precompact_hook.sh`) writes a marker diary entry (topic: `session-compaction`) when it fires. Wake-up detects this marker; if present, warns that confidence claims in that session inherit a lossy view. Symmetria adds a post-compression contamination flag (paired with §3 application work in S6).
|
||
|
||
**Rationale:** Audit B4 + D4. The PreCompact event currently silent to all downstream consumers; this makes it observable.
|
||
|
||
**Files affected:** `~/.claude/skills/wake-up/SKILL.md`; `~/.claude/skills/symmetria/SKILL.md` §3; `~/_Dev/mempalace/hooks/mempal_precompact_hook.sh` (upstream PR or steward-coordinated change).
|
||
|
||
**Awaiting:** Jurist contract definition (Q1); steward authorization; mempalace upstream coordination.
|
||
|
||
---
|
||
|
||
## PENDING-S5 — Authoritative-diary marker; wrap-up ↔ Stop hook (awaiting Q1)
|
||
**Date:** 2026-05-18
|
||
**Tag:** [PROPOSAL]
|
||
**Phase 4 — cross-repo coordination.**
|
||
|
||
**Summary:** Wrap-up's diary write carries an explicit `authoritative: true` marker (or AAAK equivalent). Stop hook (`~/_Dev/mempalace/hooks/mempal_save_hook.sh`) checks for a recent authoritative entry and skips its block if present.
|
||
|
||
**Rationale:** Audit C3. Currently a wrap-up + subsequent hook fire may produce two diary entries from different AI states. The second one (post-wrap-up, depleted context) is silently mistaken for the canonical entry by future wake-ups.
|
||
|
||
**Files affected:** `~/.claude/skills/wrap-up/SKILL.md` §4.b; `~/_Dev/mempalace/hooks/mempal_save_hook.sh`.
|
||
|
||
**Awaiting:** Jurist contract definition (Q1); steward authorization; mempalace upstream coordination.
|
||
|
||
---
|
||
|
||
## PENDING-S6 — Symmetria §3 contamination flag applications of the Directive elaboration
|
||
**Date:** 2026-05-18
|
||
**Tag:** [HARDENING]
|
||
**Phase 3b — depends on S0 (now CLOSED).**
|
||
|
||
**Summary:** Extend `~/.claude/skills/symmetria/SKILL.md` §3 contamination flag list with applications of the now-constitutional time-the-task-requires principle, plus three other self-flags surfaced by the audit:
|
||
- **Lectio** (corpus reading): take the time the corpus asks for.
|
||
- **Diagnose-don't-fix** (debugging): trace the class of failure before patching the instance.
|
||
- **Dwell-on-composition** (writing): the recommendation gets the time it wants, not the time the executor wants the recommendation to take.
|
||
- **Alignment pulse returning `aligned` without naming a specific tension** — premature-closure (D1).
|
||
- **Search queries shaped by what the session wants to find** rather than what it needs to find (D5).
|
||
- **Post-compression confidence claims** — the working memory was trimmed; what's certain now may rest on what was lost (D4; pairs with S4).
|
||
|
||
**Rationale:** Audit D1/D4/D5 + the principle elevation. §3 currently flags external code and writing patterns; with the Directive elaboration in place, applications of it at the discipline level are coherent additions, not scope-creep.
|
||
|
||
**Files affected:** `~/.claude/skills/symmetria/SKILL.md` §3.
|
||
|
||
**Awaiting:** Steward authorization (S0 closure unblocks).
|
||
|
||
---
|
||
|
||
## PENDING-S7 — Symmetria `check` mode: add `suspend` outcome (awaiting Q5 + relates to Q4)
|
||
**Date:** 2026-05-18
|
||
**Tag:** [HARDENING]
|
||
**Phase 5.**
|
||
|
||
**Summary:** §6 `check` mode outcomes extend from `proceed / return-and-reframe / escalate` to `proceed / return-and-reframe / suspend / escalate`. `suspend` = hold for unhurried steward judgment without urgency.
|
||
|
||
**Rationale:** Audit D3 + Jurist confirmation. Today's audit was the missing-shape example: neither escalate (urgent) nor return-and-reframe (the audit is the right work) fit. With the Directive elaboration in place, `suspend` is the natural outcome — *the time the steward's judgment requires is task-time, not interruption-time.*
|
||
|
||
**Files affected:** `~/.claude/skills/symmetria/SKILL.md` §6 (check).
|
||
|
||
**Awaiting:** Steward authorization.
|
||
|
||
---
|
||
|
||
## PENDING-S9 — Wrap-up §8 output template enriched to match practice
|
||
**Date:** 2026-05-18
|
||
**Tag:** [HARDENING]
|
||
**Phase 5 — depends on Q2 + Q3 (Q3 confirmed by Jurist).**
|
||
|
||
**Summary:** §8 output template in wrap-up expanded to mirror the three-tense richness the steward already produces in session memory files: Past / Present / Future as named sections, with required fields under each. Subsumes S1 if implemented together; or S1 lands first as smaller increment and S9 follows as deeper revision.
|
||
|
||
**Rationale:** Audit C5 diagnostic — template under-specifies what good practice already does. With the Directive elaboration in place, an output template that drops the practice's load-bearing tenses under compression is itself an instance of the failure mode the principle catches.
|
||
|
||
**Files affected:** `~/.claude/skills/wrap-up/SKILL.md` §8.
|
||
|
||
**Awaiting:** Steward authorization. Optional relationship to S1: implement S1 first (minimal additive), then S9 as deeper revision; or fold S1 into S9 as single revision.
|
||
|
||
---
|
||
|
||
## PENDING-76 — Authorization class follows claim class (REMANDED; executor recommends withdrawal)
|
||
**Date:** 2026-07-27
|
||
**Tag:** [ESCALATE]
|
||
**Summary:** Proposed amending Constitutional Constraint #1 so a state claim verifiable by command becomes `[FIX]` while doctrine stays `[ESCALATE]`. **Jurist remanded; the required count returns 0; executor recommends withdrawal rather than re-posing.**
|
||
**Rationale:** `~/CLAUDE.md` carried 11 substrate-contradicted state claims for up to 4 months because detection and correction were priced identically — L113 requires drift to be *flagged*, L103/L253 make correcting it cost what amending doctrine costs. Package: `~/_Dev/CapableMind-AI/docs/thinking/David/governance-currency-JURIST-PACKAGE-2026-07-27.md`.
|
||
**RULED 2026-07-27 — NOT GRANTED AS DRAFTED, remanded with one required number.** The jurist ran the package's own Part IV.2 refinement (*the verifying command's output must be the evidence*) back across its Part II census — which the executor had not done — and found the evidence and the remedy do not meet. Required back: the count of currently-false lines cleanly `[FIX]`-eligible under IV.2. **Q2 RATIFIED and severed as a standing epistemic standard, effective immediately**, with one addition: *a negative command result requires a positive control* — an absence proves nothing until the instrument is shown capable of detecting presence. **Q3** answered *no* (8 mixed lines against 32 non-doctrine = 25% ambiguity at the margin; single-party classification unsafe at that rate). **Q4** wrong mechanism — prefer sunset to revocation, since revocation-on-misuse requires the misusing party to detect it. **Q5** the eval cannot bear a constitutional edit: 3 tasks contain no tail, so guardrail redundancy was never measurable; the 3× cost gap is robust, the redundancy finding is not.
|
||
**COUNT RETURNED 2026-07-27 — 0 of 11.** Per-line working in `claude-md-gate-return-2026-07-27.md`. Every false state claim is either steward-held (the 2 expired horizons) or welded to a directive (the 9 MemPalace claims, L148) — and *"where a line is both, it is doctrine"*, the package's own tiebreaker, escalates all of them. What remains `[FIX]`-eligible is 5 defects, **entirely structural, zero state**. The amendment is titled and argued around a category it would not free a single member of.
|
||
**Recommendation: WITHDRAW.** Do not re-pose. Two live successors, neither urgent: (a) the jurist's framing challenge — the MemPalace section and Active Projects horizons are *operational configuration filed in a constitutional instrument*, so the disease is a category error and the remedy is extraction, not amendment; (b) if freeing structural repair is wanted on its own, a clause a tenth this size (*repair that changes no semantic content is `[FIX]`*) achieves it with no burden inversion.
|
||
**Mitigation landed without authorization (detection ≠ correction):** `~/dotfiles/scripts/governance-drift-check.py`, wired into `/wake-up` §2.c. Reports the contradicted claims at every wake; corrects nothing. Staleness is now visible rather than misleading — Constitutional Constraint #4 applied to the governance document itself.
|
||
**Files affected:** none. Nothing modified.
|
||
**Awaiting:** Steward — withdraw, or re-pose against the extraction framing.
|
||
|
||
## PENDING-77 — CLAUDE.md structural repair (5 defects, no semantic change)
|
||
**Date:** 2026-07-27
|
||
**Tag:** [ESCALATE]
|
||
**Summary:** Five mechanical defects in `~/CLAUDE.md`, none altering meaning. Released by the jurist from the PENDING-76 remand — *"they do not need this ruling."*
|
||
**Rationale:** §Active Projects does not render as a table, and §Constitutional Constraints — the section governing what the executor may not do — is left nested beneath an unrelated empty stub.
|
||
**The five, in required order** (drift-check verified, `governance-drift-check.py`):
|
||
1. **EOF** — no terminal newline; `wc -l` reports 257 for a 258-line file. **Apply first** or every line reference below shifts by one.
|
||
2. **L241, L242** — stray leading whitespace on table rows.
|
||
3. **L243** — two rows fused on one line (`|| **Compass** |`); the Compass row does not render.
|
||
4. **L242–243** — mid-cell hard line break inside the L2 row.
|
||
5. **L248** — empty `### L1 Active Workstream (2026-04-19)` stub (with trailing whitespace) running directly into `## Constitutional Constraints`.
|
||
**Exact old/new text with line numbers:** `claude-md-proposals-2026-07-27.md` §PENDING-C through §PENDING-F.
|
||
**Scope boundary:** structural only. The expired horizons on L241–242 and the "Stewart" typo are **excluded** — the first is steward-held state, the second requires knowing an intended spelling that no command establishes.
|
||
**Verification:** re-run `governance-drift-check.py`; the five findings should disappear and the count drop from 9 to 4.
|
||
**Files affected:** `~/dotfiles/CLAUDE.md`.
|
||
**Awaiting:** Steward authorization.
|
||
|
||
## PENDING-78 — Claude.app personal preferences: three verified-false claims
|
||
**Date:** 2026-07-27
|
||
**Tag:** [ESCALATE] — steward-held document; the executor verifies, the steward edits.
|
||
**Summary:** The `.app` preferences carry the same drift class as `~/CLAUDE.md`, including one identical stale pointer. **Jurist: outside the amendment's reach entirely** — not `~/CLAUDE.md`, not governed by L253, so no outcome on PENDING-76 touches this.
|
||
**Verified false 2026-07-27:**
|
||
1. *"branch: `fix/replay-durability-contracts`"* — merged as `c9746ae`; `HEAD` is `main`. The identical stale pointer also heads this file (`PENDING.md` L3).
|
||
2. *"`COWORK.md`"* named as a governance document — no such file exists anywhere under `~`; the only `cowork*` hits are Claude Desktop application internals.
|
||
3. *"L2 constitutional governance is blocked pending L1 stability"* — L1 has 0 commits in 14 days. Blocked pending something dormant is not a governance state.
|
||
**Also observed, not proposed:** ARC described as *"near-operational"* (Stage G sealed; 152 commits/60d, understated); chamber-library and studium-engine absent (183 and 41 commits/60d).
|
||
**⚑ For the steward and jurist, not the executor:** The Chamber is named in the `.app` preferences and **absent from `~/CLAUDE.md`**. The jurist ruled this *"the most consequential single finding in the package"* and noted the executor had filed it as a footnote: *"The jurist knowing about work the executor is blind to is not a documentation defect. It is a governance model with two parties holding different maps."*
|
||
**Files affected:** Claude.app personal preferences (steward-held). Executor modifies nothing.
|
||
**Awaiting:** Steward edit; jurist review of the asymmetry.
|
||
|
||
## PENDING-79 — CLAUDE.md doctrine preservation: §MemPalace retargeted, two rules hoisted (extraction legs A + B)
|
||
**Date:** 2026-07-28
|
||
**Tag:** [ESCALATE] — edits doctrine in `~/CLAUDE.md` (Constitutional Constraint #1). Executor drafts; steward applies.
|
||
**Summary:** The "two deletions and a pointer" estimate was wrong. A weld test at bullet/row granularity found **11 of 15 editable units across §MemPalace and §Active Projects carry doctrine**, three with no standing carrier anywhere else — including L130, which yesterday's eval credited as one of three carriers of the false-premise guardrail. Deletion would excise live doctrine. Legs A and B preserve it; the deletions (leg C) become safe only afterwards.
|
||
|
||
**Rationale.** The remedy is right and the price was wrong, for a nameable reason: **both this proposal and the withdrawn PENDING-76 amendment priced a decomposition as a relocation.** If the correct partition is by cadence and the text is organized by topic, extraction is a rewrite, not a move. Steward decision 2026-07-28: **preserve the doctrine.**
|
||
|
||
**Weld census (verified against substrate, line granularity):**
|
||
- §MemPalace L115–132 — 8 units, **7 carry doctrine**; only the tool roster (L122) deletes clean.
|
||
- §Active Projects L237–248 — 7 units, **2 carry doctrine** (the read-local-CLAUDE.md rule L246; the Compass read-only constraint, riding inside a state row).
|
||
- No standing duplicate carrier exists for: L120 (`Wrong is worse than slow`), L130 (the conflict rule), L246. Other hits are session narratives recording the decision, not instructions. L246's only second carrier is Symmetria §3 — **invoked, not standing.**
|
||
|
||
### Leg A — replace §MemPalace with §Memory Discipline
|
||
|
||
Anchored edit (not line-numbered — anchors survive reordering). Replace from the heading `### MemPalace as Primary Memory` through the line ` Storage is not memory. Memory is storage exercised by protocol.` inclusive (currently L115–132, 18 lines) with:
|
||
|
||
```markdown
|
||
### Memory Discipline
|
||
|
||
Storage is not memory. Memory is storage exercised by protocol.
|
||
|
||
The durable substrate is the files layer: git-tracked Markdown and JSONL, entered through
|
||
`MEMORY.md` (loaded at wake), with `~/PENDING.md` and `~/REVIEWED.md` as the governance record.
|
||
Instruments for reaching it change; the obligations below do not — state the obligation first
|
||
and the instrument second, or the next retired tool takes a rule down with it.
|
||
|
||
- **Before claiming any fact** about people, projects, or past events that isn't in immediate
|
||
context: check first. Wrong is worse than slow.
|
||
- **"Let me check"** — when the answer matters and isn't immediate, say so and check. The
|
||
cheapness of checking is the point.
|
||
- **When facts change, supersede explicitly** — mark the superseded record as superseded and
|
||
write the new one. An unmarked correction leaves two live versions and no way to tell which is
|
||
current.
|
||
- **Save what's worth keeping** — the wrap protocol writes the session record; if something
|
||
load-bearing surfaces mid-session, write it then. Automation assumed to fire is not a record.
|
||
- **A conflict between two memory layers is a verification trigger, not a precedence call** —
|
||
neither layer wins automatically. Every layer is a point-in-time snapshot of something else;
|
||
continuous maintenance buys currency, not authority, and carries its own silent-drift classes.
|
||
On conflict: verify against the **primary substrate** — the code, the git history, the document
|
||
itself — before acting, then correct whichever layer was wrong. Treat every memory layer as
|
||
witness, not notary.
|
||
```
|
||
|
||
**What leg A preserves, unit by unit:** storage-is-not-memory (verbatim) · before-claiming + *Wrong is worse than slow* (verbatim) · *Let me check* (verbatim stance) · supersede-explicitly (generalized off `kg_invalidate`/`kg_add`, with the reason added) · save-what's-worth-keeping (fallback obligation kept; the false hook claim becomes the rule its own falsity earned) · the conflict rule incl. *witness, not notary* (generalized from MemPalace-vs-files to any two layers; the operative clause — verify against the primary substrate before acting — is unchanged).
|
||
|
||
**What leg A drops:** the tool roster (8 unresolvable tool names) and the hook mechanism claim (`Stop`/`PreCompact` unconfigured) — both verified false by `governance-drift-check.py`.
|
||
|
||
**Two changes that are not pure preservation — flagged, not smuggled:**
|
||
1. **Addition.** The lead-in's closing clause — *"state the obligation first and the instrument second, or the next retired tool takes a rule down with it"* — is new doctrine, not preserved doctrine. It is the rule whose absence produced this entire drift. **Strikeable without affecting anything else in leg A.**
|
||
2. **De-duplication.** The original states the storage/protocol maxim twice (lead-in and closing line). The draft states it once, as the opener.
|
||
|
||
### Leg B — hoist two rules out of §Active Projects
|
||
|
||
Append to `### Session Discipline` (after its last bullet, `If session state is growing large…`). Plain, unbolded, no terminal periods — matching that section's style, not §Context Rot Prevention's:
|
||
|
||
```markdown
|
||
- When entering a project directory, read its local `CLAUDE.md` first — current state, build sequences, terminology — before acting in the repo
|
||
- The Compass vault (`~/Library/Mobile Documents/iCloud~md~obsidian/Documents/David, root-and-branch/00. Compass`) is the steward's personal operating system: reference it, never write to it
|
||
```
|
||
|
||
Both paths verified to exist 2026-07-28 with positive controls. **Equal-force hoist:** the Compass constraint had the force of a table note and keeps it. It could instead be folded into Constitutional Constraint #3 (Territory respect) — that is a *strengthening*, not a preservation move, so it is offered as an option and not recommended here.
|
||
|
||
**Verification (checkable, both directions):** after A + B, `python3 ~/dotfiles/scripts/governance-drift-check.py` must report **exactly 7** — down from 9 — and must specifically no longer report L122 (tool names) or L126 (hooks). Any other count means the edit did not land as drafted. Predicted full sequence: A+B → 7 · terminal-newline fix → 6 · leg C → 0.
|
||
|
||
**Sequencing — one dependency dissolves.** PENDING-77's five structural defects: L241, L242, L243, L248 all sit **inside the region leg C deletes**; only L258 (missing terminal newline) survives it, and that one must precede any line-referenced patch regardless. **Recommend narrowing PENDING-77 to its single newline fix**; the other four dissolve rather than get solved.
|
||
|
||
**Options:**
|
||
- **(i) Apply A + B as drafted** — doctrine preserved, both false claims cleared, §Active Projects left as pure state ready for leg C.
|
||
- **(ii) Apply A + B with the addition struck** — pure preservation, no new doctrine.
|
||
- **(iii) Defer** — but note the file currently asserts eight tool names and two hooks that do not exist, which is Constitutional Constraint #4 (honest degradation) failing in the document that states it.
|
||
|
||
**Recommendation:** (i). The addition costs one clause and is the only thing in the change that prevents recurrence; the rest is faithful preservation. Each leg is complete in itself — if leg C never lands, A + B still leave the file honest.
|
||
|
||
**Files affected:** `~/dotfiles/CLAUDE.md` (steward applies). Executor modifies nothing under `~/CLAUDE.md`.
|
||
**What is NOT changed:** the §Active Projects table rows (leg C, separate item) · §Constitutional Constraints · `~/REVIEWED.md` · the L43–61 executor-agency block (separate, still resting on a partly withdrawn finding).
|
||
**Awaiting:** Steward authorization.
|
||
|
||
## PENDING-80 — Doctrine IDs: annotate the canonical, never extract it (pilot on §Memory Discipline)
|
||
**Date:** 2026-07-28
|
||
**Tag:** [ESCALATE] — edits `~/CLAUDE.md` (Constitutional Constraint #1). Executor drafts; steward applies.
|
||
**Summary:** Give each doctrine unit a stable machine-readable id in an HTML comment, inside the canonical. Pilot scope: the seven units of §Memory Discipline, which PENDING-79 leg A has just rewritten. No prose changes — ids only.
|
||
|
||
**Rationale — why annotation and not a machine-readable sidecar.** The chamber pairs a human-readable canonical with a `.meta.json` sidecar because a chamber canonical is a *fixed historical text we may not touch*; its machine layer has nowhere to live but outside it. `~/CLAUDE.md` is a *living document we author*, so that constraint does not apply and the sidecar pattern inverts: the machine layer belongs **inside**. This matters for three reasons:
|
||
1. **L110.** A derived governance file is a parallel version. An in-place annotation is not.
|
||
2. **Authority inversion.** If the executor consumed a derived layer while the steward authored the prose, what governs would be the extractor's output, not the steward's text — PENDING-78's "two parties holding different maps," made structural and permanent.
|
||
3. **Doctrine does not separate from state cleanly, and we have three demonstrations from one morning.** The PENDING-76 amendment mislocated the seam at the claim level; the executor's own section-level census mislocated it again; drafting then caught a third error (L126) an hour after it was published as fact. An automated extractor makes that error silently and every time.
|
||
|
||
**Convention:**
|
||
- Form `<!-- D:<section>.<slug> -->`, lowercase, hyphenated, one dot. Invisible in rendered prose.
|
||
- Placed at the end of the unit's final line. One id per editable unit (bullet, aphorism, or paragraph).
|
||
- An id names an **obligation**, never an instrument — so a retired tool costs a word, not an id.
|
||
- Renaming an id is a breaking change: any skill citing it must be updated in the same commit.
|
||
|
||
**Draft — the seven units as currently applied, ids appended, prose untouched:**
|
||
|
||
```markdown
|
||
Storage is not memory. Memory is storage exercised by protocol. <!-- D:memory.storage-is-not-memory -->
|
||
|
||
The durable substrate is the files layer: git-tracked Markdown and JSONL, entered through
|
||
`MEMORY.md` (loaded at wake), with `~/PENDING.md` and `~/REVIEWED.md` as the governance record.
|
||
Instruments for reaching it change; the obligations below do not — state the obligation first
|
||
and the instrument second, or the next retired tool takes a rule down with it. <!-- D:memory.obligation-before-instrument -->
|
||
|
||
- **Before claiming any fact** about people, projects, or past events that isn't in immediate
|
||
context: check first. Wrong is worse than slow. <!-- D:memory.check-before-claiming -->
|
||
- **"Let me check"** — when the answer matters and isn't immediate, say so and check. The
|
||
cheapness of checking is the point. <!-- D:memory.say-you-are-checking -->
|
||
- **When facts change, supersede explicitly** — mark the superseded record as superseded and
|
||
write the new one. An unmarked correction leaves two live versions and no way to tell which is
|
||
current. <!-- D:memory.supersede-explicitly -->
|
||
- **Save what's worth keeping** — the wrap protocol writes the session record; if something
|
||
load-bearing surfaces mid-session, write it then. Automation assumed to fire is not a record. <!-- D:memory.write-when-you-see-it -->
|
||
- **A conflict between two memory layers is a verification trigger, not a precedence call** —
|
||
neither layer wins automatically. Every layer is a point-in-time snapshot of something else;
|
||
continuous maintenance buys currency, not authority, and carries its own silent-drift classes.
|
||
On conflict: verify against the **primary substrate** — the code, the git history, the document
|
||
itself — before acting, then correct whichever layer was wrong. Treat every memory layer as
|
||
witness, not notary. <!-- D:memory.conflict-is-verification-trigger -->
|
||
```
|
||
|
||
**The enforcement is already built and dormant.** `governance-drift-check.py` gained a section 6 (2026-07-28) that parses ids from `~/CLAUDE.md`, scans `~/.claude/skills/**/*.md` for citations, and reports duplicate ids and citations to ids the canonical does not define. It deliberately does **not** scan `PENDING.md`, where drafts legitimately quote ids that do not exist yet. It is silent today because no ids exist, and it carries four same-run controls plus a synthetic proof (a fabricated duplicate and a fabricated dead citation were both detected) — so a future "nothing reported" means *checked and clean*, not *never looked*.
|
||
|
||
**What this does NOT do:** it does not extract, summarise, or duplicate any doctrine; it does not change a single word of prose; it does not touch any section other than §Memory Discipline; it creates no new file.
|
||
|
||
**Verification:** after applying, `governance-drift-check.py` must still report **7** — ids add no findings — and section 6 must move from dormant to active with **7 ids defined, 0 dead citations**.
|
||
|
||
**Follow-on, genuinely blocked (dependency named):** having skills cite `D:` ids instead of paraphrasing doctrine cannot start until the ids exist in the canonical, i.e. until this item is applied. `/wake-up`, `/wrap-up` and `/symmetria` each paraphrase rules that would become citations.
|
||
|
||
**Options:** (i) apply as drafted · (ii) apply with different id names · (iii) reject — in which case section 6 should be removed from the drift check rather than left as dead code.
|
||
**Recommendation:** (i).
|
||
**Files affected:** `~/dotfiles/CLAUDE.md` (steward applies). Already landed without authorization, being detection-only: `~/dotfiles/scripts/governance-drift-check.py` §6.
|
||
**Awaiting:** Steward authorization.
|
||
|
||
## PENDING-81 — Keeping CLAUDE.md and the Claude.app preferences fresh with respect to each other
|
||
**Date:** 2026-07-28
|
||
**Tag:** [ESCALATE] — steward-held document, and one finding touches the party structure itself.
|
||
**Summary:** The two governance documents cannot be kept in sync by the same mechanism, because their readers differ in one decisive way. Extends PENDING-78 with findings only possible now that the executor has seen the preferences' text.
|
||
|
||
**The structural fact that determines everything else.** `~/CLAUDE.md` is read by an executor **with** filesystem access, so its state can be *computed* — which is why `governance-drift-check.py` works and why leg C could replace §Active Projects with a pointer. The `.app` preferences are read by a jurist with **no** filesystem access. Their state therefore cannot be computed at read time; it can only be cached. **Confirmed by substrate:** the live preferences are not on disk in any readable form — the only hits are March-era snapshots under `~/Library/Application Support/Claude/local-agent-mode-sessions/`. No instrument here can ever check them.
|
||
So the goal is not "make them derived." It is: **keep the cache small, generate it, date it, and track its age.**
|
||
|
||
**Findings (new, from reading the preferences text):**
|
||
1. **⚑ The two documents disagree on the party structure.** `CLAUDE.md` L88–90 names three parties: David / Claude.app / Claude Code. §Your Role names **Cowork** as a fourth with its own governance document `COWORK.md`, while calling the model three-party. `COWORK.md` is real but orphaned — `# COWORK.md — Global Instructions`, dated Mar 22, inside an agent-mode session sandbox. This is doctrine welded to a retired instrument, the same shape as the MemPalace weld, but at the constitutional layer. **Needs a ruling, not a refresh: is Cowork still a party?**
|
||
2. **The jurist's map is inverted relative to the substrate.** §Standing Context names L1 as active development. Commits in the last 30 days: **chamber-library 165, studium-engine 25, CapableMind-AI 5, BetterMemories.io 0, ARC 0.** The two highest-activity workstreams appear nowhere; Be is absent entirely. The Chamber is named in §Who I Am as a thing the steward *designed*, giving no signal that it is the live work.
|
||
3. **ARC "near-operational"** understates it in a misleading direction — Stage G sealed 2026-06-10, and its 0 commits/30d mean *finished and quiet*, not *nearly ready*.
|
||
4. **"Divorce: Settled, awaiting signing March 30, 2026"** — that date is four months past. Steward-held and unverifiable from here; flagged only because "awaiting" a past date reads as current.
|
||
5. Confirmed from PENDING-78: the `fix/replay-durability-contracts` branch pointer (merged; HEAD is `main`) and "L2 blocked pending L1 stability" (L1 dormant 30 days).
|
||
|
||
**The good news: the document is already correctly tiered.** §Who I Am, §Your Role, §Intellectual Operating System, §How We Work Together and §Communication are doctrine and identity — they do not drift. **Every finding above except #1 sits in §Standing Context.** So the fix is small: one section gets a cadence.
|
||
|
||
**Proposed mechanism:**
|
||
- Split §Standing Context into **`### Standing Context — Projects`** (generated, dated, replaced wholesale) and **`### Standing Context — Personal`** (hand-held).
|
||
- Generate the first with `python3 ~/dotfiles/scripts/wake-digest.py --brief` (built 2026-07-28): tracker index, open authorization items, last rulings, 30-day commit counts per repo, drift count, and an explicit `generated <date>` header instructing the reader to treat it as unverified after ~30 days. ~1k tokens.
|
||
- **Never generated:** the orchestra conflict, fraternal practice, and family/legal entries. They are steward-held, unverifiable from any substrate, and the generator is scoped to exclude them by design, not by convention.
|
||
- The wake reports the brief's age when it exceeds 30 days, and says plainly that it tracks **generation, not pasting** — a lower bound on the jurist's staleness, never a guarantee of freshness. This is the honest limit of what can be instrumented across a boundary we cannot read.
|
||
|
||
**Why this beats the alternative.** A pointer ("see `~/CLAUDE.md`") is useless to a reader who cannot open files — which is precisely why the preferences accumulated duplicated state in the first place. The duplication is structurally required; only its staleness is optional.
|
||
|
||
**Files affected:** Claude.app personal preferences (steward edits). Already landed, detection/generation only: `~/dotfiles/scripts/wake-digest.py --brief`.
|
||
**Awaiting:** Steward decision on finding #1 (is Cowork a party?), and authorization for the §Standing Context split.
|
||
|
||
## PENDING-82 — Read-only MCP server: giving the jurist eyes on the substrate
|
||
**Date:** 2026-07-28
|
||
**Tag:** [PROPOSAL] — new interface between two governing parties. Built and self-tested; **not installed.** Installing it edits the steward's desktop-app config.
|
||
**Summary:** `~/dotfiles/scripts/governance-mcp.py` publishes the governance substrate to Claude.app's chat surface as five read-only tools, closing the gap PENDING-81 could only narrow. Supersedes PENDING-81's premise that a generated cache is the best available answer — for chat, it is no longer the only one.
|
||
|
||
**The gate PENDING-81 left open is answered, and my framing of it was backwards.** Steward-confirmed 2026-07-28: local MCP servers configured in `claude_desktop_config.json` are exposed to the **chat** surface, and have been since roughly a year before Cowork existed — never Cowork-gated. Cowork gets them *conditionally*: local sessions inherit them, remote sessions — now the default execution mode being rolled out — do not run local MCP at all. So the relationship is not "chat, not only Cowork" but **"chat, always; Cowork, only while it still runs locally."** The jurist chat sits on the stable side of that split, which makes this design *less* exposed to product drift than the Cowork-dependent one considered and rejected on 2026-07-28.
|
||
|
||
**Substrate check:** `claude_desktop_config.json` has **no `mcpServers` key** (top-level keys: `coworkUserFilesPath`, `preferences`). Its `preferences` block is app **UI state** — sidebar mode, pinned panes, Cowork toggles — *not* the jurist's Standing Context prose. Name collision only; PENDING-81's finding that the live preferences are nowhere on disk **stands unrevised.**
|
||
|
||
**What it exposes (five tools, all read-only):**
|
||
- `governance_state` — every open item with its `[TAG]`, recent rulings, drift count, per-repo status. Computed per call.
|
||
- `governance_item(id)` — the **verbatim** body of any item or ruling, across `PENDING.md`, `PENDING-archive.md`, `REVIEWED.md`. This is the capability a pasted cache can never have: the jurist can read the thing it is ruling on.
|
||
- `governance_read(file, offset, limit)` — verbatim paged read of one of six enumerated documents.
|
||
- `drift_report()` — full `governance-drift-check.py` output.
|
||
- `repo_activity(repo, count)` — branch, dirty count, recent commits.
|
||
|
||
**Four refusals designed in, each with a control that proves the refusal detectable:**
|
||
1. **Read-only.** No tool writes. Audited by AST, not by text search: 0 filesystem-mutating calls, git subcommands present = `{log, status}` only. A write path would collapse three parties into one.
|
||
2. **Not an agent.** Tools return data, verbatim where possible. The rejected alternative — a second Claude with filesystem access reporting back — yields *an agent's testimony about the substrate*, not the substrate.
|
||
3. **No second parser.** "An item" is defined once, in `wake-digest.py`'s `item_spans()`, imported here. A private second definition is how twenty items went missing on 2026-07-28.
|
||
4. **No path arguments.** Every tool takes a key from a fixed enum. There is no traversal to defend because no path is accepted; the reachable domain is enumerable rather than defined by the instrument.
|
||
|
||
**Verified:** 29 self-test controls pass, 0 fail (`governance-mcp.py --selftest`; counted from the run, not estimated — the first draft of this line said 27). Each absence is paired with a same-run positive control (Q2). `wake-digest.py --selftest` holds at 19. Plus a live stdio round-trip — `initialize` → `notifications/initialized` (correctly unanswered) → `tools/list` → two `tools/call` → malformed input survived as a `-32700` rather than a crash; stdout carried only JSON-RPC, stderr empty.
|
||
|
||
**[FIX] applied to the shared definition while here.** `item_spans()` is now **fence-aware**: a `## ` header inside a fenced code block is neither an item nor an item boundary. Zero such headers exist in the substrate today, so behaviour is unchanged (17 open items before and after) — but governance drafts are written as fenced markdown carrying `## REVIEWED-N` headers, per the steward's own copy-paste-clean practice, so the next such draft would have created a phantom item *and* truncated the real item containing it. Latent defect with a live trigger, not a hypothetical.
|
||
|
||
**⚑ A false pointer in yesterday's own resumption point.** It stated the two §Your Role edits were "drafted verbatim in the transcript **and in PENDING-81**." They are not in PENDING-81; they existed only in a transcript discarded at the restart. Same wrap that mis-stated the archive. The lesson is the one already in doctrine: *a draft that lives in a transcript is not a record.* Re-drafted below, in the file this time.
|
||
|
||
**Installation (steward's hand — it edits the app's config, and the app must restart):**
|
||
```json
|
||
{
|
||
"mcpServers": {
|
||
"governance": {
|
||
"command": "python3",
|
||
"args": ["/Users/davidglidden/dotfiles/scripts/governance-mcp.py"]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
Merge that `mcpServers` key into `~/Library/Application Support/Claude/claude_desktop_config.json` alongside the existing `coworkUserFilesPath` and `preferences` keys, then restart Claude.app. Reversal is deleting the key.
|
||
|
||
**Cowork retirement — §Your Role replacement text (re-drafted; the steward places it, since the surrounding prose is not readable from here):**
|
||
> Three parties hold distinct roles: **steward** (David) authorizes; **jurist** (Claude.app) proposes and governs; **executor** (Claude Code) implements within authorization.
|
||
|
||
Delete the Cowork party entry and every reference to `COWORK.md`. Grounds, now two: a third executor costs a third doctrine copy of a document that is `CLAUDE.md` with the nouns changed; and Cowork could not have served as the jurist's filesystem eyes even in principle, since `coworkUserFilesPath` points at `~/Claude`, which does not exist, and remote Cowork — the incoming default — runs no local MCP at all.
|
||
|
||
**Files affected:** new `~/dotfiles/scripts/governance-mcp.py`; `~/dotfiles/scripts/wake-digest.py` (`item_spans()` fence-awareness + 3 controls). Awaiting steward hand: `claude_desktop_config.json`, Claude.app §Your Role and §Standing Context.
|
||
**Awaiting:** Steward authorization to install the `mcpServers` key. The server itself is inert until then — nothing loads it.
|