release: v2.65.0 — Agent Locks, and a way to switch a built-in guard off - #58
Merged
Conversation
Four merged PRs (#54-#57) had accumulated past the v2.64.0 tag, so the version no longer identified the code: the installed build reported 2.64.0 while running leases, a new tool, a new CLI command and a new Hub tab. MINOR, not patch. I earlier called this 2.64.1; that was wrong. It adds c3_locks, `c3 locks`, a Hub tab and a config section — new surface, not a fix. What ships: - Agent Locks. Two mechanisms for two different problems. A cross-process file lock stops two c3-mcp processes tearing each other's writes (and now covers create mode, which ran outside the lock entirely). Leases stop two agents doing overlapping work, carrying the intent from the edit summary so the blocked agent is told who holds the file and why. TTL is the real release mechanism, so a crashed agent cannot wedge a repo. - c3_locks tool, `c3 locks` CLI with the human-only force-release, and a Hub Locks tab that badges an unreadable project UNREADABLE rather than showing it with zero leases. - Access Guard built-in opt-out, two-key: a config entry AND a keyring attestation. Either alone leaves the built-in enforcing, so an agent that writes config.json cannot grant itself write access to ~/.claude/settings.json. The credential vault stays absolute. The changelog states coverage honestly rather than implying it: leases gate C3's own tool surfaces, and a raw c3_shell redirect, a non-Claude agent, or a human in an editor is not covered. 1805 pass, ruff clean, both version constants bumped (test_version_sync guards the pair). Claude-Session: https://claude.ai/code/session_01Sbd9NbQfDcoJvvURD7KCVf
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Four merged PRs (#54–#57) had accumulated past the
v2.64.0tag, so the version stopped identifying the code: the installed build reported 2.64.0 while running leases, a new tool, a new CLI command and a new Hub tab.Correction: this is MINOR, not patch
I earlier called it 2.64.1. That was wrong — it adds
c3_locks,c3 locks, a Hub tab and alocksconfig section. New surface, not a fix. 2.65.0.What ships
Agent Locks — two mechanisms, because two different problems get conflated:
c3-mcpprocesses tearing each other's writes. It now covers create mode, which ran outside the lock entirely — two agents creating one path both reported success and one file silently won.c3_edittakes one automatically, carrying the intent from your edit summary, so a blocked agent is told who holds the file and why. TTL is the real release mechanism — agents forget to release, so nothing assumes they will, and a crashed agent can't wedge a repo.Plus
c3_locks,c3 lockswith the human-onlyforce-release, and a Hub Locks tab. That tab badges a project whose lock state can't be read asUNREADABLErather than showing it with zero leases — "all clear" is a different claim from "we don't know".Access Guard built-in opt-out — two-key: a config entry and a keyring attestation. Either alone leaves the built-in enforcing. That's the point: an agent that manages to write
config.json— exactly the move a prompt-injected one would make to grant itself write access to~/.claude/settings.json— still can't produce the attestation. The credential vault stays absolute.Honesty the changelog keeps
Coverage is stated, not implied: leases gate C3's own tool surfaces. A raw
c3_shellredirect, a non-Claude agent, or a human in an editor is not covered, and the UI says so on screen.The
### Fixedsection names the class that produced three separate CI failures across these PRs — a lock key computable two ways, disagreeing by platform, which made the guard a silent no-op wherever it disagreed.Checks
test_version_syncguards the pair (it exists because v2.56.0 shipped with them out of sync andc3 --versionlied)c3 --version→2.65.0Tag
v2.65.0after merge to trigger the PyPI release workflow.https://claude.ai/code/session_01Sbd9NbQfDcoJvvURD7KCVf