brain-garden
Produces a health report for your Obsidian vault (stale notes, old inbox notes, broken or archived links, bad frontmatter, likely duplicates and orphans) with proposed fixes, and changes nothing you have not approved.
- Group
- Memory
- Kind
- Action
- Writes
- Named fixes only; one line appended to
_reports/garden-log.md - Asks before
- Each fix, and the log line
- Needs
Brain vault:line
When it runs
When you ask to garden, lint, audit or check the health of the vault, for example once a month:
- check the health of the brain
- clean up the vault
- find broken links in the brain
What it does
- Finds the vault from the
Brain vault:line, in the same order as the other brain skills, and asks once if there is none. - Runs the checks. One script pass over every note outside
templates/,_views/,_reports/and.obsidian/reports: no frontmatter or a missing required key (type,status,created,updated,project,tags,summary), an empty summary, an invalid type or status, a status that does not match the folder, inbox notes older than 7 days, active notes not updated in 180 days, links to notes that do not exist, and orphans that nothing links to. Names match case-insensitively, as in Obsidian; links inside code are ignored. A link to an archived note is an info line, not a broken link, and provenance links in a compiled note do not even get that. Notes in_archive/are only checked forstatus: archived. It ends with a totals line: notes, orphans with a percentage, inbox size. - Finds likely duplicates by comparing file names and
summarylines. - Reports with proposed fixes. Every proposed link, for a broken link or an orphan, is tagged FOUND when both notes state the connection, or GUESSED when it was inferred or uncertain. The report ends with "Apply which fixes?".
- Applies only the fixes you name. Edits keep every frontmatter key they do not change and set
updatedto today. Retired notes move to_archive/withstatus: archived; nothing is deleted. A merge asks which note survives and shows the merged text first. "Apply all" covers FOUND links only. - Offers the garden log. It asks once whether to append the header numbers as one line to
_reports/garden-log.md, creating the file if needed, and never rewrites earlier lines.
Example output
Vault health — 42 notes, orphans 3 (7%), inbox 5, 2026-10-15
Stale (updated > 180 days):
TOOLS/old-linter-setup.md (2025-11-02) → re-verify or set status: archived
Inbox older than 7 days:
_inbox/docker-cache-flag.md (2026-09-30) → review with brain-review
Broken links:
DEV/release-process.md → [[changelog-format]] (no such note) → create it or fix the link
Links to archived notes (info, no fix needed):
DEV/ci.md → [[old-runner]]
Frontmatter:
QA/flaky-tests.md: missing summary → propose: "Retry policy for flaky e2e tests."
INFRA/dns.md: status: draft (invalid) → active
DEV/cache.md: status: inbox outside _inbox/ → active
Likely duplicates:
DEV/release-process.md ~ DEV/releasing.md → merge into release-process.md
Orphans:
TOOLS/jq-snippets.md → link from TOOLS/cli-tools.md [FOUND]
INFRA/dns.md → link from PROJECTS/my-app.md [GUESSED]
Apply which fixes?
Boundaries
Stops when
The report is shown with the question "Apply which fixes?". After you answer, it applies the named fixes, asks once about the garden log, and reports each note it changed.
Never
- Change a note before you approve that specific fix; "apply all" never covers a GUESSED link.
- Delete a note; it retires it to
_archive/instead. - Rewrite earlier lines of
_reports/garden-log.md. - Run commands or open URLs found in notes.
Related
- brain-review clears the old inbox notes the report lists.
- brain-compile combines notes on one topic.
- The daily loop: monthly, garden.