05
If your team has one of the three Chert lines
What is different for a team on one of the three shared Chert FaceTime lines, and what to do about it.
5. If your team has one of the three Chert lines
Everything above still applies; the line adds a Chert project (one FaceTime line), the Chert CLI, a dispatch name, and a real FaceTime call in place of the phone page. The CLI facts are from docs.trychert.com/facetime-cli.
The Chert CLI (Node 22.23.2 or 24.x, the same Node in both terminals):
node --version # 22.23.2 or 24.x; same Node in both terminals
npm install -g @trychert/facetime@0.1.0-beta.4 && chert --version # pin the version: the unpinned install can fail
chert login # browser sign-in for your project; `chert login --device` on a remote shell
chert whoami
chert doctor # run from the repo folder: it reads LIVEKIT_* from .env.local; read-only
In .env.local set AGENT_NAME=<the dispatch name on your assignment card> while you work the line: the CLI dispatches
to that name, and a worker with an empty name is not what it dispatches to. Put it back to empty for the phone page.
Terminal A, the coach (export .env.local as in section 3):
cd brodie-rt-coach && source .venv/bin/activate && set -a && source .env.local && set +a
python -m facetime.worker dev # or --plan "...", or --voice gemini, as in section 3
Terminal B, the line (same folder, same Node):
cd brodie-rt-coach && set -a && source .env.local && set +a
chert doctor --agent "$AGENT_NAME" # dispatches a real job into a temporary room; Terminal A must already be running
chert dev --agent "$AGENT_NAME"
Then place a FaceTime VIDEO call from your own phone to the address on your card, prop the phone (section 7) and step in.
What it prints when it works. Terminal A, after the start-up lines of section 3: for Chert's waiting room [worker] job ...: joined room 'chert-warm-...', [worker] published audio track coach-audio, [worker] warm job (chert_warm): no caller; staying joined, nothing is said until a participant publishes video; on your call [worker] participant joined: chert-bridge-<call_id>, [worker] bound to 'chert-bridge-<call_id>' ... 1280x720, [worker] first frame 1280x720,
[cue] HH:MM:SS [announce] "Let's do squats" about 7 s after the accept, then the rep, count and [status] lines as in
section 3. Terminal B: Connected to Chert. Call readiness is reported separately., then
"<name>" joined a waiting room. Media readiness is not verified., and after you hang up Call ended: room removed.
Caveat: Chert's documented starter is FaceTime Audio only and the docs say video "require[s] separate development and
validation". In testing, a FaceTime Video call through chert dev on our dev line reached exactly this worker at
1280x720, 15 fps, and ran the whole plan, so the CLI path passes video on a validated line; whether your workshop line is validated is the organiser's question to Chert. If your call connects
but Terminal A never prints bound to, the line is not passing video: tell the organiser and iterate on recordings
(section 6) and the phone page (section 3) meanwhile.
The rules of the line:
- One line = one connected CLI = one active call at a time; more agent names add no capacity. Start Terminal A before B: the call is only accepted once an agent participant is in the room, and the worker needs its models preloaded.
chert devprepares and refills waiting rooms with no caller, andchert doctor --agentdispatches a real job. The worker treats both as warm jobs: it joins, publishes its silent track, says nothing and starts no script until video arrives. Keep it that way if you touchworker.py: never greet or start the plan on job start.- The line is Offline for a few minutes after each call: on our dev line Chert's worker showed "Offline, no
recent successful command poll" after every call, and calls in that window ring out; the line refreshes on Chert's
next cron cycle (
chert doctorcan also report the machine behind the line offline for a while). The CLI docs expect a second call right after cleanup, so try it, but do not plan on it: recordings are your inner loop (section 6) and the phone page costs nothing per attempt (section 3); the line is for checking. - After changing code, restart both terminals so no prepared room runs old code: end the call, Ctrl+C in Terminal B
and wait for
Stopped. The line no longer routes to this agent., then stop Terminal A, then start A, then B. - Handoff at the end of your slot: the caller hangs up, you wait for
Call ended: room removed., Ctrl+Cchert devand wait for the release, then stop the agent. The next team runschert doctorbefore starting. If cleanup or release stays pending, hold the handoff, keep~/.chertintact, do not delete state, and contact the organiser.--takeoverreplaces another team's session and is not yours to run. - When
chert doctorfails:project_not_signed_in, runchert loginfor the right project (andchert setup --clearif a stale saved setup is reported);project_role_insufficient, ask the organiser for owner/admin; no line or more than one line, ask the organiser for exactly one; busy line or offline worker, wait or ask, never force it; missing LiveKit keys, run from the folder with.env.localand check for stale shellLIVEKIT_*overrides. Line provisioning and media troubleshooting belong to the organiser and Chert, not to you.