From zkfy
Semantic health checks for the Obsidian ZK vault. Detects contradictions between notes, stale content, orphan pages, missing pages, weak links, concept gaps, and cross-reference gaps. Use when the user asks to "lint the vault", "check vault health", "find contradictions", "find orphans", or "what's missing". Goes beyond structural compliance (vault-audit) to check semantic coherence.
npx claudepluginhub jasonsie/zkfy --plugin zkfyThis skill uses the workspace's default tool permissions.
Detect contradictions, staleness, orphan pages, missing pages, weak links, concept gaps, and cross-reference gaps across the Obsidian ZK vault. Complements `vault-audit` (structural compliance) with semantic coherence checks.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Detect contradictions, staleness, orphan pages, missing pages, weak links, concept gaps, and cross-reference gaps across the Obsidian ZK vault. Complements vault-audit (structural compliance) with semantic coherence checks.
$ARGUMENTS — <path> [--fix] [--checks 1,2,3] [--vault PATH]
333.ai/, . for entire vault). — current working directory, i.e., run from inside your vault)| # | Check | Severity | Auto-fixable |
|---|---|---|---|
| 1 | Contradictions | HIGH | No |
| 2 | Stale content | MEDIUM | No |
| 3 | Orphan pages | MEDIUM | No |
| 4 | Missing pages | HIGH | No |
| 5 | Weak links | LOW | Yes |
| 6 | Concept gaps | MEDIUM | Yes |
| 7 | Cross-ref gaps | LOW | Yes |
Run note-scanner on the target path to get full inventory JSON:
python3 .claude/skills/note-scanner/scripts/note_scanner.py <target_path>
Parse the JSON output. Extract notes[] array — each entry provides path, filename, frontmatter, outgoing_links, and line_count.
For each enabled check (1-7), execute the check method and collect findings as structured data:
{check_id, severity, note_path, detail, fixable}
For each note, read the ### Abstract and key claims in ### Content. Compare against notes referenced in its ### Links section and notes sharing the same Sub-Categories.
Flag conflicting statements about the same concept — e.g., one note claims "SSR improves SEO" while a linked note claims "SSR has no SEO benefit".
Method:
Sub-Categories or appear in each other's ### Links, compare claimsNot auto-fixable — requires human judgment to resolve which claim is correct.
Notes with Date older than 6 months AND newer notes exist with overlapping Sub-Categories.
Method:
Date from each note's frontmatterSub-Categories have a newer DateNot auto-fixable — staleness requires human review to determine if content is still accurate.
Notes with 0 incoming links — no other note in the vault references them.
Method:
.md extension), grep the entire vault for [[Filename-Without-Extension]]# For each note, check incoming links:
Grep pattern: \[\[{Note-Name}\]\]
Path: {vault_root}
Glob: **/*.md
Not auto-fixable — orphans may need to be linked, merged, or deleted depending on content.
WikiLink targets that don't exist as files in the vault.
Method:
[[WikiLinks]] from note bodies across scanned notesBefore, Next, and Src fields — these are navigational{target}.md exists anywhere in the vault# For each collected target:
Glob pattern: **/{target}.md
Path: {vault_root}
Not auto-fixable — missing pages may be typos, planned notes, or intentional references to external concepts.
Notes with fewer than 2 outgoing links in their ### Links section (not counting Before/Next/Src frontmatter links).
Method:
### Links section of each note[[links]] that have rationale text nearby (e.g., "Related to [[X]] because...")Auto-fixable with --fix:
vault-search skill to find related notes based on the note's Sub-Categories and ### Abstract### Links sectionConcepts referenced frequently across notes but with no dedicated note file.
Method:
[[WikiLink]] targets across scanned notes.md file in the vaultAuto-fixable with --fix:
Type: literature, current Date, inferred Categories and Sub-Categories### Abstract section containing: "Stub -- needs dedicated note. Referenced by N notes."### Content section left empty### Links section with backlinks to the top 3 referencing notesNotes sharing the same Sub-Category that don't link to each other.
Method:
Sub-Categories values[[WikiLinks]]Sub-Category but have no cross-referenceAuto-fixable with --fix:
### Links section of both notesOnly runs when --fix flag is provided. Only checks 5, 6, and 7 are auto-fixable.
For each fixable finding:
vault-search to find related notes, add suggested links with rationale to ### Links### Links sections of both notes in the pairAfter auto-fixes, re-run the affected checks to confirm resolution.
Output grouped by severity:
## Vault Lint: {path}
Scanned: {N} notes | Checks run: {check_ids}
### HIGH
[Check 1] Contradiction: CS-SSR-Basics.md vs Web-CSR-Performance.md
CS-SSR-Basics.md claims "SSR always improves TTI"
Web-CSR-Performance.md claims "CSR with code-splitting matches SSR TTI"
[Check 4] Missing page: [[React-Suspense]] referenced by 3 notes
- Web-React-Server-Components.md
- Web-React-Performance.md
- Web-React-Streaming-SSR.md
### MEDIUM
[Check 2] Stale: Web-jQuery-Patterns.md (Date: 2024-03-15, superseded by Web-Modern-DOM-API.md)
[Check 3] Orphan: CS-Assembly-Basics.md (0 incoming links)
[Check 6] Concept gap: [[Event-Loop]] referenced 5 times, no dedicated note
### LOW
[Check 5] Weak links: AI-Transformer-Architecture.md (1 outgoing link in Links section)
[Check 7] Cross-ref gap: CS-Binary-Search.md <-> CS-Algorithm-Complexity.md (shared: algorithm-analysis)
---
Summary: {H} HIGH | {M} MEDIUM | {L} LOW | {F} auto-fixed
Empty directory: Report "No notes found in {path}" and exit.
--checks with invalid numbers: Ignore invalid check numbers, warn the user, run valid ones.
--fix without fixable issues: Report "No auto-fixable issues found" in the summary.
Large vault (whole-vault scan): Process in batches by top-level directory (111.cs/, 222.web/, etc.) to manage context. Report per-directory then aggregate.
Notes without frontmatter: Skip checks that depend on frontmatter fields (2, 7). Still run checks 1, 3, 4, 5.