Changelog

What's new in Volute CVC.

Release notes written like engineering change logs. Every capture path is named with its fidelity tier; every command shown exists at the release it describes.

v0.7.0

LatestGitHub release →

CVC 0.7.0 adds a Claude Code harness: sessions of Anthropic's Claude Code agent are recorded from the transcript it writes, through its own lifecycle hooks, with no cooperation needed from the model, and the response that runs git commit is linked to the commit it created. The release also hardens the local store for parallel worktree sessions, closes two gaps in the consent gate, and smooths the first-run path across the CLI, the MCP server, and the VS Code extension.

As always: CVC records only information its integrations expose or supply. It neither retrieves hidden chain-of-thought nor promises a verbatim record of a model's internal reasoning.

Claude Code native capture — Transcript tier

  • cvc harness install claude-code writes PostToolUse, Stop, and SessionEnd hook entries into the checkout’s .claude/settings.local.json (kept out of Git through info/exclude) and cvc harness uninstall claude-code removes exactly those entries. The install is per checkout; each linked worktree needs its own.
  • Each completed assistant response becomes one private thought: the prompt or tool results it reacted to, exposed thinking as it appears in the transcript, the text, and tool calls carrying the status of their results. Paths read or edited in the worktree become file context, subject to .thoughtignore. Ingestion is incremental and idempotent.
  • Commit links from transcript evidence: the response that runs git commit, and the reasoning before it, link to the commit the session created — segmented so each commit claims only the reasoning since the previous one. The commit is identified from the command’s recorded output: git’s own summary line, a hash at the start of a line, a full hash, or the CVC: Linked … to commit <sha>. line the post-commit hook now prints, so a quiet git commit -q links too.
  • Conversations carry Claude Code’s session title — the one you set or the one it generates — with the first prompt standing in until either exists.
  • Subagent (Agent tool) transcripts are ingested in the same pass as their own conversations, named <session>:agent-<id>.
  • Unfamiliar content block types are kept as bracketed placeholders naming the type, never its content, instead of failing the session. Entries outside the conversation chain, such as the request caches Claude Code 2.1.300 writes, are skipped whatever they carry; a transcript from another Claude Code major version, or a chained entry of an unknown shape, is still refused whole.
  • The harness is a passive channel: like the VS Code watcher it records nothing until the repository-local capture acknowledgement exists, and captures are attributed to the worktree the hook ran in.

Reliability under parallel sessions

  • The MCP server no longer loses its own thoughts: it derives its binding identity without opening the database file, so a CLI command or Git hook can no longer checkpoint the write-ahead log out from under a running server.
  • Writers wait instead of failing: every writing transaction begins immediately and waits up to 2 s for a competitor (up from 250 ms). The “database is locked” hook warning no longer appears in normal parallel-worktree use.
  • Exact squash relinking works across linked worktrees through a v2 range identity hashed from the canonical common Git directory; duplicated v1 records are unified.
  • A linked worktree with a broken gitdir marker and no commondir is refused rather than treated as a standalone repository.

Consent gate

  • Typed acknowledgements are read from the controlling terminal, not stdin: pending input is discarded before the prompt is shown and the answer is read one byte at a time, so a pasted runbook or type-ahead cannot answer a challenge.
  • cvc share --push honours an existing auto-push grant for the destination instead of demanding a second I PUBLISH challenge; without that grant the challenge follows as before.

First-run polish

  • cvc --version and cvc --help print to stdout and exit 0; cvc-mcp reports its real version to MCP clients.
  • The stubbed cvc component and cvc auth subcommands, which simulated success, are removed along with the HTTP client and keyring dependencies they pulled in.
  • VS Code: Volute: Check Setup refreshes the CLI path and starts the language server after a mid-session CLI install, so the prompted first run no longer needs a window reload.
  • cvc harness install claude-code explains that hooks apply to new sessions and how to verify capture; the README carries an ordered Claude Code quick start; the npm launcher has a README.

Upgrading from 0.5.x or 0.6.0

  • One automatic database migration: the first 0.7.0 component to open a repository rebuilds the interactions table once (capture-source-claude-code/v1) and creates the harness cursor table. 0.5.x and 0.6.0 binaries keep working on the migrated store, so upgrade the CLI, language server, and MCP server on a machine together all the same.
  • Restart running MCP servers. The write-ahead-log fix is in the cvc-mcp binary; an MCP host keeps its server process alive for the session, so a 0.5.0 or 0.6.0 server still running keeps the defect.
  • No wire-format change: sync output remains byte-compatible v5. Range evidence written by 0.7.0 uses the v2 identity; v1 records stay readable and are never silently rewritten.
  • Consent semantics are unchanged — same challenges, same per-destination boundaries, same inert bare cvc push without a standing auto-push grant. The capture acknowledgement now also gates the Claude Code harness.
  • Scripts that relied on cvc --version writing to stderr with exit status 1 must expect stdout and exit status 0.
  • Claude Code hooks are installed per checkout and are picked up by new sessions only.

Known limitations

  • Linux ARM64 is not released; the installers and npm launcher reject unsupported platforms before downloading.
  • The Claude Code transcript format is internal to Claude Code: the parser is pinned to transcript major version 2 and verified against recorded 2.1.219, 2.1.260, 2.1.289, and 2.1.300 sessions; another major version is refused whole, and an unfamiliar content block becomes a counted placeholder.
  • The Claude Code harness is verified on Linux and macOS only. Windows binaries ship and the installer writes a Windows-quoted command, but hook execution on Windows has not been exercised — treat it as untested there.
  • A worktree created by Claude Code’s worktree option (the desktop app’s “worktree” choice or the EnterWorktree tool) starts without the harness, because the hook entries live in each checkout’s .claude/settings.local.json. Run cvc harness install claude-code inside that worktree and start the session again; automatic propagation is tracked upstream. Cowork sessions, which run inside the desktop app’s sandbox VM, are not supported.
  • Advisory Git hooks call a bare cvc: if ~/.cvc/bin is not on the PATH Git’s hook environment sees, post-commit time-window linking fails silently. The Claude Code in-session commit links use an absolute path and are unaffected.
  • Thoughts recorded through the MCP server link only as temporal, because commit_thought carries no file context.
  • Transcript-derived commit links are recorded with the generated grade; subagent conversations carry no recorded edge to the response that spawned them.

Full detail at the tag: v0.6.0…v0.7.0 compare, CLI reference, Privacy.md. Release archives ship a SHA-256 manifest; the installer and npm launcher verify the selected archive, and workflow assets carry GitHub build provenance attestations.

Earlier releases

  • v0.6.0 — cvc conversations (what would I be sharing?), an interactive cvc share picker, and a legible share challenge.
  • v0.5.0 — Linked worktrees: one shared database per repository, per-worktree policy and context, one MCP binding per worktree.
All releases on GitHub