Skip to content

v0.1.4 — the Stop-hook loop fix

Choose a tag to compare

@funcpn funcpn released this 15 Sep 08:09
· 27 commits to main since this release

volens keeps a project's documentation in step with its decisions: an append-only decision log, a design snapshot derived from it, and a hook that refreshes the snapshot automatically — no hand-maintenance.

/plugin marketplace add https://github.com/funcpn/volens.git
/plugin install volens@volens

This is the fifth release and the first one published. The four before it were tagged retroactively, so the version history is complete — what each of them fixed is below.

0.1.4 — the Stop-hook loop (fixed)

The most serious bug so far. When the DESIGN.md write never landed, the hook re-injected the same delta on every Stop — 98 injections over 240 seconds, burning tokens with nothing to show for it. Two defects underneath:

  • the script never read its hook input, so it could not see stop_hook_active
  • the injected instruction said only "never skip the write", which gave the model no way out

Both fixed. The guard is scoped to Stop only, since that field is not sent to SessionStart. A write that gets refused is now reported instead of failing silently.

Reproduced end to end after the fix: 2 hook executions, 18 seconds, normal exit — and the second Stop produced no output at all, which is the guard firing.

0.1.3 — escape hook output

Hook output was being concatenated into JSON rather than escaped.

0.1.2 — the skill no longer asks the model to judge whether the hook is live

The skill told the model to hand-update DESIGN.md when it found no hook installed. To evaluate that condition the model inspected ~/.claude/plugins/installed_plugins.json — which is correct and expected to be empty there, because that file tracks marketplace installs only. A skills-directory install never appears in it. So the model concluded the hook was missing and took over a job the hook was already doing.

Both conditionals deleted. The always-loaded CLAUDE.md contract module already carries the governing rule.

0.1.1 — the notice was invisible

systemMessage was nested inside hookSpecificOutput, where Claude Code silently ignores it. It has to be top-level.

0.1.0 — first release as a plugin

The documentation model ships as a plugin: the sync hook now lives in the plugin's hooks/ instead of being written into your project.