Commit Graph
43 Commits
Author SHA1 Message Date
David F GliddenandClaude Opus 5 6f0ccde4c6 [FIX] Tarbuckle's body: the status line wired, and refreshInterval's real semantics
Tier 1 of §8's three. The body renders the name and one mark, every turn.

Verified against the substrate rather than assumed, because §13.2 gates §8 on it:
the statusLine schema is {type, command, padding?, refreshInterval?}, seconds, min 1.
The first name-match found was refreshIntervalMs, which belongs to the certificate
watcher — reading the context rather than trusting the match is what separated them.

⚠ One clause of PENDING-152 does not survive that read. It says the 20-minute tick is
"a counter over refreshes rather than over events" and that "no event-gating remains
within a session". refreshInterval re-runs the command every N seconds IN ADDITION TO
event-driven updates, so invocations burst with activity and a per-invocation counter
would be event-keyed — the v1 defect §8 exists to remove. The conclusion survives; the
mechanism named does not. The tick therefore consults the CLOCK, and the reasoning is
written into the script rather than left in this message.

The binding constraint — the variation must not correlate with anything — is carried by
render()'s signature: it takes the minute and nothing else, so a function that cannot
see the session cannot leak it. C3 asserts that structurally (argcount, co_names) and
C3n proves the assertion can fail by feeding it a deliberately leaky fixture. C4 asserts
len(MARKS) is coprime with the mumble interval, so the mark visible when a mumble lands
walks the whole cycle instead of announcing it; C4n catches a commensurate cycle.
16/16 controls, positive and negative, written before first execution.

