Skip to content

fix(kanban): diagnose unavailable triage automation#25640

Closed
qWaitCrypto wants to merge 2 commits into
NousResearch:mainfrom
qWaitCrypto:fix/kanban-triage-specifier-diagnostic
Closed

fix(kanban): diagnose unavailable triage automation#25640
qWaitCrypto wants to merge 2 commits into
NousResearch:mainfrom
qWaitCrypto:fix/kanban-triage-specifier-diagnostic

Conversation

@qWaitCrypto

@qWaitCrypto qWaitCrypto commented May 14, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

Surfaces a Kanban diagnostic when a task is stuck in triage and diagnostics can see that the active triage automation backend is not configured.

After #27572, triage can advance through two paths:

  • Auto orchestration mode (kanban.auto_decompose=true) uses auxiliary.kanban_decomposer.
  • Manual/single-task mode (kanban.auto_decompose=false) uses auxiliary.triage_specifier.

Without this, a rough triage card can sit indefinitely with no operator-facing reason. hermes kanban decompose / hermes kanban specify already return no auxiliary client configured when they cannot resolve the helper model, but board/task diagnostics did not expose that configuration gap.

Related Issue

#25641

Follow-up to #27572.

Type of Change

  • 🐛 Bug fix (non-breaking change that fixes an issue)
  • ✨ New feature (non-breaking change that adds functionality)
  • 🔒 Security fix
  • 📝 Documentation update
  • ✅ Tests (adding or improving test coverage)
  • ♻️ Refactor (no behavior change)
  • 🎯 New skill (bundled or hub)

Changes Made

  • Added a triage_automation_unavailable diagnostic for triage tasks when config clearly lacks the backend for the active triage automation path.
  • Checks auxiliary.kanban_decomposer when kanban.auto_decompose=true.
  • Checks auxiliary.triage_specifier when kanban.auto_decompose=false.
  • Kept the rule conservative:
    • no diagnostic when config context is unavailable
    • no diagnostic when the active helper has provider: auto
    • no diagnostic when a main model fallback is visible
  • Added suggested CLI actions to configure the active helper or run the matching hermes kanban decompose <task_id> / hermes kanban specify <task_id> command.
  • Passed runtime config into Kanban diagnostics from both CLI and dashboard paths.
  • Added focused diagnostics tests for auto-decompose mode, manual mode, main-model fallback, no-context suppression, and non-triage suppression.

Reproduction

Before the fix, a triage task with missing auto-decompose auxiliary config produced no diagnostic:

task = {'id': 't_triage', 'status': 'triage', 'title': 'rough task'}
config = {'kanban': {'auto_decompose': True}, 'auxiliary': {}}
diags = kd.compute_task_diagnostics(
    task,
    [],
    [],
    config=kd.config_from_runtime_config(config),
)
diagnostic_kinds = []

After the fix, the same state surfaces the unavailable triage automation backend:

diagnostic_kinds = ['triage_automation_unavailable']
suggested_commands = ['hermes config set auxiliary.kanban_decomposer.provider auto']

Manual mode checks the single-task specifier path instead:

config = {'kanban': {'auto_decompose': False}, 'auxiliary': {}}
diagnostic_kinds = ['triage_automation_unavailable']
suggested_commands = ['hermes config set auxiliary.triage_specifier.provider auto']

How to Test

PYTHONDONTWRITEBYTECODE=1 python - <<'PY'
from hermes_cli import kanban_diagnostics as kd

task = {'id': 't_triage', 'status': 'triage', 'title': 'rough task'}
config = {'kanban': {'auto_decompose': True}, 'auxiliary': {}}
diags = kd.compute_task_diagnostics(
    task,
    [],
    [],
    config=kd.config_from_runtime_config(config),
)
print('diagnostic_kinds =', [d.kind for d in diags])
print('suggested_commands =', [a.payload.get('command') for d in diags for a in d.actions if a.suggested])
PY

Result:

