§ 1 · The shape of it
What is Mycelium?
Mycelium is a memory framework for working with an AI over time. It is not an app. It is a small set of conventions, written into your own files, that let an AI you trust pick up a session where the last one ended — and the one before that.
The idea is older than this implementation. A persistent memory shouldn't live inside a vendor's product, behind their account, at the mercy of their roadmap. It should live in your hand — in plain text, in folders you already understand, on a disk you already own. When the AI joins a session, it reads the files. When it leaves, the files remain.
What Mycelium adds to that idea is a protocol — a small grammar of folders, frontmatter, and trigger phrases — and a runtime that an AI loads to know how to behave inside it. The runtime is called Spore. The current version is 0.8.0. The vault you point at is the substrate. Obsidian's CLI is how the AI reads and writes to it without breaking the structure.
v0.8.0 is the lean release
This version strips the framework of weight that wasn't earning its keep. The Network Layer (cross-vault sharing, peers, collaborators, guests) was carried in every version since v0.4.x without ever being activated — gone. The framework/user folder split (`System/User/`) solved a problem the vault didn't have — gone. `internal` personaMode was dead code — gone. `authorID` had no real customer in a single-user vault — gone. `Archive/` at vault root sat semantically wrong next to owner content categories — folded into `System/Archive/`.
The toolset goes from 13 tools to 12 (Tool 3 was Network Layer; everything below shifts up by one). The runtime drops 4 "Never Do" rules. The user-facing surface gets smaller without losing capability.
The lean release. v0.8.0 doesn't add. It removes. Every change is a deletion or a clarification. If you used v0.7.1, you know how to use v0.8.0 — there's just less of it.
The metaphor, briefly
A mycelium is the underground network of a fungus — patient, slow, and lateral. The fruiting body you see above ground is the smallest visible part. The work happens beneath. So with this: the conversation is the visible part; the durable memory beneath it is the network. Each note is a node. Each session adds a few more.
Three layers, externalised
Spore separates concerns into three layers, each owning what it should and nothing more:
- Runtime — the small file that tells the AI how to read, write, and behave. It's the hot path. Loaded every session. Smaller in v0.8.0.
- Toolset — the procedure library. Twelve tools in v0.8.0. Read on demand, not on boot.
- Persona — who you are, who the AI is, how you work together. Lives outside the vault, shared across all your Mycelium vaults. The AI's voice and the working relationship don't reset every time you start a new project.
§ 3 · First contact
What the installer creates
A fresh v0.8.0 install draws the smallest viable vault around you. Less than v0.7.1 — the lean release applies at install time too. Here's what lands where, and why each thing exists.
You paste one file
The installer is a single Markdown file: _MyceliumInstaller-v0.8.0.md. You paste it into a fresh AI session pointed at an empty vault folder. It asks you three questions — your name, the AI's name, what the vault is for — and from there it builds the foundation.
When it's done, it tells you what it installed and self-destructs. The build artefacts (Design, README, this user guide) stay behind in Projects/Spore-v0.8.0/ as documentation.
The shape of a fresh vault
../
├── MyceliumPersonas/ — external persona layer (parent dir)
│ ├── Owner/
│ │ └── [YourName].md — your profile, voice, working preferences
│ └── AI/
│ └── [AIName].md — the AI's identity, voice, the relationship
│
└── YourVault/ — this is the vault
│
├── _Spore-v0.8.0.md — the runtime (read every session)
├── _Spore-VMD-Toolset.v0.8.0.md — the procedure library (12 tools)
│
├── System/ — framework-managed state
│ ├── VaultIdentity.md — canonical vault state, IDs, version
│ ├── Archive/ — canonical archive (NEW location in v0.8.0)
│ └── Snapshots/ — Tool 12 forensic snapshots
│
├── Contacts/ — renamed from People/ in v0.8.0
├── Inbox/ — owner deposit area (NEW in v0.8.0)
│
├── Projects/
│ └── Projects-Overview.md — active project navigation
│
├── Sessions/
│ └── Sessions-Overview.md — session schema reference
│
└── Technical/
└── Technical-Overview.md — vault architecture entry point
Why each thing is here
The two root files
_Spore-v0.8.0.md is the runtime — the AI reads it first every session. _Spore-VMD-Toolset.v0.8.0.md is the procedure library — the AI reads it on demand. Both live at vault root because they're framework files, not vault content. Only these two (and any future upgrade file) are allowed at vault root. Anything else gets placed inside a category folder.
System/VaultIdentity.md
The single source of truth for vault state. v0.8.0 schema is leaner: vault's MYC- ID, your owner ID, the AI's name, the vault's name (used for CLI scoping), personaDir, Spore Version, upgradedAt. Removed in v0.8.0: Protocol Version, personaMode, collaborationEnabled, networkStatus — all Network Layer concerns.
System/Archive/ (new location)
Canonical archive destination. Tool 1's Archive Pattern populates subcategories (`Clients/`, `Projects/`, `Decisions/`, `Discards/`, `Spore-Versions/`, `Upgrades/`) on first use. Empty at install. Symmetric with System/Snapshots/. Moved from vault root in v0.8.0 — `System/` is now consistently framework-managed state.
System/Snapshots/
Empty at install. Tool 12 (Vault Snapshot) writes timestamped JSON snapshots here before risky operations. Forensic record, not a registry.
Contacts/ (renamed from People/)
For people-references — clients, contacts, anyone in your professional or personal world referenced in vault content. Empty at install. Subfolders earned, not pre-allocated. Renamed from `People/` in v0.8.0 — better fit for a knowledge-vault folder of people-references; "People" inherited from the Network era when collaborators were peer entities.
Inbox/ (new in v0.8.0)
Owner deposit area. Drop media, documents, drafts, exports, anything awaiting ingestion. Files in `Inbox/` are pre-vault — exempt from vmdId and summary frontmatter requirements. Tool 10 (Schema Validator) skips Inbox/. Tool 1 (Audit) skips it for frontmatter and coverage checks. When you triage a file out of Inbox into a category folder, schema obligations apply on arrival.
Projects, Sessions, Technical — and their overviews
Three category folders, each with a single overview file. Overviews are earned — a category only gets one if it adds navigation or context beyond what Obsidian's MetadataCache already exposes. Inbox and Contacts are not required to have overviews.
What v0.8.0 does not create. No System/User/ (M013 retired). No People/ (renamed to Contacts). No Archive/ at vault root (moved into System/). No System/VMD-Index.json (retired since v0.7). No Network/, System/Collaborators.md, or System/GuestRegistry.md (Network Layer removed).
Registering with Obsidian
The installer creates the folder structure. You point Obsidian at it. The installer's last step asks you to confirm the vault is now visible in Obsidian's vault list — without that, the AI can't run substrate queries. From then on, opening a session means: open Obsidian, make this vault the active vault, paste _Spore-v0.8.0.md into a fresh AI conversation.
§ 4 · Boot sequence
Activating a vault
Activation is what happens when you open a fresh AI conversation and paste the runtime. Deterministic sequence — bootstrap check, read order, handshake. By the time the AI says hello, it knows who you are, what the vault is, and where you left off last time.
How you start
Three preconditions, every session:
- Obsidian is open.
- Your Mycelium vault is the active vault in Obsidian (top-left vault picker).
- The
obsidian CLI is on your PATH. Test: obsidian version succeeds.
Then: open a fresh conversation in your AI, point it at the vault folder, paste _Spore-v0.8.0.md as the first message. That's the activation trigger.
The bootstrap check
Before reading anything substantive, the AI verifies the substrate:
| State | Action |
obsidian CLI not on PATH | CRITICAL — install Obsidian 1.12+ and confirm |
| Obsidian app not running | CRITICAL — surface, do not proceed |
| Active vault is not this Mycelium vault | WARN — switch active vault before continuing |
VaultIdentity exists, version is 0.8.0 | Normal session load |
| VaultIdentity exists, version is older | CRITICAL — run _SporeUpgrade-v*.md |
| No VaultIdentity | CRITICAL — run _MyceliumInstaller-v0.8.0.md |
Read order
If bootstrap passes, the AI reads in this order — non-negotiable, declared by the runtime:
- The Spore runtime itself — already pasted as the first message.
System/VaultIdentity.md — for personaDir.
- 2b. Verify personaDir. Resolve relative to the vault root file location. If the directory cannot be confirmed: STOP. Surface the resolved path that failed.
- Owner persona file (resolved from VaultIdentity).
- AI persona file (resolved from VaultIdentity).
Projects/Projects-Overview.md.
- 5b. Overview Currency Check. Query
obsidian vault=<vaultName> properties name=referencesState for state-referencing files. Run Tool 5 against each. If drift detected, surface to owner before handshake.
- 5c. Capture vault name. Extract
Vault Name from VaultIdentity. Hold as the session-local <vaultName>. Every subsequent CLI invocation passes it.
- Most recent
Sessions/ file.
- Topic-relevant overviews on demand.
- Ask owner whether to do a deep dive before starting.
The handshake
When read order completes, the AI renders the splash and a single line of acknowledgement:
__ __ _ _
| \/ |_ _ ___ ___| (_)_ _ _ __ ___
| |\/| | | | |/ __/ _ \ | | | | | '_ ` _ \
| | | | |_| | (_| __/ | | |_| | | | | | |
|_| |_|\__, |\___\___|_|_|\__,_|_| |_| |_|
|___/ v0.8.0
VMD loaded. Running Spore-v0.8.0. Last session: [date] — [one line summary]. Ready to continue. What are we building today?
From here you're in a session. The AI has loaded who you are, who it is, the state of the vault, and the thread of last time.
§ 5 · In flight
Running a session
A session is the time between the handshake and the closing commit. The AI is reading the substrate, writing into it, and asking you to confirm anything that would otherwise rot. The discipline isn't elaborate — it's just consistent.
The shape of the work
Mycelium nodes are atomic — one concept per file. New thinking lands in a new file with a clear name; existing thinking gets updated in place rather than duplicated. (Owner-2.md is always wrong.) Every .md file outside Inbox/ carries two pieces of frontmatter: vmdId (a MYC- prefixed identifier) and summary (a single sentence that distinguishes this node from others).
What earns a node
Not every conversational move lands in the vault. The AI applies a significance filter — a piece of session content earns a node when at least one of these is true:
- Decisional — a choice was made, a direction committed.
- Authorship-bearing — original thinking that would be lost if the session ended.
- Surprising — a finding, objection, or insight that contradicts prior assumption.
- Structural — changes vault shape (new project, new convention, archival decision).
Inbox: the deposit area
v0.8.0 formalises Inbox/ as a first-class folder. Drop anything there — a screenshot you want to think about later, an export from another tool, a draft you started in another app, a PDF, a .canvas file, anything. Files in Inbox have no frontmatter requirement. They're pre-vault.
When you ask your AI to triage Inbox, files move out into the appropriate category folder, gain frontmatter, and become proper nodes. Until then, they sit in Inbox without complaint from the schema validator.
Read after every write
Every CLI write op ends with a read-back. If the read-back fails, the AI stops and surfaces the failure rather than carrying on with optimistic assumptions.
Session commits
A session commit is a structured note that records what happened. They land in Sessions/[YYYY-MM-DD]-[topic].md with frontmatter (topic, sessionType) and a body that walks through what was done, decisions made, and an impact sweep.
Commits happen at three points: at the start of significant work, periodically through the session, and at the end. Nothing closes with uncommitted information.
Mid-session tools
Long sessions accumulate context. Spore offers three small instruments for keeping it tidy:
| Tool | Sayable | What it does |
| Re-Anchor (Tool 6) | "Re-anchor." | Restates critical state in one block. |
| Compaction (Tool 7) | "Compact this session." | Folds settled work into a structured summary. |
| Budget (Tool 8) | "What's my context budget?" | Reports approximate token usage by component. |
The Claude Code statusline
Mycelium ships an optional statusline for Claude Code — a persistent strip at the bottom of your terminal that gives you a live snapshot of the current session. Set it up once during install; it runs automatically in every Claude Code session after that.
What it looks like:
🍄 Aria
·
MyVault
·
42m
·
128k tok
·
5h
▓▓░░░
42%
·
7d
▓░░░░
18%
·
████████░░░░
62% ctx
| Field | What it means |
| 🍄 AI name | Which AI is active — matches the name in your persona file |
| Vault name | Auto-resolved from the working directory — works across every Mycelium vault on your machine |
| 42m | How long this session has been running |
| 128k tok | Total tokens used so far this session |
| 5h ▓▓░░░ 42% | Hourly API rate limit — bar fill and percentage consumed. Green = clear, gold = approaching, red = near limit. |
| 7d ▓░░░░ 18% | Daily API rate limit — same bar logic across a longer window |
| ████████ 62% ctx | Context window consumed — how close you are to the session limit. When this climbs, consider Re-Anchor or Compaction (Tools 6 & 7). |
The statusline is offered during fresh install and upgrade. If you already have a statusline configured, or skip the offer, the installer leaves your setup untouched — detection-first, never overwrites.
To install manually, save the statusline script from the installer or upgrade file to ~/.claude/statusline-[yourAIname].sh, make it executable (chmod +x), then add this to ~/.claude/settings.json:
"statusLine": {
"type": "command",
"command": "~/.claude/statusline-[yourAIname].sh"
}
To remove: delete ~/.claude/statusline-*.sh and remove the statusLine key from ~/.claude/settings.json. Restart Claude Code.
Things you'll never see Mycelium do
- Create a duplicate node when one could be updated.
- Skip the impact sweep before a commit.
- Run a substrate write op without reading it back.
- Run an Obsidian CLI command without
vault=<vaultName> after the bootstrap check.
- Hand-edit backlinks. Renames go through Tool 11.
- Write a
.md file outside Inbox without vmdId and summary frontmatter.
- Place a file at vault root that isn't
_Spore-*, _SporeUpgrade-*, or _Spore-VMD-Toolset-*.
- Write to
Inbox/ automatically — it's the owner's deposit area.
§ 7 · The procedure library
The Toolset
Twelve tools. Each one has a single job, a clear trigger phrase, a procedure the AI walks through, and a small set of rules. The toolset file lives at vault root alongside the runtime — but the AI only reads it when one of these tools is invoked.
Tool 4 (Standards & Versioning) isn't a procedure — it's the standards reference (versioning, ID format, schemas) the others rely on. The rest are operational.
v0.8.0 toolset is 12 tools. The Network Layer (Tool 3 in v0.7.x) was removed; everything below shifted up by one. Old session commits and audit reports referencing v0.7.1 numbering are frozen historical records — they retain their original numbers as accurate at time of writing.
· · ·
The vault's full diagnostic. Coverage, schema, persona resolution, overview health, link integrity, tag hygiene, vault health — and a written report that survives the session.
When to use
- Health check on the vault.
- Vault has reached a significant milestone.
- Something feels off and you want a full diagnostic.
- Before any major restructure.
How to run
Run a vault audit.
Procedure
Step 1 — Verify CLI substrate
- Confirm
obsidian vault=<vaultName> version succeeds.
- Confirm
obsidian vault=<vaultName> eval code="app.vault.getName()" returns <vaultName>.
Step 2 — Run audit checks (CLI-native)
Across coverage, frontmatter integrity (skip files in Inbox/), persona integrity (external-only resolution), overview health, link integrity, tag hygiene (filter for hex codes parsed as tags), and vault health (node count, Inbox items older than 30 days flagged for owner triage).
Step 3 — Write audit report
Create System/AuditReports/[YYYY-MM-DD].md. Surface to owner before closing.
Step 4 — Work through findings with owner
Each action: approve, defer, or dismiss.
Step 5 — Close the report
Set status RESOLVED, add resolvedAt, write session commit.
Archive Pattern
Files are never deleted directly. They move to System/Archive/ with the appropriate subcategory: Clients/, Projects/, Decisions/, Discards/, Spore-Versions/, Upgrades/. Every archive action is logged in System/Archive/_ARCHIVE-LOG.md.
Rules
- Never modify node content during audit — flag, don't silently fix.
- Always get owner approval before archiving or restructuring.
- Audit reports are never deleted — archive if superseded.
- A new report never overwrites an existing one.
Inbox/ is excluded from frontmatter and coverage checks.
The conceptual slot for moving a vault between Spore versions. In practice, the upgrade file does this work — Tool 2 exists to declare the rules, not to be invoked directly mid-session.
How to run
You don't, directly. Direct your AI to _SporeUpgrade-v0.8.0.md. Manual mid-session migration is not supported.
Rules
- Never modify file content — frontmatter only (except where the upgrade procedure explicitly authorises).
- Never rename or delete files during migration without using Tool 11 (Safe Refactor).
- Log skipped files in session commit.
- Never generate Owner ID without asking first.
- Post-upgrade health check is mandatory.
The lighter cousin of Tool 1. Same kinds of checks but reports inline rather than writing a report. Useful between audits, after a batch of new nodes, or before a session where you need to trust the state.
When to use
- After a large batch of new nodes.
- Before a session where you need to trust the vault state.
- As part of a full audit (Tool 1).
- After an upgrade (run automatically by the upgrade file).
- Periodically as lightweight maintenance.
How to run
Run a vault health check.
Procedure
Step 1 — Verify CLI substrate
Same as Tool 1 — version + active-vault confirmation.
Step 2 — Frontmatter completeness (Tool 10 lite)
Run Tool 10; count violations across the schema. Sample 20 random nodes (excluding Inbox/) and verify each.
Step 3 — Persona resolution check
Resolve personaDir and verify the persona files are accessible. Flag any unreachable file with the exact resolved path.
Step 4 — Link integrity (Tool 9 lite)
Run Tool 9; report broken-link count with top sources. Inbox/ excluded from source-file list.
Step 5 — Overview health
For each active overview AND every referencesState-tagged file: does the file exist? Do all its references? Run Tool 5 per tagged file.
Step 6 — Root cleanliness
Flag any root files that aren't _Spore-v*.md, _SporeUpgrade-v*.md, or _Spore-VMD-Toolset.v*.md.
Step 7 — Inbox triage reminder
Count files in Inbox/. If > 0, surface as informational (not a violation) to remind owner of pending triage.
Step 8 — Write findings
Surface inline if standalone; feed into the audit report if invoked from Tool 1.
Rules
- Never modify node content — flag only.
- Always get owner approval before acting on findings.
- Broken links and orphans are flagged, not auto-resolved.
Inbox/ is excluded from frontmatter and link-source checks.
Not a procedure — a reference the other tools depend on. Version conventions, ID format, the canonical node schemas, the significance heuristics, the Inbox exemption. Read this once; it informs everything else.
Versioning
Filename pattern: [filename]-v[release].[major].[minor][variant]. Runtime and toolset share a version number.
ID format
All IDs follow PREFIX-YYYYMMDD-XXXXXX. YYYYMMDD is the date the ID was generated (UTC); XXXXXX is six lowercase alphanumeric characters. IDs are immutable once assigned.
| MYC- | Vault identity |
| OWN- | Owner identity (person) |
v0.8.0: GST- (Guest) prefix retired with the Network Layer.
Canonical schemas
Local node:
vmdId: MYC-YYYYMMDD-XXXXXX
summary: One-sentence description distinguishing this node.
Session node:
vmdId: MYC-YYYYMMDD-XXXXXX
summary: ...
topic: [category/path]
sessionType: [regular | breakthrough | audit | migration | compaction]
State-referencing node:
vmdId: MYC-YYYYMMDD-XXXXXX
summary: ...
referencesState: [sporeVersion, owner, ai, personas, projects]
v0.8.0 simplification: The collaborator-written-node schema and shared-node (Network) schema are removed. authorID, nodeId, hop_depth, origin_vmdId, protocolVersion, publishedAt all retired.
Inbox files
Files in Inbox/ are pre-vault — they have no schema obligation. The schema validator skips them. No vmdId, no summary, no requirement on file type. When a file is triaged out of Inbox/ into a category folder, the schema applies on arrival.
Significance heuristics
A piece of session content earns a node when at least one of: decisional, authorship-bearing, surprising, structural. If none apply — no node.
Detects drift between what an overview says and what the vault currently is. Files with referencesState frontmatter declare which kinds of state their prose references; this tool walks them and reports mismatches.
When to use
- Automatically at session start (Step 5b of read order).
- Inside Tool 1 (audit) and Tool 3 (health check) for every
referencesState-tagged file.
- On owner request.
How to run
Run an overview currency check.
Procedure
Step 1 — Load authoritative state
Read System/VaultIdentity.md — note Spore Version, Owner, AI Name, personaDir.
Step 2 — Identify target files
If a path was given, target it. Otherwise: obsidian vault=<vaultName> properties name=referencesState. Walk the returned list.
Step 3 — Compare declared references against live state
For each target file, scan the prose for the declared values: sporeVersion (must match current), owner (name must match), ai (name must match), personas (path must match current personaDir), projects (listed projects must still exist and match status).
Step 4 — Verify wikilinks resolve
Run obsidian vault=<vaultName> unresolved verbose. Filter for the target file as source. Any unresolved links from it are flagged as drift.
Step 5 — Report findings
Per file: path, the referencesState values, drift entries with line numbers and excerpts, broken-link entries. If no drift: "File is current."
Rules
- Never modify content — flag only.
- Never silently assume a reference is historical. If unsure, ask.
- Historical references are legitimate; should be distinguishable from current-state drift.
- Boot-time check runs every session — keep it fast.
A pulse, not a re-boot. Restates the critical state — vault, owner, AI, version, focus — in a single block near the end of context, so a long session doesn't lose itself in the middle.
When to use
- Long session is starting to feel unfocused.
- Owner or AI notices drift from current topic.
- Context window is loaded enough that critical state may be lost-in-the-middle.
- Before a delicate write or decision where grounding matters.
How to run
Re-anchor.
Output format
Re-anchor: Vault MYC-YYYYMMDD-XXXXXX (VaultName), owner [Owner], working with [AI], Spore v[version]. Active project: [project]. Current focus: [one-line]. Continuing.
Rules
- Single block, end of context, one line preferred, never more than four.
- Do not invent state — read from VaultIdentity if uncertain.
- Never silently — always visible to the owner.
- Cheap by design.
Folds settled work earlier in the session into a structured summary; drops the raw transcript before the boundary. Keeps the active thread in working memory while the durable record survives as a node.
When to use
- Current session has grown long and you want to continue.
- Context pressure is high (Tool 8 has flagged).
- Earlier exploration is now settled.
How to run
Compact this session.
Procedure
Step 1 — Propose a compaction boundary
I'll fold everything from session start up to [boundary] into a structured summary. Active work from [boundary] onward stays in context. Shall I proceed?
Step 2 — Write the compacted summary
Context (what we came in with), What we did, Decisions made, Open threads, Impact sweep.
Step 3 — Write to a session-compaction node
Path: Sessions/Compactions/[YYYY-MM-DD]-[topic]-compaction.md. Frontmatter: vmdId, summary, topic, sessionType: compaction, compactedAt, boundary.
Step 4 — Confirm drop
Compaction written to [path]. Dropping raw transcript before [boundary] from working memory. Active thread continues.
Rules
- Never compact without explicit owner approval.
- Never drop transcript before read-back of the compaction summary succeeds.
- Compaction summaries are full nodes — survive sessions, carry
vmdId + summary.
- A session may be compacted multiple times.
- Do not compact mid-decision.
An estimate of how much of the AI's context window is currently in use, broken down by component. Always a report, never a hard block — you decide what to do with the number.
How to run
What's my context budget?
Report format
Context budget: runtime [~N] / personas [~N] / overviews [~N] / last session [~N] / current session [~N]. Approximate total: [~N]. Status: [healthy / warming / near limit].
Recommendations
- Healthy — no action.
- Warming — suggest Re-Anchor (Tool 6).
- Near limit — propose Compaction (Tool 7) or session commit + new session.
Finds broken wikilinks, classifies them, and proposes per-link repairs. Always run before a rename or archive — the broken-link list is the rename plan. Inbox/ excluded from source list.
How to run
Check link integrity.
Find broken links.
Procedure
Step 1 — Enumerate broken wikilinks
obsidian vault=<vaultName> unresolved counts verbose
Filter the result to exclude any source files in Inbox/.
Step 2 — Classify each broken target
- Rename target — a file exists at a similar path or with a similar name.
- Archived target — a matching file exists in
System/Archive/.
- Genuine miss — no candidate match.
Step 3 — Backlink subroutine (when planning a rename)
obsidian vault=<vaultName> backlinks file=<name> verbose
The list is the rename plan.
Step 4 — Owner approval per repair
Source [file] line [N]: [[broken-target]] → [[suggested-replacement]]. Apply?
Step 5 — Apply approved repairs
For each: read the source, replace the broken link, write back, read-back via scoped CLI.
Step 6 — Final verification
Run obsidian vault=<vaultName> unresolved total; surface delta.
Rules
- Never auto-repair without owner approval per target.
- Always read-back after each repair.
- For archived targets, prefer to update the wikilink to the new
System/Archive/ path.
- Genuine misses are not auto-resolved — surface and let owner decide.
Inbox/ excluded from broken-link source list.
Walks every node in the vault (excluding Inbox/) and checks frontmatter against the canonical schemas declared in Tool 4. Soft refusal at session-commit time if violations exist.
How to run
Validate vault schema.
Check frontmatter.
Procedure
Step 1 — Enumerate all markdown files (excluding Inbox)
obsidian vault=<vaultName> eval code='app.vault.getMarkdownFiles().filter(f => !f.path.startsWith("Inbox/")).map(f => f.path)'
Step 2 — Validate each against the schema
Universal rules (every node):
- Has
vmdId matching /^MYC-[0-9]{8}-[a-z0-9]{6}$/.
- Has
summary (non-empty string).
Sessions (Sessions/* paths): has topic; has sessionType (one of regular, breakthrough, audit, migration, compaction).
State-referencing nodes: referencesState is an array, values from the declared set.
v0.8.0: universal rules drop the nodeType requirement; collaborator-node rules (authorID) are gone.
Step 3 — Compile violations
Group by rule. Report count and per-file list.
Step 4 — Disposition
On owner request: surface inline. Inside audit: feed into report. At session commit: refuse softly if any session-class violations exist.
Rules
- Never silently fix — always surface.
- Refusal is soft (owner can override).
- Validate against the schema declared in Tool 4.
Inbox/ is excluded from validation entirely (pre-vault).
How a node is renamed or moved without rotting inbound links. Goes through Obsidian so backlinks update automatically; never hand-edited. Always paired with link-integrity checks before and after.
How to run
Safely rename [path] to [newname].
Move [path] to [destination].
Procedure
Step 1 — Run Tool 9 for the source
obsidian vault=<vaultName> backlinks file=<name> verbose
Step 2 — Execute the CLI rename or move
Rename (same folder):
obsidian vault=<vaultName> rename file=<old-name> name=<new-name>
Move (different folder):
obsidian vault=<vaultName> move file=<name> to=<destination-path>
Step 3 — Verify the change
Read-back semantics: read path=<new-path> succeeds; read path=<old-path> fails. If either check fails, halt.
Step 4 — Re-run Tool 9
Run obsidian vault=<vaultName> unresolved total. Expected: count is the same or lower.
Step 5 — Update related artefacts
VaultIdentity (read back), active overviews (Tool 5 catches drift on next boot), archive log (append entry if archive operation).
Rules
- Never hand-edit backlinks — let Obsidian propagate.
- Always run Tool 9 before AND after the operation.
- Halt on any read-back failure.
- For archive operations, follow the Archive Pattern (
System/Archive/).
- For renames within
MyceliumPersonas/: confirm parent vault is registered with Obsidian first; persona ops scope as vault=<parentVaultName> for that specific operation only.
A timestamped JSON snapshot of vault state — frontmatter, links, backlinks, tags, no content. Written before risky operations or whenever a recoverable record is wanted. Inbox/ markdown is included (forensic, captures state as-is).
How to run
Take a vault snapshot.
Procedure
Step 1 — Generate the snapshot via CLI
obsidian vault=<vaultName> eval code='JSON.stringify(
app.vault.getMarkdownFiles().map(f => {
const c = app.metadataCache.getFileCache(f) || {};
return {
path: f.path,
frontmatter: c.frontmatter || {},
links: (c.links || []).map(l => l.link),
backlinks: Object.keys(app.metadataCache.getBacklinksForFile(f).data),
tags: (c.tags || []).map(t => t.tag)
};
}), null, 2)'
Step 2 — Write to dated snapshot file
Path: System/Snapshots/[YYYY-MM-DD-HHmm].json. If the directory doesn't exist, create it. Read back to confirm.
Step 3 — Confirm to owner
Vault snapshot written to System/Snapshots/[filename]. N nodes captured. Forensic record — keep indefinitely.
Rules
- Never overwrite an existing snapshot — use timestamps.
- Snapshots are not registry — do not consume them as source of truth at runtime.
- Useful for: pre-upgrade safety, post-incident forensics, time-series of vault state.
- Do not include file content in snapshots — frontmatter, links, and tags only.
- Inbox markdown is included (forensic), unlike validators which skip Inbox.