Also placed: a STATE-CLAIM marker on the false "STEWARD OWES: place REVIEWED-127" line.
Steward-directed to defer the correction itself to the next session; this makes the
deferral machine-checked rather than remembered. It could NOT be placed beside the claim
— governance-drift-check.py scans */docs/**, claude/governance/**, PENDING.md and the
archive, and claude/memory/MEMORY.md matches none of them. The file read at the start of
every session is the one governance surface the checker cannot see.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J6hZXNYSxEfZseBGTni4sf
2026-08-25 16:15:55 +02:00
David F GliddenandClaude Opus 5 063eccfd80 [HARDENING] STATE-CLAIM + the resolution state, built together (REVIEWED-127)
Both halves of the schema, shipped in one change because the ruling said half a schema
invites a third patch and a third patch is how a vocabulary accretes instead of being
designed.

157 — resolution state. `resolved:` on any block; a resolved block is no longer due but
is NOT dropped: it prints as a closed ledger, because a discharge that vanishes from the
report is its own decay. The pointer must RESOLVE — a real path or a real git object —
so an undocumented discharge is impossible to express rather than merely discouraged. A
dangling pointer reports in the register-integrity lane, the same lane as an amendment
that replaced the record it amends; both are a record closing over its own history.

The 25th's hand-rename is MIGRATED back to DEFERRED-DECISION with resolved: set. That
block was the per-instance workaround 157 was filed against, and it is now the
migration's own test case.

158 — STATE-CLAIM. Reuses trigger_fired() verbatim and inverts only what firing MEANS:
for a deferral, fired = the decision is due; for a state-claim, fired = THE CLAIM IS
FALSE. Two new trigger kinds earned directly from today's instances: text-present (the
trial-09 hold, falsified by REVIEWED-124's existence) and file-changed-since ("the filed
rule not edited", false one hour after writing).

16 new controls, each with its discriminating half — fires on met, silent on unmet,
manual listed-never-fired, resolved excluded from due-ness, the SAME block unresolved
still due, a real pointer resolves, "yes, done" does not.

Proven on the LIVE blocks, not only fixtures: pointing the state-claim at an older
commit made it report FALSIFIED by name; replacing the resolution with "yes done" made
register-integrity report it; both restored and both returned to quiet.

⚠ One control failed before shipping and the failure was the useful part. The negative
control for file-changed-since pointed at FOOL-SEED-RULE.md, which this same session then
edited — so "unchanged since HEAD" broke, correctly. A control whose subject is "did this
file change" must not point at a file the session is changing. Re-pointed at a frozen
2026-08-02 trial artifact, with the reason recorded at the fixture. Caught because the
controls run on every invocation rather than in a separate suite.

First two real state-claims filed, deliberately one of each kind: ~/CLAUDE.md untouched
under PENDING-150, mechanically watched and [ESCALATE]-grade the moment it goes false;
and §9's channel unbuilt, marked `manual` because it has no filename yet and inventing a
proxy falsifier is the error the schema's own comment warns against.

⚠ The zero-state prints a WARNING, not a tick: "0 marked, NOT none-stale" with the ~57
unmarked candidates named as a grep. An instrument that reads nothing reports exactly
like one that finds nothing, and that is the failure this item exists to end.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J6hZXNYSxEfZseBGTni4sf
2026-08-25 15:29:59 +02:00
David F GliddenandClaude Opus 5 3e828fe3f2 Session 2026-08-24: grounding gates ruled, daybook rule changed, two censuses run
PENDING-95: Amendment 2 (jurist ruling — (a) rejected, (d) discharged, (b)/(c)
deferred) plus the (b)/(c) census that discharges the deferral's condition.
60 guarded / 32 marked (record said 59/31); date 75%, sections 97%, quoting 47%.
Date broadly present => the jurist's cheaper third form is the live option.

PENDING-156 opened (kind (c): mechanisms off the path the work takes) and its
option (b) census run the same session. PENDING-109 prior confirmed by direct
read. PENDING-89: two docket entries, one same-direction miss and one
cross-direction catch, filed the same day and at the same speed.

Mechanisms: daybook-cue.py rewritten on steward ruling — the daily note must be
appended to until end of day, so the trigger is staleness, not note size, and the
matcher now includes Bash (it had never fired once). daybook-ensure.py and
/wrap-up 7.5 gain a standing Corrections slot per REVIEWED-126.
governance-mcp.py gains two read-only keys so the jurist can read the artifacts
it rules on; the doctrine that read-surface changes should arrive as rulings is
adopted, and the next key is proposed rather than added.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQKeKY9T9d95KpvHwwok8T
2026-08-24 18:36:34 +02:00
David F GliddenandClaude Opus 5 edf71fb173 session 2026-08-24: the heap got a dynamo — thread-query.py + daybook-cue.py, 11 user-memories harvested to the vault
- thread-query.py: the turning. Queries both corpora with the pulling thread, excluding
  the recency slice (/wake-up reaches 0.71% of an 859,803-word corpus) and favouring age.
  Wired into /wake-up §2.b.3, replacing a described-not-invoked grep step. Trial
  pre-registered, graded 2026-10-05 from --log. Caught PASS-BUT-FALSELY on its first live
  run at 14/14 green; rescored on windowed co-occurrence, length-bias control added.
- daybook-cue.py: PostToolUse cue for the daily note. Diagnosed from the record — the
  hook only ever CREATED and nothing ever prompted filling. 16/16, fail-open, never blocks.
- All 11 user-* memories harvested into the vault (12 notes, 10 into 09. Atlas of Roots,
  empty since 2025-09-29); each memory file back-pointed, vault note canonical for the idea.
- N-now corrected in MEMORY.md: 49/84, down 11 — the counter is a rolling window.

Steward-authorized. Trials: thread-query + Smart Connections, both graded 2026-10-05.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQKeKY9T9d95KpvHwwok8T
2026-08-24 11:25:39 +02:00
David F GliddenandClaude Opus 5 e3da9abad1 session 2026-08-23: the vault got instruments, a convention, and a name for what it lacks
Fool: FOOL-SEED-RULE.md §2a corrected two days before the beacon — the heading
claimed a ruling scope the recorded ruling could not reach (d6377af, pushed).

Obsidian: the paper bridge tested and working, first notebook transcription
filed under its own entry date; vault-links.py built and twice caught failing
while its selftest read green; Paradigm + Marshall read in full; the Archive
Convention and Re-encounter placed in the vault; the vault's CLAUDE.md
rewritten after fifteen months stale.

Files: session record + notebook-provenance reference memory + 6 KG lines
(3 drift-patterns, 2 preventions, 1 measured-state); MEMORY.md rotated with
the prior Active Session demoted verbatim to MEMORY-reference.md;
scripts/vault-links.py archive-path fix (substring -> path component, 3 new
controls, 26/26).

No new PENDING items — today's vault work is steward-direct and touches no
governed artifact.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQKeKY9T9d95KpvHwwok8T
2026-08-24 00:01:58 +02:00
David F GliddenandClaude Opus 5 9bc84a6f16 [FIX] vault-links.py: resolve Obsidian links from the files, with controls
An Obsidian link census is only worth acting on if it can be trusted, and twice
on 2026-08-23 we were one step from acting on numbers that were wrong: a regex
census that read 52 path-form links as broken, and a fuzzy matcher that offered
to rewrite [[2025-05-30]] as [[2025-08-30]] — different days, not aliases.

Implements Obsidian's resolution order (exact path, basename, alias, then
case-insensitive; ambiguous basenames to the shortest path) over the files
themselves. Not the app's index: that is a 43 MB LevelDB cache which, measured
this afternoon, was 78 minutes stale and held ZERO entries for a note created
the same day (control: 29 entries for a note months old). It also carries a
LOCK — freshest while Obsidian runs, readable only while it does not.

NEVER fuzzy-matches. Date- and week-shaped targets get no candidate at all,
with a positive control proving that is a refusal and not a broken function.

The first run was PASS-BUT-FALSELY and the log records it: selftest green at
18/18 while the live vault reported 8,296 dead targets, of which 7,830 were web
paths and app URLs the tool had no business judging. The fixture contained no
web links, so the selftest certified its author's blind spot. Now 23/23 with
two positive controls proving the new filter did not silence real breakage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQKeKY9T9d95KpvHwwok8T
2026-08-23 20:00:01 +02:00
David F GliddenandClaude Opus 5 7226e0d806 Daily notes link up to week and month, both in the steward's own formats
The steward asked for links between the week's daily notes, weekly and monthly
ids, and rollups that show progress. Three of those already existed in the vault
and had lapsed: 01. Weekly/2025-W15..W21 (7 notes, ISO YYYY-Www), 02. Monthly/
2025.05 (dots, not dashes), a quarterly, and templates for all of them. The old
daily template already carried week: gggg-[W]WW and month: YYYY-MM fields.

So nothing here is invented. The hook now writes his week/month frontmatter and
creates the week and month notes in his folders, in his filename formats.

LINK UPWARD ONLY, and this is the load-bearing design decision. An unresolved-
link census of the vault the same day found 4,799 unresolved targets across
1,366 distinct names, with 56% of notes carrying no link in or out. A nav line
with a "tomorrow" link manufactures ~365 more unresolved links a year, and a
weekly note hard-linking its seven days manufactures ~5 a week for days that
never happened. So: the week note always resolves because the hook creates it;
Previous is written only when yesterday's note actually exists on disk; tomorrow
is never written; and the weekly note hard-links no dailies at all — the dailies
link up, so Obsidian's backlinks pane lists exactly the days that exist.

Two controls carry that: Previous appears when yesterday exists, and is absent in
a fresh directory — proving the check reads the disk rather than the calendar.

The weekly note carries a Work heading and keeps a Personal review heading. The
2025 weekly practice was personal — intentions, patterns, task migration — and
the work rollup sits beside it under its own heading rather than displacing it,
which is the same instruction the steward gave for the daily note.

17 selftest checks, up from 7.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQKeKY9T9d95KpvHwwok8T
2026-08-23 11:07:02 +02:00
David F GliddenandClaude Opus 5 073ef8a482 The daily work log, with a trigger this time (PENDING-155 filed)
The steward asked for a daily note in Obsidian explaining in plain terms what
we did, decisions taken, and commit references — plus significant insights and
exchanges between the parties. This is Obsidian tracker item 5, the actual goal,
unstarted since 2026-08-19 while four items of frontmatter hygiene stood in
front of it.

Two prior attempts at this exact genre were read before anything was designed,
honouring the tracker's own flag: daily-log/ (4 entries, Mar-Apr 2026) and
sessions/ (3 long-form narratives). Both died inside four weeks. Neither had a
trigger — they were written when someone remembered. So the design question was
never what the note should say. It was what makes it survive.

Answer, steward-chosen at each fork: the note lives at 01. Daily/YYYY-MM-DD.md
with project work under its own H2 inside it rather than in project folders; a
SessionStart hook creates it so existence stops depending on memory; the
executor writes during the session because a wrap-only design inherits the
wrap's failure mode (2026-08-19 died unwrapped); and the wrap finalises rather
than begins.

daybook-ensure.py creates only. It will not touch an existing note — that is the
control the design turns on, and it is tested, along with a positive control
proving the no-dir report distinguishes a missing directory from a broken
function. It also reports failure loudly, because the job it sits beside spent
five months failing behind a > /dev/null 2>&1.

Not revived: the 2025 analogue template — sleep, supplements, homeopathy. Pen
and paper beat it and should keep it. That it failed is a finding, not a gap,
and this note is a different genre rather than its replacement.

PENDING-155 files the steward's idea for the jurist's side: an append-only MCP
surface writing a scratch file the executor folds in. Deliberately NOT a tool on
governance-mcp.py, whose read-only guarantee is a live AST control with a
positive control rather than a comment. A separate one-tool server leaves that
intact, and the vault note stays single-writer — the same lesson the
thinking-mirror taught this morning.

Correction carried into the record: the executor told the steward mid-session
that Claude.app has no filesystem access. False since 2026-08-08. Third instance
today of a constraint asserted from recall where the substrate was one file away.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQKeKY9T9d95KpvHwwok8T
2026-08-23 10:52:35 +02:00
David F GliddenandClaude Opus 5 5a350c7059 [FIX] The wake digest read an anchor case its producer was never told to emit
The digest read `PULLING THREAD` and `LITERAL QUESTION` with a case-sensitive
`str.find`. /wrap-up names these fields in prose — "The pulling thread",
"**Pulling thread:**" — and has never mandated a case. The reader was demanding
a shape its own producer had no instruction to write, so the wrap wrote
correctly and the digest reported DEGRADED.

Censused by running the real function over all 195 wrap files rather than by
grep: 102 threads and 103 questions unreadable, of which 86 and 84 were present
in the body in the wrong case. The remaining 16 and 19 are wraps that never
wrote the field. After the fix: 16 and 19. Predicted and achieved agree.

Second defect, distinct and found only because the first was traced to its
class: the label terminator was "first colon within 40 characters", a proxy for
"same line". When an aside pushed the colon past the window the function
returned THE LABEL, and with the paragraph cut assuming label and content share
a paragraph, a question written below its heading was invisible. The 2026-08-22
wrap hit both defects at once. The terminator is now the first colon on the
anchor's own line, and a label that ends its line takes the paragraph below.

Case-insensitivity alone would have let a narrative "…as the pulling thread
showed…" outrank the field it describes, so a match in label position now wins
over an earlier mention. Four checks added (71 -> 75), including that negative
control and a positive control proving it cannot pass vacuously.

Not changed: file selection (ledgers were already excluded correctly, line 124),
frontmatter stripping, and the verbatim-never-summarised contract. The ladder's
"61 checks" is stale — it was 71 before this commit — and stays stale: the
ladder is frozen under REVIEWED-123 and this is not an exemption.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQKeKY9T9d95KpvHwwok8T
2026-08-23 09:55:21 +02:00
David F GliddenandClaude Opus 5 d04c875054 [FIX] The deferral checker silently skipped the governance register (REVIEWED-123)
Executing REVIEWED-123 conditions 2 and 3 surfaced a defect in the instrument
that was supposed to carry them.

PENDING.md had grown to 546,944 bytes, past the scanner's 400 KB guard, so EVERY
structured DEFERRED-DECISION block in the governance register was skipped —
silently — by the checker built to stop deferred conditions from being silently
missed. The 30-day review point placed under condition 2 was inert on arrival.

Worse than silent. The prose-deferral loop has no size guard, so PENDING.md's
prose count (70) still appeared in the report, making the file look examined
while its structured blocks were never read. Found only by placing a block and
noticing the tracked count did not move.

Both halves fixed:
- The two named governance files are exempt from the guard. The guard exists to
  bound the unbounded **/*.md globs; it was never meant for the files the scan
  reaches outside docs/ specifically to include.
