Two fixes, both long-standing rather than regressions from v8.3.0.
If you run Codex, this is the one that matters: the Stop hook has been failing at the end of every session. The cause turned out to be wider than Codex. The session-end checklist was reaching nobody on any of the three agents, and Codex is simply the only one that says so out loud. Separately, CHANGELOG.md had been collecting a blank line under its header on every release, seventeen of them by v8.3.1.
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-mindOr 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 searchOpen 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.
What's new in v8.3.2 — 2026-08-03
Fixed
-
The session-end checklist reached none of the three agents. The Stop hook wrote plain text, and all three treat session-end stdout as JSON-or-nothing. Codex says so — "Stop expects JSON on stdout when it exits 0" — and reported a hook failure, which is how this was found. The other two failed quietly: Gemini discards anything on
SessionEndthat isn't the final JSON object, and Claude Code routes exit-0Stopstdout to the debug log. So a featureCLAUDE.mddocuments was inert everywhere, and a Codex-only fix would have left two thirds of it that way. The hook now emits{"systemMessage": …}unconditionally, the one output field all three implement with the same meaning, so there is no flag and no guessing at who is calling. Found and fixed by @RRap0so. (#194) -
The changelog generator added a blank line under the header on every release.
CHANGELOG.mdopened with seventeen of them by v8.3.1. The insert logic scanned past the blank lines already separating the header from the first entry, then sliced from the start of the file including them, then added one more. Cutting from immediately after the header normalizes the gap to one however many have piled up, so the fix is retroactive rather than just stopping the bleed: this release's entry is the first written by the corrected code, and the file went from seventeen blank lines to one. A second defect surfaced while writing the regression test. The path that replaces an existing version's section, used when a release is re-run, only ever replaced the heading: the pattern needs themflag for^, andmmakes the trailing$match end-of-line, so the lazy match was satisfied the moment it cleared the heading. Fixed with(?![\s\S]). Found and fixed by @jcaruso2020. (#193)
Upgrading
Nothing to migrate. No config to edit, no notes to move, no commands renamed. Behaviour does change once you update, and which way depends on the agent you run.
Important
Codex: your Stop hook stops failing.
Every session end has been reporting a hook failure. Nothing was lost when it did — the checklist is advisory and the QMD refresh runs on its own path — but the error is gone now, and the checklist arrives as a UI warning instead.
Tip
Claude Code and Gemini: you are about to see the checklist for the first time.
It has never actually reached you. It was written to a debug log or discarded, depending on the agent. From this release it appears as a message when a session ends: the same wrap-up checklist CLAUDE.md documents, plus any vault-hygiene drift from the scan SessionStart already runs. /om-tidy acts on all of it.
If you would rather not have it, remove the Stop block from .claude/settings.json or the SessionEnd block from .gemini/settings.json. Nothing else depends on it.
shardmind update # if you installed via ShardMindOr 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.1