Harrison re-gate pilot broke the mechanism before converting a byte, and the break was constitutional: tier_of() faithfully implements the ratified evidence-tier table, which enumerates tiers by FORMAT, so 16 born-digital-PDF canonicals with real ground truth receive a false ABSTAIN. Jurist design-gate PASSED with two corrections (independence into the constitutional text, NOT by analogy with V-TEXT which ruled the other way; the demonstration is of two instruments and the second has no control). REVIEWED-83 placed by the steward. Also: steward-facing maps given a durable home after one was lost and four more found unbacked; memory pointers made home-anchored and self-diagnosing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WuMjg3ipEVa3n8CoSzoyvc
70 KiB
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.
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.mdSteward 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
alignedwithout 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):
- EOF — no terminal newline;
wc -lreports 257 for a 258-line file. Apply first or every line reference below shifts by one. - L241, L242 — stray leading whitespace on table rows.
- L243 — two rows fused on one line (
|| **Compass** |); the Compass row does not render. - L242–243 — mid-cell hard line break inside the L2 row.
- 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-rungovernance-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:
- "branch:
fix/replay-durability-contracts" — merged asc9746ae;HEADismain. The identical stale pointer also heads this file (PENDING.mdL3). - "
COWORK.md" named as a governance document — no such file exists anywhere under~; the onlycowork*hits are Claude Desktop application internals. - "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
.apppreferences 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:
### 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:
- 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.
- 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:
- 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:
- L110. A derived governance file is a parallel version. An in-place annotation is not.
- 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.
- 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:
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):
- ⚑ The two documents disagree on the party structure.
CLAUDE.mdL88–90 names three parties: David / Claude.app / Claude Code. §Your Role names Cowork as a fourth with its own governance documentCOWORK.md, while calling the model three-party.COWORK.mdis 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? - 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.
- 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.
- "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.
- Confirmed from PENDING-78: the
fix/replay-durability-contractsbranch pointer (merged; HEAD ismain) 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 explicitgenerated <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, acrossPENDING.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()— fullgovernance-drift-check.pyoutput.repo_activity(repo, count)— branch, dirty count, recent commits.
Four refusals designed in, each with a control that proves the refusal detectable:
- 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. - 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.
- No second parser. "An item" is defined once, in
wake-digest.py'sitem_spans(), imported here. A private second definition is how twenty items went missing on 2026-07-28. - 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):
{
"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.
PENDING-83 — The evidence tier is decided by file extension, so a born-digital PDF gets a false ABSTAIN
Date: 2026-07-28
Tag: [PROPOSAL]
Summary: verify_body_conservation.tier_of() classifies by suffix — .pdf → V-SCAN → the body-conservation gate ABSTAINS and the candidate proceeds unverified — but every PDF-sourced canonical tested has a real text layer, so ground truth exists and the strongest available check is being skipped on the grounds that it is impossible.
Rationale. Surfaced by the Harrison re-gate pilot, at its first gate question, before any conversion ran. tier_of() (scripts/verify_body_conservation.py:457-467) reads the source's extension only: .epub/.azw3/.mobi → V-TEXT, .pdf → V-SCAN, else V-UNKNOWN. V-SCAN abstains by design, and the spec is explicit that this abstention is the permanent, tier-level kind — "this tier has NO ground truth" — which proceeds, unlike the contingent run-level UNVERIFIED, which holds.
The premise is false for this source and, on the evidence, for the class. the-dominion-of-the-dead-harrison.pdf (banked, sha 06f0158a…, match_cov 1.0) carries four embedded Type-1C subset fonts and yields 1,549 words from pages 1-12 via pdftotext. It is a typeset born-digital PDF, not a scan. The landed canonical was itself produced by pdftotext + python, and the 2026-07-28 Docling trial measured 90,155 words against a 90,955-word source extraction — 99.1%. Ground truth not only exists, it has already been used to measure this exact file twice.
Consequence for the pilot: Harrison — chosen because it is the known-worst apparatus case, to exercise the mechanism where it is most likely to break — would graduate with no verbatim verification performed, and the gate would report an honest-looking abstention while doing so. Per the jurist's 2026-07-14 ruling (PENDING-55 res.a): "A false ABSTAIN is as much a lie as a false PASS." This is also the fifth-instance shape v2.7.0 named — a reported non-failure where no verification occurred.
Grounding — this is arguably a conformance gap against already-ratified text, not a new direction. Spec v2.7.0 (§Tiering & Fence evidence-tiers preamble, REVIEWED-75) ratified that verification method is declared for the work's kind, with an anti-bypass guard bound to the property, not enrollment — no work may weaken its applicable method by re-labelling. tier_of() binds the method to a label (the filename suffix), which is precisely the coupling that clause forbids. A born-digital PDF is not a different kind from a born-digital EPUB with respect to the property that matters — extractable ground-truth text — and the extension is doing the re-labelling automatically.
Exposure — bounded measurement, stated as such. 6 canonicals declare source_format: pdf; 5 fell within the read-slice I sampled and all 5 resolve to banked PDFs with a text layer (born-digital 5 · scan-like 0). One file is unaccounted for by my slice. This is a sample, not a census — a full census over the corpus is a separate measurement and is not claimed here. On the sample, the V-SCAN tier presently contains no scans at all.
Options.
- (a) Probe the property, not the extension.
tier_ofgains a decidable text-layer probe for.pdf: extractable text above a declared threshold → V-TEXT; below → V-SCAN. Threshold and probe live ingraduation-spec.yamlas declared data (the house requirement/mechanism split). Mechanically decidable, carries its own positive and negative control, and applies the v2.7.0 property-not-label guard to the one place it was not applied. - (b) Per-file declared tier. An attested
evidence_tier:in frontmatter or the sidecar, attest-never-default. Honest, but pushes judgment onto a curator for something a probe can decide, and adds an attestation surface to every PDF. - (c) Narrow the change to the pilot. Re-tier Harrison alone by hand and leave the classifier. Rejected on its face: it fixes the instance and leaves the class, which the executor directives forbid.
Recommendation: (a). It is the only option that binds the method to the property the spec already says it must bind to; it is mechanically decidable rather than curator-judged; and its discriminator is already demonstrated on real material (the pdffonts + pdftotext probe run above, which correctly separates a typeset PDF from a scan and would return the opposite verdict on a scan). Per v2.7.0's extension path, a method must be demonstrated on real material before ratification — that demonstration is the natural first deliverable if authorized, and it should include a true scan as the negative control, which the corpus does not presently appear to contain and may need to be supplied.
Change class. PROPOSAL, not FIX: it changes what the gate accepts (a class of candidates moves from abstain-and-proceed to verified-or-held). The amendment discipline is explicit that this crossing is what makes a change PROPOSAL-class, even where the change restores conformance with ratified text.
What this does NOT block. Harrison's reconversion, cleaning, strip_cruft/verify_conversion, the running-head handling, the boundary-drop attestation, and the voice-purity reading pass are all unaffected and proceed. What is blocked is the final graduation stamp, which would otherwise land on an unverified file.
Files affected: scripts/verify_body_conservation.py (tier_of, + controls in test_tools.py); _curation/graduation-spec.yaml (body_conservation: — probe + threshold as declared data). No canonical, no hash, no binding touched by this item.
Awaiting: Steward authorization. Harrison holds at the graduation stamp until ruled; every prior step proceeds.
PENDING-83 — ADDENDUM 1 (2026-07-28, same session, before any ruling): the recommendation is corrected to a distinct V-DPDF tier
Superseding my own Recommendation (a) above, on the steward's correction. The original item proposed probing the property and re-tiering born-digital PDFs — with V-TEXT as the implied destination. That destination is wrong, and the item should not be ruled on as written.
Why V-TEXT cannot receive them. The V-TEXT criterion is not merely a policy that could be pointed at a new format; its ratified reference conversion is pandoc -f epub -t markdown-smart — source-anchored AND writer-matched (REVIEWED-72, graduation-spec.yaml body_conservation.reference_writer). There is no -f epub for a PDF. Routing PDFs into V-TEXT would inherit a criterion whose reference cannot be produced for the substrate, which is precisely the failure this repo already has a named lesson for: "a check proven for one tier is NOT proven for another (V-DSL ≠ V-TEXT — the k-gram check false-flagged the DSL's reflow) — demonstrate per case, don't reuse-and-assume." I reached for the nearest existing tier without asking whether its method transfers. It does not.
Why a distinct tier is the right shape, on the ratified test. v2.7.0 holds that verification method is declared for the work's kind. A born-digital PDF differs from a born-digital EPUB in the property that decides the method: an EPUB carries an explicit reading order and reflowable structure, while a PDF's reading order is inferred from page layout. That is not a smaller version of the same problem — it is the layer-2 PASS-BUT-FALSELY case §VII already names (column reassembly across a gutter: same words, wrong order, invisible to any word-guard). It also brings hyphenation at line breaks and running heads interleaved into the text stream — the running-head defect already blocking this very pilot. Same property (ground truth exists), different kind (how ground truth is recovered, and what can go wrong recovering it). Two tiers, two declared methods.
Revised recommendation: add V-DPDF as a declared kind with its own method, entering by v2.7.0's extension path (new kind by PROPOSAL, method demonstrated on real material before ratification). tier_of() stops deciding by suffix and dispatches on a structural probe: .pdf → V-DPDF if born-digital, V-SCAN if scanned. The deterministic/scan split v2.7.0 preserved is thereby preserved and extended, not flattened.
On self-declaration — the steward's question, answered plainly: a PDF cannot reliably declare its own origin. There is no standard "I am a scan" flag. /Producer and /Creator are self-report — frequently absent, frequently wrong (a scan re-saved through Acrobat reports Acrobat), and overwritten by any post-processing. PDF/A conformance declares archival intent, not origin. Metadata is testimony; structure is evidence — the same distinction this corpus already applies to every other attestation. But the structure IS decidable, on a triad: extractable text density on interior pages · embedded text fonts · page-sized image coverage per page. Born-digital = text drawn, fonts embedded, no page-sized image. Scanned-with-OCR = text over one page-sized image per page. Bare scan = no usable text.
Demonstration status. A read-only classifier implementing that triad is built and self-tested in scratchpad (classify_pdf_origin.py, 8 controls incl. a live end-to-end); it is deliberately NOT a fleet tool and NOT wired to any gate — it exists to produce the evidence v2.7.0 requires before ratification. Its own first version failed its live control, classifying a 68-font typeset Harrison as inconclusive at 42.7 words/page: it sampled pages 1-8, which are half-title, title, copyright and contents. Corrected to sample the interior, the same file reads 397.6 words/page — a 9x error caused purely by the measurement window, and caught only because the control ran against a known answer. That failure is itself an argument for this item: an instrument that samples the wrong region reports a confident wrong verdict, exactly as tier_of() does.
Still owed before ratification: a true scan as the negative control. A classifier that has only ever returned born-digital has not been shown capable of returning scanned. A corpus-wide census over the master library (385 PDFs) is running to find one; if the corpus contains no genuine scan, that is itself a finding — and the control must then be supplied deliberately rather than assumed.
Awaiting: Steward authorization, on the revised V-DPDF shape rather than the original recommendation (a).
PENDING-83 — ADDENDUM 2 (2026-07-28, same session, before any ruling): the exposure figure in the original item is WRONG and is retracted
Retracting my own measurement. The original item reported: "6 canonicals declare source_format: pdf; 5 fell within the read-slice and all 5 resolve to banked PDFs with a text layer (born-digital 5 · scan-like 0) … On the sample, the V-SCAN tier presently contains no scans at all." That is false. Do not rule on it.
How it was wrong, twice over. (1) The probe sampled pages 1-10 and thresholded on raw word count — pages 1-10 of a typeset book are front matter, so it measured half-title and contents pages and generalised to the book. The same defect later made the corrected classifier's first version call a 68-font Harrison inconclusive at 42.7 words/page against its true interior 397.6. (2) It enumerated candidates by grepping source_format: pdf in frontmatter, which is a declaration, not the resolved source. juvenescence-harrison declares nothing useful here: its banked source is an .epub, and the PDF I found bearing that title was a master-library copy, not the canonical source. The standing invariant already says this — a canonical's source is whatever resolve_archived_source returns, never a path in frontmatter, never the master library — and I violated it while writing an item about verification.
The corrected census, by mechanism (resolve every canonical's source, then classify the ones that are PDFs):
| resolved-PDF canonicals | count |
|---|---|
| scanned-with-OCR | 35 |
| bare-scan | 9 |
| born-digital | 16 |
| total | 60 |
44 of 60 (73%) are genuine scans. The steward stated this from direct knowledge of the library before the measurement returned; the measurement agrees with him.
This strengthens the proposal rather than weakening it, and changes its shape. V-SCAN is not a vestigial or empty tier to be corrected away — it is correct for 44 canonicals and must keep its abstention, exactly as v2.7.0's preserved deterministic/scan split requires. The defect is narrower and sharper than I first stated: 16 canonicals whose sources carry real ground truth are being abstained on as though they carried none. That is the false-ABSTAIN population, and it includes the pilot's own book. Same author, same subtradition folder, opposite tiers: the-dominion-of-the-dead-harrison is born-digital (68 fonts, no page image) while forests-shadow-of-civilization-harrison is scanned-with-OCR (805 fonts, one page-sized image per page). Neither the author, the collection, nor the folder can decide the tier — only the file's own structure can, which is the argument for a structural probe stated as a demonstrated fact rather than a prediction.
Two further findings, surfaced not resolved.
- 9 bare-scans (e.g.
mal-darchive,on-textual-understanding-szondi) have zero extractable text — 0 fonts, 0 words per page. Their canonicals exist, so text was obtained somehow; from the banked source it cannot have been. Whatever produced those canonicals is unverifiable against the archived source by any mechanical means. Not part of this item; named because it was found and would otherwise be lost. - Boundary cases needing eyeball before any of them gate a graduation:
function-of-dynamics-haydn-mozart-beethovenreads 4,537 words/page on 1 font — implausible for a book page and probably an extraction artefact;the-arcades-project-walter-benjamin-pdfreads born-digital on 1,664 fonts, a font count far more characteristic of OCR, and may be a scan whose images fall under the classifier's page-image threshold. The classifier is sound enough to establish that the tier split is needed; it is NOT yet sound enough for its per-file verdicts to gate anything. Per §VII, eyeball-after-gate is discipline where no stronger mechanical check exists — these are exactly that case.
Negative control: satisfied, abundantly. The earlier concern that a classifier which has only ever returned born-digital has not been shown able to return scanned is discharged: across 385 library PDFs it returns 164 bare-scan · 59 scanned-with-OCR · 62 born-digital, and within the canon 44 scans against 16 born-digital. The instrument demonstrably detects both presence and absence.
Unchanged: the V-DPDF recommendation of Addendum 1, and the hold on Harrison's graduation stamp. Awaiting: Steward authorization on the V-DPDF shape, reading the exposure figures from THIS addendum and not from the original item.
PENDING-83 — ADDENDUM 3 (2026-07-28): routed to the jurist; the framing is corrected a third time
Jurist package filed: ~/_Dev/chamber-library/docs/vdpdf-tier-JURIST-PACKAGE-2026-07-28.md (self-contained; 45 quoted clauses verified verbatim against the ratified spec with a positive control; five gate questions with executor leans).
Third correction, and it inverts the item's premise. The original item and both prior addenda argued that tier_of() was wrong — that the code decided the tier by file extension where the constitution intended otherwise. Reading §Tiering & Fence from the substrate (rather than from the repo CLAUDE.md summary I had been quoting) shows the opposite: the ratified evidence-tier table itself enumerates the tiers by format — "V-TEXT (born-digital: epub/azw3/mobi)" and "V-SCAN (scanned pdf)". The suffix map in the code reproduces those parentheticals exactly. The code is faithful; the constitution is what conflates the container with the origin. A reviewer comparing code against spec would find agreement, which is why the defect survived — and it is why this is a constitutional supersession rather than a code fix.
The argument is also stronger than filed. The same ratified subsection carries the anti-bypass clause: "a text-bearing work is verified by the method declared for text-bearing kinds, and no work may weaken its applicable method by declaring itself a new kind." A born-digital PDF is text-bearing, and §V confirms "Tier 3 governs every canonical whose content is words." The weakening that clause forbids is therefore already occurring — not because any work declared anything, but because the table's format enumeration performs the re-labelling automatically by reading a file extension. Whether that reading extends the clause past its ratified reach is put to the jurist as Q4 rather than assumed.
A fabricated quote was caught in the package's own Grounding section before filing. The draft rendered a promotion-criterion clause as "the §V prose-word guard we already have." The spec says "the §V prose-word guard we already run is the promotion test. The bar for 93% (1,191/1,284) of the corpus." — invented ending, in the one section whose entire purpose is that the jurist can trust the wording without repository access, in a package about verification. Caught by a mechanical containment check over every quoted line, run with a positive control; the true text is materially stronger for the argument than the invention. Recorded rather than quietly repaired: it is the fourth instance today of a claim composed from a summary of a document rather than the document.
Awaiting: jurist design-gate ruling (steward-relayed), then steward authorization. Harrison holds at the graduation stamp; its prior steps are unblocked and unaffected.
PENDING-83 — ADDENDUM 4 (2026-07-28): design gate PASSED with two required corrections
Ruling filed verbatim: ~/_Dev/chamber-library/docs/vdpdf-tier-JURIST-RULING-2026-07-28.md. Executor disposition: the Addendum appended to docs/vdpdf-tier-JURIST-PACKAGE-2026-07-28.md (Parts I–VIII preserved unrewritten as the text ruled on). REVIEWED-83 drafted for steward placement — in the ruling and the package Addendum, plain-fenced.
Q1, Q4, Q5 affirmed as filed; Q4 on stronger grounds than argued (REVIEWED-75's drafting note states the anti-bypass guard was rebound "to the property, not enrollment" because the declaration-only reading "would open the moment the door is first used" — the extension is inside the clause's ratified reach). Two corrections supersede the drafted design: (1) independence of the reference conversion from the ground-truth extraction is a constitutional requirement, not declared data — and REVIEWED-72's V-TEXT precedent must not be carried across, because it ruled the other way (a shared pandoc reader was accepted there since reader-loss cancels a priori over unambiguous markup; PDF recovery is inference over page geometry, so nothing cancels). (2) the demonstration is of two instruments, and the executor conflated them: the classifier's controls are complete, but the verification method has no control at all, and requires a deliberately constructed column-order corruption case run through a genuinely independent extractor pair. Harrison's graduation stamp holds until that passes; its earlier steps proceed. Awaiting: steward placement of REVIEWED-83, then the Q3 demonstration.
PENDING-84 — Nine canonicals whose banked sources carry no extractable text at all
Date: 2026-07-28
Tag: [HARDENING]
Summary: Nine canonicals resolve to archived sources with zero embedded fonts and zero extractable words (bare scans), yet their canonical texts exist — so the text came from somewhere that is not mechanically recoverable from the source of record.
Rationale: Surfaced by the PENDING-83 census and docketed separately on the jurist's process note (PENDING-55 residual-item precedent: findings named-not-lost still have to be findable). Whatever produced these canonicals cannot be re-derived from the banked source by any extraction, which means they are unverifiable against their own provenance by any tier's method — not V-SCAN's, not a future V-DPDF's. This is a distinct condition from "hard to verify": it is "no mechanical path from the source of record to the canonical exists." Instances observed 2026-07-28 include mal-darchive and on-textual-understanding-szondi; the full set of 9 is in the census.
Recommendation: Read one end-to-end first — establish what actually produced the text (a prior OCR run whose output was not banked? a different edition?) before proposing a class remedy. Diagnose the class, but from one real instance rather than from the count.
Files affected: none yet — diagnosis precedes any change.
Awaiting: Steward triage of priority. Not urgent; not to be lost.
PENDING-85 — Two PDF-origin classifier verdicts require human eyeball before any per-file use
Date: 2026-07-28
Tag: [FIX]
Summary: Two of the 60 classified canonical PDF sources carry verdicts the classifier's own numbers make doubtful, and they must be eyeballed before any per-file verdict is relied on.
Rationale: the-arcades-project-walter-benjamin-pdf classifies born-digital on 1,664 embedded fonts — a count far more characteristic of OCR output than of typesetting, suggesting a scan whose page images fall below the classifier's page-image threshold. function-of-dynamics-haydn-mozart-beethoven reads 4,537 words/page on 1 font, implausible for a book page and probably an extraction artefact. Both were stated as caveats on the instrument's own output (§VII: a measurement carrying a known reliability caveat states it in the same breath as its count) and the jurist affirmed they were correctly held out of the PENDING-83 population claim. The population claim (16/44) does not depend on either.
Recommendation: Open both PDFs and look. This is §VII's eyeball-after-gate, which the spec names as the genuine ceiling where no stronger mechanical check exists — not a deferral.
Files affected: none — a reading task; may yield a threshold correction to the scratchpad classifier.
Awaiting: Nothing blocking; do before the classifier's per-file verdicts gate anything.
PENDING-86 — The jurist cannot read the constitution it design-gates
Date: 2026-07-28
Tag: [HARDENING]
Summary: governance_read exposes claude-md, pending, pending-archive, reviewed, app-brief and memory-index — but not chamber-library-specification.md, so a constitutional supersession of §Tiering & Fence was ruled on by a party who could not read §Tiering & Fence.
Rationale: Disclosed by the jurist unprompted at the head of the PENDING-83 ruling, which is the mechanism working: it corroborated the package's load-bearing quotes against REVIEWED-75/-72/-67 and PENDING-55 — genuinely independent of the package, but one layer short of the primary substrate, and said so rather than letting the ruling imply a check it had not made. The ruling's substance is unaffected; the standing arrangement is the problem. This is the same shape as the defect PENDING-83 repairs, one level up: an instrument reporting on a domain it does not reach. At present the only instrument reading the primary substrate for this class of package is the executor's own verbatim self-check — which is exactly what should not be sole, since that self-check caught a fabricated quote the executor had itself introduced into the Grounding section of a package about verification.
Options: (a) add the chamber constitution (and graduation-spec.yaml) to governance_read's document keys, read-only, alongside the existing six; (b) keep the jurist repo-blind by design and require every package to carry a mechanical verbatim-containment proof over its quoted clauses, reported in the package; (c) both.
Recommendation: (c). (a) removes the gap for the documents the loop actually rules on and costs two keys on an already-built read-only server; (b) is worth keeping regardless, because self-containment is what makes a package rulable at all and the containment check has already proven it catches executor fabrication. They are complements, not alternatives.
Files affected: ~/dotfiles/scripts/governance-mcp.py (document keys). Extends PENDING-82.
Awaiting: Steward authorization — it widens what the jurist can read, which is the steward's call, not the executor's.