- A size-skip is now REPORTED, not swallowed: "NOT SCANNED for structured blocks",
  named, with byte counts, and stated as "could not assess" rather than "nothing
  there" — REVIEWED-104's third outcome, applied to the instrument whose entire
  subject is conditions nobody is watching. Two legitimate skips now visible
  (Carruthers 1.6 MB, Yates 1.0 MB — scholarly texts, correctly out of scope).

Three controls added, derived from the PROPERTY rather than the guard's own
vocabulary: is the register actually scanned; is a real block in it parsed (the
live instance, not a fixture); and does the guard still apply to non-governance
files, so the exemption cannot quietly become "scan everything". A control asking
"does the guard work" would have passed throughout.

Result: 32/32 controls (was 29/29); deferred decisions 3 tracked (was 2), all
checkable. The ladder-freeze-30day-review trigger is live at date 2026-09-16.

Also under REVIEWED-123: N-now recorded (60 transcripts of 84, 24 remaining);
freeze scope stated as GENERAL per condition 1 and ladder file verified untouched;
owed-entries list ratified with each row naming its authorizing ruling per
condition 3 — OWED-1 under REVIEWED-122 cond. 9, OWED-2 explicitly NONE, queued
but not authorized and needing its own ruling before it joins the ladder.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Y6t6qx7cpaCu5xGdD36u4
2026-08-17 20:40:53 +02:00
David F GliddenandClaude Opus 5 fb7bd6849f [FIX] REVIEWED-122 conditions 6, 7, 11 — and a fifth defect class found by the ruling's own placement (REVIEWED-122)
Executes the three legs REVIEWED-122 severed from the gated mechanism.

COND. 6 (second requirement, which the earlier docstring commit did NOT
discharge): checked what else relies on the discarded reading. Two sites.
(1) The selftest asserts `ruled_pendings ignores a ruling that names no PENDING`
using REVIEWED-82 as its fixture — a real AUTHORIZED ruling on PENDING-82,
presented as an example of correct ignoring. The assertion is mechanically true
and stays true; what is wrong is the fixture and what the name implies.
Annotated, NOT repaired: the repair sits inside the gated mechanism.
(2) governance-mcp.py asserts `governance_state item count == sec_pending()` —
a count-based agreement check, the exact shape finding 9 names, which passes
regardless of whether the classification is right. Reported, not changed.

