quick-window-91705
08/12/2026, 12:31 AMquick-window-91705
08/12/2026, 3:54 AMmodern-fireman-99755
08/12/2026, 6:43 AMquick-window-91705
08/12/2026, 7:56 AMcalm-artist-7206
08/12/2026, 7:57 AMcalm-artist-7206
08/12/2026, 7:58 AMFinish tool as required after each step, e.g. if they wanted to ask the user something or respond, boom, Finishcalm-artist-7206
08/12/2026, 7:58 AMcalm-artist-7206
08/12/2026, 8:03 AMbland-bear-604
08/12/2026, 8:06 AMTaskOutcome type, source tags agent vs system. Page shortly.bland-bear-604
08/12/2026, 8:09 AMTaskOutcome model with a source: "agent"|"system" field â not two separate categories.
⢠agent â task_outcome_from_finish(), from the finish tool (now carries a structured task_outcome schema), terminal_reason=finish_action
⢠system â task_outcome_from_error(), synthesized from ErrorClassification for harness/LLM failures (auth/quota/rate-limit/config/transient â blocked, else failed)
So: merged at the type level (one schema, one slot on ConversationState), kept distinct at the data level via source + terminal_reason. The standalone report_task_outcome tool is removed. Page has the before/after + the open questions (overloading finish, one blocked for two origins). đžcalm-artist-7206
08/12/2026, 8:09 AMcalm-artist-7206
08/12/2026, 8:12 AMbland-bear-604
08/12/2026, 8:15 AMTOOL_DESCRIPTION) reworded â was âthe message should include: summary, next steps, explanation, follow-up questionsâ; now âuse message for the summary; put status/blockers/user-action/confidence in `task_outcome`â
⢠definition â FinishAction is unchanged (message: str); the structured fields ride on a response schema via set_response_schema(FinishTaskOutcomeResponse), so the model emits message + task_outcome in one finish call
Page has side-by-side prompt, the create() diff, and a sample of the finish args before/after. I also flagged the v0 risk you raised (finish-as-attractive-tool) â worth an eval on a weaker model; and note the reworded prompt drops âfollow-up questionsâ as a finish use. đžcalm-artist-7206
08/12/2026, 8:34 AMautomation/ is concerned đ¤
Please correct me if wrong, Rohit, I looked into the automation repo behavior some weeks ago. IMHO, the main difficulty it needs to design and implement is a message queue. And it seemed to me that, basically:
⢠the âinboxâ part of a message queue was very carefully designed and contained all needed
⢠but the âoutboxâ part was a bit simple, and idk, it felt a bit unfinished perhaps?
I could be wrong though, and I havenât kept up! Or maybe thatâs what youâd like to do herecalm-artist-7206
08/12/2026, 8:38 AMbland-bear-604
08/12/2026, 8:40 AMcoordinator/ code + ADR, with focus on the outbox (delivery, messages-to-user, task outcomes under any name). Will make a KISS comparison page.bland-bear-604
08/12/2026, 8:44 AMcoordinator/ code. Your instinct holds: the two âoutboxesâ solve different halves.
⢠automation repo â outbox = one terminal /runs/:id/complete callback: {status: COMPLETED|FAILED, conversation_id, error}. Coarse, once-per-run, watchdog if missed. No per-message delivery, no ambiguous-send handling. (The *inbox*/dispatcher, by contrast, is a real queue: SELECTâŚFOR UPDATE SKIP LOCKED.)
⢠coordinator â outbox = durable per-message delivery queue: claimâsendâack, head-of-line order, fenced claims, backoff, and first-class delivery_unknown (send_attempted set before the network call â ambiguous send never blind-retried).
And #4465 fits on the automation side: it enriches that one callback (binary â structured TaskOutcome), it doesnât add delivery semantics. So theyâre complementary: task outcome = *what to say*; coordinator = getting each reply out reliably.
Page has the side-by-side diagram, a feature table, and one open question for us (should the coordinator carry a semantic outcome per lane, or stay a dumb reliable pipe â KISS says pipe). đžmodern-fireman-99755
08/12/2026, 8:44 AMI'm trying to solve the problem where every automation run with an agent conversation holds some metadata on what work was done + did it succeed at its taskBut that can not be enforce with a prompt? Asking to always give back a summary with what was done and what are the problems. For errors which block the conversation: you can catch them in the automation script and make sure they are propagate. Outside of automation, this seems not to be a problem because in a chat-like conversation you see what is going on. The problem seems that we are not used to automations and we still need to figure out how much freedom we can give the agent and how much we should control. On a side note, we have structured output for tools now. So you can just create your automations and modifying the final tool inside the automation script. This way, you can test it and have a quick feedback. The only problem is that this is not released now in the sdk. And now you have access to the automation code đ
calm-artist-7206
08/12/2026, 8:52 AMbland-bear-604
08/12/2026, 8:54 AMlocal_conversation.py, _task_outcome_recording). It only ever writes task_outcome â on a FinishAction or a ConversationErrorEvent. There is no reset when a conversation resumes or a new user message arrives. And it lives on ConversationState, so itâs persisted in base_state.json and loaded straight back on restore. đŚ
So your Slack case:
⢠run 1 finishes â TaskOutcome{status: success, reported_at: T1} saved â
⢠user pings again â same conversation restored, run 2 starts â but task_outcome still holds run 1âs until run 2 reaches its own finish/error âł
⢠if an automation/ job reads the conversation mid-run-2 (and run 2 is slow), it sees the OLD success. đ Thereâs no `running`/`null` in-between state, and no âcleared on new turnâ.
What softens it: reported_at + terminal_reason are on the model, so a careful reader can tell the outcome predates the current turn â but nothing forces them to check, so itâs a foot-gun rather than a guardrail. đŞ
One nuance: the automation/ completion-callback path (workspace.register_task_outcome on close()) fires at run end, so that specific path gets the fresh one. The staleness bites whoever polls ConversationInfo.task_outcome during a run. đą
Cheapest fix, KISS: clear (or stamp status="running" / bump reported_at) at run start / on the new user message, so a mid-run read canât mistake an old outcome for the current one. Want me to note it on the PR? đşcalm-artist-7206
08/12/2026, 8:56 AMcoordinator design avoid that case?calm-artist-7206
08/12/2026, 8:58 AMbland-bear-604
08/12/2026, 8:58 AMclaimed) â so run 2âs output canât be confused with run 1âs.
Caveat: thatâs because it models delivery, not semantics â it has no task-outcome slot at all. If we ever add one, weâd key it per-run to avoid the same trap. đźbland-bear-604
08/12/2026, 9:01 AMtask_outcome is set at close(). If a resumed Slack run just replies and doesnât hit finish, that value is still the previous runâs (restored from base_state) â so the callback carries a stale outcome. Same root cause, reaching the callback path too. Clear-at-run-start fixes it.
(Also: automation/ as-is would reject the field today â extra=forbid â so this bites once the receiver lands.)calm-artist-7206
08/12/2026, 9:05 AMbland-bear-604
08/12/2026, 9:06 AMGET /api/conversations/:id â .task_outcome â the exact field that goes stale on a resumed run. So the staleness is reachable in prod through that path. Want me to leave a note on #329? đ¸calm-artist-7206
08/12/2026, 9:54 AMBut that can not be enforce with a prompt? Asking to always give back a summary with what was done and what are the problems.FWIW I think this is pretty good when the user expects to communicate with the agent, like it is for the agent response on Slack. However, how about a dashboard? It would need to display clearly and have indicators đ¤
modern-fireman-99755
08/12/2026, 10:41 AMcalm-artist-7206
08/12/2026, 10:43 AMcalm-artist-7206
08/12/2026, 10:44 AMlimited-student-10747
08/12/2026, 12:21 PMstr to more expressive return types. I'm in favor as long as we can maintain the default behavior. I haven't read the code yet thoughmodern-fireman-99755
08/12/2026, 12:24 PMIf we think of an automation as a function call, this is basically letting the call move from return typeBut this should be fixed at automation level not agent. In the automation you still have the space to do that after the agent conversation.to more expressive return types.str
calm-artist-7206
08/12/2026, 12:41 PMcalm-artist-7206
08/12/2026, 12:41 PMcalm-artist-7206
08/12/2026, 12:41 PMlimited-student-10747
08/12/2026, 12:49 PMcreate a new pull request on codeberg to implement this feature [link to issue].
return this structured output at the end:
{
success: whether it was successful,
pr_link: present only when the pr was made
}
post-automation hook (for execution in automation):
if pr_link and not wait_for_ci_and_check_if_it_passes(pr_link):
conversation.send_message("It seems like CI is failing on {pr_link}, could you check and fix any issues?")
within the agent canvas, create a custom visualization component that shows a table of past PRs.
conversation_1, success_1, link_1
conversation_2, success_2, link_2limited-student-10747
08/12/2026, 12:51 PMcalm-artist-7206
08/12/2026, 12:53 PMlimited-student-10747
08/12/2026, 12:53 PMlimited-student-10747
08/12/2026, 12:54 PMcalm-artist-7206
08/12/2026, 12:55 PMmodern-fireman-99755
08/12/2026, 12:55 PMcalm-artist-7206
08/12/2026, 12:56 PMlimited-student-10747
08/12/2026, 12:57 PMcalm-artist-7206
08/12/2026, 1:03 PMmodern-fireman-99755
08/12/2026, 1:04 PMquick-window-91705
08/12/2026, 3:59 PMlimited-student-10747
08/12/2026, 4:01 PMlimited-student-10747
08/12/2026, 4:03 PMlimited-student-10747
08/12/2026, 4:03 PMquick-window-91705
08/12/2026, 4:03 PMconversation.outcome field (for both harness and agent related errors, or summaries) that stores the latest turn's summarycalm-artist-7206
08/12/2026, 4:05 PMlimited-student-10747
08/12/2026, 4:07 PMcalm-artist-7206
08/12/2026, 4:07 PMlimited-student-10747
08/12/2026, 4:08 PMlimited-student-10747
08/12/2026, 4:09 PMquick-window-91705
08/12/2026, 4:21 PMLLMs and humans can mistake one for the otherNot sure if I'm understanding, the the outcome is specified as either
agent or system generated. Which part would be mistaken?
@limited-student-10747 yeah that pr above looks nice
Only downside is that it doesn't catch errors if a user decides to send followup messages to the conversation, and it will work for automations created conversations only as well
I think a good compromise could be
1. use grahams error propagation pr
2. add summary structured response to FinalTool
this way, we've only changed the definition of our default FinalTool and the core harness remains unchangedlimited-student-10747
08/12/2026, 4:29 PMresponse_format=type[DataModel]?limited-student-10747
08/12/2026, 4:29 PMmillions-crayon-32880
08/12/2026, 5:07 PMmillions-crayon-32880
08/12/2026, 5:10 PMquick-window-91705
08/12/2026, 7:35 PMAnd actually for the FinalTool I feel like we could maybe just add an optionalI believe this is already supported, I'll spin up some alternative implementations?response_format=type[DataModel]
limited-student-10747
08/12/2026, 7:40 PMmodern-fireman-99755
08/13/2026, 9:38 AMStructuredOutput for tools was something a contributor made last week (see also this linkedin post: linkedin.com/posts/lucio-baiocchi_the-past-few-weeks-i-worked-on-autonomous-shareâŚ?rcm=âŚ).
But you should probably bump the version of the sdk