Skip to content

feat(kanban): triage layer Phase 1 — labels column + LLM-emitted assignee + routing engine - #25870

Closed
jjaavvin-web wants to merge 6 commits into
NousResearch:mainfrom
jjaavvin-web:feat/kanban-triage-layer
Closed

feat(kanban): triage layer Phase 1 — labels column + LLM-emitted assignee + routing engine#25870
jjaavvin-web wants to merge 6 commits into
NousResearch:mainfrom
jjaavvin-web:feat/kanban-triage-layer

Conversation

@jjaavvin-web

Copy link
Copy Markdown

Summary

Phase 1 of the triage routing layer that fills the "auto-assignee" gap in Kanban dispatch:

  • hermes_cli/kanban_db.py — adds labels JSON column to tasks + migration for legacy DBs + set_task_labels/get_task_labels helpers
  • hermes_cli/kanban_specify.py — specifier LLM now emits {title, body, assignee_suggestion, labels} instead of just title/body; suggestion fills empty assignee, labels written via schema column with metadata fallback
  • hermes_cli/triage_routing.py (new) — route(labels, llm_suggested_assignee, routing_rules) with first-match-wins subset semantics; reads triage.routing_rules from ~/.hermes/config.yaml
  • Specifier now calls route() after parsing LLM output → final assignee flows to specify_triage_task

Routing rules block (drop into config.yaml when ready):

triage:
  routing_rules:
    - labels: [audit-only]
      assignee: h2reviewer
    - labels: [long-running, autopilot]
      assignee: ruflo-swarm

Test plan

  • 84/84 new tests in tests/hermes_cli/test_kanban_labels.py, test_kanban_specify.py, test_kanban_specify_db.py, test_triage_routing.py
  • Full hermes_cli suite: 4378/4378 green — no regressions

🤖 Generated with Claude Code

jjaavvin-web and others added 6 commits May 13, 2026 21:35
Phase 1 of the Kanban triage layer. The new tasks.labels column holds
a JSON-encoded array of strings populated by the LLM specifier and
consumed by the routing engine. Stored separately from task_runs.metadata
so tags stay structurally distinct from arbitrary per-run data.

- Adds labels TEXT NOT NULL DEFAULT '[]' to the tasks CREATE TABLE.
- Adds _migrate_add_labels_column() and wires it into the existing
  _migrate_add_optional_columns() migration pass so legacy DBs pick up
  the column on first connect().
- Adds set_task_labels() / get_task_labels() helpers with strict
  input validation (rejects non-list, non-str elements, tuples) plus
  strip + dedupe so re-emitting a tag set is idempotent.
- Adds tests/hermes_cli/test_kanban_labels.py covering schema on fresh
  DBs, legacy-DB migration, set/get roundtrip, and malformed input.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…allel-defense tests

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@alt-glitch alt-glitch added type/feature New feature or request comp/cli CLI entry point, hermes_cli/, setup wizard comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have labels May 14, 2026
@teknium1

Copy link
Copy Markdown
Contributor

Thanks @jjaavvin-web — closing this one. The Phase 1 triage layer (labels column + LLM-emitted assignee + routing engine, 1360 LOC + 84 tests) overlaps with the existing orchestrator-driven decompose path that landed in #27572. Decompose already takes an LLM call to route tasks to specialist assignees by description; adding a parallel labels+routing engine would create two paths to the same outcome. If there's a concrete gap decompose doesn't fill, please open an issue and we can fold it into the orchestrator surface.

@teknium1 teknium1 closed this May 19, 2026
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/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants