{"repo":"NousResearch/hermes-agent","public_id":"31901","display_label":"Kanban notification delivery bugs and features","summary":"This cluster covers work on Kanban task event notification delivery — including blocked or missed sends, TUI/desktop session gaps, subscription polling issues, decomposed task handling, and proposals to generalize the notification system across surfaces.","subsystem":"agent","counts":{"members":14,"open_issues":2,"open_issues_distinct":2,"open_prs":0,"closed_issues":4,"merged_prs":3,"attempt_prs":5},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":72177},"resolution":{"state":"partially_resolved","by":"pr-72177,pr-72236"},"freshness":{"state":"verified","last_verified_at":"2026-09-07T21:16:58+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.11868131868131868},"fix_edges":[{"issue_number":31901,"pr_number":105356,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":59269,"pr_number":72236,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":59890,"pr_number":72177,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":59960,"pr_number":72177,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":85575,"pr_number":105356,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":93851,"pr_number":105356,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":96070,"pr_number":105356,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":102635,"pr_number":105356,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false}],"members":[{"kind":"issue","number":31901,"title":"[Bug]: Kanban notifications can be lost for failed sends and decomposed child tasks","url":null,"state":"closed"},{"kind":"issue","number":35417,"title":"[Feature]: Kanban task terminal-event callbacks for async orchestration (TUI/WebUI + coordinator workflows)","url":null,"state":"open"},{"kind":"issue","number":49190,"title":"[Feature]: Generalize Kanban notifications into an event substrate — any-surface subscribers + delivery-adapter registry","url":null,"state":"open"},{"kind":"issue","number":59269,"title":"Kanban notifier jams permanently on one bad delivery — masks the real error and blocks all notifications","url":null,"state":"closed"},{"kind":"issue","number":59890,"title":"[Bug] Kanban task event notifications never delivered — all 18 subscriptions have last_event_id=0","url":null,"state":"closed"},{"kind":"issue","number":59960,"title":"[Bug] TUI kanban notifications never delivered — poller only watches process completions, not kanban_notify_subs","url":null,"state":"closed"},{"kind":"pr","number":31902,"title":"fix(kanban): preserve notifications and workspace for decomposed tasks","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"4810074d73d9419dc82545202d595507a73f4f0e","number":0},{"kind":"pr","value":"#105356","number":105356}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":59278,"title":"fix(gateway): isolate per-subscription failures in kanban notifier","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#72236","number":72236},{"kind":"pr","value":"#59269","number":59269}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":59963,"title":"fix(tui): poll kanban_notify_subs for task event delivery to TUI sessions","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"badb240ffa","number":0},{"kind":"commit","value":"6247712c3f","number":0},{"kind":"pr","value":"#72177","number":72177},{"kind":"pr","value":"#66435","number":66435},{"kind":"pr","value":"#60085","number":60085},{"kind":"pr","value":"#60085","number":60085}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":60085,"title":"fix(tui): deliver kanban notify subscriptions to TUI/desktop sessions","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#66435","number":66435},{"kind":"pr","value":"#66435","number":66435},{"kind":"pr","value":"#66435","number":66435}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":66435,"title":"fix(tui): deliver Kanban notifications to TUI sessions","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"badb240ffa","number":0},{"kind":"commit","value":"6247712c3f","number":0},{"kind":"pr","value":"#72177","number":72177},{"kind":"pr","value":"#72177","number":72177}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":72177,"title":"fix(tui): deliver kanban notify subscriptions to TUI/desktop sessions (salvage #66435)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["tests/tui_gateway/test_kanban_notify_poller.py","tui_gateway/server.py"]},{"kind":"pr","number":72236,"title":"fix(gateway): isolate kanban notifier failures + cursor snap at creation (salvage #59278, #62712, #63001)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["contributors/emails/[redacted:email]","gateway/authz_mixin.py","gateway/kanban_watchers.py","hermes_cli/kanban_db.py","tests/gateway/test_kanban_notifier.py","tests/gateway/test_kanban_notifier_zero_sub_gate.py","tests/gateway/test_multiplex_profile_authz.py","tests/hermes_cli/test_kanban_core_functionality.py","tests/hermes_cli/test_kanban_count_notify_subs.py","tests/hermes_cli/test_kanban_notify.py","tests/tui_gateway/test_kanban_notify_poller.py"]},{"kind":"pr","number":105356,"title":"fix(gateway): heartbeat and completion events resume the owning conversation","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["evals/gateway_completion/README.md","evals/gateway_completion/delivery_lifecycle.py","evals/heartbeat_idle_wire.py","gateway/AGENTS.md","gateway/kanban_watchers_notifier.py","gateway/platforms/base.py","gateway/platforms/event.py","gateway/run.py","gateway/run_busy.py","gateway/run_goals.py","gateway/run_heartbeat_acceptance.py","gateway/run_heartbeat_restore.py","gateway/run_notifications.py","gateway/run_startup.py","gateway/run_turn.py","gateway/session_context.py","gateway/session_recovery.py","gateway/slash_commands.py","gateway/wake.py","hermes_cli/kanban.py","hermes_cli/kanban_db.py","hermes_cli/kanban_db_connect.py","hermes_cli/kanban_db_graph.py","hermes_cli/kanban_db_notify.py","plugins/platforms/raft/adapter.py","tests/gateway/test_background_process_notifications.py","tests/gateway/test_busy_wake_admission.py","tests/gateway/test_completion_admission.py","tests/gateway/test_completion_delivery.py","tests/gateway/test_completion_session_boundary.py","tests/gateway/test_heartbeat_acceptance.py","tests/gateway/test_heartbeat_execution_ownership.py","tests/gateway/test_heartbeat_poller.py","tests/gateway/test_heartbeat_session_boundaries.py","tests/gateway/test_heartbeat_watch_lifecycle.py","tests/gateway/test_heartbeat_watch_restore.py","tests/gateway/test_kanban_changes_requested_notifier.py","tests/gateway/test_kanban_notifier.py","tests/gateway/test_kanban_notifier_wake_only_ordering.py","tests/gateway/test_kanban_route_anchor_capture.py","tests/gateway/test_kanban_routed_transport.py","tests/gateway/test_kanban_wake_acceptance.py","tests/gateway/test_kanban_wake_scope.py","tests/gateway/test_relay_completion_injection_routing.py","tests/gateway/test_relay_injection_egress_priming.py","tests/hermes_cli/test_kanban_creator_origin.py","tests/tools/test_kanban_provenance.py","tools/async_delegation.py","tools/kanban_tools.py","website/docs/developer-guide/gateway-internals.md","website/docs/user-guide/features/delegation.md","website/docs/user-guide/features/heartbeat.md","website/docs/user-guide/features/kanban.md"]}],"trust":{"default_tier":"verified","includes_suggested":false}}