COND. 7: PENDING-121 restored to the open list by hand as PENDING-143, a
disclosed CARRIER. Direct restoration was impossible without one of three acts
the executor may not take — editing REVIEWED.md (Constraint #1, and cond. 5),
inducing a Class-A header (trading hidden for unclosable), or changing the gated
parser. The carrier is labelled as a proxy, not as the item. -124 and -128
deliberately not carried: cond. 7 preserves their UNDETERMINED status.

COND. 11: filed separately as PENDING-144 rather than folded — script-resident
substrate claims are checked by nothing, including the drift-check. One confirmed
occupant; population explicitly unmeasured.

AND A FIFTH DEFECT CLASS, found by watching this ruling land. A ruling claims a
NUMBER, not a record. REVIEWED-122 named PENDING-142 and hid all four of its
records at once — fine here, since its conditions do dispose of them, but the
mechanism never checked that.

Where it is not fine: REVIEWED-115 (2026-08-10) claimed `131`, so all five
PENDING-131 records are hidden — including ADDENDUM 4, dated 2026-08-13 and
therefore SUPPRESSED ON ARRIVAL, three days after the ruling that silenced it,
while awaiting steward direction. PENDING-131 (c) is the unbuilt fence: the
pulling thread of every session since 08-10, made a CONDITION by REVIEWED-121,
and it has never once appeared in the list of items awaiting authorization.
The work was not lost only because MEMORY.md and the session records were
carrying it by hand.

The same item fails the other way too: REVIEWED-116's header
`PENDING-131/132/133/134` parses to one token matching no id, so a four-item
design-gate ruling suppresses nothing.

Filed as PENDING-145 — a new item, not a PENDING-142 addendum, because an
addendum would have been hidden on arrival, which is the defect. None of
PENDING-142's options (a)/(b)/(d) covers this: all three still resolve
id -> ruled. Flagged as something the pre-registered answer key must encode
BEFORE implementation, or the key will certify this behaviour as correct.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Y6t6qx7cpaCu5xGdD36u4
2026-08-17 20:28:05 +02:00
David F GliddenandClaude Opus 5 aa745bcfb0 [FIX] ruled_pendings' docstring asserted the opposite of the record
Jurist-ruled 2026-08-17 to correct independently of the mechanism, since it is a
false claim whichever remedy wins.

The docstring described REVIEWED-78/-81/-82 as "like-numbered rulings … concerning
other matters" that had "falsely hidden" three items. Both halves are false. They
are the AUTHORIZED rulings on PENDING-78/-81/-82 — same date, titles verbatim
identical, and REVIEWED-81 names "PENDING-81" twice in its own body. They are
like-numbered on purpose: REVIEWED-78's Notes say it was filed separately "for a
mechanical reason: the closure rule in wake-digest.py matches a PENDING item to
REVIEWED-<same number>."

So the number→subject fix broke the three entries deliberately authored to satisfy
the rule it replaced, then recorded their compliance as coincidence. Surfacing them
was a regression; they have read open since 2026-07-28. The change proof could not
see it because it measured a count (18→19) while the claim was each item's
disposition — and the counts stay equal either way: removing 3 false-opens and
restoring 3 false-closeds both leave 29.

Superseded wording retained in the note rather than overwritten.

Also filed as PENDING-142 ADDENDUM 3: the jurist ruling with its condition that
(b)'s closing-verb enumeration must default to NOT CLOSED on unrecognized verbs;
and the verified finding that governance-drift-check.py's subject is exactly one
file (~/CLAUDE.md), so the scripts implementing governance checks make substrate
claims nothing checks — one confirmed occupant, population unmeasured.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Y6t6qx7cpaCu5xGdD36u4
2026-08-17 20:01:36 +02:00
David F GliddenandClaude Opus 5 c2df868104 [FIX] Repair 39 files' frontmatter — including 3 I damaged an hour earlier
The 2026-06-06 normalization sweep (3f9a89b, 283 files) prepended a stray
permalink-only frontmatter block to 39 memory files, 20 of them session wrap
records. Any real frontmatter parser reads the FIRST block, gets `permalink`
alone, and never sees name/description/type.

The sharp case: `strip_frontmatter` exists specifically to stop thread extraction
from matching inside `description:` — its docstring says so. On those 20 wrap
records it strips the stray block and hands the real frontmatter back AS BODY,
producing exactly the condition it was written to prevent.

Repair merges permalink into the real block and drops the duplicate. Nothing
retyped: frontmatter and body are carried as slices, body md5 asserted unchanged.

TWO DEFECTS OF MY OWN, both found only after claiming success:

1. THREE FILES DAMAGED BY THIS SESSION'S OWN STAMPING COMMIT (ef6fa94). That
   script located frontmatter with a non-greedy `^---\n.*?\n---\n`, which on a
   stray-block file matches the STRAY block — so it appended superseded_by to the
   wrong block and orphaned the real frontmatter into the body. That is the same
   non-greedy-first-block blindness diagnosed in strip_frontmatter one hour
   earlier, reproduced in the tool written to clean up after it.
   And the post-stamp check reported "malformed: none" because it asked "does the
   file start with frontmatter then a banner" — true for all three — while the
   claim was "the stamp preserved the record's metadata". The control's subject
   was adjacent to the claim's, for the sixth time today and the first time in my
   own verification. Repaired, verified against the pre-stamp file from git: no
   key lost, prose preserved.

2. REPAIRING 20 APRIL-MAY WRAP RECORDS MOVED THEIR MTIMES TO TODAY, and
   `sec_pause` picked "newest wrap" by mtime — so the digest promoted an April
   session to `Last wrap` and lost both the pulling thread and the open question.
   Caught by the DEGRADED section, which is the honest-degradation mechanism doing
   its job. `sec_pause` now selects by git add-time, like `wrap_events`. Residual
   stated in the comment: add-time lags the wrap by hours, so `Last wrap` is an
   upper bound — wrong by hours where mtime was wrong by months.

Verified after: 0 two-block patterns, 0 orphaned frontmatter, 16 stamps intact
with name: present, 381 pointers resolve, 0 dead, selftest PASS, drift clean,
digest reports 0 degraded sections and the correct last wrap.

Not defects: context-discipline.md and relational-gap-analysis.md use the
`title:`/`type: note` convention and have no `name:` — flagged by my check, correct
as they stand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Y6t6qx7cpaCu5xGdD36u4
2026-08-17 19:49:02 +02:00
David F GliddenandClaude Opus 5 b6e1b5e470 [FIX] The unwrapped-session detector compared two different clocks
The wake digest's `PREVIOUS SESSION DID NOT WRAP` alarm fired falsely at three
consecutive wakes and was overridden by hand at two of them. It was scoped as a
two-valued-detector problem. Diagnosing the class first found four defects, and
the scoped one was not the cause:

1. TIME BASE (the cause). Transcript timestamps are UTC (`...Z`); the code
   dropped the suffix and called `time.mktime`, which reads a struct_time as
   LOCAL, then compared the result against `os.path.getmtime`, a true epoch.
   Measured: +7201 s skew against a 900 s tolerance. Because the skew exceeds
   the tolerance, a wrap written at the end of a session could NEVER land inside
   the window — the alarm was systematic, not intermittent.
2. SELECTION. "Newest transcript quiet for >60 s" excluded the previous session
   at exactly the moment it mattered: on 2026-08-17 it had ended 12 s before the
   wake, was skipped, and the session from four days earlier was reported
   instead. The defect is time-dependent and disappears ~60 s later, which is
   why re-running the digest afterwards showed nothing wrong.
3. EVIDENCE. Wrap records were dated by mtime, which any later edit moves — the
   08-14 record read 08-17 because a CODA was appended to it. Now dated by git
   add-time, which cannot move once committed; mtime is a labelled fallback.
4. ARITY. `verdict is None` (could not assess) was folded into silence with
   "wrapped fine". Now four outcomes, per REVIEWED-104: wrapped · unwrapped ·
   unassessable-subject (environment) · unassessable-check (defect).

Acceptance is old-vs-new on the real case, not a unit pass. At the reconstructed
wake instant the old code selects the wrong transcript AND returns a false alarm
on the right one; the new code selects correctly and returns `wrapped`. Both
defects independently produced the alarm, so fixing only the arity — the scoped
task — would have shipped a fix that left it firing.

The selftest gains a control derived from the property rather than from the
check: a transcript's last inner timestamp and its file mtime are two readings of
one moment, so their MEDIAN skew detects a systematic clock mismatch (1 s now,
~7200 s before). Max is printed too, because one transcript legitimately skews
31 h — the same mutable-mtime problem, on the transcript side.

The old real-substrate gate demanded both verdicts occur across live sessions
and PASSED while the detector was broken: it established that outcomes were
spread, never that any was correct. Demoted to a printed note with its limit
stated beside it. Filed as PENDING-142 ADDENDUM 1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Y6t6qx7cpaCu5xGdD36u4
2026-08-17 14:57:48 +02:00
David F GliddenandClaude Opus 5 92d5ad2547 session 2026-08-13: REVIEWED-119/120 placed; MCP key descriptions refreshed
⚠ THIS COMMIT'S CONTENTS ARE MIXED, BY EXECUTOR ERROR, AND THE MESSAGE NOW SAYS
SO RATHER THAN DESCRIBING ONLY ONE PART. The original message named only the
governance-mcp.py change; `git add -A` had swept four other files. Amended before
push, so no shared history is rewritten.

What is actually here:

1. REVIEWED-119 and REVIEWED-120 (REVIEWED.md, +38) — STEWARD acts, placed during
   this session. 119 authorizes PENDING-135 option (c), instance 8 reclassified as
   a negative-candidate with the sub-type name held open, and corrects the item's
   own claim that option (d) was blocked cross-repo (the constraint is
   studium/v2-gold@1 §14.2, engine-side and D-1, not the chamber-locked
   studium/meta@1). 120 authorizes PENDING-136 option (c), retiring bare
   `distinct_spans`.

2. PENDING-135, PENDING-136 and the PENDING-131 Addendum 4 defect-count fix
   (PENDING.md, +212) — executor filings, and the ones that legitimately belong to
   a session wrap.

3. The session ledger (claude/memory/session-ledger-2026-08-13.md) — likewise.

4. governance-mcp.py (+24) — the [FIX] the original message described: two V0-lane
   key descriptions had gone stale the same day the dispositions landed.
   PENDING-134's H1 holds the doctrine ruling until those keys are actually SERVED
   (the running client keeps the old eight-key map until restart, which is steward
   action and still pending). The descriptions are what the jurist reads to decide
   which key to OPEN, so a stale index served at first contact would mislead on
   first contact — the class this whole arc is about. Selftest 54 checks, 0 failures.

5. Brewfile (+1, `mas "NordVPN"`) — NOT this session's work. It belongs to
   sysupdate's sweep and was swept in by the same error. Left in place rather than
   surgically removed: extracting it would rewrite more than it repairs, and the
   line is already accurate. Recorded so the next reader is not misled about which
   process authored it.

The wrap protocol's §6.5 requires a scoped add for exactly this reason — the
steward's in-progress changes belong to the steward's sweep, and a governance
act placed by the steward must not be recorded under an executor's message.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G38S6gU6G7akko9syvB7nu
2026-08-13 21:24:39 +02:00
David F Glidden 4c3758e559 [PROPOSAL] PENDING-134 (whose-proposition as doctrine); 132 split+re-grounded; 133 rescoped; MCP opens the V0-lane texts
Jurist ruling accepted in full on all six questions.

Q1: the variable is right, the derivation is not. §6.2 is PRE-REGISTERED, and a
test that changes stratum-B membership, derived after reading the spans it
reclassifies and entering by interpretation, voids that guarantee whether or not
the test is right. Filed as PENDING-134 — new doctrine, dated, with §7.4(ii) as
SUPPORTING ARGUMENT rather than derivation and §6.2's double omission recorded
as the counter-argument heard and overruled. The decisive form of that objection
is the jurist's: §6.2 admits F5 as 'qualified span (F5)', a construction that
would have admitted 'reported-speech span (F4)' and was in use one item away.

Q3: ran the fused-claim test on instance 8's fragments. It goes against
retention — fragment 2 opens on the tail of the carpenter's speech with NO
attributing clause before reaching Mauss's conclusion. The B4 shape. PENDING-132
amended: the retention is split out, and the retraction re-grounded on two
convergent bases so it is authorizable regardless of how 134 resolves.

133: rescoped from two F4-carrying spans to every fr grounded span, because the
bound assumed P7's tagging was complete and the item's own diagnosis says it had
no claim-side step at all.

And the access gap the ruling opened with: governance_read gains
v2-harness-design, v2-stratum-tags, mauss-fixture-spans, mauss-fixture-citations
— PENDING-86's fourth instance, same shape and same remedy as chamber-spec. The
jurist can now verify Part I rather than take it as testimony. Eight controls
including that the served text actually carries §6.2's pre-registration clause,
§5's F4 row and the L926 citation strings. Self-test 54 checks, 0 failures.
2026-08-10 17:41:25 +02:00
David F Glidden 32b0c9dfc6 [FIX] The link canary was blind to code spans, to wikilinks, and to its own class
The steward's 2026-08-09 to-do read "the gap is neither knowledge nor home but
the absence of an EXECUTABLE." The premise was false: classify_pointers has
existed since 19bddd5 (2026-08-08), wired to SessionStart, with controls. The
gap was that the executable was incomplete, and the incompleteness had already
produced a false positive.

Four defects, three named in the spec and one found by building it:

1. CODE SPANS. `](file.md)` inside backticks read as a pointer, so the single
   DEAD pointer reported on 2026-08-09 was the link pattern written inside
   MEMORY.md's own specification of this canary. An instrument that flags its
   own documentation flags it every wake forever, and the real signal drowns —
   the same "known canary bug" dismissal the 2026-07-28 block was written to
   end, arriving by a second route. Fences and inline spans are blanked with
   offsets preserved; inline spans may not cross a newline and an unterminated
   fence does not match, so a stray backtick can never blank the file and HIDE
   dead pointers.

2. WIKILINKS. reference-verification-ladder.md has specified this canary as
   covering "every `](file.md)` and `[[wikilink]]`" since 2026-07-06. Only the
   first half was ever built. 31 wikilinks now checked.

3. BREAKAGE AGE, derived from git rather than a stored prior run — a state file
   would make this the one cached section in a digest whose governing property
   is that it is computed. Where git cannot answer, it says so.

4. Found by running it: the first wikilink pass reported only UNWRITTEN, and
   both live hits were [[trust-prior-pass-frame]], whose file EXISTS as
   feedback-trust-prior-pass-frame.md. That is precisely the one-word alarm the
   comment ten lines above it was written to forbid. Wikilinks now report three
   outcomes and hand back the replacement slug. Both are repaired here.

The wake-up skill and the ladder now POINT AT the executable instead of
describing the check — the described-not-invoked gap is why it kept being
retyped by hand on 2026-08-08 and 2026-08-09.

Verify: python3 scripts/wake-digest.py --selftest   (61 checks, exit 0)
        python3 scripts/wake-digest.py | grep 'MEMORY POINTERS'
Induced red: blank_code reverted to a no-op (behaviour, not the symbol) →
        exit 2, five named failures, no traceback; direction controls held.

Not changed: the wrap_inside detector, which announced "PREVIOUS SESSION DID
NOT WRAP" for a session that wrapped at 19:48 and kept working until 21:54 —
a two-valued detector over a three-case state. Named in the ledger, not fixed.
2026-08-10 16:01:51 +02:00
David F GliddenandClaude Opus 5 90dc0f7373 [HARDENING] Close PENDING-82 and -118; mark 119/120/123 BUILT
82 is discharged by events. Its 2026-07-28 substrate check said there was no
mcpServers key; today the config carries mcpServers: governance, and the jurist
used the tools in three consecutive rulings — opening graduation-spec directly
and refusing to rule from my summary, which is the capability the item existed
to create. Two residuals carried, not buried: the read enum reaches neither the
runbook nor the R0 contract, and the installed surface has 8 keys and a search
tool the description does not name.

118 is built, and building it REFUTED the option I had recommended. I wrote that
the checker already parses the archive format. It does not — the marker is an
HTML comment and there are zero in either register file; their deferrals are
prose, 53 and 26. Widening alone would have scanned two more files, found
nothing and reported clean: a silent net built to close a blind spot, which is
the failure the item was filed to describe.

So the widening ships with its limit in its own output — prose deferrals counted
and reported un-machine-readable, never as absent, with counting explicitly not
classifying. The census stays owed.

119/120/123 marked BUILT with their commits so the built-vs-ruled checker sees
them; all three were already ruled, so this closes a reporting gap, not an
authorization one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A35wiD55yRHj5U1ECZAX4t
2026-08-08 21:05:15 +02:00
David F GliddenandClaude Opus 5 bfd0f45293 [HARDENING] drift-check gains built-vs-ruled (REVIEWED-108 family)
Earned 2026-08-08: PENDING-125, -126 and -127 were authorized verbally in the
D-1 lane, built, pushed, and recorded BUILT in their own amendments while no
REVIEWED entry named any of them. Nothing was crossed — D-1 is steward-direct
and the authorizations were real — but the register did not show them, the
commits could not carry the REVIEWED-N tag the commit format prescribes because
no number existed, and the gap surfaced only because the steward asked. It was
not reconstructible from memory; it had to be enumerated mechanically.

Same family as the amendment-link and deferred-decision checks: the registers
own instruments not reaching parts of the register. This one watches the seam
between the work happening and the record showing why it was allowed to.

Three-valued per REVIEWED-106, ruled hours earlier: it reads two files, either
of which can be absent, so cannot-assess is reported distinctly and never as
clean. The BUILT vocabulary is stated with the result — caps only, because
lower-case prose "built" would flag every item that describes building.

Six controls including a REAL known-bad rather than only fixtures: the register
at git HEAD, before the steward placed 107-109, names 125/126/127; the working
register names none. It discriminates on real artifacts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A35wiD55yRHj5U1ECZAX4t
2026-08-08 20:41:16 +02:00
David F GliddenandClaude Opus 5 1cf79b0f86 [PROPOSAL] PENDING-124 gate passed; five conditions discharged, and the gate found a tenth instance
Q1 is applied, not extended: Constraint 4 has two clauses and my contrary reading
engaged only the second. Limits, not failures — and "I could not look" is a limit. I
had overstated my own uncertainty on the question I withdrew a recommendation over.

The condition that cost most: my quote-verification pass reported verified on a
reconstruction of REVIEWED-104 — contractions, re-punctuation, two blocks spliced, and
the closing sentence dropped. A two-valued verifier inside a package arguing verifiers
must be three-valued. Rebuilt at ~/dotfiles/scripts/verify-quotes.py. The first rebuild
had three tiers and cried wolf on every correctly-copied quote, since a record stored
with hard wraps is byte-different from the same text quoted as one line; splitting
re-wrapped from normalized is the same two-strengths lesson the fleet learned. Both
directions proven: corrected package exit 0, original reconstruction not-found exit 1.

The dropped sentence answered my own Q2. It was in the record the package quoted.

Both citation errors in that package had one cause, which the script cannot diagnose: I
quoted the ADVISORY message and attributed it to the PLACED record. Different
documents; placement adds and cuts, so quoting the advisory loses exactly what
placement contributed.

My "five instances, same shape" was wrong — two are the shape, three belong to the
attested-absence family whose parent is already ratified (REVIEWED-47, 2026-07-05). I
searched for a doctrinal parent among R0 and Constraint 4 and missed the ratified
sibling closest in content. The ladder entry now joins that lineage.

Filed as a watch-item, with an operative memory note: third package running where the
grounding pass was incomplete and every substantive omission cut against my own
argument. It optimises for finding my errors, not my support.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A35wiD55yRHj5U1ECZAX4t
2026-08-08 19:15:14 +02:00
David F GliddenandClaude Opus 5 33c11fff87 session 2026-08-07 evening: PENDING-112 + REVIEWED-95 (route harvested capabilities by firing moment)
Register censused and rebuilt from the archive: 177 claimed -> 154 real live
proposals, legible, with exact archive:L### pointers. The 2026-08-01 compaction
was lossless but illegible (55 scraped header rows; 95% of cells cut mid-word);
completeness verified 124 = 124, so nothing had been dropped.

Skills pruned 63 -> 12 after measuring that 53 had never been invoked across 64
sessions / ~5 months. The finding underneath: retrieval is set by a capability's
HOME, not its importance -- MEMORY.md 83%, register 77% (named in a wake step),
ladder 14%, 'THE GOVERNING FRAME' 12%, 'Read at Step 0' 9%, recall-bound skills 0%.

PENDING-112 filed, jurist design-gated, steward concurred; REVIEWED-95 drafted.
Landed: the /wrap-up 1.6 filing gate (prospective) and the /wake-up ladder
sentence (a pre-registered trial intervention, landed alone). The 20-session
falsifier is WIRED, not intended -- DEFERRED-DECISION ladder-ritual-trial,
trigger: transcripts 84. Wiring it exposed two defects in the deferral checker:
no way to express a session count except as a date proxy, and a scan that never
looked at claude/governance/. Controls 16 -> 19.

Stroke 2's 41-entry ladder append deliberately NOT done: REVIEWED-95 Q3
sequences it after the ladder trigger, which now exists.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NEWjLBP4quXbDPDL2byEzZ
2026-08-07 19:09:46 +02:00
David F GliddenandClaude Opus 5 97ae59a0d3 [FIX] deferred decisions: check the trigger instead of remembering it
The 2026-05-16 jurist settlement deferred TEI-native authoring "until
Cluster A's MD-with-sidecar form is operational". Cluster A became
operational, the condition was met, and nobody looked — it surfaced months
later by accident, while reading an unrelated document for another purpose.
The steward's stated reason for settling it today was not the format question
at all: "I abhor deferring so many things and then forgetting them."

A deferral is a claim — "not yet". When its trigger fires the substrate
contradicts that claim, which is exactly what this instrument detects, so
check 8 belongs here rather than in a new register. A deferred decision now
declares a machine-checkable trigger in a comment block:

  <!-- DEFERRED-DECISION: <slug>
       since: YYYY-MM-DD
       owner: steward | jurist | executor
       trigger: glob <pat> | path-exists <p> | date <YYYY-MM-DD> | manual
       discriminator: <where the deciding evidence is written down> -->

`manual` never auto-fires and is listed rather than checked — an honest way
to record a deferral whose condition cannot be mechanised, instead of
inventing a proxy. Proxies are the failure being fixed: the old trigger stood
in for "behavioural evidence on high-fidelity sources" and came true without
producing any, because neither named test case was ever manifested.

Scans */docs/**/*.md under ~/_Dev and ~/dotfiles; glob and path-exists
resolve against the containing repo's root. First and only entry today is
D-5 (tei-native), correctly reported as not due — no protocol spec exists yet.

Controls, five, per the standing epistemic standard. The load-bearing one is
the discriminating half: the evaluator must NOT fire on an unmet condition,
because a checker that fires on everything reports nothing. Red-witnessed
end-to-end by temporarily pointing D-5's trigger at a path that does exist:
reported COME DUE with slug, owner, deferral date, trigger and file; restored
after, and the spec's working tree verified clean.

Also fixed in passing: this file's own report block was briefly duplicated
and misplaced by a `str.replace` without a count, which substituted both
`sys.exit(0)` occurrences including the early-exit branch. Caught by reading
the output — the deferred-decisions line printed twice.

Wake-up §2.c updated to describe all three of the script's reports, and to
require that a COME DUE item be surfaced in the briefing under "What's
unresolved". That is a change to the wake protocol, not only to a
description: a mechanism nobody reads is not a mechanism.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NEWjLBP4quXbDPDL2byEzZ
2026-08-07 17:32:51 +02:00
David F GliddenandClaude Opus 5 bcc02ada3d [FIX] register integrity: an amendment must never replace the record it amends
REVIEWED-87's original entry (PENDING-99, the fidelity_equivalence@3
design-gate ruling of 2026-08-05) was replaced this afternoon by the
PENDING-111 amendment block placed at the same heading. The amendment's own
"**Amends:** REVIEWED-87" line then pointed at a record no longer in the
file, and the register could no longer answer what was ruled under 87 — the
register's whole job.

