Teknium
c868425467
feat(kanban): durable multi-profile collaboration board (#17805)
Salvage of PR #16100 onto current main (after emozilla's #17514 fix
that unblocks plugin Pydantic body validation). History preserved on
the standing `feat/kanban-standing` branch; this squashes the 22
iterative commits into one clean landing.
What this lands:
- SQLite kernel (hermes_cli/kanban_db.py) — durable task board with
tasks, task_links, task_runs, task_comments, task_events,
kanban_notify_subs tables. WAL mode, atomic claim via CAS,
tenant-namespaced, skills JSON array per task, max-runtime timeouts,
worker heartbeats, idempotency keys, circuit breaker on repeated
spawn failures, crash detection via /proc/<pid>/status, run history
preserved across attempts.
- Dispatcher — runs inside the gateway by default
(`kanban.dispatch_in_gateway: true`). Ticks every 60s, reclaims
stale claims, promotes ready tasks, spawns `hermes -p <assignee>
chat -q "work kanban task <id>"` with HERMES_KANBAN_TASK +
HERMES_KANBAN_WORKSPACE env. Auto-loads `--skills kanban-worker`
plus any per-task skills. Health telemetry warns on stuck ready
queue.
- Structured tool surface (tools/kanban_tools.py) — 7 tools
(kanban_show, kanban_complete, kanban_block, kanban_heartbeat,
kanban_comment, kanban_create, kanban_link). Gated on
HERMES_KANBAN_TASK via check_fn so zero schema footprint in normal
sessions.
- System-prompt guidance (agent/prompt_builder.py KANBAN_GUIDANCE)
injected only when kanban tools are active.
- Dashboard plugin (plugins/kanban/dashboard/) — Linear-style board
UI: triage/todo/ready/running/blocked/done columns, drag-drop,
inline create, task drawer with markdown, comments, run history,
dependency editor, bulk ops, lanes-by-profile grouping, WS-driven
live refresh. Matches active dashboard theme via CSS variables.
- CLI — `hermes kanban init|create|list|show|assign|link|unlink|
claim|comment|complete|block|unblock|archive|tail|dispatch|context|
init|gc|watch|stats|notify|log|heartbeat|runs|assignees` +
`/kanban` slash in-session.
- Worker + orchestrator skills (skills/devops/kanban-worker +
kanban-orchestrator) — pattern library for good summary/metadata
shapes, retry diagnostics, block-reason examples, fan-out patterns.
- Per-task force-loaded skills — `--skill <name>` (repeatable),
stored as JSON, threaded through to dispatcher argv as one
`--skills X` pair per skill alongside the built-in kanban-worker.
Dashboard + CLI + tool parity.
- Deprecation of standalone `hermes kanban daemon` — stub exits 2
with migration guidance; `--force` escape hatch for headless hosts.
- Docs (website/docs/user-guide/features/kanban.md + kanban-tutorial.md)
with 11 dashboard screenshots walking through four user stories
(Solo Dev, Fleet Farming, Role Pipeline, Circuit Breaker).
- Tests (251 passing): kernel schema + migration + CAS atomicity,
dispatcher logic, circuit breaker, crash detection, max-runtime
timeouts, claim lifecycle, tenant isolation, idempotency keys, per-
task skills round-trip + validation + dispatcher argv, tool surface
(7 tools × round-trip + error paths), dashboard REST (CRUD + bulk
+ links + warnings), gateway-embedded dispatcher (config gate, env
override, graceful shutdown), CLI deprecation stub, migration from
legacy schemas.
Gateway integration:
- GatewayRunner._kanban_dispatcher_watcher — new asyncio background
task, symmetric with _kanban_notifier_watcher. Runs dispatch_once
via asyncio.to_thread so SQLite WAL never blocks the loop. Sleeps
in 1s slices for snappy shutdown. Respects HERMES_KANBAN_DISPATCH_IN_GATEWAY=0
env override for debugging.
- Config: new `kanban` section in DEFAULT_CONFIG with
`dispatch_in_gateway: true` (default) + `dispatch_interval_seconds: 60`.
Additive — no \_config_version bump needed.
Forward-compat:
- workflow_template_id / current_step_key columns on tasks (v1 writes
NULL; v2 will use them for routing).
- task_runs holds claim machinery (claim_lock, claim_expires,
worker_pid, last_heartbeat_at) so multi-attempt history is first-
class from day one.
Closes #16102.
Co-authored-by: emozilla <emozilla@nousresearch.com>
2026-04-30 13:36:47 -07:00
..
2026-04-29 20:05:32 -07:00
2026-03-23 07:43:12 -07:00
2026-04-29 23:18:55 -07:00
2026-04-27 20:08:33 -07:00
2026-04-27 06:42:32 -07:00
2026-04-24 15:25:12 -07:00
2026-04-16 04:07:11 -07:00
2026-04-20 23:20:33 -07:00
2026-04-24 03:46:46 -07:00
2026-04-17 16:05:04 -07:00
2026-04-24 03:46:46 -07:00
2026-04-28 07:03:44 -07:00
2026-04-08 13:44:58 -07:00
2026-04-16 04:19:34 -07:00
2026-04-20 00:32:09 -07:00
2026-03-28 17:25:04 -07:00
2026-04-10 13:05:44 -07:00
2026-04-28 07:03:44 -07:00
2026-04-26 09:57:58 -07:00
2026-04-29 23:18:55 -07:00
2026-04-01 12:03:56 -07:00
2026-04-26 18:27:13 -07:00
2026-04-23 22:23:37 -07:00
2026-04-11 02:58:48 -07:00
2026-04-26 19:05:52 -07:00
2026-04-29 23:18:55 -07:00
2026-04-18 01:46:25 -07:00
2026-04-30 03:31:16 -07:00
2026-04-29 07:22:33 -07:00
2026-03-27 04:03:00 -07:00
2026-04-10 03:44:43 -07:00
2026-04-26 08:32:09 -07:00
2026-04-25 22:07:12 -07:00
2026-04-29 06:35:34 -07:00
2026-04-08 17:23:15 -07:00
2026-03-02 04:34:21 -08:00
2026-04-24 04:58:32 -07:00
2026-03-26 14:50:26 -07:00
2026-04-27 21:09:14 -07:00
2026-04-25 04:50:14 -07:00
2026-04-29 16:16:43 +10:00
2026-04-14 21:20:37 -07:00
2026-04-29 21:56:51 -07:00
2026-04-21 06:14:25 -07:00
2026-04-17 19:04:11 -07:00
2026-04-22 06:11:41 -07:00
2026-04-22 06:11:41 -07:00
2026-04-17 19:26:40 -07:00
2026-04-27 00:17:26 -07:00
2026-04-23 15:11:52 -07:00
2026-04-21 16:41:26 -07:00
2026-04-30 06:36:50 -07:00
2026-04-10 03:01:46 -07:00
2026-04-10 21:14:32 -07:00
2026-04-20 00:58:16 -07:00
2026-04-08 17:23:15 -07:00
2026-04-24 03:46:46 -07:00
2026-04-13 05:15:05 -07:00
2026-03-14 11:27:02 -07:00
2026-04-21 02:03:46 -07:00
2026-04-29 07:22:33 -07:00
2026-03-04 18:34:16 +03:00
2026-04-13 04:45:07 -07:00
2026-04-21 02:04:21 -07:00
2026-04-23 03:01:18 -07:00
2026-04-21 13:35:31 -07:00
2026-04-28 22:16:08 -07:00
2026-04-14 02:18:38 -07:00
2026-04-30 13:36:47 -07:00
2026-03-27 15:28:19 -07:00
2026-04-19 11:27:50 -07:00
2026-04-29 07:22:33 -07:00
2026-04-29 23:18:55 -07:00
2026-04-23 05:15:37 -07:00
2026-04-09 16:24:53 -07:00
2026-04-16 12:36:49 -07:00
2026-04-16 12:36:49 -07:00
2026-04-15 13:29:05 -07:00
2026-04-09 13:17:06 -07:00
2026-04-16 12:36:49 -07:00
2026-04-21 05:19:03 -07:00
2026-04-29 20:05:32 -07:00
2026-04-19 16:31:07 -07:00
2026-04-19 16:31:07 -07:00
2026-04-16 21:57:10 -07:00
2026-04-16 21:57:10 -07:00
2026-04-26 05:43:54 -07:00
2026-04-04 10:18:57 -07:00
2026-04-16 21:57:10 -07:00
2026-04-26 18:21:20 -07:00
2026-04-29 20:05:32 -07:00
2026-04-16 21:57:10 -07:00
2026-04-04 10:18:57 -07:00
2026-04-24 05:28:45 -07:00
2026-04-28 04:58:03 -07:00
2026-04-14 10:18:05 -07:00
2026-04-13 16:32:04 -07:00
2026-04-23 15:14:11 -07:00
2026-04-12 06:18:05 +05:30
2026-04-29 07:22:33 -07:00
2026-04-10 03:01:46 -07:00
2026-04-12 00:36:22 -07:00
2026-04-05 12:46:07 -07:00
2026-04-22 14:45:50 -07:00
2026-04-10 16:47:44 -07:00
2026-04-29 04:59:21 -07:00
2026-04-13 16:32:04 -07:00
2026-04-28 01:57:21 -07:00
2026-04-23 15:11:52 -07:00
2026-03-10 17:09:51 -07:00
2026-04-24 02:44:46 -07:00
2026-03-17 02:02:57 -07:00
2026-04-15 17:37:43 -07:00
2026-04-30 04:28:08 -07:00
2026-04-26 19:03:17 -07:00
2026-04-26 11:55:02 -07:00
2026-04-20 13:24:15 -07:00
2026-03-16 19:01:39 +03:00
2026-04-10 03:44:43 -07:00
2026-04-01 04:19:19 -07:00
2026-04-29 10:28:25 -07:00
2026-04-01 04:19:19 -07:00
2026-04-30 10:31:47 -07:00
2026-03-04 05:30:43 -08:00
2026-03-02 02:00:09 -08:00
2026-04-23 06:20:47 -07:00
2026-03-14 23:15:04 -07:00
2026-04-26 20:57:10 -07:00
2026-04-23 05:09:08 -07:00
2026-04-29 07:22:33 -07:00
2026-04-29 21:56:47 -07:00
2026-04-24 07:06:11 -07:00
2026-04-30 04:32:28 -07:00
2026-04-20 03:07:32 -07:00
2026-03-04 17:23:23 +03:00
2026-04-16 19:39:21 -07:00
2026-04-19 16:53:11 -07:00
2026-04-29 16:16:43 +10:00
2026-04-04 16:57:24 -07:00
2026-04-19 16:47:20 -07:00
2026-04-08 21:37:51 -07:00
2026-04-20 23:20:33 -07:00
2026-04-29 07:22:33 -07:00
2026-03-29 21:51:44 -07:00
2026-04-09 16:24:53 -07:00
2026-04-29 07:22:33 -07:00
2026-04-28 01:34:16 -07:00
2026-04-08 17:23:15 -07:00
2026-04-29 23:18:55 -07:00
2026-04-11 16:22:50 -07:00
2026-04-26 19:02:55 -07:00
2026-04-07 17:19:07 -07:00
2026-04-23 21:51:19 -07:00
2026-04-11 14:26:11 -07:00
2026-04-29 23:18:55 -07:00
2026-04-29 23:18:55 -07:00
2026-04-29 23:18:55 -07:00
2026-04-30 02:53:20 -07:00
2026-04-29 23:18:55 -07:00
2026-04-16 14:23:16 -07:00
2026-04-21 01:28:32 -07:00
2026-04-21 17:49:39 -07:00
2026-04-30 02:53:20 -07:00
2026-04-30 02:53:20 -07:00
2026-04-12 16:46:18 -07:00
2026-04-26 18:27:13 -07:00
2026-04-29 07:22:33 -07:00
2026-04-20 00:32:09 -07:00
2026-04-21 00:29:29 -07:00
2026-04-09 16:24:53 -07:00
2026-04-25 06:41:58 -07:00
2026-04-28 02:09:30 -07:00
2026-04-09 13:17:06 -07:00
2026-03-30 08:10:14 -07:00
2026-03-01 01:54:27 +03:00
2026-04-24 03:46:46 -07:00
2026-04-25 22:07:12 -07:00
2026-04-24 03:46:46 -07:00