ainb fleet:standup
List every claude session across the host. Three sources merged + deduped by cwd.
What standup reads vs what needs reads
standup is a roster: it merges discovery sources (ainb + claude-peers
broker + background jobs) and attaches a JSONL-synthesised summary line per
session. It does not read the event-sourced current_state table itself —
it is a "who is running" snapshot, not a "who is blocked" classifier.
The block-detection lives in /ainb-fleet:needs, which is
hooks-primary: it reads the materialized current_state table (ASK / ERR /
WAIT / IDLE / RUNNING / DONE), sourced from Claude Code hooks via
events.jsonl → notifyd, with a tmux/transcript fallback for non-Claude agents
(Codex/Gemini fire no Claude hooks). Standup's job is to spot when a session
looks answerable (summary contains AskUserQuestion) and auto-chain to
needs for the authoritative read + routing (see below).
Neither skill installs hooks — they consume materialized state. The global Claude Code hooks are installed by
ainb fleet atc setup.
Run
ainb fleet standup # text table (default)
ainb --format json fleet standup # JSON for piping
ainb fleet standup --no-enrich # 0-token roster (env AINB_FLEET_ENRICH=0)
--format is a global flag — it may appear anywhere (ainb --format json fleet standup or ainb fleet --format json standup both work); the
global-first form above is the convention across the fleet skills.
The workflow-backed briefing (/ainb-fleet:jarvis verb=standup) drafts the
per-session "what it's doing" lines in a single batched agent, not one per
session. --no-enrich skips that entirely.
Output fields (JSON)
| field | meaning |
|---|---|
id |
session id (peer id preferred, else ainb session_id, else bg job id) |
cwd |
working dir — primary dedupe key |
pid |
OS pid (when known — peers + bg jobs publish; ainb does not) |
tmux_session |
tmux session name if running in tmux |
workspace_name |
ainb workspace name |
worktree_path |
ainb worktree path |
peer_id |
broker peer id (if registered) |
sources |
array — subset of ["ainb","peers","jobs"] |
summary |
peer-published summary (may start with WAITING: to flag block) |
last_seen_ms |
unix ms of last activity any source observed |
Composition patterns
Just names:
ainb fleet --format json standup | jq -r '.[].tmux_session // .workspace_name'
Sessions in a specific repo:
ainb fleet --format json standup | jq '.[] | select(.cwd | contains("shotclubhouse"))'
Sessions reachable by the default tmux transport:
ainb fleet --format json standup | jq '.[] | select(.tmux_session != null)'
Sessions with a broker peer (fallback-routable):
ainb fleet --format json standup | jq '.[] | select(.peer_id != null)'
Group by source mix:
ainb fleet --format json standup \
| jq -r 'group_by(.sources | sort | join(",")) | .[] | "\(.[0].sources | sort | join(",")): \(length)"'
Auto-chain to /ainb-fleet:needs
After rendering standup, scan the result for sessions whose summary
contains AskUserQuestion (literal string — the JSONL-synthesised
summary surfaces this when the last assistant turn fired the tool).
If ANY such session exists, the standup MUST NOT stop at the standup table. Immediately:
Tell Stevie explicitly:
N session(s) blocked on AskUserQuestion — firing `/ainb-fleet:needs` to surface the questions + answer them in one batch.Invoke the
ainb-fleet:needsskill (via the Skill tool) OR runainb --format json fleet needsdirectly and render the Jarvis HUD per theainb-fleet:needsSKILL.md. No second Stevie-typed slash command required — the handover is automatic.
Detection one-liner:
ainb --format json fleet standup \
| jq -r '[.[] | select(.summary // "" | contains("AskUserQuestion"))] | length'
If 0 → skip the chain, standup is the final word. If >0 → chain immediately.
Rationale: standup is a snapshot; the moment it reveals an
answerable question, the fleet's center control panel (needs)
already knows how to extract the structured options + route the
answer back. Don't make Stevie type another slash command for a
mechanically inevitable next step.
Performance
Sub-100ms cold start. Reads broker SQLite directly + shells out to ainb list
once. Safe to call frequently.