Recoverable, and recovered: the entry was intact in git HEAD and the
underlying jurist ruling is separately filed at
studium-engine/docs/quoted-tier-acceptance-JURIST-RULING-2026-08-05.md. But
the register entry uniquely held Q2's reframing (the route to PENDING-100),
Q3 REJECTED and its strengthened basis, Q5 CONCUR D-1, and the finding that
"the decisive sentence was one the executor had read and not surfaced, which
a verbatim-containment check passes every time."

CAUSE, and it is the executor's. The handoff draft was headed
"## REVIEWED-87 — AMENDMENT 2026-08-07" and described as "the block to
place", with no instruction that it join rather than replace. That reads as a
replacement heading, and the steward's reading of it was reasonable. The
copy-paste-clean discipline exists so a placement cannot be ambiguous, and
this draft was ambiguous.

NOTHING DETECTED IT. It surfaced because a diff was read by hand and the tell
was a deletion count on what should have been a pure append. This is
`removing-a-claim-is-not-removing-the-reliance` at the governance layer: the
amendment's dependency on the original survived the original's removal and
became invisible.

Check 7 added to governance-drift-check.py, which already runs at every wake:
every `## REVIEWED-N — AMENDMENT` requires an un-amended `## REVIEWED-N`
entry, and every `**Amends:** REVIEWED-N` must resolve. Reported separately
from the CLAUDE.md findings so that report's own claim stays true.

