From spine
Scans Spine vault for broken wikilinks and missing tags at session start. Auto-fixes low-risk issues and reports coverage gaps from recent commits.
How this skill is triggered — by the user, by Claude, or both
Slash command
/spine:spine-scanThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Automatically scan the Spine vault for decay and coverage gaps. Auto-fixes low-risk issues, reports findings as a non-blocking banner.
Automatically scan the Spine vault for decay and coverage gaps. Auto-fixes low-risk issues, reports findings as a non-blocking banner.
Before doing anything, check if Tier 3 is enabled:
~/.spine/config.jsontier3 fieldtier3 is false or missing, skip silently — do not scan, do not print a banner, do nothing.This skill only runs when the user has opted into Tier 3 autonomous behavior.
Resolve the vault path using this config chain:
$SPINE_VAULT_PATH environment variable~/.spine/config.json → read the vaultPath field~/Documents/SpineVault/If no vault is found, or the vault directory doesn't exist, skip silently — no banner, no output contract, nothing. Not every repo uses Spine. The output contract is only emitted when the scan actually runs.
basename "$(git remote get-url origin 2>/dev/null)" .git
Fall back to the current directory name if no git remote. If {vault}/{repo}/ doesn't exist, skip silently — this repo isn't tracked by Spine.
Scan the vault for mechanical issues and fix them silently. Log every action to {vault}/.spine/curator-log.md.
Ensure {vault}/.spine/ directory exists before writing.
Before reading each file for auto-fix analysis, record its modification time and file size (size catches same-second edits on filesystems with only second-resolution timestamps). Before writing the fix back:
**Skipped:** \{file}` — modified by another process during scan`This prevents overwriting concurrent edits from Obsidian, Obsidian Sync, or parallel sessions. The dual check (mtime + size) handles HFS+/ext4 second-resolution timestamps where a sub-second edit would otherwise be invisible.
For each markdown file in {vault}/{repo}/:
[[wikilinks]] in the file content**Auto-fixed:** Broken wikilink in \{file}` → `[[{corrected}]]``For each markdown file in {vault}/{repo}/ (skip spine notes):
type/* tag from the filename:
Fix - → type/fixFeature - → type/featureArchitecture - → type/architecturePlan - → type/planDecision - → type/decisiontags array contains the expected type/* tag**Auto-fixed:** Missing \{tag}` tag on `{filename}``For each feature folder in {vault}/{repo}/:
{Feature}.md with type/spine tag)[[wikilink]] in the spine notetype/fix → ## Fixestype/feature → ## Featurestype/architecture → ## Architecturetype/plan → ## Planstype/decision → ## Decisions**Auto-fixed:** Orphan doc \{filename}` linked into `{spine-note}``For each doc in {vault}/{repo}/ that has a **Files changed:** section:
git ls-files -- {filepath}
obsolete: true in frontmatter. Do NOT also set stale.stale: true and add a removed_files list to frontmatter.git log --oneline --since="{doc-date}" -- {filepath}. If 3+ commits, set stale: true.**Flagged obsolete:** \{doc}` — all referenced files removed from repo (feature likely deleted)`**Flagged stale:** \{doc}` — `{filepath}` removed from repo (partial)`**Flagged stale:** \{doc}` — `{filepath}` has {N} commits since doc date`Important: Never auto-delete or archive obsolete docs — only flag them. The user decides what to do.
Find significant commits that have no corresponding Obsidian doc.
{vault}/.spine/last-scan-timestamp
{vault}/.spine/pending-commits.json for any leftover commits from abrupt session endsgit log --oneline --since="{last-scan-timestamp}" in the current repo^(style|lint|chore|docs|merge)Print a single non-blocking summary. Do NOT ask for input or wait for a response.
Format:
🦴 Spine: {N} commits since last session — {fixes summary} (auto). {gaps summary}.
Include obsolete/stale flags in the summary if any were found:
Examples:
🦴 Spine: 5 commits since last session — 2 wikilinks fixed, 1 tag corrected (auto). 2 coverage gaps (auth, payments). Run /spine-capture when ready.🦴 Spine: No new commits. 1 orphan doc linked (auto). Vault is healthy.🦴 Spine: 3 commits since last session. No issues found. Vault is clean.🦴 Spine: 4 commits — 1 doc flagged obsolete (TradeIn feature removed?): \2026-03-12 Feature - TradeIn Flow.md`. Review with /spine-health.`🦴 Spine: 2 commits — 2 docs flagged stale. Vault mostly healthy.If there are zero commits and zero issues, either print 🦴 Spine: Vault is clean. or skip the banner entirely.
Check {vault}/.spine/last-health-timestamp. If the file doesn't exist or the timestamp is older than 14 days, append a reminder to the banner:
Last full health check: {N} days ago — consider running /spine-health.
Examples with the reminder:
🦴 Spine: Vault is clean. Last full health check: 18 days ago — consider running /spine-health.🦴 Spine: 2 wikilinks fixed (auto). 1 coverage gap (auth). Last full health check: 21 days ago — consider running /spine-health.If the last health check was within 14 days, do not mention it.
After the human-readable banner, emit a structured observation block. This is the contract that downstream skills (especially /spine-capture --batch) rely on.
spine_scan_result:
status: success | warning | error
summary: "5 commits since last session — 2 wikilinks fixed, 1 coverage gap"
auto_fixes:
- { type: "wikilink", file: "Auth/Login.md", detail: "[[Logn]] → [[Login]]" }
- { type: "tag", file: "2026-04-10 Fix - Cache Bug.md", detail: "added type/fix" }
- { type: "orphan", file: "Architecture - API Layer.md", linked_to: "API.md" }
stale_docs:
- { file: "2026-03-18 Fix - Session Bug.md", reason: "session.hook.ts has 5 commits since" }
obsolete_docs:
- { file: "2026-03-12 Feature - TradeIn Flow.md", reason: "all referenced files removed" }
coverage_gaps:
- { feature: "auth", commits: 3, files: ["src/auth/login.ts", "src/auth/session.ts"] }
next_actions:
- { action: "/spine-capture", reason: "1 undocumented feature group" }
- { action: "review obsolete", file: "2026-03-12 Feature - TradeIn Flow.md" }
recovery_hint: null
Status values:
success — scan completed, no issues foundwarning — scan completed, issues found (gaps, stale, obsolete)error — scan failed (vault missing, git error, etc.) — include recovery_hintCross-skill handoff: Write coverage gaps to {vault}/.spine/scan-gaps.json so /spine-capture --batch can pre-populate drafts without re-scanning. Delete this file after capture consumes it.
Write the current ISO timestamp to {vault}/.spine/last-scan-timestamp:
2026-04-19T14:30:00Z
Append a dated section to {vault}/.spine/curator-log.md (create the file from templates/curator-log.md if it doesn't exist). Newest entries at the top of the file (prepend, don't append).
## {YYYY-MM-DD} — Session Scan
- **Auto-fixed:** {description of each fix}
- **Flagged obsolete:** `{doc}` — all referenced files removed from repo (feature likely deleted)
- **Flagged stale:** {description of each stale doc}
- **Coverage gap:** {description of each gap}
If no actions were taken, do not add an entry.
npx claudepluginhub nodewarrior/spine --plugin spineScans an Obsidian vault for coverage gaps, stale docs, duplicates, missing spine links, tag inconsistencies, and out-of-sync memory signposts. Helps maintain vault hygiene.
Runs nightly vault maintenance: fixes broken wiki-links, detects orphan pages, syncs directory indexes, and flags stale GitHub issue tasks.
Validates Meta-Vault Markdown frontmatter and wiki-link integrity. Runs as a session-end gate, blocking close on errors. Supports hard, warn, and off modes.