CCCC v0.4.48 Release Notes
CCCC v0.4.48 lets you switch the runtime that runs an agent, between native sessions and CCCC-managed runtimes, without losing the agent or automatically resending a message whose delivery is uncertain; see Switch an Agent's Runtime. It also keeps more of your work when something goes wrong. A Web send whose result never came back can be restored, and sending it again unchanged does not create a duplicate. Voice recordings keep the words already recognized in more of the ways they can end early, and a stopped voice model download can continue where it stopped. A Connect remote workspace waits, with its unsent work, while its access is renewed instead of closing. After an instruction file changes, a later message can remind agents to check it, mentions are highlighted in each agent's colour, and NotebookLM refusals are reported instead of being treated as success. It also closes a gap that let a Group member without administrator access run an agent with another user's private Actor Profile and its keys; see Profile Access. This release covers the changes since v0.4.47; see Before You Upgrade before installing.
Before You Upgrade
Before upgrading, let sends and recordings in progress finish, and restore or discard any sends waiting to be restored. Waiting sends and unsent drafts live only in the open page, so reloading it loses them; the browser's leave warning does not save anything.
Then upgrade the CCCC executable and restart the daemon and Web through your usual launch method to load the new code and bundled Web assets, 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, then start CCCC again. A daemon left running keeps the previous version. Runtime history remains in CCCC_HOME.
- If other people sign in to your CCCC with access tokens that are not administrators, check existing Profile links after upgrading; see Profile Access.
- For already connected native sessions, update and reload the CCCC integration and reconnect its MCP server in each app. Restarting the CCCC daemon alone does not reload those processes. From this release on, the
ccccMCP server says when its version differs from the daemon's, or, with the same version, when it was built from different sources, and which side to restart. Servers from earlier releases cannot check this themselves; a native agent reading a message through one may see a note suggesting a reconnect. Reconnect them after upgrading even without a note. Follow the native-session upgrade steps for your app. - Voice Secretary recording with the local or external speech recognizer needs the browser's AudioWorklet support as well as microphone permission. A page without AudioWorklet says so instead of starting those recognizers; browser speech recognition is unaffected.
- Agents may see a new line in their messages after an instruction file changes; see Instruction Files and Mentions.
- A Connect remote workspace waits for its access to return instead of closing only when both instances run this release or later; with an older instance on either side it closes as before. With an older entry, a remote page from this release cannot reload itself, for example from its update notice; reload the entry's page instead.
- This CCCC release does not include an SDK update.
cccc-sdk0.4.47 was released separately on PyPI, npm and crates.io; its Python package needs Python 3.10 or later. On Linux, fresh installs of all three packages passed their smoke tests against CCCC 0.4.47 and against a development build with most of this release's changes.
Switch an Agent's Runtime
An administrator can now move an agent to another runtime and keep the agent: from one connected native session to another, from a native session to a CCCC-managed runtime and back, or between managed runtimes and Profiles. In the agent editor, Runtime first offers CCCC managed, Native session or Web Model, then the item within it. The agent keeps its ID, role, tasks, Mail, reply requests, message history, agent state and notes. An agent on a native session now opens this same editor, so you can change its avatar, display name, behavior preset and notes there; its working directory is read-only, and settings that apply only to a process CCCC starts are hidden.
- CCCC stops the managed process that ran the agent. It cannot close a native application's process; stop the old session yourself if it is still running.
- A message the old runtime may have received without a confirmed result is not delivered again automatically. A handoff notice lists such messages and asks the new runtime to check them. When the new runtime can receive during the switch, the notice comes before the messages still waiting; an agent that is stopped, paused or has its access paused receives them all later, in the order they were written.
- CCCC does not move the old runtime's own conversation; whether it is still available depends on the provider.
- Switching to a native session removes the agent's managed configuration, including its own private environment variables, which cannot be recovered. Save as Profile first keeps a custom configuration; a linked Profile is not changed.
- Do not start after switching leaves a managed agent stopped so you can add private environment variables before Start. Leaving a native session, the new runtime starts with a running Group; Save and restart after changing a managed agent's runtime, mode or Profile switches it in the same way and starts it at once.
- The old native session is told it was replaced if it calls CCCC, and its reconnection does not take the agent back. Switch back explicitly to use it.
- If the final step of a switch fails, the agent stops receiving and shows Retry completion; CCCC also retries when the daemon starts. Its messages, and changes to the agent other than Stop, wait meanwhile.
Web Model agents keep Save and Save and restart in this release, and a native agent switches to CCCC managed before choosing a Web Model. Those changes do not check unfinished work: make sure the previous runtime has finished first. The CLI offers the same switch as cccc actor switch. See Connect existing native sessions for details.
Profile Access
Linking an agent to an Actor Profile now requires permission to read that Profile. Before this release, a Group member without administrator access could link another user's private Profile to an agent, through the Web or by asking an agent to do it, and the agent then started with that Profile's command and private environment, such as API keys. This matters only for a CCCC that others sign in to with access tokens that are not administrators. Elsewhere, the one visible change is that agents can link global Profiles only; link a Profile from My Profiles to an agent in the Web instead.
Adding an agent with a Profile, linking or relinking one, changing which user's Profile a link points to, and converting a linked agent to a custom one now check that the person asking may read the Profile. A request made by an agent can link global Profiles only, whatever it claims about its sender. The Web takes the caller from the signed-in session rather than from the request, and the cccc MCP server drops authority fields that a model supplies. Local cccc commands keep administrator access.
Links made before this release are not checked again. If others can sign in to your CCCC, an administrator can open Settings → Agent Profiles and use Usage on each user Profile to see which agents use it. Remove an agent that should not use a Profile, or link it to one it may use. Do not turn it into a custom agent instead: Convert to Custom, and deleting the Profile with Delete anyway and convert linked agents to custom, both copy the Profile's configuration and keys into the agent. If such an agent has run, consider replacing the keys in that Profile.
Sends That Did Not Confirm
A Web send whose result never came back, for example because the connection dropped before the response arrived, can be restored and sent again unchanged without creating a duplicate, and a draft you started in the meantime is not overwritten.
- A failed message returns to the composer by itself when its own Group is open, the composer is still empty and the routing is unchanged. Otherwise it waits under N sends to restore with its destination, recipients, reply target, references and attachments.
- Sending a restored message again without changes reuses the first attempt's client ID, so the daemon returns the message it already accepted instead of creating a second one. Editing it, even back to the same text, makes it a new message. The retry is remembered only in the open page; reloading it starts over.
- A failed slash command is kept the same way. A failed send may still have arrived and a command may already have run, so the list says to check the conversation before sending again.
- The list appears in every Group, and a send's content shows only in its own Group. A send whose Group is no longer available cannot be viewed or restored unless that Group becomes available again.
- While sends wait, a message or slash command is in flight, or a Voice Secretary recording is starting, running or being finalized, the page asks the browser to warn before a reload or close. Switching away from a Connect remote workspace asks first once that workspace has reported such work or an unsent message draft. Browsers may suppress the warning, and waiting sends live only in the open page.
- While a message is being sent, the Send button shows that it is still sending and comes back when the attempt ends; you can keep writing the next draft. A second send during that time used to look possible but do nothing. Slash commands are unchanged.
- A draft addressed to another Group keeps its destination and recipients across Group switches, and a send naming a recipient who is no longer available stays in the composer instead of going without that recipient. The recipients row shows that recipient as unavailable until you remove it, including in a reply to an agent that has left the Group.
Voice Secretary
Recording was reworked so that each recording owns its text, state and resources. This closes several ways recognized words could be lost; audio that was never recognized can still be lost.
- Dictation continues the draft instead of starting a new paragraph. Chinese and Japanese text joins without a space, Latin words get one space, and short answers such as 好, 嗯, OK, yes or no are kept.
- After you stop, the panel shows that the recording is being finalized. With the local or external recognizer, stopping releases the microphone at once, and a recording outside a document that has waited 20 seconds for its final transcript offers Stop waiting. It keeps the text recognized so far; audio not yet recognized may be lost.
- For a recording outside a document, when the connection fails, the final transcript fails or is incomplete, a polish or Ask request fails or its result is not confirmed, or you cancel a polish or it comes back unchanged, any words the recognizer has returned go into the message box of the Group where the recording started, with a notice saying what happened. If the page leaves the Group view while recording, that text is saved to the same message box. Document recordings keep browser-recognition pieces not yet sent, and a local-recognizer part whose save was still in progress, in the same place.
- Polishing tells the voice secretary that the text is your own words to tidy, not a request to carry out.
- With the local or external recognizer, a hint suggests checking the microphone when no audio frames arrive, or all samples are zero, for about six seconds. When a recording cannot start because the selected microphone is no longer available, the error offers Use system default microphone.
- A model download is treated as stalled only after 60 seconds without data. A download that stops partway continues with a range request instead of starting over, when the server supports range requests as GitHub release downloads do. What arrived is kept in the model's
.download-resumefolder and uses disk space until it is used or deleted. A kept file is deleted when it fails its SHA-256 check or its model is removed, and cleanup deletes kept files that the model definition no longer lists or that nothing has added to for seven days.
Instruction Files and Mentions
- CCCC watches
AGENTS.override.md,AGENTS.md,CLAUDE.md,CLAUDE.local.mdand.claude/CLAUDE.mdin an agent's workspace and each directory above it. After one of them changes, appears or is removed, the next message that has room for it carries one line asking the agent to check the current project instructions; Claude's notification gets a short form. This covers agents CCCC starts, connected native sessions and Web Model agents. Changes made before CCCC began watching a session, or while the daemon was stopped, are not reported. See When instruction files change for the limits. @and#suggestions open at the cursor, including after punctuation or Chinese, Japanese or Korean text, and choosing one keeps the text after the cursor. Messages highlight only references to the Group's current agents, the selectors such as@all, and the Groups a message refers to. An agent's reference takes the colour of its name; links, common email addresses and code are not highlighted. A highlight marks a recognized name, not who received the message.- Ctrl+Enter (Cmd+Enter on macOS) now sends a message that ends in a mention matching no suggestion.
NotebookLM, Web Model Tools and Connect
- NotebookLM source refresh, rename and delete, artifact listing and artifact generation no longer report a recognized refusal as success, and a status CCCC cannot read is reported as a changed response format. Rate limits, timeouts and authentication failures are reported as such. A chat reply that holds only stream bookkeeping and an end-of-stream frame, with no answer or heartbeat, the form NotebookLM is reported to use when the chat quota runs out, is reported as rate limited with a note that the quota may be exhausted. The answer marked final is used rather than a longer earlier draft. Error handling follows the notebooklm-py source as of 2026-11-03, shortly after v0.8.6; request formats are unchanged.
- Commands a Web model runs with
cccc_exec_commandturn off the common pagers by default, sogit logno longer waits for a key press; a pager set in the call'senvstill applies.cccc_code_execno longer advises rerunning a cell whose earlier calls may already have taken effect. - A Connect remote workspace no longer closes, or asks its administrator to sign in again, when one periodic access check fails with a network error or an HTTP 5xx; the page and its unsent work stay.
- It also stays open when its access proof expires, for example after the computer slept, when the account directory is briefly unavailable, or when the target's Web service restarts. The page is kept as it was, hidden behind a notice with the time of the last connection attempt. Meanwhile it pauses new requests and live updates and disconnects agent terminals and browser views. It comes back once both instances confirm the same account, administrator access on each side and a fresh access proof, and Close this page asks first when it has unsent work. A change of account, device or address, revoked administrator access on the entry, or the target refusing access during recovery still closes it. A change being saved when the connection dropped may already have been made; recovery does not automatically resend it.
- A remote page that needs to reload, from its update notice, its error screen or after part of its code failed to load, now asks the entry to open it again, and the entry asks first when it has unsent work. Reloading inside the frame ended the connection.
- A Connect delivery whose window ended, or whose connection was disconnected, before the target received it now says so and that it can be sent again, instead of saying the target did not accept it.
Other Changes
- A managed Claude agent whose startup confirmation closed before CCCC connected shows Confirmation closed. CCCC does not start it again by itself; an explicit retry such as Launch, or a CCCC restart, clears the pause. An agent or automation that tries to start it is told that starts are paused.
- When Mail names an agent that is disabled or reported as not running, or whose Group is paused or stopped, the send result can now list it, with a note that Send, or delivering the Mail, can request delivery to an enabled agent in an active Group. Writing Mail still starts nothing, and a result without that list does not promise the Mail will be read.
- The terminal interface marks a managed agent waiting for its startup confirmation as
confirm Weband counts these in the Members heading. Web Model agents showaccess onoraccess paused, because enabled access does not show whether a browser is connected. - Waiting for you no longer reopens empty. When you come back to a Group after answering everything, and both the page and the count confirm that nothing is waiting, the chat shows All; a request that arrives later shows its count on the tab without switching the view. Requests answered while you are in the view stay listed until you leave.
- Images read with
cccc_filenow reach the model in Codex. For Codex's MCP client (codex-mcp-client), a tool result that contains an image leaves outstructuredContentand carries the same metadata as text. Error results whosestructuredContentholds anerror, and results for other clients, are unchanged. - Agents can read or reply to a message by the short ID that delivery headers show, such as
56712672from(reply:56712672). It resolves only among the messages that agent can read; when several match, the error lists them. - A native session CCCC cannot deliver to is no longer shown as Stopped in the Runtime Dock; it shows the same receive status as its tab. For Codex, which can receive only through its shared app-server, the agent's panel asks you to check that the session is open in a Codex connected to it. When the
ccccMCP server identifies that session on a tool call, the tool result can tell the agent that new messages may not reach it, so it can ask you to check. - The default name of a native session is shorter and has no spaces, such as
Codex_cccc_0632d7. Agents already in a Group are not renamed at once; one that still has its default name can take the new form when its session is restored. - A custom agent avatar now appears in the agent editor and the agent list after you upload it, and stays after a reload. Before, the upload was saved but those views kept the default image. The picker no longer offers SVG, because CCCC's file route serves SVG as binary data rather than as an image.
- Codex sessions started in a terminal are no longer labelled VS Code in Connect existing sessions when Codex records the client that created the thread, as Codex 0.166 does; that version records terminal threads with the source
vscode. A session listed before this change can keep its old badge. - A DeepSeek turn no longer times out while its provider keeps sending valid ACP updates or permission requests; the 300-second timeout restarts with each one. Such turns used to be cut off at 300 seconds and sent again from the start.
- A notification an agent sends with
cccc_notifyand no target now goes to the Group's agents, as documented; before, it reached no one. A target the daemon cannot read is refused instead of turning the notification into a broadcast, and notifications no longer store the session binding they were checked against in the Group's history. cccc_file_sendsends up to 10 files as one message with one caption, and itsidempotency_keynow also applies to sends on this instance, so a retry returns the first message instead of posting the files again.- Chinese and Japanese interface text uses the names from the published READMEs, and the status of a delegation sent from a Group follows the interface language.
See the changelog, Web UI guide, local sessions guide and Voice Secretary guide for the full changes and operational details.
Validation Scope
Release preparation ran the Rust workspace tests and static checks, the Web tests and static checks, and repository checks in isolated homes. Runtime switching was tested through the daemon's own operations in isolated homes: switches in each direction, refused and interrupted switches, an unfinished completion and its retry, the handoff notice with a thousand unconfirmed messages, a terminal submission and a DeepSeek turn cut off by the switch, and work that arrives while a switch is under way. Isolated smoke tests of the release candidate's Linux executable covered its served Web assets, Mail results and adding agents with Profiles through the Web, and runtime switches through the Web and the CLI with synthetic native sessions and no provider process, including the answer a replaced native session gets from the cccc MCP server, a refused mode and working directory, a Group starting while one agent's switch is unfinished, and the default names the native hooks write. The agent editor was checked on the candidate's own page in an isolated browser at desktop and phone widths, for native and managed agents, including an avatar upload, its display after a reload and a switch right after it. With synthetic keys and no outside network, the smoke tests also checked Profile access. A user without administrator access could neither read nor link another user's private Profile, and its keys reached no agent process; on an earlier candidate of this release, the same user could link it and its keys reached the agent. That user's own Profile could still be linked and started, agents could link global Profiles only, and an update's patch did not link a Profile. A candidate built before Profile access and runtime switching were added was also checked for the composer's send, mention and recipient states, a dialog that fails to load, Waiting for you and the terminal interface. Earlier packages of this release covered the instruction-file line on a real daemon with a negative control on the previous build, mention input in Chromium, and the voice capture worklet in the production bundle.
This is not complete live acceptance. One switch between two real Codex native sessions ran on an earlier candidate of this release; switches between a real native session and a managed provider were not tried before release. NotebookLM was checked with offline fixtures rather than a real account, and voice with component tests and a synthetic audio source rather than real recordings. Connect retries were checked with synthetic responses. A remote workspace staying open, with the same page and draft, through an expired account directory, an expired access proof and a restart of the target's Web service was checked with two real instances in isolated homes and Chromium; the sleeping computer was simulated by pausing the browser process for 130 seconds, not by real sleep. The Windows and macOS builds come from release CI and were not checked by hand. Live Voice remains experimental.
Thanks to waterbang for the inline mention work this release builds on, to chriscoveries for the DeepSeek timeout and Connect notice fixes and for diagnosing the lost agent notifications, and to everyone who contributed code, tested and reported issues.