Controls per the standing epistemic standard, and the third is the lesson of
the day — a check that has never fired on a known-bad input is unestablished,
so the instrument is run against a synthetic reproduction of the actual
failure. Red-witnessed on a copy of the live file with the deletion replayed:
fires both findings. 11/11 controls pass.

Detection only. REVIEWED.md is [ESCALATE], the steward's hand
(Constitutional Constraint #1); the restoration above was placed by the
steward, not by the executor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NEWjLBP4quXbDPDL2byEzZ
2026-08-07 17:21:07 +02:00
David F GliddenandClaude Opus 5 4785d02b7d scripts: track drain-hook-queue.mjs (written 2026-08-05, never committed)
The hook-queue drainer built during the BMF investigation. Its never-delete-on-failure
rule and 10-failure halt are what surfaced the entity-pipeline finding; it was left
untracked in the working tree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AB3Kryoy6b1pm2Nz1DYdLh
2026-08-06 19:45:51 +02:00
David F GliddenandClaude Opus 5 673823961c [HARDENING] governance-mcp: keyword search — the jurist can discover an item whose id it does not know (PENDING-86 d)
Steward-authorized 2026-08-05, completing the (a)+(d) pair the jurist asked for.

The failure this closes is NOT "cannot read item X" — (a) fixed that. It is
"cannot DISCOVER item X whose id it does not already know": the 2026-07-29 case
where a ruling demanded an outcome REVIEWED-74 had settled four days earlier, in
a file the jurist could read but had no reason to open. Keyed retrieval cannot
serve that; only search can.

`governance_search(query, limit)` over PENDING / PENDING-archive / REVIEWED.
Result unit is the ITEM, boundaries from wd.item_spans — no second definition of
"an item" (the 2026-07-28 bug that hid twenty). Results name ids to hand to
governance_item, so the two tools compose.

Three deliberate properties:

  - Terms are ANDed, and that is DISCLOSED on every result. A silently
    conjunctive matcher is exactly how recall dies as a question lengthens —
    found in the engine yesterday (PENDING-97, "what does levi mean by the gray
    zone" -> 0 over ten real matches). The same shape is not being rebuilt here
    unannounced.
  - A miss is a legible empty: it states the corpus, the item count scanned, the
    terms, and the match mode, and says outright that a longer query narrows
    fast. Silence discloses its own blindness (PENDING-96's discipline, applied
    to a new instrument on the day it was ruled).
  - Ranked by exact-phrase then raw term-count, labelled as a term COUNT and not
    a relevance score — it is a field this code actually computes.

Plus a query-INDEPENDENT structural pass: an item header hidden by leading
whitespace is invisible to item_spans, so it can never appear in results and its
absence reads as a genuine miss. Such headers are now reported beside the
results. An earlier draft flagged any uncovered matching line and drowned the
signal in each file's preamble — which is how a warning stops being read.

That pass earned itself immediately: REVIEWED-11, REVIEWED-12 and REVIEWED-74
were all indented and therefore unreachable by governance_item. REVIEWED-74 is
precisely the ruling the jurist could not find, so its failure was
over-determined — it did not know the id, AND the id would not have worked.
Steward unindented all three (REVIEWED.md is his file, not the executor's, per
Constitutional Constraint 1); items visible 78 -> 81, hidden headers now zero.

Selftest 35 -> 44 controls, 0 fail, including a negative control that goes red
if a header is ever hidden again. Live stdio round-trip confirms six tools and a
correct search result.

⚠ Requires a Claude.app restart to expose the new tool.

Refs PENDING-86 (d), PENDING-82, PENDING-96, PENDING-97.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AB3Kryoy6b1pm2Nz1DYdLh
2026-08-05 21:27:18 +02:00
David F GliddenandClaude Opus 5 5cd5faf66e [HARDENING] governance-mcp: the jurist can now read the constitution it design-gates (PENDING-86 a)
Steward-authorized 2026-08-05, on the jurist's own request while unable to close
PENDING-99's Q2 — a question that turns on the chamber constitution's vocabulary
(§II.3's "inline anchor marker", §V's marker exclusion), which governance_read
did not expose. Third recorded instance on PENDING-86: the constitution, the
skill files, contamination-problem.md.

Adds two keys to the existing enum: `chamber-spec`, `graduation-spec`. No new
tool, no path argument, no traversal surface — the domain stays enumerable and
every refusal control still passes.

⚠ THE NON-OBVIOUS PART. Reachability of the KEY is not reachability of the
CLAUSE. This file's operative sections begin around line 354; the ~330 lines
above them are SUPERSEDED version headers kept as the amendment trail. A jurist
reading with the default limit=400 would land squarely in obsoleted text and
could rule on superseded clauses — the new access CAUSING the misruling it
exists to prevent. So the trap is disclosed on the key's own description, at the
point of use, and two controls pin it:

  - the §V inline-anchor clause and the §II.3 marker constraint are both
    reachable in ONE paged call (offset=350, limit=2000) — the actual Q2 text
  - NEGATIVE CONTROL: a first-page read does land in the "(obsoleted)" region,
    proving the trap is real rather than hypothetical

Selftest 29 → 35 controls, 0 fail. Live stdio round-trip confirms the §V clause
arrives verbatim through governance_read.

⚠ Requires a Claude.app restart: the running server process carries the old
code and will not show the new keys until respawned.

Option (d) — keyword search across PENDING/PENDING-archive/REVIEWED — is NOT in
this change and remains open on PENDING-86. It is a new tool surface, not two
enum entries, and the jurist asked for (a)+(d) together.

Refs PENDING-86, PENDING-99 Q2, PENDING-82.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AB3Kryoy6b1pm2Nz1DYdLh
2026-08-05 21:17:33 +02:00
David F GliddenandClaude Opus 5 9c2a7c985c session 2026-08-04: PENDING-92/93/94 + the replay-never-resumed finding + l1-replay-sampler
Filed PENDING-92 [HARDENING] idle ladder (cool/deep unreachable, spec §9A.1
divergence), PENDING-93 [PROPOSAL] event_seqs normalisation, PENDING-94
[ESCALATE] the resume floor — minCursor pinned at 0 by two non-participating
modules, so 13/13 restarts rebuilt from seq 0 and the catch-up branch has
never executed. Recall never worked either (retrieval_count = 0 across the
whole April-June graph); same fact from the other end.

Adds scripts/l1-replay-sampler.py (external read-only sampler, four positive
controls, refuses to run blind). Note to Seb pushed separately as
CapableMind-AI@ad285df.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WuMjg3ipEVa3n8CoSzoyvc
2026-08-04 15:30:56 +02:00
David F GliddenandClaude Opus 5 0a48e6934d [FIX] L1 pin root-caused and cleared; S-series closed; instrument census
mindfabric-00 had been event-loop-pinned for 6+ days (100% CPU, /health silent).
Profile + CDP inspector named two hot paths, both from runTemporalPipeline:

  checkForCycle -> getCausalEdgesFromSqlite   99.8% of samples
  tryExtendChains -> getChainsContainingSeq   now dominant (json_each scan)

Cause of the first: ANALYZE had never been run, so SQLite preferred a boolean
index (idx_caused_tombstoned, matching ~all 836k edges) over idx_caused_from.
ANALYZE across 15 module DBs flipped the plan; 6.4x on a microbenchmark and
99.8% -> 6.0% in the live profile. /health went from silent to 200 in 0.13s.

B1.1's fan-out cap is IMPLEMENTED AND WORKING (today: max in-degree exactly 20,
zero violations; pre-23-June: max 629, avg 67.6). The defect is data, not code —
836k edges / 813k chains minted under ungoverned fan-out before the fix landed.
Repair run: derived stores wiped, logchain preserved, replay in flight.

S-series closed (jurist had already ruled all of Q1-Q5 on 2026-05-18):
  S6/S7/S9 implemented (Symmetria §3 flags, `suspend` outcome, wrap-up §8 tenses)
  S2 rebuilt as [FIX] — wake-digest unwrapped-session detector, discrimination-
    gated on real sessions (11 wrapped / 2 unwrapped)
  S4/S5 withdrawn with MemPalace (steward ruling)
Dormant legacy dispositioned: PENDING-4/5/11/12, CD-03, ICP-19 duplicate.
Open authorization items 22 -> 10.

Census 01: which instruments have no real negative instance. Finding — the
governance drift-check has 3 of 5 families inert against the current CLAUDE.md,
and 71 of 75 verification-ladder entries are cited nowhere outside the ladder.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WuMjg3ipEVa3n8CoSzoyvc
2026-08-03 20:57:41 +02:00
David F GliddenandClaude Opus 5 4dc38e69b9 [FIX] wake-digest: resolve rulings by subject, not by number
sec_pending() suppressed any PENDING-N whose number appeared as a REVIEWED-N,
never checking the ruling was about that item. The two sequences have drifted:
REVIEWED-84 rules on PENDING-87. So PENDING-84 was invisible at wake on the very
morning the steward's pulling thread pointed at it, and closing it later produced
no visible count change because it had never been counted. Found 2026-08-01 at
wake, surfaced not fixed; register row 179.

Resolution now reads the PENDING each ruling names in its header. Rulings that
name none (REVIEWED-78, -81, -82) suppress nothing.

Extracted as ruled_pendings() so it is testable at all -- the logic was buried in
a file-reading routine with no way to exercise it. Five self-tests added,
including the 2026-08-01 bug as a regression control and an empty-input positive
control.

Bounded-change proof against the live files: 18 -> 19 visible. Three items
surfaced that were falsely hidden (PENDING-78, -81, -82); two stopped being shown
that are genuinely ruled (PENDING-87 by REVIEWED-84, PENDING-88 by REVIEWED-85 --
no REVIEWED-87 or -88 exists, so number-matching had never suppressed them).

That proof also caught an overclaim in this fix's own docstring, which asserted
the correction could only ever surface more items and never fewer. It corrects in
both directions. Comment repaired to say what the code does; the false version
would have been a comment promising behaviour the code does not deliver, in a
file whose purpose is to stop governance hiding from the steward.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WuMjg3ipEVa3n8CoSzoyvc
2026-08-02 11:59:47 +02:00
David F GliddenandClaude Opus 5 19bddd5ecb [FIX] A home for steward-facing maps; memory pointers made portable and self-diagnosing
Two loose ends closed before the Harrison re-gate, both surfaced by the steward.

Memory pointers. Six links in MEMORY.md / MEMORY-reference.md pointed at files
that all existed, via hand-counted relative depths that resolved from neither of
the memory dir's two addresses (it is ~/dotfiles/claude/memory, symlinked from
~/.claude/projects/…). The wake canary detected this correctly FOUR times over
two days and the banked remedy was to change the canary's path resolution — i.e.
to silence a true positive. The defect was never the pointers: the alarm emitted
one undifferentiated word, MISSING, so every firing had to be re-diagnosed by
hand and the cheapest re-diagnosis is always "known bug". wake-digest.py now
reports four outcomes (ok / mis-authored / dead / non-portable), hands back the
exact replacement, and carries a regression control replaying this bug's shape.
Pointers are home-anchored (~/…), not absolute — steward's correction; absolute
hardcodes this machine into the repo whose purpose is surviving a machine change.

