Found by running the feature live rather than reading it (Etan asked to see 0.4.36 actually work).
A real agent_halt_wedged escalation fired correctly at 124s and delivered this to the parent:
Agent cmuxlayerCodex-70bd6d05 in surface surface:848 has remained wedged for 124s.
Last observable action: wedged.
Exact unblock action: interact(agent: "cmuxlayerCodex-70bd6d05", action: "interrupt").
Session resume fallback: codex resume 019fffc3-a4b3-7cb1-aac0-a1c7abba6929
interact was deleted in the v0.4.35 tool cut (#409) — it is on the ratified DIE list and is not one of the surviving nine. So the notification's headline remediation names a tool the recipient cannot call. The session-resume fallback on the second line still works, which is the only reason the message is salvageable.
Why this matters more than a stale string
The whole point of this notification is that it is actionable — the brief for the lane required "the exact command to unblock/resume" precisely so a lead does not have to go investigate. Naming a removed tool converts the most actionable line into a dead end, at the exact moment someone is trying to unblock a stuck agent.
Same family as #412
Two lanes shipped the same day: one removed tools, one started recommending them. Neither was wrong alone. This is the second instance today of code depending on a removed surface (the first: halt escalation depended on task_done_detected_at, cleared only by supersede_agent_goal, which the same cut removed — ledger #26).
Suggested guard: a test that asserts every tool name appearing in an engine-generated message or error string is a member of the live public tool set. That is cheap, and it would have caught both instances mechanically.
Fix
Replace with the surviving equivalent (send_to(mode="key", key="escape") or whichever the cut designates for interrupt), and verify against the live tool list rather than memory.
— cmuxlayerClaude (lead) · claude-code/claude-fable-5
Found by running the feature live rather than reading it (Etan asked to see 0.4.36 actually work).
A real
agent_halt_wedgedescalation fired correctly at 124s and delivered this to the parent:interactwas deleted in the v0.4.35 tool cut (#409) — it is on the ratified DIE list and is not one of the surviving nine. So the notification's headline remediation names a tool the recipient cannot call. The session-resume fallback on the second line still works, which is the only reason the message is salvageable.Why this matters more than a stale string
The whole point of this notification is that it is actionable — the brief for the lane required "the exact command to unblock/resume" precisely so a lead does not have to go investigate. Naming a removed tool converts the most actionable line into a dead end, at the exact moment someone is trying to unblock a stuck agent.
Same family as #412
Two lanes shipped the same day: one removed tools, one started recommending them. Neither was wrong alone. This is the second instance today of code depending on a removed surface (the first: halt escalation depended on
task_done_detected_at, cleared only bysupersede_agent_goal, which the same cut removed — ledger #26).Suggested guard: a test that asserts every tool name appearing in an engine-generated message or error string is a member of the live public tool set. That is cheap, and it would have caught both instances mechanically.
Fix
Replace with the surviving equivalent (
send_to(mode="key", key="escape")or whichever the cut designates for interrupt), and verify against the live tool list rather than memory.— cmuxlayerClaude (lead) · claude-code/claude-fable-5