Every agent on nh3-dev — Claude, Codex, Grok, Aider — needs the same answers: what runs here, how do I call it, what will bite me. Until now that lived in ~/.claude/CLAUDE.md, which only Claude sessions load, and it was interleaved with operator preferences that other families have no use for. Two-tier by design, matching the persistent-memory split: FLEETTOOLS.md is a 135-line index an agent reads whole, and each entry links to a detail file it opens only when it actually needs that tool. Reading the index costs about a fifth of reading the tree. Detail paths are absolute so they resolve from any working directory, since a non-Claude agent will cat the path rather than follow a markdown link. ~/FLEETTOOLS.md symlinks to the index for discovery. Rule zero is that live inventories get queried, not transcribed: Homepage /api/services, asset-engine /api/v1/services, LiteLLM /v1/models, and every FastAPI seat's /openapi.json. A copied service table would be stale within a month and this repo already has a standing rule against second copies that drift. Contents verified against the running fleet rather than copied from existing docs: binaries resolved on PATH, seven endpoints probed live, the LiteLLM roster counted at 40 models where the old note said ~30. No credentials are included; the vault and its CLI are pointed at instead.
3.2 KiB
The Booth — ephemeral media board + operator decisions
URL: http://10.100.10.50:8090/ · CLI: booth (on PATH on nh3-dev)
Storage: a booth is just a folder — ~/booth-data/<name>/ on nh3-dev. No upload API.
Wiped 24h after last activity unless kept. No auth (LAN/WG-internal), so never drop secrets in a booth.
Show the operator something
booth new <name>; booth add <name> <file>... # or just cp/rsync into ~/booth-data/<name>/
rsync -a ./out/ nh3-dev:booth-data/<name>/ # from another host
booth url <name> # -> http://10.100.10.50:8090/b/<name>/
booth keep <name> / booth unkeep <name> # exempt from / restore the 24h sweep
Auto-renders a gallery of images, webm+mp4 video and audio. A <file>.txt sidecar
becomes that item's caption (this is how you label an A/B pair). A folder's own
index.html is served verbatim — build a custom report when you want one.
Ask the operator to decide (no chat round-trip)
booth ask <booth> <stem> "<prompt>" "<option A>" "<option B>" [...] [--no-notes]
booth answer <booth> <stem> --wait # blocks until answered (default 1h)
booth answer <booth> <stem> # non-blocking; exit 1 while unanswered
booth asks <booth>
Open asks are flagged amber on the Booth front page, so a waiting question is visible
without pinging anyone. Files are the state: <stem>.ask.json (yours),
<stem>.answer.json (theirs: choice, choice_index, label, notes,
answered_at, answered_by). Re-answering overwrites — the sidecar is the current
answer, not a log. Radio only, no multi-select.
Put the ask WHERE THE ARTIFACT IS. If the booth has its own index.html, the
Booth substitutes placeholders: <div data-booth-ask="<stem>"></div> for the whole
ask, data-booth-ask="<stem>:<question-key>" for one question's radios,
data-booth-ask-submit="<stem>" for notes + submit. Per-question fragments bind to
one form via the HTML5 form= attribute, so a five-clip audition can put each radio
group under its own audio and still submit in a single POST.
⚠ Keep the placeholder OUTSIDE any grid/flex container or it becomes a cell in it.
⚠ A partial answer is legal and you must handle it. The operator can leave any
question blank; the sidecar then carries complete: false and the blank keys in
unanswered. Check complete before acting, and read a key in unanswered as
"not decided yet", never as "declined".
Standing convention — the link board
Every operator-facing link worth more than the next thirty seconds goes on the standing link board, in the same turn you mention it.
booth link <url> "<short description>" # on nh3-dev
ssh nh3-dev 'booth link <url> "<desc>"' # from anywhere else
booth links # read it
Still put the link in your reply — this is in addition to, not instead of. Links in chat drown in scrollback; the board is a kept booth rendered at the top of the Booth front page. Don't post noise: if the operator would not click it a week from now, it does not belong there.
Full schema + rules: ~/development/eshpfi-management/services/booth/README.md