Recording shot list: the external-ACP-agents wave
The concrete, take-by-take plan for the media the external-ACP-agents wave needs
— the follow-through to the audit in
content-refresh-inventory.md §3. It says exactly
what to shoot, with what tool, in what order, and where each asset embeds. The
reusable how-to (tools, gotchas, the model-swap ritual, the selectors) lives in
scripts/demos/RECORDING.md; this file does
not repeat it, it schedules against it.
House style: real turns only, a meaningful seeded sidebar (no trash sessions), secrets scrubbed, and a fast cloud model on camera. Every take below names its output filename and embed target so nothing is shot blind.
Shared pre-flight (every Beam take)
Do this once before any Beam capture, then leave it running for the whole session:
- Model-swap ritual — set a fast, quiet cloud model and restore your real
default afterward. Verbatim commands in
RECORDING.md§“Before any recording”. In short:contenox config set default-provider vertex-google/default-model gemini-3-flash-preview/default-think off; restore after. - Seed a meaningful sidebar — a handful of believable, triaged sessions (RevOps/HubSpot tool-call runs, a repo-chore session), so a new agent session sits among real neighbours. No husks, no “test test”.
- Register the demo agent — the agent takes need one enabled external agent.
The sidebar’s agent chevron is hidden until one exists:
contenox agent add claude-acp # or: add demo-agent -- <cmd> contenox agent check claude-acp "say hello" # confirm it answers first - Reset fixtures between takes (
git checkout <file>), verify frames after (Read renders images), and confirm no token/key is on camera.
Drive Beam with Playwright at 1440×900 (record-beam.mjs, or the Playwright
MCP browser). Terminal takes use vhs (scripts/demos/*.tape + mkgif.sh).
Take 1 — Hero loop (re-record)
The homepage hero and the beam-guide video. The current cut ends on the retired modal approval gate and predates the agent picker + inline card.
- Tool: Playwright video (
scripts/demos/record-beam.mjs, retargeted — see Selectors). ~30 s, encode to webm (libvpx-vp9 -crf 40). - Output:
beam-demo.webm(+ poster framebeam-video-cover.png), flat underwebsite/public/. - Embed targets:
website/src/components/Landing.astro(homepage hero<video>) anddocs/guide/beam.md(top-of-page<video>, currently behind aTODO(recapture)comment — remove it once the new cut lands). - Seed: meaningful sidebar + the
demo-projectworkspace on the allowlist (contenox serve <demo-dir>), plus the registered agent from pre-flight. - Steps:
- Opening pan: open the sessions drawer (seeded sidebar on camera ~2 s), close it.
- New chat with an agent chevron → pick the registered agent from the
AgentPicker(Contenox (default) at top). (This is the new beat vs. the old cut.) The empty chat stages it and reads “Say hello — you are talking to {name}, live”. - Send a prompt that reads then writes a file (e.g. “Read TODO.md and add a 0.2.0 entry to CHANGELOG.md for the completed items.”).
- Let the tool-call cards render; the gated write raises the inline permission card — hold ~3 s on the diff, then Allow.
- Closer: open the workspace Files panel and toggle Agent view so the
per-file policy verdicts are the final frame. Grab
cover-frame.pnghere for the poster.
- Selectors / timing: wait on the card via
getByRole('group', { name: /permission required/i }), not a dialog role, and click Allow (no click-outside/yshortcut). Full selector snippet inRECORDING.md§2.record-beam.mjs:94still waits on[role="dialog"]and pressesy— retarget both first.
Take 2 — Permission card (replaces beam-approval-gate.png)
A still of the inline permission card against a registered agent’s gated action.
- Tool: Playwright screenshot (Playwright MCP), 1440×900.
- Output:
agent-permission-card.png, flat underwebsite/public/. - Embed target:
docs/guide/beam.md“The approval gate” section — a commented-out<!--  -->placeholder is already there; uncomment it and delete the siblingTODO(recapture)and the oldbeam-approval-gate.pngreference. Retirebeam-approval-gate.png. - Seed: the registered agent +
demo-projectworkspace; a HITL policy that gates writes (so the card actually raises). - Steps:
- Start a chat against the registered agent (sidebar chevron → pick it).
- Prompt it into a single gated file write (a
CHANGELOG.md/TODO.mdedit reads well — a real diff, not a destructive command). - When the inline card appears in the transcript, screenshot with the card and its diff in frame, buttons visible (Allow / Deny, and their always variants if the policy offers them).
- Selectors / timing: the card is
role="group",aria-label“Permission required”. Frame it inside the transcript (it is inline, not a modal) so the screenshot visibly differs from the old floating gate.
Take 3 — Agent picker
Shows the sidebar picker and the staged-agent empty chat.
- Tool: Playwright — a short GIF (screenshot sequence stitched with ffmpeg) is ideal; a single PNG of the open dropdown is the cheap fallback.
- Output:
agent-picker.gif(oragent-picker.png), flat underwebsite/public/. - Embed targets:
docs/integrations/agents/external-acp-agents.md(“Drive it from Beam”) anddocs/guide/beam.md(“Chat with a registered agent”) — add the embed in both once shot. - Seed: ≥1 enabled registered agent (ideally two, so the list reads as a roster) + meaningful sidebar.
- Steps:
- Sidebar in view. Click the chevron beside New session (
aria-label“New chat with an agent”). - Hold on the open
AgentPicker: Contenox (default) at the top, registered agents below. - Pick a registered agent → the empty chat shows the staged greeting; the new
session row carries
Agent: {name}. - (GIF) type the first line of a prompt to show attribution persisting, then stop.
- Sidebar in view. Click the chevron beside New session (
- Selectors / timing: chevron
aria-labelacp_sidebar.new_session_with_agent; the picker is aDropdown(AgentPicker.tsx) anchored to the rail’s right edge. Keep the panel un-clipped — capture at ≥1440 wide.
Take 4 — agent check (terminal)
The CLI verification turn: streamed reply, stop reason, advertised commands, forwarded MCP servers.
- Tool: vhs. New tape
scripts/demos/agent-check.tape; render withmkgif.sh(vhs agent-check.tape && ./mkgif.sh agent-check). - Output:
agent-check.gif, flat underwebsite/public/. - Embed targets:
docs/reference/contenox-cli.md(contenox agent checksubsection) anddocs/integrations/agents/external-acp-agents.md(“Verify it withagent check”) — add the embed in both. - Seed: an agent whose config declares an
mcp_serversallowlist (so theForwarding MCP servers:line appears) and that advertises ≥1 slash command (so theAgent advertises N command(s):line appears). Register it off-camera. - Steps (tape):
Set Theme "Catppuccin Mocha",Set FontSize 18, fixed Width/Height/Padding to match the other tapes.Type "contenox agent check demo-agent \"summarize this repo in one line\""→Enter.Wait+Screenon a loose regex of the reply, then let these lines land:Forwarding MCP servers: …, the streamed reply,Turn completed (agent … stopReason=end_turn).,Agent advertises N command(s): ….- Short hold, done.
- Selectors / timing: vhs gotchas apply (no
&&/$()insideType; relativeOutputpath; looseWait+Screenregex) — seeRECORDING.md§1. Keep the GIF < ~3 MB. Scrub any real path/credential from the run command on camera.
Take 5 — Agent slash-command menu
The proxied agent-advertised /commands in the composer.
- Tool: Playwright screenshot, 1440×900.
- Output:
agent-slash-menu.png, flat underwebsite/public/. - Embed target:
docs/guide/beam.md(“Composer shortcuts”) — add the embed. - Seed: a session against a registered agent that advertises commands (the
same agent as Take 4). The command menu is populated from the agent’s
available_commands_update, so drive one turn first if the list arrives lazily. - Steps:
- In a live agent session, click the composer and type
/. - When the command suggestions menu opens (
SlashCommandMenu, labelacp_chat.slash_menu_label“Command suggestions”), screenshot it with a few agent-advertised commands (e.g./compact,/review) visible.
- In a live agent session, click the composer and type
- Selectors / timing: the menu is anchored above the composer; capture with the composer and one highlighted entry in frame.
Take 6 — New-chat surface (update beam-new-chat.png)
Refresh the empty new-chat still so it shows the staged-agent picker beat.
- Tool: Playwright screenshot, 1440×900.
- Output:
beam-new-chat.png(overwrite), flat underwebsite/public/. - Embed targets:
docs/guide/beam.md(“Per-session controls”, behind aTODO(recapture)comment — remove it once reshot) anddocs/guide/first-chain.md. - Seed:
demo-projectworkspace on the allowlist + ≥1 registered agent (so the sidebar chevron is present in the sidebar chrome). - Steps:
- Open a fresh empty chat with the sidebar visible (chevron in frame).
- Bind the
demo-projectworkspace so the per-session Model / HITL Policy / Think / Token Limit / Workspace controls show above the empty chat. - Screenshot the empty surface with the sidebar (including the “New chat with an agent” chevron) in frame.
- Selectors / timing: keep the framing close to the existing shot so the swap is drop-in; the only new element is the sidebar chevron.
After the shoot
- Optimize assets and place them flat under
website/public/(never editwebsite/dist/— it is build output). - Enable the embeds and remove the matching
TODO(recapture)comments indocs/guide/beam.md; retire the orphanedbeam-approval-gate.png(and the unusedbeam-chat.png/beam-modeld.pngif you are cleaning house). - Restore the real
contenox configdefaults (model-swap ritual) andgit checkoutany demo fixtures.