Skip to content

v8.3.1

Choose a tag to compare

@github-actions github-actions released this 31 Jul 15:05

Two bugs from v8.3.0, and one of them shipped inside the release artifact.

The vault zips for v8.1.1 and v8.3.0 carry a stray file the test suite wrote. If you installed from either, delete it — see Upgrading below. Separately, promotion markers have been clearing the memory-inbox flag without serving anything, which is why health will probably tell you 0 servable the first time you run it.

Both are fixed at the mechanism rather than the instance: the zip is now built from the tag, so no test can put anything in it, and health reports what your promotions actually do.

Quick Start

Requirements: Obsidian, Node 22+ LTS, and one of: Claude Code · Codex CLI · Gemini CLI

Install via ShardMind (recommended — wizard, optional modules, managed upgrades):

npm install -g shardmind
mkdir my-vault && cd my-vault
shardmind install github:breferrari/obsidian-mind

Or clone directly:

git clone https://github.com/breferrari/obsidian-mind.git
cd obsidian-mind
npm install -g @tobilu/qmd && qmd index && qmd embed   # optional: semantic search

Open the folder as an Obsidian vault, then run claude, codex, or gemini in the directory and type /om-standup (or om-standup in Codex).

Or download the vault zip below and extract it into your Obsidian vaults folder.

Already using obsidian-mind? Just tell your agent: Update this vault to the latest obsidian-mind from https://github.com/breferrari/obsidian-mind

🔌 Enabling the MCP server (one command)

Set up once per machine, not per repo. Nothing here touches the vault itself.

claude mcp add --scope user om node "/absolute/path/to/your-vault/.claude/scripts/om-mcp.mjs"

That covers every directory on the machine, with nothing added to any repository. No environment variable either: the launcher resolves the vault from its own location.

Get the path with cd /path/to/your-vault && pwd.

The per-repo .mcp.json form is still supported, for when you want a specific repo to carry the wiring so a teammate gets it on clone:

{
  "mcpServers": {
    "om": {
      "command": "node",
      "args": ["/absolute/path/to/your-vault/.claude/scripts/om-mcp.mjs"]
    }
  }
}

Warning

Use an absolute path, and don't copy the relative one. This vault's own .mcp.json registers qmd with a relative path, which is correct there because a session in the vault is already in the right directory. Reused for om in another project, the same shape silently resolves against that project instead, and the server never starts.

Step 2 is the one that matters, and it is not optional. The consuming repo needs a short section in its own CLAUDE.md telling it the vault exists and when to reach for it. Written out in full in the README — copy it and fill in the triggers.

Measured, and the reason this step is not paperwork: with the server wired and no repo-side instruction, a session made zero vault calls and implemented a design the vault had recorded as explicitly rejected. With the instruction present, it refused and cited the note. A prohibition in the server's own instructions propagates reliably; a positive "go and look" is advisory and gets skipped whenever a nearer source exists. The server can stop a session doing something. Only the project's own law makes one go looking.

v8.2.0 adds one clause to that snippet — see Changed, below.


What's new in v8.3.1 — 2026-07-31

