Skip to content

State the task-state/session-state boundary in DESIGN.md §8 - #9

Merged
MJohnson459 merged 1 commit into
mainfrom
worktree-design-dispatch-boundary
Jul 9, 2026
Merged

State the task-state/session-state boundary in DESIGN.md §8#9
MJohnson459 merged 1 commit into
mainfrom
worktree-design-dispatch-boundary

Conversation

@MJohnson459

Copy link
Copy Markdown
Contributor

Writes down the justification behind the dispatch design (voro task #26): Voro tracks task state, agents own session state. The return-path verbs push task-level transitions rather than Voro observing processes; a session's pid and log_path are receipts (redispatch trail, orphan detection), not management handles. This is what keeps dispatch agent-agnostic and Voro out of the orchestrator business.

Task 26's dispatch design records only a pid and log path per session and
learns task outcomes through the return-path verbs. The design doc described
the mechanics but not the reasoning, which surfaced when reviewing #26
against Claude Code's agent view and the orchestrator field (Vibe Kanban,
Claude Squad): those tools observe processes; Voro is told about tasks.
Writing the boundary down keeps future session work (orphan detection,
hooks fallbacks) on the right side of it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EFJffbUUv6cdgNn4KsFHoN
@MJohnson459
MJohnson459 marked this pull request as ready for review July 9, 2026 10:46
@MJohnson459
MJohnson459 merged commit 86f4bf4 into main Jul 9, 2026
@MJohnson459
MJohnson459 deleted the worktree-design-dispatch-boundary branch July 9, 2026 10:46
MJohnson459 added a commit that referenced this pull request Aug 1, 2026
`remove_dep` has been kind-aware since the deps-key change, but no verb
reached it, so an edge authored by mistake — a `related` typed where
`blocks` was meant, a `discovered-from` linking the wrong parent — was
removable only with raw SQL against the database. `--blocked-by` could
clear the blocker set wholesale, which left every other kind, and the
ability to drop one edge of a pair carrying two, with no spelling at all.

`voro set <id> --unlink <kind>:<other-id>` names one edge in the direction
`show` prints it — the edge belongs to the task being edited — and drops
exactly that one. The flag repeats for several. The echo reads the kind the
way `show` does (`no longer blocked by #9`, never the kind backwards), and
because dropping a blocker reconciles readiness in the store, the promotion
that can follow is echoed beside it, symmetrically with `--blocks`' demotion
echo; the trailing state is read back after the edit rather than reported
from before it.

No core logic changed: the store call and its refusal of an absent edge
already existed. Covered at the CLI level — one kind of a pair surviving the
other's removal, the refusal, the promotion, and the deliberate non-promotion
when the last blocker goes (a parked task with no blockers is deferred by
choice, DESIGN.md §5, so `unpark` stays the manual escape).


Claude-Session: https://claude.ai/code/session_01DxkK1vKA77ewc7vgnRTT9R

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant