Vault

Vault Heartbeat — 2026-08-26

First recorded heartbeat. Structural pass clean after repair; tag layer went 35 discrepancies → 0; the skill’s own two checks were found buggy and fixed. This file is the baseline date for the next run’s incremental scope.

Links: vault-heartbeat skill, Vault manual, INDEX

Fixed this run

The skill was auditing with two broken checks

Both are now fixed in SKILL.md, and the deterministic checkers are saved as scripts so they stop being re-derived (and re-broken) each run:

Check Bug Fix
1.5c raw coverage Matched by filename only → flagged 75 of 194 source groups. Spot-checking four clusters (peikoff-hop-*, mcfadden-* battlezone/stellar7, all 8 wordwar-results-*, the hangman substack) found all four fully processed — pages cite by URL or under an unrelated page name. ~70% false-positive. Three passes: collapse sibling formats → match by URL → match by topic keyword. Report only what survives all three, and say which passes ran.
1g canary Flagged Claude Code’s own file-history/ backups and session .jsonl transcripts as violations. They match every token every run — turning a real invariant into noise trains the reader to ignore a genuine FAIL. Exclude generated state; check authored files only.
1c tags (added) Checked two sets, missing the ghost/missing split; counted tag links appearing anywhere in a page. Three-set check; a tag counts only inside the ## Tags section — body prose legitimately links tag files (CLAUDE.md’s example, the Dataview note) and counting those invents tags. Tag→tag “related” links excluded.

Correction — most of those checkers already existed, in tools/

The first version of this report claimed two new scripts, check.py and repair-tags.py. They were rebuilds. tools/ already held vault-graph.py (broken links + ledger reciprocity + orphans), vault-tagindex.py (derive tags/<tag>.md from each page’s ## Tags), tag-counts.py (recompute _index.md counts), vault-fix-links.py, and vault-backlinks.py — all indexed in tools/README.md, all implementing author-web-derive-hierarchy’s derive, never hand-maintain rule. /vault-sync already routed to tag-counts.py.

The rebuilds were worse: mine appended bare - [Title](path) back-links where vault-tagindex.py preserves curated one-liners, and when the real tools were finally run they found live drift mine had just declared clean (tags/debates.md +3, tags/epistemology.md +1, two counts off). Both were deleted; the residual drift was fixed with vault-tagindex.py --write then tag-counts.py --write.

Root cause, and it is the vault’s own predicted failure mode: tools/README.md was a good index — this skill just never pointed at it (grep -c "tools/" on the heartbeat SKILL returned 0). A capability nothing routes to is unfindable, and unfindable capability gets rebuilt. Fixed in both directions: the heartbeat now opens with a “read tools/README.md first” block, and tools/README.md now names its consumer skills. Reuse requires findability — protect the meta-tool.

Kept: .claude/skills/vault-heartbeat/scripts/heartbeat-checks.py, reduced to the two checks tools/ genuinely lacks — raw-coverage pass 1, and the tag-ghost direction vault-tagindex.py leaves alone (it prunes entries whose target is gone, not ones whose target still exists but stopped declaring the tag).

The section rule caught its own predecessor’s mistake. My looser first pass added game-theory back-links for wilson-christians-right-to-rule and wilson-rights-dont-exist-only-force; under the correct rule those are deliberate inline cross-references in body prose (“the convention/procedure layer”), not tag declarations. Both reverted. Whether those two pages should carry game-theory is a content judgment left for Chris — see Open Questions.

Still open (not actioned)

Clean

INDEX.md 407 relative links / 0 broken · canary placement PASS (each token = kernel table + its own layer file) · index-drift gate healthy (48 firings Jun 5 / Jul 25 / Aug 18, zero pages still unindexed — every nudge actioned, no /vault-sync sweep needed) · provenance clean on all 20 pages changed since 2026-08-23 · no open PRs across 14 repos.

Scope

Audited: full structural pass (links vault-wide, stubs, tags, bloat, drift log, canary) + semantic pass on all 20 pages changed since 2026-08-23 + topic-verification of 20 raw clusters. Not audited: cross-cluster contradiction detection (1.5b) and the rotating ~10-page older sample — no prior heartbeat report existed, so there was no baseline date to diff from. This file supplies it for next time.

Open Questions

(both resolved same-day, 2026-08-26 — kept here as the record of what was decided and why)

Tags

methodology · workflow · tools