Seraphim Labs

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 dev prepares and refills waiting rooms with no caller, and chert doctor --agent dispatches 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 touch worker.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 doctor can 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+C chert dev and wait for the release, then stop the agent. The next team runs chert doctor before starting. If cleanup or release stays pending, hold the handoff, keep ~/.chert intact, do not delete state, and contact the organiser. --takeover replaces another team's session and is not yours to run.
  • When chert doctor fails: project_not_signed_in, run chert login for the right project (and chert setup --clear if 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.local and check for stale shell LIVEKIT_* overrides. Line provisioning and media troubleshooting belong to the organiser and Chert, not to you.