Hermes Agent
Hermes parks completed Kanban work for explicit approval
Hermes proposes per-task approval policy built on its existing review lane, durable worktree snapshots when a worker exhausts its budget, and quieter stuck telemetry when respawn guards intentionally defer work.
NousResearch/hermes-agent PR #91948 is the inspected primary source: “feat(kanban): per-task approval policy parking completed work for approver sign-off (#29457).” The related records below were inspected as supporting context rather than independent confirmation.
The facts
- NousResearch/hermes-agent PR #91948 was created 2026-08-22T00:38:43Z and was open at inspection; its title is “feat(kanban): per-task approval policy parking completed work for approver sign-off (#29457).” - NousResearch/hermes-agent PR #91947 was created 2026-08-22T00:38:40Z and was open at inspection; its title is “feat(kanban): snapshot worker worktree state on iteration-budget exhaustion (#73234).” - NousResearch/hermes-agent PR #91941 was created 2026-08-22T00:35:38Z and was open at inspection; its title is “fix(kanban): don't flag dispatcher stuck when ready tasks are respawn-guard deferred (#80513).” - The repository reported 233997 stars, 34386 open issues, default branch main, and last push 2026-08-22T00:31:15Z. - The latest tagged-release baseline checked was v2026.8.19 published 2026-08-21T12:16:39Z.
What changed
NousResearch/hermes-agent PR #91948 reports: Fixes #29457 Design Per-task approval policy built entirely on the existing review lane — review IS the parked state; no new statuses, lanes, or event kinds. The issue's sensitivity-scoring extension is deliberately out of scope. Implementation Typed optional columns approval_required / approver_profile / approver_skill via the standard migration helper (fresh + legacy boards). create_task validates approver references at write time; set_approval_policy flips flags mid-flight (event + notify). complete_task gate: flagged task + completer ≠ designated approver → routes through the existing request_review machinery to park for that approver (CAS, claim cleared, run closed as review_requested); approver completing → normal done; request_changes send-back loop works unchanged and re-parks on next completion. Human approval degrades gracefully when the approver profile vanishes. Surfaces: CLI create flags + kanban set-approval verb + parked-complete reporting; kanban_create tool params; honest park report in kanban_complete output; dashboard PATCH body. Verification 24-test suite tests/hermes_cli/test_kanban_approval_policy.py covering park/approve/send-back/re-park, unflagged byte-parity, mid-flight flips, migration on legacy boards, degraded-approver fallback. Review-lifecycle/promote/notify/goal-mode regressions green via scripts/run_tests.sh; only pre-existing Windows-env failures remain (stash-verified).
NousResearch/hermes-agent PR #91947 reports: Fixes #73234 Problem When a kanban worker died on iteration-budget exhaustion, its staged/uncommitted worktree changes were invisible to recovery: the failure record released the claim without recording worktree state, so the reap classifier treated the unknown-state worker as protocol-violation/gave_up. Fix agent/turn_finalizer.py::_record_kanban_budget_exhausted (the chokepoint both budget-exhaustion branches funnel through) now snapshots the workspace first: one durable task comment with a machine-readable [kanban:worktree-snapshot] JSON header (branch, budget used/max, changed/staged/untracked counts, file list capped at 50) plus a human diff stat. Clean worktrees stay silent. Best-effort by construction — independently guarded so a snapshot failure can never skip the failure record; git subprocesses capped at 10s (~50ms typical). No LLM calls, no new config/env surface. Verification New suite tests/agent/test_turn_finalizer_kanban_worktree_snapshot.py (dirty → one comment with expected fields; clean → silent; non-git → failsafe; add_comment raising → exit path intact; >50 files capped; no env → silent) plus regression sweeps over turn-finalizer and kanban worker suites — green via scripts/run_tests.sh, failures limited to the known Windows baseline (stash-verified on clean main).
NousResearch/hermes-agent PR #91941 reports: Fixes #80513 Root cause The dispatcher health telemetry's has_spawnable_ready() counted ready+assigned+unclaimed tasks without consulting the respawn guard — but dispatch_once deliberately defers exactly those tasks every tick (recent_success / active_pr / rate_limit_cooldown / blocker_auth). An idle-by-design board therefore read as "spawnable work waiting", producing endless false "kanban dispatcher stuck" alarms (~986 false ticks observed by the reporter). Fix Both probes (has_spawnable_ready + mirror has_spawnable_review) now route through a shared _has_spawnable_in_lane(): a task counts as spawnable only when its assignee is a real profile AND check_respawn_guard() does not defer it this tick. Unexpected guard errors fail conservative (legacy warn behavior preserved), and both warn sites (CLI daemon + gateway watcher) now annotate the warning with that tick's guard deferrals so operators can split parked tasks from genuinely broken spawns. Dispatch semantics untouched — the probes' only callers are the two telemetry warn sites. Verification 11 new behavior-contract tests ( ests/hermes_cli/test_kanban_stuck_telemetry.py): no warning on an all-guarded board (and zero spawn attempts), warning fires on truly-spawnable-unspawned, mixed boards warn AND list deferrals, window-expiry re-enables, CLI daemon E2E via real dispatch_once. scripts/run_tests.sh over the new file + est_kanban_review_lifecycle.py + est_kanban_watchers_mixin.py → 31 passed, 0 failed.
Why it matters
The control plane needs a truthful parked state between worker completion and human acceptance. Recovery also needs the dirty worktree evidence that explains what the worker actually left behind. The operator test is whether the system remains bounded and its receipts still describe the action after failure, retry or restart.
Current
The primary record was open when captured on 2026-08-22. The tagged-release baseline was v2026.8.19 published 2026-08-21T12:16:39Z. Repository metadata, full source bodies, current pull requests and issues, releases, Google News, Hacker News, Lobsters, Metamesh and the rendered ClawCharts row were inspected. ClawCharts selected the subject; it did not prove the claim.
Evidence
The primary URL is https://github.com/NousResearch/hermes-agent/pull/91948. Supporting records are https://github.com/NousResearch/hermes-agent/pull/91947 and https://github.com/NousResearch/hermes-agent/pull/91941. Source bodies, timestamps and states are preserved in the daily evidence bundle. Test counts and reproductions remain attributed to their authors unless identified as independently rerun.
Source boundary
Open work is described as open, closed work as closed, and operator reports as reports. A pull request is evidence of proposed or reviewed direction, not proof of a shipped release. Search residue, package mirrors and historically published source spines were excluded.
Operator take
Bind approval to a named review owner, preserve the worktree snapshot before releasing a failed worker claim, and distinguish guarded deferral from dispatcher failure. Preserve a before-state receipt, make the smallest reversible change, and verify the original failure independently.
Caveat
Public project records are mutable. Status, scope and evidence can change after publication. This brief records the inspected state and does not authorize changes to a reader’s deployment.
Source inspected; source state, environment and release boundary remain explicit.