IDENTITY: Auditor.VaultHygiene. ArchitectureReview➔StructureMap➔SignalScan➔PriorityTriage➔KanbanDecompose. Law: NeverDeleteWithoutReading.NeverAssumeVaultRoot.AlwaysPhase0First. WHENUSE: User says audit/cleanup/reorganize/spring-clean vault|Structural drift|Clutter accumulation. ESPECIALLY:DualWikiArchitecture|IcarusAccretion|OversizedIndexes. NoSkip:Phase0ArchitectureReview|CaseInsensitiveDuplicates|VaultRootVerification. REDFLAGS: DeleteBeforeRead->SampleOrReadFirst|CaseDupOnAPFS->CheckWithStat|KanbanWorkerCrash->CheckEventLogBeforeRedispatch|WikiExtractNoContext->CrossReferenceExistingPages. RATIONALIZATIONS: AllSessionFilesJunk->AgentDecisionsAreHighSignal|FastBulkCleanup->Phase0ArchitectureFirst|KanbanAlwaysWorks->ScriptableOpsBetterInNoAgent. QUICKREF: Phase0(ArchitectureReview{container/wikis/pipeline/drift})➔Phase1(MapStructure)➔Phase2(ScanSignal{icarus/duals/oversized/untitled/empty/datedirs/zerobyte})➔Phase3(Prioritize{P1/P2/P3/P4})➔Phase4(KanbanDecompose)➔Phase5(Verify).
Obsidian Vault Audit
When This Skill Activates
Run this when the user asks to:
- Audit, clean up, or reorganize their Obsidian vault
- "Look through my Obsidian brain"
- "Consolidate, organize, rename, clean up" the vault
- Check for clutter, duplication, or structural problems
- "Spring clean" their notes
Scan Pattern
Phase 0 — Knowledge Architecture Review (Pre-Scan)
Before running file-level scans, step back to assess whether the vault structure is serving its purpose. This phase answers strategic questions that inform the cleanup priorities. See references/knowledge-architecture-review.md for the full checklist and worked examples.
Key framing: The vault is the "second brain" — the agent stores the LLM-Wiki, operational notes, and Fabric entries here. Mnemosyne handles hot auto-injected facts; Obsidian holds everything else. Don't treat it as just a human notebook.
When to run Phase 0 instead of skipping to Phase 1:
- User asks about "how the brain is organized" or "how things are broken up"
- Vault has multiple wikis or knowledge bases
- Vault structure has accumulated organically over months
- User wants to discuss improvements, not just cleanup
- First time auditing this vault
Step 1 — Container audit
Check which containers are active vs archived. Note: PARA structure (0-Inbox, 1-Projects, etc.) was archived on 2026-05-21. Current active structure is: llm-wiki/, icarus/, 3-Resources/, 4-Archive/, Trade Tracking/.
| Container | Health check |
|---|---|
llm-wiki/ |
Is it populated? Are pages cross-linked? Is index.md current? |
icarus/ |
How many files? Are they mostly agent-session-task (low signal) or agent-decision (high signal)? |
3-Resources/ |
Is this still active or should it be archived? (As of 2026-05-27, it still exists despite being "archived") |
4-Archive/ |
What accumulated? Is it properly categorized? |
notes/ |
Does this directory exist? (It should — for quick agent captures) |
Step 2 — Wiki architecture assessment (for vaults with dual wikis)
Compare wikis side by side:
Purpose Content Schema Health
Wiki A: <knowledge> <N pages> <style> <active|stale|empty>
Wiki B: <operational> <N pages> <style> <active|stale|empty>
Questions to answer:
- Do the wiki purposes overlap? If yes, merger candidate.
- Does one schema reference concepts from the other? (e.g., Team-Wiki tags referencing LLM-Wiki conventions)
- Is one thriving and the other empty? → investigate why (never started? abandoned? superseded?)
- Compare tag taxonomy overlap — same concepts tagged differently?
- Cross-check: do wikilinks exist between the two wikis?
Step 3 — Pipeline flow audit
Track the content lifecycle: External input → Inbox → wiki/project → Archive
Identify where content gets stuck:
- icarus files never promoted to wiki pages
- Inbox items sitting for weeks
- Project notes created but never updated
- Wiki pages created but never cross-linked
High-signal pattern: when icarus/ has 10+ agent-decision files but the wiki has no corresponding pages, that's a curation opportunity.
Step 4 — Icarus curation opportunity assessment
Count and categorize icarus entries by filename pattern:
| Tier | Pattern | Signal | Recommended action |
|---|---|---|---|
| HIGH | agent-decision-*.md |
Decisions, architecture choices, approved plans | Extract key facts → promote to wiki |
| MEDIUM | agent-research-*.md |
Research briefs, findings, recommendations | Evaluate for wiki inclusion |
| LOW | agent-session-*.md |
Session logs, cron reports, audit records | Archive or leave in place |
Step 5 — Architectural drift check
Compare actual structure against any documented plan:
- AGENTS.md or SCHEMA.md files describing intended structure
- Previous session descriptions of vault layout
- Folder names referenced in plans but missing from the filesystem
- Folders existing unreferenced (structural orphans)
- Conventions that diverged (naming patterns, tag formats, frontmatter fields)
Output: A summary delivered before moving to Phase 1:
Vault architecture at a glance:
• PARA status: Inbox empty, Projects partial (n/N active workstreams covered), Archive has X items needing triage
• Wiki architecture: <dual|single> — Wiki A is <state>, Wiki B is <state> — <recommendation>
• Pipeline: Content flowing through Inbox→Wiki? <yes|no> — icarus has X promotable entries
• Drift: <conventions intact|minor drift|structural drift detected>
Phase 1 — Map the structure
# Full directory layout (3 levels deep, no hidden dirs)
find "$VAULT" -maxdepth 3 -not -path '*/\.*' -type d | sort
# All markdown files
find "$VAULT" -maxdepth 3 -name "*.md" | sort
# All non-md files at root level
ls -p "$VAULT" | grep -v /
# Empty directories
find "$VAULT" -type d -empty -not -path '*/\.*'
Do NOT use the terminal for this — use search_files(target='files') and read_file instead. Terminal is for batch operations only.
Phase 2 — Scan for signal issues
Use this checklist. For each item, the operations list what tools to use:
| # | Signal | How to detect |
|---|---|---|
| 1 | icarus clutter | Count files in icarus/ — if >20, most are likely auto-generated session-task files |
| 2 | Dual/conflicting folder pairs | Look for: Archive+Archived, multiple wiki folders (llm-wiki+LLM-Wiki), similar names |
| 3 | Oversized single files | wc -l on any index/aggregation file — flag if >300 lines |
| 4 | Untitled files | find "$VAULT" -name "Untitled*" — Obsidian creates these when you open without a file |
| 5 | Empty structural dirs | PARA structure that was never populated: empty Guides/, Workspace/, To-Dos/, etc. |
| 6 | Date directories vs flat files | find "$VAULT" -type d -name "????-??-??" — daily notes should be flat, not wrapped in a folder |
| 7 | Parse errors / corrupt files | find "$VAULT" -name "*.md" -size 0 — zero-byte files |
| 8 | Fabric split | Check if ~/fabric/ and the vault's icarus/ are separate directories. If FABRIC_DIR doesn't point into the vault, Fabric entries are split across two locations. Consolidation target: FABRIC_DIR → vault's icarus/. |
| 9 | Dual wiki directories | Check if WIKI_PATH env var points to a different path than the vault's wiki dir, indicating a split |
| 10 | Skill vs vault duplication | Compare 3-Resources/Skills/ content with ~/.hermes/profiles/senna/skills/ |
Phase 3 — Categorize by priority
Use this severity scale:
- 🔴 P1 — Clutter that actively degrades navigation (hundreds of files, duplicates, broken structure)
- 🟠 P2 — Bloat (oversized files, skill-vault redundancy)
- 🟡 P3 — Hygiene (empty dirs, untitled files, naming inconsistencies)
- 🟢 P4 — Polish (convention drift, like a date-folder vs flat daily note)
Phase 4 — Decompose into kanban tasks
Use the kanban-orchestrator pattern:
- Create one task per priority group (not per issue — keep the board manageable)
- Assign P1-P2 as independent tasks, P3-P4 can be bundled
- Set body with: what to scan, what actions to take, what to leave alone
Task body template:
Vault path: <path>
Issue: <description>
Plan:
1. Read affected files/dirs
2. For each: determine keep/archive/delete/merge
3. Document findings in a task comment or log
4. Archive drift to 4-Archive/ when in doubt
Options (if branching):
A) <option 1>
B) <option 2>
C) <option 3>
Phase 5 — Post-cleanup verification
After all kanban tasks complete (or you handle them directly):
# Verify empty dirs are gone
find "$VAULT" -type d -empty -not -path '*/\.*'
# Re-count all files
find "$VAULT" -name "*.md" | wc -l
# Spot-check icarus/
ls -la "$VAULT/icarus/" | wc -l
# Spot-check Sessions/
ls "$VAULT/Sessions/" 2>/dev/null || echo "Sessions/ removed"
Weekly Summary Pattern
For recurring cron-based vault health checks (new/modified notes, attention items, wikilink graph stats), use references/vault-weekly-summary.md. This is a lighter pass than the full audit — stats and highlights, not cleanup decomposition.
Common Cleanup Patterns
Fabric split consolidation
When Fabric tools write to ~/fabric/ but the vault has its own icarus/:
- Check
FABRIC_DIRenv var — where does it point? - If it points to
~/fabric/(not the vault), the entries are split - Merge
~/fabric/contents into the vault'sicarus/(skip duplicates) - Update
FABRIC_DIRto point to the vault'sicarus/ - Verify:
fabric_write+fabric_recallstill work after change
icarus triage
icarus/ content falls into 3 tiers:
- agent-decision-*.md → HIGH signal — decisions worth keeping
- agent-session-*.md (non-task) → MEDIUM — cron, research session records
- agent-session-task-*.md → LOW — auto-generated audit records, safe to archive
For decisions: read each, check if knowledge is already in LLM-wiki.
If not, extract key facts → create wiki concept page.
Archive session-task files to 4-Archive/Icarus-Sessions/.
Skill Index split
When 3-Resources/Skills/Skill Index.md exceeds 300 lines:
- Read the file to understand its structure
- Split into one
*-Index.mdper category subdirectory - Create a main
Skill Index.mdthat serves as a category directory with[[wikilinks]]to each per-category index - Each per-category index lists skills in that category with descriptions
Sessions consolidation
When Sessions/ has Active/, Archive/, and Archived/:
Archive/andArchived/are the same thing — pick one convention- Move
Active/session files intoicarus/(they're session records) - Remove
Sessions/entirely — session handling has moved to icarus pattern
Daily note normalization
When daily notes are split (vault's Daily Notes/ vs icarus/daily/):
- Move
icarus/daily/*.mdintoDaily Notes/ - Check for date-directories (folders named
2026-04-25/) — convert to flat2026-04-25.md - Remove
icarus/daily/directory
Untitled files cleanup
find "$VAULT" -name "Untitled*" -type f
# For each: read content. If empty/blank, delete.
# If has content, rename meaningfully or triage to Inbox.
Pitfalls
- Case-insensitive filesystem trap: On macOS APFS,
llm-wiki/andLLM-Wiki/are the same directory. Always check withstatbefore assuming they're duplicates. - Don't delete what you didn't read: Always sample or read files before mass-archiving. Some "low-signal" files may contain the only record of a decision.
- Shared state: The
icarus/directory is written to by agents. Any cleanup you do may be partially undone by the next agent cycle. That's OK — periodic cleanup is expected. - Wiki extraction needs user context: When moving icarus decisions to the wiki, check if the wiki already has the concept before creating a new page. Cross-reference existing pages.
&in filenames: macOS allows&in filenames. Shell-escape with\&when usingcp/mv. Preferread_file+write_filefor these.- Kanban protocol_violations may be benign: Workers sometimes crash on simple file ops while succeeding on the harder work. Check the task's event log and comment thread before re-dispatching — the work may already be done.
- Always verify the vault root: The vault may be nested (e.g.
Hermes Vault/Hermes/notHermes Vault/). Always resolve via.obsidian/orOBSIDIAN_VAULT_PATH.
Verification
After cleanup:
- Every
Untitled*file accounted for (renamed, moved, or deleted) - No dual
Archive+Archivedfolders -
icarus/count ≤ 20 files -
Daily Notes/all flat.mdfiles, no date-folders -
Sessions/removed (content merged into icarus/) - Oversized index files split to < 50KB each
- Wiki page count updated in index.md
- Vault still opens cleanly in Obsidian (no broken wikilinks introduced)