Finding / temporal-agent-harness

2026-10-13-temporal-agent-harness-first-class-messages-shipped-in-0-5-0-the-packaged-skip-all-route-is-gone-and-the-examples

First-class messages shipped in 0.5.0: the packaged skip-all route is gone, and the examples rebuilt it as handlers that model_callable=False does not hide. The packaged slash commands, /approvals skip among them, are deleted. Every inbound path now runs through @agent.accepts handlers that declare mid_turn (ENQUEUE, ACCEPT, or REJECT by default); events carry message_id; expected_turn, is_message_queuing_enabled and the reply, error, message_queued and operator_command_* events are gone, replaced by message_accepted and message_handler_start/_end/_error; agents are defined with @agent.defn and @agent.init (#150, #155). So the wheel no longer ships an HTTP route to the skip-all layer. But the two examples that let a user change posture do it with @agent.accepts(mid_turn=MidTurn.ACCEPT, model_callable=False) handlers whose choices include dangerously_skip_all, and a posture change releases every parked call the new policy allows. model_callable=False only keeps a handler out of a parent agent’s generated toolset. It hides nothing from POST /api/messages, which takes any handler name, from the chat-server, which offers every handler (section 7), or from a parent built with SubagentToolPolicy.dangerously_allow_all(). The code comment that a child’s approval policy “stays operator-owned even under dangerously_allow_all()” holds for the tool_approval update and not for a policy handler the author wrote. HTTP session creation still passes an empty AgentConfig(), so an HTTP caller cannot choose the starting policy; a Temporal client still can.

Channel: preview-or-beta. Half: both. Date: 2026-09-30.

Operator consequence: Clients written for 0.4.0 break on 0.5.0: key on message_id, drop expected_turn, replace is_message_queuing_enabled with per-handler mid_turn, and move agents to the agent.* decorators. Do not treat model_callable=False as access control. A handler that moves the guardrail belongs to whoever reaches the server or the chat thread. If you copy the examples, drop the skip-all choice or gate the handler in your own app layer, and never give a parent dangerously_allow_all() over a child that has such a handler. The capability half: one dispatch path with typed, self-describing handlers replaces the operator-command channel the last read flagged, so there is less harness surface to lock down and the remaining risk sits in code the agent author controls.

Receipt

Finding metadata

Run: 2026-10-13-profile-refresh-2026-09-21_2026-10-13-frontier-v0

Finding ID: 2026-10-13-temporal-agent-harness-first-class-messages-shipped-in-0-5-0-the-packaged-skip-all-route-is-gone-and-the-examples

Profile citations

Source links

Primary links, including exact changelog lines when available.