Repository navigation
Conversation
A steer that joins a turn while a call waits for its approval or its client's answer, held live or parked, now lifts the wait: the call becomes a proc: handle that waits on past the turn and reports back as a background command does, and the turn reads the message. The request stays listed and answerable; an allow runs the call then, in the background, and a deny, a lapse or an answer ends it with the result the call would have had. write_stdin kill=true withdraws a lifted request or stops what it started, and now stops any background command. Waits the agent did not start keep the message for later. Protocol 64, schema 91 (processes.call, approvals.process, answers.process). Sonny keeps a lifted call in the window and needs-you until it ends (call_lifted, lifted_ended). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review Summary: ✅ CompletedThis 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. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2f9bcb2245
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
- Its lapse goes on the schedule as it lifts, so a lifted call with a time of its own runs out without a restart. - Its row in the audit trail is read before the handle's answer clears it, so its end is recorded. - A prune keeps a running command's call, so a lifted answered call is still listed and answerable past retention. - A bot's approval listing includes the steps of its lifted answered calls. - A lifted terminal starts without reading its first output, which stays for the next read or its end. - A turn-dependent call allowed after its turn ended says so without advice. - `lifted_ended` carries `failed` and the result as told, and `waits_for: "answer"` when an allowed call now waits for its client; `tool_calls` lists a lifted call with its `handle`. - Sonny's tool host keeps a lifted call it serves past its turn's end and serves one allowed later; the ACP thread keeps a lifted call until it ends, so a lifted start_task still opens its task's thread. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 598e8c0cc8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
A wait on a lifted answered call hands the answer's pictures over with its words, and a step of a lifted answer takes its verdict after its turn has ended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3c1b030986
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
An allowed lifted call does not start once a pause came after it was checked, and a pause ends it as it runs. A lifted read keeps its pictures for the wait that collects it, and a lifted kill of a command without a terminal stops it, as in a turn. A lifted answer's steps are listed under its handle, so Sonny keeps them past the turn. One bot's approvals are found through its own running commands, on a partial index by bot. The ACP bridge keys the calls it shows by turn and call. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bb6c8c571c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Sonny's needs scope each call's end to its turn, and keep a lifted call's steps past its turn until the call ends, from events and from listings alike. A lifted call's result keeps `parts` for its pictures only: an output that names its own stays whole as `output`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f86aea558a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…n kill Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 057a49595c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… stops - A step of a lifted answered call carries its call's handle while the call's own turn still runs, as it does after. - Sonny keeps a lifted call's marker when it is allowed and waits for its answer, so steps asked for then outlive the turn. - Stopping a lifted answered call reports ran: true once its client took it, in the kill's answer and the stopped result; ran: false only for a call that never started. - A killable run's place among those its agent can kill goes when the run is dropped, so a pause leaves nothing behind. - A lifted result with pictures is built off the runtime thread, and the store job hands the value back instead of a copy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b1e887e8cb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
- A wait whose results carry pictures takes them out on a blocking worker, where a result another waiter shares is copied. - The unfiltered approvals listing gives a lifted call's step its call's handle, as the bot and tag listings do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d21a85e160
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
- Stopping a lifted call by its handle takes its time off the run loop's schedule, as its verdict or answer does. - An ACP thread that comes back puts lifted calls (and their steps) to the person again, whether or not a turn runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bb4e21b3e5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
A later turn's call under a lifted call's id and request number is put to the person afresh; a decided approval lets go of its own turn's marks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bea56d5d87
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… call A step announced for the reviewer only and then handed to the person keeps its parent in Sonny's needs, so it outlives its turn like a step asked of the person from the start. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1d11ad107a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…easurements - An allowed lifted call's environment takes its turn's model and effort, or the bot's as that turn ran when the bot's changed since, as `turns` reads them, rather than the bot's now. - A Sonny window opened with no turn running lists the calls a message lifted, and their steps, for its approval keys. - docs/DAEMON_MEASUREMENTS.md records what each path pays and the Perf screen against the base. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ddfebf4559
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| .await; | ||
| // A pull while it opened found no terminal to end. | ||
| if cord.pulled() { | ||
| registry.end_terminal(process); |
There was a problem hiding this comment.
Cancel lifted terminal preparation before spawning the child
If a pause arrives while a lifted terminal awaits a lasting slot or sandbox::hold_for, the terminal is not yet registered, so Registry::end_running cannot stop it. After that await completes, Registry::terminal still spawns the child before this cord check, allowing commands to produce effects after the pause response. The fresh evidence beyond the earlier preparation-guard fix is the additional asynchronous preparation inside Registry::terminal (src/tools/terminal.rs:405–438), after the initial cord.check(). Killing the terminal after spawning cannot undo those effects; propagate cancellation into terminal preparation and check it before spawning.
Useful? React with 👍 / 👎.
What
One rule for a message that arrives while the agent waits: a message lifts any wait the agent started, and cancels nothing.
Before this, a steer that reached a turn while a call waited for its approval (or for its client's answer) either sat behind the wait or, if the person used the window, cancelled the call. Now:
shellgets) or parked. The steer then wakes the turn and answers the call with{"handle":"proc:N","background":true,"steered":true,"waits_for":"approval"|"answer"}. The turn reads the message right away.handle), served and answerable past its turn's end. A restart or a prune keeps it. Its time goes on the run loop's schedule as it lifts. Its verdict now goes to the command:An allow runs the call then, in the background, in its turn's folder, with that turn's model, effort, environment and command rules:
A pause that comes after the call's check stops it from starting, and a pause ends it while it runs, as in a turn. A call that reads or changes its own turn (
wait,note,history,readof a result) failsturn_ended.A deny or a lapse ends it with the result the call would have had.
An answer ends it, told as
{"answer": TEXT}.output(or the answer), andwaiton the handle collects it whole. Its row in the audit trail ends with it.write_stdinwithkill: trueon the handle withdraws a request still waiting (never run) or kills what it started. It answers{"handle","stopped":true,"ran":BOOL}. The same kill now ends any background command, in a turn or when allowed after a lift.attachnever lifts. No timers are added.Events and listings:
call_lifted {call_id, handle, waits_for}.lifted_ended {call_id, handle, outcome}. The outcome is either:allowed, withapprovals, pluswaits_for:"answer"when the call now waits for its client; ordenied,expired,answered,unserved,withdrawnorstopped, which carryfailedand theresultas told.tool_started, because that event means a call of the running turn, for the window, ACP and the lookout.tool_callslists a lifted call with itshandle. A bot's approval listing includes the steps its lifted answered calls ask for, under the call'shandle.Sonny:
lifted_ended. A turn ending orturn_resumedno longer clears them.start_taskstill opens its task's thread. It keys the calls it shows by turn and call.Protocol and schema
Protocol 64, schema 91:
processes.callholds the lifted call.approvals.processandanswers.process(indexed, partial) let listings find lifted requests past their turn.processes_bot_runningis a partial index of running commands by bot.Performance
processesrow and the request'sprocess). It happens only when a steer meets a waiting call, so a turn with no waiting call does no new work.processes_bot_running), thenapprovals_lifted,answers_liftedandapprovals_steps. It never reads another bot's calls, and a unit test pins that plan.toolsdelete skips only the calls of commands still running, at the cost of one indexed subquery per pruned turn.Tests
store_contract:a_lifted_answered_call_keeps_its_time_steps_listing_and_audit_row: lapse, step listing (by bot and by tag, under the handle), step verdict, prune, answer with pictures, and the audit row.tool_contract: a terminal started with no yield keeps its first output for the next read.test_runtime::test_a_message_lifts_an_approval_wait_and_the_verdict_reports_back: parked and held waits, an allow with the note it tells, and a stop.test_a_lifted_kill_stops_a_background_command_once_allowed.test_images::test_a_lifted_read_hands_its_picture_to_the_wait_that_collects_it."stopped":truefrom a kill of a background command.test_acp: a steer that lifts astart_taskits client is running still opens the task's thread.tests.run --jobs 4, with bubblewrap) pass locally.🤖 Generated with Claude Code