Repository navigation
CCCC 0.4.53
CCCC v0.4.53 Release Notes
CCCC v0.4.53 makes mistakes in message calls show up at once. A message call with
a misspelt or misplaced argument used to report success while the argument was
stored or ignored; it now fails and names the argument. See Message Calls Name
the Arguments They Do Not Recognize.
It also closes a gap in who may state where a message came from: an ordinary Web
or MCP message call can no longer supply the fields that IM bridges use to record
a platform and sender. See Security: Message Origin.
A connected native session now gets start-up examples it can call as written, and
the guide gains a starter walkthrough for a two-agent team with a short
AGENTS.md template. See Native Sessions and A Starter Pair
and an AGENTS.md Template. This
release covers the changes since v0.4.52.
Before You Upgrade
Before upgrading, let sends and recordings finish. Restore or discard waiting sends,
then send or copy every unsent draft, restored ones included, and save unsaved edits
in Files: all of these live only in the open page. Check whether a message
already arrived before sending it again.
Upgrade the CCCC executable, restart the daemon and Web the way you usually launch
them, and reload open CCCC pages. The standalone installer behind cccc update
stops a running daemon and starts it again from the new version. Before a pip
upgrade, run cccc daemon stop and close any foreground CCCC so pip can replace the
executable, especially on Windows. A daemon left running keeps the previous version.
Runtime history stays in CCCC_HOME.
- Agent sessions that were started before the upgrade keep the MCP server they
started with. They keep working with the new daemon, and the daemon's argument
check applies to their calls at once. The MCP-side changes (the origin check and
the new start-up examples) reach a session only when its MCP server is started
again, for example by restarting the agent. Updating the daemon alone does not
give an already running MCP server the origin check. - A retry of a message call that carries an argument CCCC does not recognize now
fails, even when the same call was accepted before the upgrade. Check whether the
message already arrived before sending it again without the argument. - Messages already stored keep what they stored. Nothing in a ledger is rewritten.
Message Calls Name the Arguments They Do Not Recognize
A message call with an argument CCCC does not recognize, such as mdoe for the
mode or a question's options given at the top level instead of inside
question, used to succeed. The argument was stored with the message or ignored,
and the message went out without what the caller meant: a choice card without its
choices, for example.
The call now fails with unknown_arguments. The error lists the argument names
in sorted order, without their values, and the attempt changes nothing. This
covers sending, replying, sending files, cross-Group sends on the same instance,
tracked sends, system notifications, slash-skill dispatch, native session sends
and upload preflights, through the Web, MCP, the CLI and direct daemon calls.
New messages and files sent through CCCC Connect are not covered yet; a reply to
a Connect message is.
A caller-supplied scope_key is now rejected instead of dropped, and so are
sender snapshot fields. Accepting an argument's name says nothing about who may
use it: authorization checks are separate and unchanged.
Security: Message Origin
IM bridges record where a message came from: the platform, the chat and the
sender. Ordinary Web messages and MCP message tools accepted the same fields from
the caller, so a caller could put a false platform and sender in the envelope the
recipient sees. This was reproduced with a non-administrator Web token limited to
one Group. The probe did not demonstrate access beyond the token's permitted
Group.
Web and MCP message calls now reject these fields, such as source_platform or
transport, before anything is sent or stored. When a Web message names another
Group as the source of a forwarded message, the signed-in user must be able to
access that Group. Forwarding by a user who has that access, replies to genuine
cross-Group messages and file uploads work as before. IM bridges themselves are
unaffected.
Two limits remain. The source references an MCP tool call gives for a forwarded
message are not verified, and programs that call the daemon directly on the same
machine are trusted as before.
A message a native session sends directly, and the record a cross-Group send
keeps in its own Group, also no longer store the session's internal binding with
the message. The ordinary Web and MCP entrypoints we inspected reject or replace
caller-supplied bindings.
Native Sessions
A connected native session has no Group of its own to fall back on, so each Group
tool needs an explicit group_id. The calls cccc_bootstrap suggested to such a
session left it out, and its agent-state examples carried an actor_id
placeholder that a session does not need. In a zero-model fixture of a native
Claude session, none of the eight suggested examples succeeded when called as
returned.
The suggested calls now name the Group, the agent-state examples use the
caller's own identity, and the parameter descriptions a native session sees say
that group_id must be given. With this build, all eight examples succeeded when
called as returned, in the same native fixture and in a fixture of an agent CCCC
starts. The examples' placeholder text was sent as it is, so this checks their
arguments, not what an agent would write in them.
The collaboration guidance also no longer suggests Mail for context that has no
higher-order perspective. Under the MCP profile, an agent's Mail to another agent
needs an insight, so following that line led to a rejected call.
A Starter Pair and an AGENTS.md Template
The guide's Builder + Reviewer Pair
use case is now a path you can follow from an empty project: register two agents,
merge a short template into the project's instructions, start them, agree who
edits which files, hand off, review and integrate. The
short AGENTS.md template
is a block to copy and adapt: scope, ownership, independent review, evidence,
handoff and authority boundaries.
Supported Runtimes
now explains where a Claude Code agent that CCCC starts edits files. Claude Code
has such a background session enter a worktree before it edits files in the main
checkout by default, so its result can sit outside the checkout the rest of the
Group uses. The section shows the Claude Code setting that changes this and how
to pass it in the agent's command. CCCC's own default is unchanged.
Best Practices was corrected in several places: it no longer suggests checking
delivery with cccc inbox, which consumes the agent's Mail, or restarting an
agent to clear its context.
Validation Scope
Release preparation ran these checks on one frozen tree, all but ruff in isolated
homes: the Rust workspace tests (113 targets, 3,937 passed, 0 failed,
10 ignored), rustfmt and clippy, the CI test profile with nextest 0.9.148 and
real Chrome forbidden (3,887 passed, 60 skipped), the daemon
self-launch tests (3 passed), the Web check and the full Web tests (4,939 tests
in 657 files), and the repository's Python tests (126 passed) and ruff.
Corrections made afterwards changed only these release notes, and git diff --check
and the Python tests were run again on them.
The argument check has a test for each entry it covers. In a separate copy of the
source, removing the check from the send entry made the new message test fail at
its send rejection. The arguments that CCCC's own ports, the SDK and MCP servers
from v0.4.45 to v0.4.52 send were listed by reading their source, and the lists
accept them; those older MCP servers were not each run against this daemon.
The origin check's HTTP tests cover a restricted and an administrator caller,
unchanged ledgers and no new stored blobs after a rejection, an authorized
forward, a reply to a genuine cross-Group message and both upload paths. Removing the Web
source-access check in a separate copy made the restricted-source test fail,
with the request accepted instead of refused. The MCP test checks that the tools
reject these fields before a daemon exists, then sends an ordinary message.
The binding test sends both ways with valid native session fixtures and checks
that the direct message and both cross-Group records do not keep the captured
native binding. Removing either part of the fix made it fail at that path. These
regression cases exercise native bindings, not a captured Web binding.
The three lock tests were changed after a probe in a separate copy, using
cccc-core's lock while another thread started child processes, found an
immediate reclaim busy in 187 of 51,565 cycles over five seconds. Whether an
earlier failure of the CLI's lock test in a full run had this cause is not
established.
The start-up examples were called as returned, without a model, against the
debug builds before and after the change. Before, none of the eight succeeded in
the native Claude fixture and five did in the fixture of an agent CCCC starts;
after, all eight succeeded in both.
The guide's changed registration, launch and messaging examples were run against
an isolated daemon with stand-in runtime executables: pair registration and
roles, cccc group start reaching the stand-in Codex launcher before its
intentional failure, the Mail summary line as written, and the documented cccc actor update command, whose setting reached the agent's private settings file.
The Linux x86_64 package built for this release, cccc 0.4.53, was checked in
isolated homes by two separate runs. The first checked its version and the files
in its archive; the 33 scripts and stylesheets its Web page references, byte for
byte against the Web build; through its MCP server, a misspelt mode, a question's
options given at the top level and two IM origin fields, each rejected without
repeating the value and with the ledger and the stored blobs unchanged, followed
by an ordinary message that was accepted; and the documented cccc actor update
command with a stand-in Claude executable, whose setting reached the agent's
private settings file.
The second started from the official v0.4.52 Linux package, sent messages with
it, then replaced its daemon with this package's while the v0.4.52 MCP server
kept running. Through that older MCP server an ordinary send and a reply still
succeeded, and it still passed IM origin fields on, which a newly started MCP
server rejected. Retries of an ordinary message and of a question that carried an
unrecognized argument failed with unknown_arguments; without the argument, the
ordinary message was recognized as already sent and the question was refused as
a conflicting retry. What the old daemon had written to the ledger was not
rewritten. On the package's Web, a restricted token sent an ordinary message and
replied to a genuine cross-Group message, while an IM origin field and a source
Group it cannot access were refused with the ledger unchanged, and all 229
scripts and stylesheets in the Web build were served byte for byte. The start-up
examples were called as returned on the package, and all eight succeeded in both
fixtures.
This is not complete live acceptance. No real runtime or model was used for the
start-up examples, the walkthrough or the Claude Code setting, so how a real
Claude Code session treats that setting, and whether the walkthrough helps a new
team, are not verified. None of these changes was tried on native Windows or
macOS.