fix(kanban): wake the origin on review handoffs and triage escalations

`review_requested` and `block_loop_detected` are terminal event kinds that
hand a decision back to the origin subscriber, but neither was listed in the
gateway notifier's `_WAKE_KINDS`. A `notify+wake` subscription therefore got
the passive ping only and the origin agent never took a turn — so an agent
that delegated implementation work slept through the "ready for review"
handoff and through a task being routed to triage, while the equivalent
`blocked` event woke it.

Add both kinds to the wake set, add their status strings to the synthetic
wake message in every locale, and document which events wake.
This commit is contained in:
Nikita Barkov
2026-08-16 15:46:18 +02:00
committed by Teknium
parent 5538bd1f93
commit 7700d3a011
20 changed files with 161 additions and 1 deletions
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -189,6 +189,8 @@ gateway:
crashed: "تعطّل (خرج العامل)؛ سيعيد المُوزّع المحاولة"
timed_out: "انتهت المهلة؛ سيعيد المُوزّع المحاولة"
blocked: "محجوبة؛ تحتاج إلى انتباه"
review_requested: "أُحيلت للمراجعة؛ اكتمل التنفيذ"
block_loop_detected: "أُحيلت إلى الفرز بعد تكرار الحجب؛ تحتاج إلى قرار"
status_default: "تغيّرت الحالة"
status_joiner: "، "
message: "[kanban] المهمة {task_id} {status}.\nالعنوان: {title}\nالمُكلَّف: @{assignee}\nاللوحة: {board}\n\nراجع النتيجة أو قرّر الخطوة التالية."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -181,6 +181,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -170,6 +170,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
+2
View File
@@ -166,6 +166,8 @@ gateway:
crashed: "崩溃(worker 异常退出),dispatcher 将重试"
timed_out: "超时,dispatcher 将重试"
blocked: "被阻塞,需要处理"
review_requested: "已交付评审;实现已完成"
block_loop_detected: "反复阻塞后被转入待分诊,需要做出决定"
status_default: "状态变化"
status_joiner: ","
message: "[kanban] 任务 {task_id} {status}。\n标题: {title}\n执行者: @{assignee}\n看板: {board}\n\n请检查结果或决定下一步动作。"