JoyZoning separates cognition from authority.
- Hermes owns agent cognition: chat, planning, skills, tools, and the conversational TUI.
- JoyZoning owns runtime governance: kanban scheduling, execution leases, verification, human merge, recovery, evidence, and operator commands.
jz is not a Hermes clone. jz is the operator shell for the JoyZoning local kanban runtime — the same control plane the desktop app uses, with the same gates and evidence rules.
See also: what-is-joyzoning.md (plain-language product explanation) · cli.md (command reference) · concepts.md (why leases exist) · workspace-state.md (1:1 card → folder) · architecture.md (layers) · diet-hermes TUI architecture (upstream pattern we follow for agent chat)
| Cockpit | Command | What it is |
|---|---|---|
| Agent cognition | hermes --tui (via jz hermes tui) |
Full Hermes terminal: multiline chat, slash skills, tool streaming, session resume |
| External editing | Cursor, Claude Code, Copilot, manual | Files change outside JoyZoning; state tracked via jz task start-external / delivery-chain next --external |
| Operator / runtime | jz or jz tui |
JoyZoning operator shell: leases or external JSDP, verify, merge, approvals, live OnJoyEvent stream |
flowchart LR
subgraph cognition [Hermes_cognition]
TUI[hermes --tui]
Tools[skills_and_tools]
Chat[planning_and_chat]
end
subgraph authority [JoyZoning_authority]
JZ[jz_operator_shell]
CP[control_plane_9470]
Lease[execution_lease]
Merge[human_merge]
end
Chat --> Tools
TUI --> Chat
JZ --> CP
CP --> Lease
Lease --> Merge
JZ -.->|launch_only| TUI
Rule of thumb: if the question is “what should the agent think or do next?”, use Hermes or your external IDE (Cursor, etc.) — JoyZoning does not need to run the agent. If the question is “what is allowed to become project state?”, use JoyZoning (jz, desktop, or REST): mark-ready, verify, merge.
Without a deliberate split, the chat surface becomes the operating system. That failure mode looks familiar:
- Planning, dispatch, verification, merge, recovery, and scheduling all collapse into one conversational UI.
- “The agent said it’s done” replaces durable lease state and evidence.
- Tool output in chat is mistaken for governance truth.
- Operators lose scriptable, auditable commands in favor of prose.
JoyZoning exists so conversation stays volatile and runtime state stays durable. Hermes is excellent at cognition; JoyZoning is the kernel that decides what crosses into kanban, SQLite, and git merge.
| Layer | Hermes | JoyZoning |
|---|---|---|
| Agent chat | hermes --tui |
jz hermes tui / /hermes launcher (no .NET reimplementation) |
| Operator shell | Classic CLI + central slash registry | jz / jz tui + OperatorSlashRegistry |
| Live events | Tool streams, gateway events | SignalR OnJoyEvent + manager chat deltas |
| Automation | Non-TTY / flags / pipes | JOYZONING_NO_TUI=1 + JSON on stdout |
Process model (aligned with upstream Hermes TUI docs):
jz tui # Ink-style operator REPL (C#)
└── HTTP :9470 # control plane
└── SignalR hub # live tool / lease / manager events
jz hermes tui # spawns hermes --tui (Node Ink + Python gateway)
└── diet-hermes # agent sessions, tools, skills — unchanged
Do not re-implement the primary agent chat experience in JoyZoning. The desktop embeds Hermes TUI over dashboard PTY for the same reason: one transcript, one composer, one slash-command behavior.
| Layer | Shows |
|---|---|
| Hermes TUI / Manager Chat | Plans, tool streams, reasoning |
| JoyZoning Workspace | Files on disk for the selected card (card branch in canonical workspace after dispatch) |
| JoyZoning Timeline | Same paths, persisted as git.status.changed / workspace.file.changed |
jz /workspace with /use <task> hits the same APIs as the desktop — not a second copy of git state. See workspace-state.md.
- Planning and decomposition (Manager role)
- Agent chat and conversational reasoning
- Tool and skill invocation
- Streaming assistant output and tool progress
- Session resume, model/skill selection inside chat
- Task / card lifecycle on the kanban board
- Execution lease lifecycle (dispatch → verify → review → merge)
- Worktree and session scope for workers
- Verification reports attached as evidence
- Merge and revoke (human-only for Complete)
- Recovery and reconciliation (reopen, reattach, replacement lease)
- Append-only operator evidence and event timeline
jz # auto-starts TUI on a real TTY
jz tui --session <guid> --task <guid> # pre-bind contextInside jz tui, bind a task then run lease workflows:
/use <task-guid>
/dispatch # or /run; add --approve-critical for risk 3
/watch # stream OnJoyEvent + manager deltas
/complete --yes # human merge only
Plain text (no /) sends Manager Chat when a session is active — planning input, not merge authority.
jz hermes tui # full hermes --tui
jz hermes tui -c # resume latest Hermes TUI sessionInside operator TUI: /hermes does the same launch and returns when Hermes exits.
JOYZONING_NO_TUI=1 jz task list --pretty
jz task run <id> --poll 10
jz task complete <id> --yesUse source scripts/dotnet-env.sh before build/test if macOS dotnet points at .NET 6 only (development.md).
These rules are non-negotiable across desktop, REST, and jz:
| Statement | Meaning |
|---|---|
| Hermes can think and act as an agent worker | Tools, edits, and plans in the lease workspace (card branch) |
| JoyZoning decides what becomes project state | Kanban column, lease status, evidence rows |
jz agent done → ready_for_review only |
Never Complete |
jz task complete --yes → human merge |
Only path to Complete after verification |
| Chat never owns final authority | Manager Chat does not merge, revoke, or bypass leases |
The chat layer proposes; the control plane records; the human signs off.
| Property | Benefit |
|---|---|
| Runtime state is durable | SQLite + joy_events survive restarts; chat context does not |
| Chat context is volatile | Replanning does not silently rewrite lease or verification history |
| Leases constrain mutation | Worktree path, risk, caps, one active lease per card |
| Verification gates truth | Commands run in worktree; reports stored on the lease |
| Human approval preserves governance | Critical dispatch, merge, revoke require explicit operator intent |
| Terminal automation stays scriptable | JOYZONING_NO_TUI=1, JSON stdout, exit codes for CI |
This strategy explicitly does not:
- Rebuild Hermes or embed a second Ink/React chat stack in JoyZoning
- Make
jza general-purpose AI assistant - Let agents bypass execution leases or mark tasks Complete
- Let Manager Chat or Hermes TUI merge, revoke, or replace verification without the control plane API
- Add a second messaging gateway or duplicate Hermes slash-command registry for agent skills
If a feature belongs in agent cognition, it belongs in diet-hermes. If it belongs in project authority, it belongs in JoyZoning.
jz
/use 550e8400-e29b-41d4-a716-446655440000
/dispatch --approve-critical # when risk: 3
/watch # live tool + event stream
/complete --yesEquivalent automation:
JOYZONING_NO_TUI=1 jz task dispatch 550e8400-e29b-41d4-a716-446655440000 --approve-critical
JOYZONING_NO_TUI=1 jz task verify 550e8400-e29b-41d4-a716-446655440000 --cmd "dotnet test"
JOYZONING_NO_TUI=1 jz task complete 550e8400-e29b-41d4-a716-446655440000 --yesjz hermes tui # plan and use tools in Hermes
cd "$WORKTREE"
jz agent heartbeat
jz agent verify --cmd "dotnet test"
jz agent done # ready_for_review — not CompleteJOYZONING_NO_TUI=1 jz task list --pretty
JOYZONING_NO_TUI=1 jz --field .status task lease "$TASK_ID"| Piece | Role |
|---|---|
| Hermes | Cognition cockpit — how agents think, talk, and use tools |
| JoyZoning | Runtime kernel — what is allowed to become durable project state |
jz |
Operator shell — human-supervised commands against the control plane |
jz agent |
Constrained worker harness — inside the lease workspace only |
| Kanban | Scheduler — cards, dispatch, sync with Hermes board |
| Human merge | Final authority — Complete after evidence and review |
| Workspace (1:1) | One card → one folder — PR-style file review, not chat scrollback |
Use Hermes to explore and execute. Use JoyZoning to govern and sign off — and use Workspace to see what actually changed on disk.