Skip to content

feat(kanban): inherit notification subscriptions to child tasks - #46443

Open
coderlaoma wants to merge 2 commits into
NousResearch:mainfrom
coderlaoma:feat/kanban-child-notify-inheritance
Open

feat(kanban): inherit notification subscriptions to child tasks#46443
coderlaoma wants to merge 2 commits into
NousResearch:mainfrom
coderlaoma:feat/kanban-child-notify-inheritance

Conversation

@coderlaoma

@coderlaoma coderlaoma commented Jun 15, 2026

Copy link
Copy Markdown

Summary

  • Add a kanban.inherit_notify_subscriptions_to_children config flag (default false).
  • When enabled, child tasks created by triage decomposition inherit the root task's gateway notification subscriptions.
  • Thread the flag through kanban_decompose.decompose_task to kanban_db.decompose_triage_task.
  • Expose the setting through the dashboard orchestration GET/PUT API and settings panel.
  • Document the default-off behavior and per-child notification fan-out.

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, and INSERT OR IGNORE keeps 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 -q
  • Result: 135 passed, 0 failed.
  • ruff check on all changed Python source and test files.
  • node --check plugins/kanban/dashboard/dist/index.js.
  • scripts/check-windows-footguns.py on 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

  • No platform-specific logic: the change is SQLite, YAML config, dashboard API, and browser UI code.
  • No new external destination or credential surface. Existing subscription rows are copied only within the same Kanban database.
  • The flag defaults off, so existing deployments retain their current notification behavior.

@alt-glitch alt-glitch added type/feature New feature or request P3 Low — cosmetic, nice to have comp/cron Cron scheduler and job management labels Jun 15, 2026

@tonydwb tonydwb left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

cwest added a commit to cwest/hermes-agent that referenced this pull request Jun 21, 2026
…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 teknium1 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread hermes_cli/config.py
@@ -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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please document this user-facing kanban setting and expose it through the dashboard orchestration settings surface, which already manages related decomposition toggles.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@teknium1 teknium1 added sweeper:risk-message-delivery Sweeper risk: may drop, duplicate, misroute, or suppress messages sweeper:blast-contained Sweeper blast radius: contained — one narrow path / opt-in / few users labels Jul 14, 2026
@coderlaoma
coderlaoma force-pushed the feat/kanban-child-notify-inheritance branch from 64626e3 to db8f10c Compare July 14, 2026 16:31
@coderlaoma
coderlaoma requested a review from teknium1 July 14, 2026 16:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/cron Cron scheduler and job management P3 Low — cosmetic, nice to have sweeper:blast-contained Sweeper blast radius: contained — one narrow path / opt-in / few users sweeper:risk-message-delivery Sweeper risk: may drop, duplicate, misroute, or suppress messages type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants