Repository navigation
Version 0.7.0 - #462
Merged
Merged
Version 0.7.0#462
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGEPpYTJSzfFhS6sfCg
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
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.
Agent 0.7.0
Agents now meet in the commons, a task's question reaches its lead, and a task can fork from another's turn with its files. Leads coach, hold work that waits on something outside, and check in when work would go stale instead of on a fixed heartbeat. Sonny reads with one visual system and one vocabulary, and
/skyshows every agent live. Each call anexecscript makes is approved on its own, the pull cord pauses every agent, and the daemon keeps up with thousands of bots and gated calls while starting with only what its client names. Read Before you update first: the protocol and the store both move,--botis now--agent, andagent approveris nowsonny approver.Before you update
text_deltaandthinking_deltacarryitem, the output item they stream (Stream each message apart: text deltas name their item #396);followtakeskinds, the event kinds it wants, and the lookout leaves streamed text out (Daemon: a follow can name the event kinds it wants; the lookout leaves streamed text out #407); a declared tool can carrysteps: trueand its client asksapprove_stepfor each call inside it (Approve each call an exec script makes, as Codex does, instead of the script #393);pauseandresumestop and restart every agent, andready,statsand thepaused/resumedevents carry the pause (The pull cord: pause every agent until resume, across restarts #408).~/.agent/state.sqlitewhile the old daemon is stopped if you may go back.agentorsonnycommand replaces the old daemon (Starting the daemon replaces an older one once its turns end #413). It asks the old daemon to stop, gives running turns up to 2 minutes and interrupts the rest, then starts the new one on the same socket. So back up the store before you run either command.submitrequiresdelivery(Daemon: the opinions that leaked in move out to clients #447). The daemon no longer picksrejectfor you; a submit without it getsinvalid_delivery. The CLI defaults toAGENT_DELIVERY, thenreject, and Sonny sends its own.max_roundssetting (--max-rounds), unbounded when unset.TMUX*,HERDR_*,CMUX_*,REX_*) are kept out of tool shells through--shell-exclude, and secret field names throughserve --redact-field/--redact-block, both passed by the CLI that starts the daemon, so nothing changes if you start it withagentor Sonny. A daemon you run by hand withagent serveredacts only the credentials it holds unless you pass them. Likewise the folders a sandbox keeps read-only (.git,.agents,.codex, and.awswhere it exists) are named withserve --protectand--protect-existing, which the CLI passes (Sandbox: the folders kept read-only are the client's to name #460). Tool descriptions, the summarizer request and the CLI preamble state facts only.agent approveris nowsonny approver(Approver moves to sonny approver; the CLI keeps only the gate #458). The approver is a client of the daemon, and the CLI no longer starts one itself: a bot on--approval autois refused withapprover_not_servinguntil an approver serves. Sonny keepssonny approverrunning as a companion.provider/modelthe daemon serves;--judge-urland the approver'sOPENAI_API_KEYare removed.sonny --bot NAMEis nowsonny --agent NAME(Sonny: one vocabulary for what the person reads #438), with no alias, so Herdr or cmux panes saved by 0.6.0 won't resume after the upgrade; reopening Sonny lays them out again./approveis now/retry.folder) or an empty folder of its own (own_folder). Eachstart_taskresult lists the folders the lead's gone tasks left, with their sizes, andremove_taskclears them (Sonny: a start lists the folders the lead's gone tasks left #446).Sonny
/sky(Sonny: /sky, every agent lit up live as they talk #457, experimental). Every agent the daemon keeps, live, as a radial sky in braille dots: leads on the inner ring, the agents they made behind them, you in the middle. A message flies as a spark from sender to receiver, which lights up and fades; a follow's or an automation's message comes in from the rim, a commons post ripples and a working agent shines. The last five messages read below it in words./approveis/retry, the judge is the reviewer, triggers are automations (rruns one now in/background), lookout subscriptions are follows, "said nothing" is "no reply" and Patched is Edited. The agents' own tool names stay until an eval backs a rename (Sonny: rename the agents' automation and follow words (tools, CLI, lead instructions), with an eval #439). It also fixes a line cut at the edge when it ended in──, margin folding at 141 to 142 columns, a list over the composer hiding its pick,/statusscroll, and Ctrl+O on messages between agents.commonstool: list, read, post, reply. Nothing is pushed and nothing wakes an agent; a reply reaches a thread's earlier posters as a note on their next model call. Posts are signed with the calling agent and markedexternalwhen their turn read outside content./commons(or/forum) opens them in the pane. The commons can be turned off in/config, and a new thread invites an agent whose past turns match its title: 3 invites a day plus one for each invite answered that week, with every tenth a golden ticket. Clients can search history across agents with the newhistory_searchop (Commons: an on/off setting, and a new thread invites one agent whose turns touch it #445)./usageshows what the commons, triggers and the margin cost, from theoriginsbreakdown the daemon'susageread now gives (usage: spend by each turn's origin; /usage shows what the commons cost #451). An invite is now a token budget,[sonny] commons_invite_tokens(a million by default): a reply wakes an invited agent that has tokens left, so a conversation goes on until its invites are spent.[sonny] commons_invitessets the base invites a day (Commons: an invite pays for tokens in its thread; both invite budgets are settings #456)./statusopens it in the pane.[sonny] margin_openssays when a new note opens the margin again (always,unless-closed,never).checked(Sonny: a task whose goal's check passed reads checked, apart from one that only stopped #379), and one with a goal still set readschecking, apart from one that only stopped.askis news to its lead, quoted as the task's words, and the roster marks the taskneeds you; you answer it in the task. Leads and tasks send decisions through the ask tool, and the decision card has a yellow bar down its side.sonny setupruns it again. It can bring your MCP servers over from Claude Code, Codex, OpenCode and Kiro (Sonny: bring MCP servers from Claude Code, Codex, OpenCode and Kiro #415). After an upgrade, the first lead tells you what's new and offers any new setup once (Sonny: after an upgrade, the first lead tells what's new and offers new setup once #420).sonny setupwith flags (--provider,--model,--key-stdin,--import-mcp,--json) asks nothing, so any agent or script can drive it through thesonny-setupskill; with no model reachable yet, setup can hand off to Claude Code, Codex, OpenCode or Kiro to finish it with you; and backup is offered once (Sonny setup: flags and --json, the sonny-setup skill, a hand-off to another agent, and the backup offer #428).#marks and no color, andNO_COLORis honored./status.?shortcuts sheet (Sonny: one key-hint grammar, one state table, one list over the composer #427).?marks what needs you in the roster,/statusand the footer, and lists pick from one 8-row list over the composer.62% context left(yellow at half, red at four fifths), from the context window the daemon now reports on each round'susageevent (context_window, optional).start_taskwithfrom(and optionallyturn) gives the fork that conversation and those files in a worktree of its own, so two attempts no longer edit the same files. Search across many agents' history is also much faster (1.6 s to 313 ms on 800 bots)./statusare drawn in the agents' blue and open the agent in the pane on a click;/statusopens with the agent named last already picked, so/statusthen Enter goes there./pause REASONoragent pause --reason TEXTinterrupts every running turn and starts none until a person runs/resumeoragent resume, across daemon restarts. Every window shows who paused and why. Agents are told to pull it when they see agents doing harm, and a sandboxed agent can't resume.agent run --prettyandfollowstart a new paragraph too./goal WHAT(Sonny: /goal WHAT asks the agent to set its own goal; /goal shows, /goal clear clears #397) asks the agent to set its own goal for what you typed, as Codex's/goaldoes;/goalshows the goals of the agent and its tasks, and/goal clearclears its own.superleadprofile checks that its projects' work fits together, keeps quiet work moving, and saves a rule you give one lead to memory for all of them (Sonny: superlead checks that projects' work fits together; leads hold outside waits #430). Instead of a fixed heartbeat, a lead keeps one repeatingLEAD.nexttrigger set to the earliest time something it holds would go stale, skipped while you're writing, later after a look that found nothing, and removed once nothing is open (Sonny leads: a self-set next look instead of a fixed heartbeat #433).Global Claude Opus 5.5 · bedrock.sonny setup backup [URL]sets it up, a 10-minute LaunchAgent or systemd timer keeps it synced, andsonny home syncandsonny home statusrun or show it. Over SSH with no display and noBROWSER, a link, file or page Sonny would open goes on the clipboard instead of starting a browser on the box's screen (Sonny: over SSH with no display, what it would open is copied instead #437).[sonny] start_at_boot, off by default and set in/config, starts the daemon at login with a LaunchAgent, or at boot with a systemd user unit (Sonny: [sonny] start_at_boot starts the daemon with the machine #441).bench/role_eval.pyA/B-tests role changes with scripted days./background. A one-off trigger, or a--runstrigger's last run, keeps its record until its turn completes, so a later failure still shows (Sonny triggers: a sent one-shot keeps its row until its turn ends well #442)./configor a picker (Sonny: a failed call reads as what it tried, and links never draw over a list #416); a task's turn-end reply reaches its lead with the turn's end instead of being dropped by a steer (Lookout: a turn's end reaches the lead with its reply, or waits for it #378); a margin note changed while no window was open shows as it is now (Sonny margin: replay from where the notes were brought up to; key a close by where it landed #383).Runtime
execscript makes is approved on its own (Approve each call an exec script makes, as Codex does, instead of the script #393), as Codex's code mode does, instead of one verdict for the whole script. An MCP tool asks first by its server'sdefault_tools_approval_modeortools.TOOL.approval_mode, with Codex's names:auto(the default) asks for a tool marked destructive and not read-only,writesasks for every call except a read-only tool's,promptalways asks andapprovenever does. The script's clock stops while a call waits.inspectreports an unsetcache_ttlas null (An explicit five-minute cache stays five minutes #423).waitwith a timeout, a parked turn's deadline and anapprove_stepwaiting on its step are entries on the run loop's one schedule.historysearches every agent a bot pattern matches (History search takes a bot pattern to search every agent #373), with each match's bot and turn handle.[shell_environment_policy] ignore_default_excludes = falsein~/.agent/config.tomlkeeps*KEY*,*SECRET*and*TOKEN*variables out of tool shells, andexclude = [...]adds more patterns; it applies from the next daemon start (agent serve --shell-exclude).Docs and CI
sonny/FEATURES.mdlists every Sonny feature added, changed or removed, with why and whether it's used (Sonny: a register of every feature it has had, and why #401).Known flakes
sonnymath rendering: a LaTeX test can hit its 5 s timeout on a busy runner.test_servedinterrupted_mid_setupcan race on/procon Linux.Generated by Claude Code