From spine
Scans Spine vault at session start for Obsidian-style notes: auto-fixes broken wikilinks, missing tags, orphan docs; detects coverage gaps from recent git commits.
npx claudepluginhub nodewarrior/spine --plugin spineThis skill uses the workspace's default tool permissions.
Automatically scan the Spine vault for decay and coverage gaps. Auto-fixes low-risk issues, reports findings as a non-blocking banner.
Audits Spine Architecture Obsidian vault for coverage gaps via git history, stale docs, duplicates, spine note integrity, tag consistency, and Claude memory sync. Maintains vault hygiene.
Performs nightly Obsidian vault maintenance: detects broken wiki-links and orphan pages, syncs directory indexes, flags stale GitHub issues. Use for automated vault linting.
Performs extended vault cleanup: full audit plus stale content scan, outdated references, content quality review, redundant tags, broken external links, and template compliance. Ideal for messy Markdown vaults.
Share bugs, ideas, or general feedback.
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.