feat(kanban): inherit notification subscriptions to child tasks - #46443
feat(kanban): inherit notification subscriptions to child tasks#46443coderlaoma wants to merge 2 commits into
Conversation
tonydwb
left a comment
There was a problem hiding this comment.
Code Review Summary
Verdict: Approved
Kanban notification subscriptions now inherit to child tasks. Clean feature, well-scoped.
Looks Good
- Single-concern feature
- No security concerns
Reviewed by Hermes Agent
…bump base-tag NousResearch#44338 was closed administratively (fork CI gating), not merged, so the manifest's default "auto-retire when the PR lands in a release" rule can never fire for this row — and the only strictly-weaker alternative PR (NousResearch#45940, detection-only) would regress the keep-alive and backoff behaviors if the carry were dropped on its merge. Rewrite the NousResearch#44338 row's retire trigger to be behavior-keyed: retire only when upstream gateway/kanban_watchers.py implements ALL of (i) SendResult failure-detection, (ii) keep-subscription-alive-on-permanent-failure, and (iii) bounded exponential backoff. Watch NousResearch#45940 and NousResearch#46443 but do not drop on NousResearch#45940 merge alone. Update the port-location note to the post-refactor home (GatewayKanbanWatchersMixin in gateway/kanban_watchers.py) and bump the row's base-tag to v2026.6.19. Add a "per-row override" caveat to the global Auto-retire rule so a future rebaser does not naively apply the PR-merge rule to a behavior-keyed row.
teknium1
left a comment
There was a problem hiding this comment.
Thanks for the focused implementation. The underlying gap is still present on current main: decompose_triage_task() creates child tasks without copying root notification subscriptions (hermes_cli/kanban_db.py:5299-5359), while the gateway notifier delivers from per-task subscription rows (gateway/kanban_watchers.py:251-278).
Problems
- The new user-facing config key is absent from the Kanban config documentation (
website/docs/user-guide/features/kanban.md:503-511). - The dashboard orchestration settings surface does not read or persist this related setting (
plugins/kanban/dashboard/plugin_api.py:2287-2330,2393-2397), leaving YAML editing as the only way to opt in.
Suggested changes
- Document
kanban.inherit_notify_subscriptions_to_children, including its default-off behavior and per-child notification fan-out. - Add the flag to the dashboard orchestration settings API and panel alongside the existing decomposition controls.
Automated hermes-sweeper review.
| @@ -2158,6 +2158,11 @@ def _ensure_hermes_home_managed(home: Path): | |||
| # large bulk-load of triage tasks from spending a burst of aux | |||
| # LLM calls in one tick. Excess tasks defer to the next tick. | |||
| "auto_decompose_per_tick": 3, | |||
| # When true, child tasks created from a triage decomposition inherit | |||
| # the root task's gateway notification subscriptions. Defaults to | |||
| # false so only the root task reports back unless the user opts into | |||
There was a problem hiding this comment.
Please document this user-facing kanban setting and expose it through the dashboard orchestration settings surface, which already manages related decomposition toggles.
There was a problem hiding this comment.
Implemented in db8f10cb8 after rebasing the PR onto current main:
- documented
kanban.inherit_notify_subscriptions_to_children, including the default-off behavior and per-child notification fan-out; - added the flag to the dashboard orchestration GET/PUT API with persistence through
config.yaml; - added a Child notifications checkbox to the Orchestration settings panel with a warning that each child can send its own completion or blocked notification;
- added dashboard API and bundle regression coverage.
Validation: 135 targeted tests passed, ruff check passed, the dashboard bundle passed node --check, and the Windows footgun scan was clean.
64626e3 to
db8f10c
Compare
Summary
kanban.inherit_notify_subscriptions_to_childrenconfig flag (defaultfalse).kanban_decompose.decompose_tasktokanban_db.decompose_triage_task.Why
When a triage task is fanned out, only the root task carries gateway notification subscriptions. Users who want updates from individual children currently have no opt-in path.
The default remains conservative: only the root reports back unless the user enables child notification inheritance. Inherited subscriptions start at
last_event_id = 0, andINSERT OR IGNOREkeeps the copy idempotent.Test Plan
scripts/run_tests.sh tests/hermes_cli/test_kanban_decompose.py tests/hermes_cli/test_kanban_decompose_db.py tests/plugins/test_kanban_dashboard_plugin.py -qruff checkon all changed Python source and test files.node --check plugins/kanban/dashboard/dist/index.js.scripts/check-windows-footguns.pyon all changed Python source and test files.Tests cover default no-inheritance behavior, DB-layer field copying, config-driven inheritance, dashboard default/read/write persistence, partial updates, and the dashboard control contract.
Cross-platform / Security impact