The run card stays in the chat by default. Preview opens the item's deployed
page in the preview panel with the proposed arguments already filled, and Run
there hands them back to the parked tool call — so the chat still owns the job
and reports on its result.
A chat flow has no run form to fill: its page is a conversation, so the proposed
message goes into the composer and a strip above it says what was asked for.
Sending it runs the flow in that conversation, which settles the call with a
reason rather than a refusal — the card says "Handed off", not "Cancelled".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- the chat-flow seed was latched before the composer existed, so a page opened
fresh dropped the proposed message; the host's input is now reactive and the
latch waits for an offer the composer actually took
- that offer carries the run's other arguments too: a chat flow's schema can
declare more than user_message, and the message alone would have run on saved
values or schema defaults
- the page takes its seeded arguments out of the runtime rather than reading
them on every mount, so a later open of the same item is not re-seeded with
an old turn's proposal
- the card said "Done" beside "Opened", asserting a completion nothing claims
- run_script / run_flow say what the call does in a session, and background /
wait_seconds say they do not apply there
- restored runFormCancelled's doc comment, displaced by the new helper
Tests pin the three invariants the handover rests on: no job started, the model
told the run has NOT happened, and neither a test run nor the bypass posture
taking the branch.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A deployed `run_script` / `run_flow` opened a form in the chat and started the
job itself. It now opens the item's deployed page in the preview panel, fills
the run form that is already there with the arguments it proposed, and the call
ends. The run is the reader's: they start it from the page they would have run
it from anyway.
**Why the tool stops owning the run.** What the tool could carry was arguments
and nothing else, so the page had to hide the controls it could not forward —
scheduling, tag override, invisible-to-owner — and "Schedule to run later" ran
immediately. It also ran HEAD whatever version the page was pinned to. Handing
the page over costs the model nothing it had: it never ran anything, it waited
for a reader to press Run. Now it says so and moves on; `get_run` is there when
it needs the outcome.
A TEST run is unchanged. It executes the draft being written, which the deployed
page does not show, so it keeps the chat's own form. So does the bypass posture,
which answers for a reader who has already consented and would leave nobody to
press Run. Plan mode is unaffected: its gate already sits before the form, so it
refuses before anything opens.
**On the page.** The arguments arrive narrowed against the deployed schema by
the tool that fetched it, and a note above the form says where they came from;
dismissing it drops the note and keeps the values. A chat flow has no run form —
its page is a conversation — so the proposed `user_message` goes into the
composer instead, for the reader to edit and send. The composer declines if they
were already typing.
**On the card.** The call settles as `Opened`, with the arguments it filled
under Inputs and no outcome pane: nothing ran, and a Result tab could only say
the run came back empty. The eye reopens the page.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: collapse run card in ai chat when the run is declined
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* refactor: simplify run card collapse condition and comment
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(ai-chat): render get_run through the run tools' card
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(ai-chat): retry unreadable logs on reopen and drop the loading tint
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* refactor(ai-chat): inline two single-use deriveds in the run card
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs(ai-chat): record why an inspected run's logs need the dedicated endpoint
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(ai-chat): key an inspected run's fetch to the tool call, not the job
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs(ai-chat): say an inspected run's logs are a tail, not the whole log
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: disable a dynamic input when its schema field is disabled
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERed9zo2oJjpSczzMayaNh
* refactor: extract the run form's argument hygiene into job_args
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERed9zo2oJjpSczzMayaNh
* feat: give Tabs an opt-in sliding selection indicator
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERed9zo2oJjpSczzMayaNh
* refactor: share the chat's scroll-fade measurement
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERed9zo2oJjpSczzMayaNh
* feat: give the chat a run-form contract and incremental job output
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERed9zo2oJjpSczzMayaNh
* feat: run and test a script from the chat through an argument form
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERed9zo2oJjpSczzMayaNh
* feat: carry a chat run's card and job across saves and reloads
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERed9zo2oJjpSczzMayaNh
* feat: render a chat run as a tool call row with its form, logs and result
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERed9zo2oJjpSczzMayaNh
* feat: open a pending run form in the sessions preview pane
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERed9zo2oJjpSczzMayaNh
* test: benchmark running a deployed script from the chat
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ERed9zo2oJjpSczzMayaNh
* feat: offer a test run's dynamic options from the draft it previews
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* docs: say that a test run's dynselect helper executes on form display
* fix: send a schema default the model omitted when yolo skips the form
* fix: infer a test run's schema when the stored one declares no properties
* docs: tighten the note on the form's mount-time helper job
* fix: apply a nested schema default the bypass posture counts as answered
* fix: apply a declared default to a null value and an optional nested field
* fix: check required fields inside a supplied optional object before bypassing
* fix: read required args as own properties before bypassing the form
* fix: stop the turn from the run form's action row in the preview panel
* refactor: drop the run-form prediction and share its secret minting
* refactor: prefill a proposed secret instead of emptying the field
* docs: correct the comments the run-form prediction left behind
* fix: keep a proposed secret out of the chat's stored messages
* docs: say what a literal secret argument now does
* test: restore the copilotInfo export the aiStore mock omits
* docs: cut the run form's helper-script note to its constraints
* refactor: settle a run form from one entry and fetch a job's logs once
* fix: separate colliding secret paths, gate plan mode, keep polled logs
* fix: mint before the form opens, skip empty fields, show what ran
* revert: mint a run form's secrets at submit, not before it opens
* fix: settle a cancelled run card on the form's arguments, not the proposal
* fix: settle a stopped run form like a cancelled one, and keep an empty secret empty
* fix: snapshot a run's arguments before minting its secrets
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>