diagnostic_kinds = ['triage_automation_unavailable']
suggested_commands = ['hermes config set auxiliary.kanban_decomposer.provider auto']
python -m py_compile hermes_cli/kanban_diagnostics.py hermes_cli/kanban.py plugins/kanban/dashboard/plugin_api.py tests/hermes_cli/test_kanban_diagnostics.py

Result: passed.

pytest -q tests/hermes_cli/test_kanban_diagnostics.py -k "triage_automation or config_from_runtime_config"

Result: 8 passed.

python -m ruff check hermes_cli/kanban.py hermes_cli/kanban_diagnostics.py plugins/kanban/dashboard/plugin_api.py tests/hermes_cli/test_kanban_diagnostics.py

Result: passed.

git diff --check -- hermes_cli/kanban_diagnostics.py hermes_cli/kanban.py plugins/kanban/dashboard/plugin_api.py tests/hermes_cli/test_kanban_diagnostics.py

Result: passed.

Checklist

Code

  • I've read the Contributing Guide
  • My commit messages follow Conventional Commits (fix(scope):, feat(scope):, etc.)
  • I searched for existing PRs to make sure this isn't a duplicate
  • My PR contains only changes related to this fix/feature (no unrelated commits)
  • I've run pytest tests/ -q and all tests pass
  • I've added tests for my changes
  • I've tested on my platform: Linux (WSL-style dev environment)

Documentation & Housekeeping

  • I've updated relevant documentation (README, docs/, docstrings) — or N/A
  • I've updated cli-config.yaml.example if I added/changed config keys — or N/A
  • I've updated CONTRIBUTING.md or AGENTS.md if I changed architecture or workflows — or N/A
  • I've considered cross-platform impact (Windows, macOS)
  • I've updated tool descriptions/schemas if I changed tool behavior — or N/A

Screenshots / Logs

See reproduction and test logs above.

@alt-glitch alt-glitch added type/bug Something isn't working comp/plugins Plugin system and bundled plugins comp/cli CLI entry point, hermes_cli/, setup wizard P3 Low — cosmetic, nice to have labels May 14, 2026
@qWaitCrypto qWaitCrypto force-pushed the fix/kanban-triage-specifier-diagnostic branch 2 times, most recently from 4d33cc7 to 4652b19 Compare May 18, 2026 06:56
qWaitCrypto and others added 2 commits May 18, 2026 16:02
After NousResearch#27572, triage automation defaults to the kanban decomposer path instead of only the specify path. Update the diagnostic to check the active triage automation backend: kanban_decomposer when auto-decompose is enabled, triage_specifier in manual mode.
@qWaitCrypto qWaitCrypto force-pushed the fix/kanban-triage-specifier-diagnostic branch from 4652b19 to 74b25c2 Compare May 18, 2026 08:09
@qWaitCrypto

Copy link
Copy Markdown
Contributor Author

Updated this PR after #27572 landed.

The underlying gap still exists on current main: triage tasks can remain stuck without a clear diagnostic when the active triage automation backend is unavailable.

The shape of the issue changed after #27572:

  • Before: triage primarily depended on auxiliary.triage_specifier, so the diagnostic checked for a missing specifier.
  • Now: triage defaults to orchestration / auto-decompose via auxiliary.kanban_decomposer, while manual mode still uses auxiliary.triage_specifier.

So I updated the diagnostic from the narrower triage_missing_specifier case to triage_automation_unavailable, and made it check the active path:

  • kanban.auto_decompose=true -> check auxiliary.kanban_decomposer
  • kanban.auto_decompose=false -> check auxiliary.triage_specifier

I also updated the tests to cover both modes.

