fix(kanban): retire on-complete orchestrator reaction (revert PR #43) - #72
Conversation
PR #43 fired ONE "Decide next" orchestrator decision card on EVERY task completion (parented or not, decomposed or not), making ~340 of ~674 cards pure coordination tax. It fired blind (sees only "task X done", reconstructs the next step from a summary) and was redundant with the dependency engine that already auto-promotes children when parents finish. The official Kanban model has no on-completion hook: orchestration clusters around decomposition, the dependency graph advances work mechanically, and workers create/link follow-up cards themselves. The hook inverted "agents declare what's next" into "a cold orchestrator infers it after the fact" — off-grain. Replaced with instructions (constitution "Follow-on work" section + kanban-skill reference rewrite, landed first and approved by Eric), then removed the code: - gateway/kanban_watchers.py: dropped _AUTO_REACTION_MARKER, _resolve_on_complete_review_config, _orchestrator_assignee, _qualifies_for_on_complete_review, the _maybe_react_on_complete mixin method, the per-tick cfg resolve, and the call site in the notifier completed branch. - hermes_cli/config.py: removed the kanban.on_complete_review DEFAULT_CONFIG block. - tests/gateway/test_kanban_on_complete_review.py: deleted (feature gone). Behavior-neutral in prod: the loop was already config-gated OFF (kanban.on_complete_review.enabled: false). The dependency engine and worker-side card creation carry follow-on work; nothing depended on the reaction. Patch note: ~/.hermes/plans/hermes-patches/retire-on-complete-review.md Task: t_710545d4
There was a problem hiding this comment.
Code Review
This pull request removes the on-completion review reaction feature from the Kanban watcher system. This includes deleting the loop-guard marker, configuration resolvers, orchestrator assignee resolution, qualification gating, the reaction handler method _maybe_react_on_complete, its integration within the notifier watcher loop, default configuration values, and all associated unit and integration tests. There are no review comments, so I have no feedback to provide.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
🔎 Lint report:
|
| Rule | Count |
|---|---|
unresolved-attribute |
1 |
First entries
gateway/kanban_watchers.py:1367: [unresolved-attribute] unresolved-attribute: Object of type `Self@_maybe_react_on_complete` has no attribute `adapters`
Unchanged: 6089 pre-existing issues carried over.
Diagnostics are surfaced as warnings — this check never fails the build.
The lint_diff stable-message regex hard-coded plural 'union elements', so a 1<->2 omitted-count flip (which crosses ty's singular/plural boundary, '1 union element' vs '2 union elements') still leaked the count into the diff key and flagged a spurious fixed+new pair. Make the trailing 's' optional and cover the boundary with a test.
Independent Code Review — PR #72Ran an independent, read-only review (skeptical pass, find-the-bug framing) against the worktree at HEAD Verdict: clean revert, safe to merge. The removal is total and correct. Confirmed clean
One nit found and fixed in this PR
Reviewed by EX Bot (independent read-only subagent) — no prior human/bot review existed on this PR. |
Retire the on-complete orchestrator reaction (revert PR #43)
Date: 2026-06-29
Branch: fix/retire-on-complete-review → live-config
Task: t_710545d4
Symptom
PR #43 (
feat: on-completion → orchestrator decides the next step, merged tolive-config) fired ONE "Decide next" orchestrator decision card on EVERY kanban
task completion — parented or not, decomposed or not. Result: ~340 of ~674
cards on the board were auto-spawned "Decide next" coordination cards: pure
coordination tax. The hook fired blind (it sees only "task X done" and must
reconstruct from a summary whether a real next step exists), so it over-fired,
and it was redundant with the dependency engine that already auto-promotes
children when their parents finish.
Root cause / why it's the wrong shape
The official Kanban docs have NO on-completion hook. The documented model:
orchestration clusters around DECOMPOSITION (the orchestrator judges completion
only of parents it decomposed); the dependency graph advances work mechanically
(a parented child auto-promotes when its parents are
done); and workerscreate/link follow-up cards themselves via
kanban_create+kanban_linkasthey discover work. PR #43 inverted "agents declare what's next while they hold
the context" into "a cold orchestrator infers it after the fact" — off-grain.
Decision (Eric, 2026-06-29): replace the hook with INSTRUCTIONS in the
constitution, then remove the feature. The loop was already turned OFF in
~/.hermes/config.yaml(kanban.on_complete_review.enabled: false, read fresheach tick) ahead of this revert.
Fix (instructions first, then remove the code)
Instructions (landed first, approved by Eric):
~/.hermes/constitution.md— new "Follow-on work: workers open the cards, thegraph carries the rest" section: bake mandatory review/verify into the
decomposition graph up front (auto-promoting dependency children, no watcher),
and have working agents open + assign + link follow-on cards as they uncover
work. Silence = nothing's next; no manufactured "decide next" coordination
cards.
~/.hermes/skills/devops/kanban/references/on-complete-orchestrator-routing.md— rewritten from "how to wire the on-complete reaction" to "why there is no
on-completion hook and how follow-on work actually flows," documenting the
retired feature and why not to re-add it. SKILL.md reference-index line
updated to match.
Code removed (this PR):
gateway/kanban_watchers.py— deleted_AUTO_REACTION_MARKER,_resolve_on_complete_review_config,_orchestrator_assignee,_qualifies_for_on_complete_review, the_maybe_react_on_completemixinmethod, the per-tick
on_complete_review_cfgresolution, and the call site inthe notifier
completedbranch (with its getattr guard).hermes_cli/config.py— removed thekanban.on_complete_reviewDEFAULT_CONFIGblock.
tests/gateway/test_kanban_on_complete_review.py— deleted (the feature ittested is gone).
Files Changed
gateway/kanban_watchers.pyhermes_cli/config.pytests/gateway/test_kanban_on_complete_review.py(deleted)~/.hermes/constitution.md,~/.hermes/skills/devops/kanban/references/on-complete-orchestrator-routing.md,~/.hermes/skills/devops/kanban/SKILL.mdVerification
grep -rn 'on_complete_review\|_AUTO_REACTION_MARKER\|_maybe_react_on_complete\|_qualifies_for_on_complete_review\|_orchestrator_assignee'across the reporeturns zero hits after the change.
scripts/run_tests.sh tests/gateway/ -- -k kanbanstays green (the deletedtest no longer collected; remaining kanban watcher tests pass).
Residual risk
Low. The feature was already config-gated OFF in production (
enabled: false),so removing the code changes no live behavior. The dependency engine and
worker-side card creation (both pre-existing) carry follow-on work; nothing
depended on the reaction.
kanban.orchestrator_profileis unaffected — it'sstill read by Triage auto-decompose.