From 40217aa1946b26c5a08f466324b1bcd8f18bccc7 Mon Sep 17 00:00:00 2001 From: teknium1 <127238744+teknium1@users.noreply.github.com> Date: Thu, 28 May 2026 23:21:52 -0700 Subject: [PATCH] fix(kanban): tell workers not to use clarify; route to kanban_block instead (#32167) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Kanban workers run headless — no live user is on the other side of `clarify`, so the call times out (~120s default) and the task sits silently in `running` with no signal to the operator that input is needed. Reporter observed a real incident where a worker asked 'promote to production, or check staging first?' via clarify, the call timed out, the agent hallucinated a fallback, and the task sat 'running' for hours. Fix: explicit 'do not call clarify' bullet in two surfaces every kanban worker sees — - `agent/prompt_builder.py` KANBAN_GUIDANCE `## Do NOT` section (auto-injected into every dispatcher-spawned worker run). - `skills/devops/kanban-worker/SKILL.md` `## Do NOT` section (the bundled worker skill). Both point at the right pattern: `kanban_comment` (context) + `kanban_block` (decision needed) — the task surfaces on the board as blocked, the operator sees it, unblocks with their answer in a comment, and the worker respawns with the thread. Co-authored-by: kweiner <17778+kweiner@users.noreply.github.com> --- agent/prompt_builder.py | 5 +++++ scripts/release.py | 1 + skills/devops/kanban-worker/SKILL.md | 1 + 3 files changed, 7 insertions(+) diff --git a/agent/prompt_builder.py b/agent/prompt_builder.py index 8eb0a113f..0f9822804 100644 --- a/agent/prompt_builder.py +++ b/agent/prompt_builder.py @@ -235,6 +235,11 @@ KANBAN_GUIDANCE = ( "- Do not shell out to `hermes kanban ` for board operations. Use " "the `kanban_*` tools — they work across all terminal backends.\n" "- Do not complete a task you didn't actually finish. Block it.\n" + "- Do not call `clarify` to ask questions. You are running headless — " + "there is no live user to answer. The call will time out and the task " + "will sit silently in `running` with no signal to the operator. Instead: " + "`kanban_comment` the context, then `kanban_block(reason=...)` so the " + "task surfaces on the board as needing input.\n" "- Do not assign follow-up work to yourself. Assign it to the right " "specialist profile.\n" "- Do not call `delegate_task` as a board substitute. `delegate_task` is " diff --git a/scripts/release.py b/scripts/release.py index 4d4a1eb5d..35fe10a82 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -60,6 +60,7 @@ AUTHOR_MAP = { "202622897+ticketclosed-wontfix@users.noreply.github.com": "ticketclosed-wontfix", "wuxuebin1993@gmail.com": "victorGPT", "211828103+julio-cloudvisor@users.noreply.github.com": "julio-cloudvisor", + "17778+kweiner@users.noreply.github.com": "kweiner", # teknium (multiple emails) "teknium1@gmail.com": "teknium1", "kenyon1977@gmail.com": "kenyonxu", diff --git a/skills/devops/kanban-worker/SKILL.md b/skills/devops/kanban-worker/SKILL.md index 4954e6dc9..ef9022d9a 100644 --- a/skills/devops/kanban-worker/SKILL.md +++ b/skills/devops/kanban-worker/SKILL.md @@ -167,6 +167,7 @@ You can configure the gateway to receive cross-profile Kanban task notifications ## Do NOT - Call `delegate_task` as a substitute for `kanban_create`. `delegate_task` is for short reasoning subtasks inside YOUR run; `kanban_create` is for cross-agent handoffs that outlive one API loop. +- Call `clarify` to ask the human a question. You are running headless — there is no live user to answer. The call will time out (default ~120s) and the task will sit silently in `running` with no signal that it needs input. Use `kanban_comment` (context) + `kanban_block(reason=...)` (decision needed) instead — the task surfaces on the board as blocked, the operator sees it, unblocks with their answer in a comment, and you respawn with the thread. - Modify files outside `$HERMES_KANBAN_WORKSPACE` unless the task body says to. - Create follow-up tasks assigned to yourself — assign to the right specialist. - Complete a task you didn't actually finish. Block it instead.