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:

What it does

  1. Finds the vault from the Brain vault: line, in the same order as the other brain skills, and asks once if there is none.
  2. 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 for status: archived. It ends with a totals line: notes, orphans with a percentage, inbox size.
  3. Finds likely duplicates by comparing file names and summary lines.
  4. 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?".
  5. Applies only the fixes you name. Edits keep every frontmatter key they do not change and set updated to today. Retired notes move to _archive/ with status: archived; nothing is deleted. A merge asks which note survives and shows the merged text first. "Apply all" covers FOUND links only.
  6. 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

brain-garden
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.