feat(kanban): add human_review status + review/approve/reject tools and CLI - #30967
Closed
sahilm-ti wants to merge 2 commits into
Closed
feat(kanban): add human_review status + review/approve/reject tools and CLI#30967sahilm-ti wants to merge 2 commits into
sahilm-ti wants to merge 2 commits into
Conversation
added 2 commits
May 23, 2026 18:20
The kanban terminal-event notifier was hard-truncating payloads at
160-200 chars, which made blocked notifications routinely unactionable
— users couldn't see the question the worker was asking without
opening the dashboard.
Extract the caps as named module-level constants and bump them per
event kind:
- NOTIFY_BLOCKED_REASON_MAX = 1500 (was 160; this is the one
users actually answer)
- NOTIFY_DONE_SUMMARY_MAX = 800 (was 200)
- NOTIFY_GAVE_UP_ERROR_MAX = 600 (was 200)
- NOTIFY_DONE_RESULT_LEGACY_MAX = 400 (was 160; legacy task.result
field, kept smaller because
new code uses summary)
All caps stay under Discord/Slack's ~2000-char single-message ceiling
so the largest payload still fits in one chat message on the tightest
platform we target. Telegram (4096) has plenty of headroom.
Tests cover: blocked carries the full reason, blocked truncates at
the documented cap on overflow, done carries the extended summary,
gave_up carries the extended error, and the cap budget stays ordered
(blocked > done > error > legacy result) so a chatty done summary
can't crowd out a critical blocked reason.
…ions
Adds a second review-flavored status to differentiate automated review
(the existing 'review' column the dispatcher auto-claims with the
sdlc-review agent) from human review (parked, awaiting Sahil's decision).
Workflow:
running -> review --[agent passes; merges PR]--> human_review
--[approve]--> done
--[reject]---> ready
-> review --[agent rejects]----------------> ready
kanban_db.py
- 'human_review' added to VALID_STATUSES.
- New atomic helpers: move_to_review, move_to_human_review, approve_task,
reject_task. Each does CAS on the expected source status and writes a
dedicated audit event (review_requested / human_review_requested /
approved / rejected) so the notifier and dashboard can render
differently per kind. approve_task also clears the failure counter,
recomputes ready for dependents, and cleans up the workspace
(mirroring complete_task).
- dispatch_once skips human_review tasks: no auto-spawn. The gateway
notifier subscription path is the only thing that fires for them.
CLI (hermes_cli/kanban.py)
- New subcommands: review / human-review / approve / reject. Pattern
matches block/unblock/complete: positional task_id, optional reason
with a comment+event audit trail.
Tool surface (tools/kanban_tools.py)
- kanban_review, kanban_human_review, kanban_approve, kanban_reject.
Mirror kanban_block/kanban_complete shape. Worker-ownership enforced
on the worker-initiated transitions (review, human_review).
Gateway notifier (gateway/run.py)
- TERMINAL_KINDS includes the three new event kinds.
- Renders ⏳ for human_review_requested, ✅ for approved, ↩ for
rejected, all capped at NOTIFY_BLOCKED_REASON_MAX.
Tests
- tests/hermes_cli/test_kanban_human_review.py: 12 tests covering
status validity, each transition, CAS atomicity, and dispatcher
hands-off behavior.
- tests/gateway/test_kanban_notifier_human_review.py: 3 tests pinning
the notifier glyph + content for each new event kind.
174 kanban + notifier tests pass; ruff clean on all touched files.
Contributor
Author
|
Closing — opened in error by a kanban worker. Will be reopened against sahilm-ti/hermes-agent (the personal fork). Hermes-agent PRs from this install should target the fork only, not upstream. |
This was referenced May 25, 2026
feat(kanban): add human_review status + review/approve/reject tools and CLI
sahilm-ti/hermes-agent#1
Merged
sahilm-ti
pushed a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
May 25, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home.
sahilm-ti
pushed a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
May 25, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home.
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
May 25, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
May 25, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
May 28, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
May 28, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
May 28, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
May 29, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jun 3, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jun 5, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jun 15, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jun 17, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jun 22, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jul 3, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jul 9, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jul 10, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jul 11, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jul 13, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jul 15, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jul 17, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jul 21, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jul 23, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
sahilm-ti
added a commit
to sahilm-ti/hermes-agent
that referenced
this pull request
Jul 28, 2026
Add the new 'human_review' status (introduced alongside the kanban_review/approve/reject machinery) to the dashboard's column list so cards in that state are actually visible on the board. Backend: append "human_review" between "review" and "done" in plugins/kanban/dashboard/plugin_api.py::BOARD_COLUMNS. The endpoint already buckets tasks by status into BOARD_COLUMNS, so this is the only Python change required. Frontend (dist/index.js — there is no src/ tree, the bundled JS is the canonical UI): - COLUMN_ORDER: extended to the full status list (scheduled and review were also missing from the JS fallback). The render loop iterates board.columns from the API, so missing keys here would just degrade labels; aligning it with the backend keeps the frontend's hard-coded order honest. - FALLBACK_COLUMN_LABEL / FALLBACK_COLUMN_HELP: added entries for scheduled, review, and human_review so the dashboard renders sane text when the i18n catalog has no key. - COLUMN_DOT: added scheduled/review/human_review classes. Style (dist/style.css): added .hermes-kanban-dot-scheduled, .hermes-kanban-dot-review, .hermes-kanban-dot-human-review with distinct colors so the new columns are visually distinguishable. The Python human_review status itself ships on the feat/kanban-human-review branch and PR NousResearch#30967; this change is a no-op until that lands but is safe to merge independently — any tasks ever set to status='human_review' will now have a home. Co-authored-by: Sahil Marwaha <sahilm@triangleinvestments.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Differentiates automated review (existing
reviewstatus — dispatcher auto-spawns thesdlc-reviewagent) from human review (newhuman_reviewstatus — parked, waits for the human reviewer to approve / reject).Also surfaces a CLI + tool API for manual transitions, so a worker can request review itself after opening a PR.
Changes
hermes_cli/kanban_db.pyhuman_reviewadded toVALID_STATUSES.move_to_review,move_to_human_review,approve_task,reject_task. Each writes a dedicated audit event (review_requested/human_review_requested/approved/rejected) so the notifier and dashboard can render different glyphs per kind.approve_taskclears the failure counter, recomputes ready for dependents, and cleans up the workspace (mirrorscomplete_task).reject_taskflips status back toready(not stuckrunningwithout a claim) and synthesises a closing run so the rejection rationale surfaces via the normal prior-runs path on the next worker'skanban_show.dispatch_onceskipshuman_reviewtasks: no auto-spawn. The gateway notifier path is the only thing that fires for them.hermes_cli/kanban.py(CLI)hermes kanban review,human-review,approve,reject. Pattern matches the existingblock/unblock/completesubcommands.tools/kanban_tools.py(worker tool surface)kanban_review,kanban_human_review,kanban_approve,kanban_reject. Mirror thekanban_block/kanban_completeshape. Worker-ownership enforced on the worker-initiated transitions.gateway/run.py(notifier)TERMINAL_KINDSextended with the three new event kinds.human_review_requested, ✅ forapproved, ↩ forrejected. All capped atNOTIFY_BLOCKED_REASON_MAX(1500 chars), consistent with the blocked-reason path.Tests
tests/hermes_cli/test_kanban_human_review.py— 12 tests covering: status validity, each transition (success + rejection from wrong source status), CAS atomicity (approve_task is idempotent on the second call), and the dispatcher's hands-off behavior forhuman_review.tests/gateway/test_kanban_notifier_human_review.py— 3 tests pinning the glyph + content of each new notifier message.All 174 kanban + notifier tests pass locally. Ruff clean on all touched files.
Out of scope
sdlc-reviewskill itself (already proposed in a separate config repo PR).