@qWaitCrypto qWaitCrypto changed the title fix(kanban): surface missing triage specifier fix(kanban): diagnose unavailable triage automation May 18, 2026
teknium1 added a commit that referenced this pull request May 18, 2026
…aware) (#27871)

Adds a 'triage_aux_unavailable' diagnostic for tasks stuck in triage when
neither the active aux helper slot nor the main-model auto fallback is usable.

Auto-decompose aware:
- kanban.auto_decompose=True (default): primary is auxiliary.kanban_decomposer,
  triage_specifier is the fanout=false fallback.
- kanban.auto_decompose=False: primary is auxiliary.triage_specifier (manual
  'hermes kanban specify' path).

Default aux slots use 'provider: auto' which falls back to the main model, so
this rule only fires when both the explicit slot config AND the main-model
auto fallback are absent. Quiet by default; informative when there is a real
config gap.

Also adds kd.config_from_runtime_config() that carries kanban + auxiliary +
model keys through to diagnostics, and updates CLI/dashboard call sites to
use it. config_from_kanban_config() is preserved for back-compat.

Reworks the original PR #25640 idea (@qWaitCrypto) to align with the new
auto-decompose dispatcher path landed in #27572. The original PR pointed only
at auxiliary.triage_specifier, which is now the fallback rather than the
primary helper.

Co-authored-by: qWaitCrypto <axmaiqiu@gmail.com>
@teknium1

Copy link
Copy Markdown
Contributor

Reworked and merged via #27871 onto current main. The original PR pointed only at auxiliary.triage_specifier — after #27572 added the auto-decompose dispatcher, the primary path is now auxiliary.kanban_decomposer (with the specifier as the fanout=false fallback). The new diagnostic is auto_decompose-aware and points at the right slot for both modes. You are credited via Co-authored-by on the merge commit. Thanks for surfacing this gap!

@teknium1 teknium1 closed this May 18, 2026
Lillard01 pushed a commit to Lillard01/hermes-agent that referenced this pull request May 21, 2026
…aware) (NousResearch#27871)

Adds a 'triage_aux_unavailable' diagnostic for tasks stuck in triage when
neither the active aux helper slot nor the main-model auto fallback is usable.

Auto-decompose aware:
- kanban.auto_decompose=True (default): primary is auxiliary.kanban_decomposer,
  triage_specifier is the fanout=false fallback.
- kanban.auto_decompose=False: primary is auxiliary.triage_specifier (manual
  'hermes kanban specify' path).

Default aux slots use 'provider: auto' which falls back to the main model, so
this rule only fires when both the explicit slot config AND the main-model
auto fallback are absent. Quiet by default; informative when there is a real
config gap.

Also adds kd.config_from_runtime_config() that carries kanban + auxiliary +
model keys through to diagnostics, and updates CLI/dashboard call sites to
use it. config_from_kanban_config() is preserved for back-compat.

Reworks the original PR NousResearch#25640 idea (@qWaitCrypto) to align with the new
auto-decompose dispatcher path landed in NousResearch#27572. The original PR pointed only
at auxiliary.triage_specifier, which is now the fallback rather than the
primary helper.

Co-authored-by: qWaitCrypto <axmaiqiu@gmail.com>
gweeteve pushed a commit to gweeteve/hermes-agent that referenced this pull request Jun 2, 2026
…aware) (NousResearch#27871)

Adds a 'triage_aux_unavailable' diagnostic for tasks stuck in triage when
neither the active aux helper slot nor the main-model auto fallback is usable.

Auto-decompose aware:
- kanban.auto_decompose=True (default): primary is auxiliary.kanban_decomposer,
  triage_specifier is the fanout=false fallback.
- kanban.auto_decompose=False: primary is auxiliary.triage_specifier (manual
  'hermes kanban specify' path).

Default aux slots use 'provider: auto' which falls back to the main model, so
this rule only fires when both the explicit slot config AND the main-model
auto fallback are absent. Quiet by default; informative when there is a real
config gap.

Also adds kd.config_from_runtime_config() that carries kanban + auxiliary +
model keys through to diagnostics, and updates CLI/dashboard call sites to
use it. config_from_kanban_config() is preserved for back-compat.

Reworks the original PR NousResearch#25640 idea (@qWaitCrypto) to align with the new
auto-decompose dispatcher path landed in NousResearch#27572. The original PR pointed only
at auxiliary.triage_specifier, which is now the fallback rather than the
primary helper.

Co-authored-by: qWaitCrypto <axmaiqiu@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/cli CLI entry point, hermes_cli/, setup wizard comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants