Merge feature/orchestrator/s53-agent-presence into master

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	docs/requirements/001-agent-orchestrator.md
#	orchestrator/templates/page-board.js
#	tests/e2e/test_orchestrator_e2e.py
This commit is contained in:
Kevin Veen-Birkenbach committed 2026-11-11 07:48:48 +00:00
commit afebf24703
24 files changed
+798 -13

No files matched your search

@@ -334,6 +334,34 @@ from three views down to any agent, branch or artefact.
remaining digits and hashes. Rejected for paths: every segment with
"slash", the file name only, mapping to known repositories, not speaking
paths.
61. **Agent states** (operator 2026-11-10, decisions 61 to 64): the hub
derives six states per agent session: sleeping (drain or suspend part,
idle),
suspending (drain or suspend part, still busy), working (process alive,
busy), alive (process alive, idle), dead (process gone while a claim or
task still names it) and unreachable (busy without an update for 15
minutes, or a call without a receipt for 10 minutes). Inputs: the Claude
Code session files (status, pid and its start tick), the night state and
the radio receipts; a runtime without a session file shows alive or dead
by its claim heartbeat. The hub's container sees neither the session
files nor the host's processes, so a host timer
(`kvb-orchestrator-sessions.timer`, every 15 seconds while the page
polls) writes a snapshot with each process checked into the hub's
state; one older than 5 minutes counts as absent. Rejected: an agent
hook reporting its own state (a hook and a reinstall on every agent),
the claim heartbeat alone (no working versus alive), the host's PID
namespace or `/proc` in the container (every process's command line in
reach of the web-facing hub).
62. **State symbol**: an animated Bootstrap icon from the vendored sprite
next to every agent in Orbit, Chord, Swimlane, Tree and 3D and in the
agent panel; `prefers-reduced-motion` stops the animation. Rejected:
emoji (font-dependent), a colored ring only (six states hard to tell
apart).
63. **Status menu**: a "Status" menu in the Agents toolbar holds one checkbox
per state and "Faces in 3D", stored per browser like the saved views,
no passkey. Rejected: hub-wide settings with a signature.
64. **3D faces**: agent nodes in the 3D view show their face, on by default
and switchable; repositories and branches stay spheres.
## Approach
@@ -785,6 +813,19 @@ flowchart TD
- [ ] The spot shows the speaking caption, the last five sent messages and
the stations with play and stop.
### Phase 6: agent states and 3D faces (S5.3)
- [ ] The state of every fixture session matches decision 61 for each of the
six states and for a session without a session file (unit test).
- [ ] Orbit, Chord, Swimlane, Tree, 3D and the agent panel show the state
symbol of each fixture agent.
- [ ] Unticking a state in the Status menu hides its symbols in every view;
the choice survives a reload.
- [ ] The 3D view shows agent faces by default and spheres after unticking
"Faces in 3D".
- [ ] `make orchestrator-install` enables `kvb-orchestrator-sessions.timer`,
and `make orchestrator-check` reports it active.
### Tests
- **Unit**
@@ -812,6 +853,10 @@ flowchart TD
redirecting to `#stream` with the spot flag.
- [ ] S5.5: ICAO digit words, Zulu times, DTG with offset conversion,
dates, decimals and spoken paths.
- [ ] S5.3: each agent state from a fixture snapshot, night state and
receipts, a session without a record; the host client's snapshot
from fixture session files with a reused pid; a stale or malformed
snapshot read as absent.
- **Integration**
- [ ] Two scratch sessions exchange `post` and `call` through the real hook
entry points (JSON on stdin): the post appears only on the callee's
@@ -844,3 +889,6 @@ flowchart TD
class sends from it, the icon-only Cancel mayday, the speaking
caption and the stations inside the spot, in Chromium and Firefox at
1920, 1366 and 390 px.
- [ ] S5.3: state symbols in every Agents view and the panel, the Status
menu toggles through a reload, 3D faces on and off, in Chromium and
Firefox at 1920, 1366 and 390 px.