Maps. With the noise gone, one genuine dead pointer surfaced:
arc-current-state-2026-05-07.md, a live ARC dashboard the steward read to orient.
It lived only on the Desktop and went with a tidy-up. A census found four more in
the same condition, zero copies anywhere — including the Making-Sequence
architecture and reading list, load-bearing for current corpus work. The cause is
structural: code, session records and memories are durable; the one artifact
class addressed to the steward had no home. All five now live in maps/ and are
symlinked back to their exact Desktop paths (Desktop view unchanged), moved under
a checksum gate with a positive control. wake-digest.py reports stray Desktop
maps; it never moves them — the Desktop is the steward's.

How to verify:
  python3 scripts/wake-digest.py --selftest     # 28 controls, PASS
  python3 scripts/wake-digest.py | grep -A3 'MEMORY POINTERS'
  cd ~/Desktop && shasum -a 256 *.md            # reads through the symlinks

What was not changed: ~/CLAUDE.md and REVIEWED.md untouched (Constraint #1). No
Desktop file was deleted or renamed. MEMORY-reference.md's May entry is marked
superseded, not rewritten.

Known limitation: maps/ has no successor for the ARC map's FUNCTION — the
open-work register carries the content, but nothing exists that the steward can
open and orient by. Named in the entry rather than quietly closed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WuMjg3ipEVa3n8CoSzoyvc
2026-07-28 14:10:03 +02:00
David F GliddenandClaude Opus 5 3df09228c0 [PROPOSAL] governance-mcp: read-only substrate access for the jurist (PENDING-82)
The three-party model asks Claude.app to rule on items it cannot read. Steward
confirmed 2026-07-28 that local MCP servers are exposed to the app's *chat*
surface — and always have been, predating Cowork by about a year. My earlier
framing ("chat, not only Cowork") had the relationship backwards: it is "chat,
always; Cowork, only while its loop still runs locally," and local Cowork is the
mode being phased out as default. The jurist chat is therefore the sturdy target.

Five read-only tools. The one a pasted cache can never provide is
governance_item(id): the verbatim body of any item or ruling, across PENDING.md,
PENDING-archive.md and REVIEWED.md. Four refusals are designed in, each with a
control proving the refusal is detectable — no writes (AST-audited), no path
arguments (keys from a fixed enum, so there is no traversal to defend), no second
parser (item_spans is imported, not reimplemented), and not an agent (tools
return data; an agent would return testimony about the substrate instead).

[FIX] to the shared definition while here: item_spans() is now fence-aware. A
'## ' header inside a fenced block is neither an item nor a boundary. Zero such
headers exist today — 17 open items before and after — but governance drafts are
written as fenced markdown carrying '## REVIEWED-N' headers, which is the
steward's own practice, so the next draft would have created a phantom item and
truncated the item containing it. PENDING-82's own fenced JSON block confirms the
fix within the hour.

Not installed. The mcpServers key edits the steward's desktop-app config; the
snippet is in PENDING-82 and the server is inert until someone loads it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WuMjg3ipEVa3n8CoSzoyvc
2026-07-28 10:20:17 +02:00
David F Glidden 8abfe8835a session 2026-07-28: governance block closed — CLAUDE.md drift 9→0 (REVIEWED-76/77/79/80), PENDING.md split 1848→430 + archive, wake-digest SessionStart hook, doctrine ids live, PENDING-79/80/81 2026-07-28 09:45:44 +02:00
David F GliddenandClaude e8cd376741 fix(drift-check): handle SIGPIPE so | head does not traceback
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xefg5EXwcpd9RMAr63dWrD
2026-07-27 22:15:06 +02:00
David F GliddenandClaude e8b6ce06a3 session 2026-07-27 evening: PENDING-76/77/78 placed; governance drift-check built + wired into /wake-up
PENDING-76 remanded by jurist — required count returned 0 of 11 (the package's own
IV.2 refinement proved its target category empty); executor recommends withdrawal.
PENDING-77 (5 structural defects) and PENDING-78 (.app preferences) released by the
ruling from needing it. Drift check reports contradicted state claims at every wake
and corrects nothing — detection needs no authorization, correction does.

MEMORY.md compacted 20.5KB -> 17.1KB (budget hook); prior Active Session demoted to
MEMORY-reference.md. CLAUDE.md and REVIEWED.md untouched.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xefg5EXwcpd9RMAr63dWrD
2026-07-27 22:14:25 +02:00
David F Glidden f83aae27c5 🔧 Auto-commit from sysupdate on 2026-05-19 21:49 2026-05-19 21:49:14 +02:00
David F GliddenandClaude Opus 4.6 066a47a26b Audit and optimize for CapableMind development
Brewfile: stripped to essential tools (~600MB freed), removed boost,
cmake, aerc, newsboat, fontforge, starship, and 24 auto-dependencies.
Added caffeine, ollama, fastfetch, ocrmypdf, tea, sshpass, vitetris.
Dropped 1password, iterm2, github-desktop, hazel, swiftbar, oversight.

Shell: fixed all stale references (fzf, zoxide, starship, old paths,
Homebrew node aliases). Updated project paths to ~/_Dev/. Added
CapableMind aliases (cm, bmf, bmf-health, bmf-status, bmf-logs).

Configs: removed iterm2, neofetch, swiftbar configs. Added capablemind
(launchd plists, MCP example, bmf-start script). Updated SSH config
with git.skemantix.com. Added CLAUDE.md to dotfiles.

Scripts: consolidated 3 backup scripts into 1 (backup-all-secrets.sh),
added pass store backup. Added setup-capablemind.sh for full environment
reconstruction. Updated symlinks.sh for new config structure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 23:45:33 +01:00
David F GliddenandClaude 389febb161 🚀 Complete machine migration setup with encrypted backups
- Added comprehensive configuration files for seamless migration
- SSH, GPG, Karabiner, iTerm2, Neofetch, SwiftBar configs
- Pass license management system with templates and documentation
- Enhanced shell functions with MAS updates and moon phase tracking
- Comprehensive encrypted backup system (GPG AES256)
- Included encrypted backups of all sensitive data
- BBEdit as default editor with proper configuration
- Fixed shell compatibility issues
- Merged existing .zsh configs with improvements

Security:
- All sensitive data is GPG encrypted (.gpg files)
- Private keys excluded from version control
- Only configs and encrypted backups are tracked

Following prime directive: durable, thoughtful solutions

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-28 23:10:36 +02:00
David F GliddenandClaude a0e34f78ae Recover missing Brewfile and enhance system updates
- Add missing Brewfile (found in home directory)
- Add bashrc and FZF configurations to dotfiles
- Install mas CLI for Mac App Store management
- Enhance sysupdate() with moon phase and MAS updates
- Update symlinks script for all shell configs

🖖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-28 19:13:11 +02:00
David F GliddenandClaude 1f543d195b Add comprehensive system enhancements and shell configurations
Following the μέτρον principle of durable, thoughtful solutions:

Shell Configuration:
- Add refined .zshrc with modular architecture
- Include .p10k.zsh for Powerlevel10k prompt
- Add .zprofile for login shell configuration
- Update aliases with new dotfiles management tools

System Management Tools:
- safe-update.sh: System updates with rollback protection
- detect-drift.sh: Configuration drift detection
- system-health.sh: Comprehensive health monitoring
- generate-lockfile.sh: Version tracking for reproducibility

Documentation:
- ARCHITECTURE.md: Philosophy and design rationale
- USAGE.md: Practical guide and troubleshooting

Other Updates:
- Update symlinks.sh to manage all config files
- Add .vimrc configuration
- Create Brewfile.lock for version pinning

These enhancements provide visibility, safety, and maintainability
while following the prime directive of prioritizing durability.

🖖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-27 22:27:54 +02:00
David F GliddenandClaude 92b0ead991 Add completion cleanup script and deploy refined shell config
🧹 Completion system maintenance:
- Remove old Mullvad VPN completion files
- Clear completion cache for fresh start
- Check for NordVPN completion availability

🚀 Deployment successful:
- Backed up original .zshrc
- Symlinked refined modular configuration
- Git hooks configured globally
- All scripts and configs linked

System now running with enhanced durability principles! 🎯

🤖 Generated with Claude Code (https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-27 14:05:56 +02:00
David F GliddenandClaude 546e43fc64 Refactor shell configuration following prime directive principles
🎯 Comprehensive refinement addressing durability and maintainability:

**Modular Architecture:**
- environment.zsh: Centralized environment variables with XDG compliance
- paths.zsh: Intelligent PATH management with existence checking
- aliases.zsh: Enhanced aliases with tool fallbacks and context awareness
- functions.zsh: Sophisticated functions with error handling and recovery
- .zshrc: Clean main config with graceful degradation

**Key Improvements:**
- ✅ Fixed PATH duplication and made portable
- ✅ Added graceful dependency handling throughout
- ✅ Enhanced vault/chamber/work context integration
- ✅ Comprehensive error recovery in sysupdate()
- ✅ Intelligent tool detection and fallbacks
- ✅ Performance optimizations for different shell modes

**Philosophy Applied:**
- μέτρον (measure): Right amount of features without bloat
- συμμετρία (proportion): Balanced modular structure
- πρόσφορον (fitting): Portable, maintainable, testable

**Testing:**
- Syntax validation for all modules
- Function loading verification
- Isolated test environment
- Ready for production deployment

🤖 Generated with Claude Code (https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-27 14:01:23 +02:00
David F GliddenandClaude 8bddc004a7 Add SSH key backup script and fix git config
- Copy actual .gitconfig instead of placeholder
- Create encrypted SSH key backup script with GPG
- Add SSH-based remote setup script
- Include restore instructions and security notes

🤖 Generated with Claude Code (https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-27 13:23:22 +02:00
David F GliddenandClaude 0838f1cf8c Initial commit: Complete macOS dotfiles system
🖖 Features:
- Master 'engage' script for one-command setup
- 120+ CLI tools via Homebrew
- 40+ Applications (casks + MAS apps)
- Complete macOS system configuration
- Security hardening and privacy settings
- Obsidian knowledge vault setup
- Comprehensive backup strategies
- Automated symlink management

Live long and prosper\! 🚀

🤖 Generated with Claude Code (https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-27 13:17:01 +02:00