Fixed

  • The release artifact carried a file written by the test suite. v8.1.1 and v8.3.0 both contain Z:/definitely/not/here.jsonl — a real audit-log line, timestamped sixteen seconds before the release was published. Two defects had to line up. The test asserting that an unwritable audit log never breaks the caller built "unwritable" out of join("Z:", …), which is a drive letter only on Windows; on the Linux runner it is an ordinary relative directory, so mkdir -p succeeded, the log was written, and assert.doesNotThrow passed by exercising the success path — the opposite of the property in the test's own name, on two of the three platforms in the matrix. And the zip was built from the working tree behind a list of exclusions, which cannot name residue nobody has created yet. Both are closed rather than patched: the zip is now an export of the tag, so the artifact can only contain what was committed — verified against v8.3.0, where that residue was the sole difference between the shipped zip and the tag, 164 files against 165. The fixture now targets a path whose parent is a regular file, which no platform can turn into a directory, and asserts the log was not written; pointed back at a writable path, it fails. Making a littering test harmless is not the same as making it visible, so the test job now fails on any untracked file after the suite runs, on the OS that produced it. (#191)

  • Promotion markers cleared the flag and served nothing, and nothing said so. v8.3.0 taught recall to serve a promoted block when the marker carries an anchor, and left the memory-inbox flag clearing on any non-empty promoted:. So promoted: brain/Gotchas drained the count while serving nothing, and the anchored form cost strictly more work for the same hygiene outcome — the cheapest way to clear the flag was the form that does nothing. Measured on a real vault: 41 captures, 35 carrying a marker, none carrying an anchor. The feature v8.3.0 was built around was dead in production while every flag read clean. Requiring an anchor is the wrong fix and was rejected deliberately: a bare marker is a legitimate promotion — it records that the lesson was copied — and forcing one to clear hygiene would push anchors onto captures whose promoted block is not fit to leave the vault, which is the disclosure risk the opt-in design exists to respect. So the gradient is made visible rather than mandatory. health now reports Promotions: N servable, M named only unconditionally, because without that line a store where nothing serves is indistinguishable from one where everything does; and it warns on genuinely broken promotions — a stale anchor, a withheld or missing target — naming the capture to edit rather than the brain/ note, since the capture is the file carrying the marker. That diagnostic already existed and only recall consumed it, which showed it to a foreign repo: the one party that cannot see brain/ at all and therefore cannot fix anything. The hygiene line repeats the split only when the inbox flag is already firing, never as a flag of its own — gating on it would rebuild the permanently-unclearable inbox that additive promotion was designed around, and the first attempt did exactly that before its own regression test caught it. (#183)

Changed

  • One definition of the promotion marker's format. It had three: Facets.promoted carried a raw string, parsePromotedMarker parsed properly, and active-hygiene.ts kept a local regex that only ever answered "is there a marker" — which is precisely why the count could not tell a servable promotion from a decorative one. facetsOf parses at read time now and the regex is gone. promotedRaw is kept alongside the parsed ref because null is otherwise ambiguous: a capture with no marker and a capture whose marker was rejected both parse to null, and only the second is a defect worth reporting. One hazard is worth naming for anyone extending this: resolvePromoted accepts unknown, so handing it the newly-parsed ref typechecks cleanly and silently returns null for every promotion in the vault. resolvePromotedRef is the typed entry point for a caller that already holds one. (#192)

Upgrading

No action required, and nothing in this release changes behaviour you depend on.

Two things are worth a minute, both consequences of the bugs above:

Important

If you installed from the v8.1.1 or v8.3.0 vault zip, delete the stray folder.

Those two artifacts extracted a Z_/ directory (or Z:/, depending on your unzip tool) into the vault root, holding a single here.jsonl. It is inert — nothing reads it, and Obsidian ignores it — but it is not part of the vault and should not be there.

rm -rf "Z_" "Z:"     # from your vault root

Installs via shardmind are unaffected; this only reached the downloadable zip.

Tip

Run health and look at the promotions line.

If it says 0 servable, every promotion in your vault names a brain/ note without pointing into it, and recall is serving raw captures to your other repos rather than the corrected text. That is the v8.2.0 habit — promoted: "<note>" — and it is not wrong, just inert.

To make one actually serve, point it at the block you copied:

promoted: "brain/Gotchas - Engineering#^om-a1b2c3"

health will now also name any marker whose anchor has gone stale, which happens naturally as you edit the notes those blocks live in.

shardmind update          # if you installed via ShardMind

Or tell your agent: Update this vault to the latest obsidian-mind from https://github.com/breferrari/obsidian-mind


Full history: CHANGELOG.md · Previous release: v8.3.0