Repository navigation
kanban: card-level due_at, woken by the dispatcher tick - #118559
Open
yoyodine-industries wants to merge 77 commits into
Open
yoyodine-industries wants to merge 77 commits into
yoyodine-industries wants to merge 77 commits into
Conversation
Author
|
pr-evergreen: this branch conflicts with |
yoyodine-industries
force-pushed
the
feat/kanban-card-due-at
branch
from
October 2, 2026 16:49
2294aa2 to
193736e
Compare
Author
|
pr-evergreen status: the |
Parks a card with a due time and wakes it from the dispatcher loop, so a
time-gated card needs no wake-due-cards.sh cron entry of its own.
- kanban_db: tasks.due_at / due_window_policy (epoch seconds + band policy),
schedule_task(due_at=...), list_due_tasks(), kanban_meta KV for the waker
heartbeat; unblock_task clears the due time and takes an extra event payload.
- kanban_due: the waker. Reads the execution-window map, defers a wake into a
reserved band (moved to the band close, with a comment saying so) unless the
card is armed "ambient", fails closed on a broken map, records its heartbeat.
- kanban_db_dispatch: wake phase at the top of every tick, before the lanes are
enumerated, so a card woken here is claimed in the same tick.
- kanban_diagnostics: "overdue_scheduled" -- a parked card past its due time is
an error, not something to notice days later; says whether the tick is dead.
- CLI/API: hermes kanban schedule --due/--window-policy/--clear-due, the due
time in `show`/--json, and PATCH /tasks/{id} due_at.
- Dashboard: scheduled column in board order, column hint, due badge.
33 tests in tests/hermes_cli/test_kanban_due_wake.py; the kanban suites are
unchanged (identical failure set with and without the diff).
Authored with AI assistance (Hermes Agent); diff verified manually.
… block auto-release via the due sweep Two follow-ups to the card-level `due_at` work: - the overdue-kind assertion now asks the diagnostics payload instead of parsing the rendered sweep text, so a wording change in that report cannot make the test pass for the wrong reason (ports 1dc25ea); - `kanban block --due-at/--due-window-policy` arms an auto-release on a `blocked` landing: the due-card waker unblocks the card on the first dispatcher pass after that time, so a time-fenced hold releases without a human touching it. The CLI reports the armed time back as a `due_note`, and upstream's newer typed-block verdict wording (`needs a human decision` vs `orchestration attention needed`) is preserved (ports c8f6661). Authored with AI assistance (Hermes Agent); diff verified manually.
yoyodine-industries
force-pushed
the
feat/kanban-card-due-at
branch
from
October 11, 2026 18:55
c289716 to
4d994c8
Compare
Conflict: hermes_cli/kanban_db.py `_TASK_OPTIONAL_COLUMNS`. This branch adds the `due_at` column to that tuple; upstream removed `last_heartbeat_at` from the same tuple (it is already read through `_TASK_EPOCH_COLUMNS`, so the duplicate entry was redundant). The two edits are independent, so the resolution keeps upstream's removal AND this branch's added column. Fork policy: the resolved branch is pushed to the FORK branch only; nothing is merged to fork main, which is an upstream mirror. Agent: platform-coder
added 26 commits
October 17, 2026 21:24
This branch has not been deployed
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.
A card can now carry a wake time.
due_at(epoch seconds) plusdue_window_policyare task columns the dispatcher's due-card waker honours on each tick: a card whose due time has passed is woken fromscheduledintoready, and a wake whose due time lands inside a reserved execution band is deferred to the close of that band instead of starting work inside it (defer/ambientpolicies). Waking is not spawning — an unreadable band map or a waker crash leaves the card parked and is reported through the overdue diagnostic rather than starting work in a window that forbids it.Surfaces:
hermes_cli/kanban_due.py— the sweep, the band lookup and the deferral math.kanban schedule/kanban block --due-at/--due-window-policyand the parser/output plumbing; the CLI echoes an armed time back as adue_note.kanban_metakey/value row records the waker's last-tick heartbeat (one row per key, never a log).Also in this PR, two follow-ups: the overdue-kind assertion asks the diagnostics payload instead of parsing the rendered sweep text, and a time-fenced block auto-releases through the same sweep.
Ported from fork commits
7b5545479d50,1dc25ea03c31,c8f6661310onto current main. Three base-drift calls, all recorded in the resolutions:kanban_metatable is kept, and the fork'sCREATE INDEX IF NOT EXISTS idx_tasks_assignee_statusline is dropped because main now creates that index inkanban_db_connect.py.kanban_db_connect.pykeeps both sides — main'sworker_started_atcolumn and the fork'sdue_at/due_window_policy.kanban_db_dispatch.pykeeps the fork'sdue_*DispatchResultfields and main'sdescribe_suppression; the fork's hunk context also carried arow_errorsfield that belongs to fix(kanban): isolate per-row dispatch faults so one poison row can't end the pass #118290, so it is excluded here to keep this PR scoped to the wake time. fix(kanban): isolate per-row dispatch faults so one poison row can't end the pass #118290 touches the same dataclass, so whichever lands second needs a trivial rebase.Evidence, base
7b3c7aef31:scripts/run_tests.sh tests/hermes_cli/test_kanban_due_wake.py→ 44 passed, 0 failedtest_schedule_without_due_at_keeps_an_existing_due_time,test_window_policy_needs_a_due_time,test_unknown_window_policy_is_refusedpython3 -m py_compileclean on every touched moduleAuthored with AI assistance (Hermes Agent); diff verified manually.
Related Issue
Related Issue: none
Checklist
Code
fix(scope):,feat(scope):, etc.)scripts/run_tests.sh tests/hermes_cli/test_kanban_due_wake.py→ 44 passed, 0 failed. The fullpytest tests/ -qwas not run on this host.python scripts/checkpasses (the blocking lint and code-health checks CI runs)tests/hermes_cli/test_kanban_due_wake.py.Documentation & Housekeeping
docs/, docstrings) — N/A: the PR body records no documentation update.cli-config.yaml.exampleif I added/changed config keys — N/A: the PR body records nocli-config.yaml.examplechange.CONTRIBUTING.mdorAGENTS.mdif I changed architecture or workflows — N/A: the PR body records noCONTRIBUTING.mdorAGENTS.mdchange.