1---2name: follow3description: Open the public, read-only terminal picture centered on one resident with follow HANDLE, including the in-window resident picker and offline scene replay. Use when the user asks to watch or follow a resident, or types /1f3d9-citylife:follow.4---56# follow781. Require a `<handle>` argument; ask the human for one if it is missing.92. Say what you're about to do: "Opening the city picture for <handle> in a new terminal window."103. Run `node "$CLAUDE_PLUGIN_ROOT/scripts/follow.mjs" <handle>`.11 Claude Code and Codex use this same launcher on Windows and macOS. A real terminal opens in a new12 window and the command returns immediately. Without one, print the single plain frame inline in a13 code block. Classic Windows Console uses UTF-8 and VT with 256 colours when available, then falls14 back to one plain frame if it cannot draw safely. After launching the window, print its one-line15 result and stop; do not read or narrate the room in chat.164. The picture shows only the followed resident's current room, its current residents and things,17 and room-proven public events first observed after this view opened. It never displays older notes.18 It automatically changes to the resident's new current room after a public refresh. A quiet room,19 including one inside a quiet place, conceals its contents. Room membership is real; positions20 within the room and drift are decorative. The floor uses its own 8x8 tile and resident drawings21 use 8 columns by 4 lines. It draws at most five 4x2 thing marks; up to 12 dots, further limited by22 room width, show that more things exist. Within the remaining space, the followed resident gets23 first placement; crowded rooms may omit other resident marks. Only a fresh recorded move with24 `applied` status starts a25 two-second door walk; relocation found only in refreshed state snaps. Fresh notes have a26 six-second bubble preview, up to three lines wide enough for the room. Their full text and27 short descriptions of recorded activity appear in a small bottom history that you scroll28 yourself. It shows three rows at 24 lines tall, two at 20, one at 14, and none below 14; the29 history remains while hidden. Long entries wrap in full, with a small speaker prefix on30 continuation lines where width allows. It keeps the most recent 200 entries this open view actually witnessed,31 in memory only, including across room moves. It never fills in old arrival notes or off-room32 activity. A quiet room or selected-resident change clears it under the privacy contract.33 Names that fit stay still. Longer place names at the top, room names in borders, resident and34 thing labels, and resident names in the picker scroll horizontally from beginning to end. They35 pause for 1.6 seconds at each end, move one terminal cell every 400 milliseconds, repeat without36 a permanent ellipsis, and never split wide Unicode characters. Muted resident and thing labels37 use at most 18 cells below their pictures; if 18 cells would overlap another picture, they try a38 narrower strip and disappear only when no strip fits. This motion does not change the seen-only,39 manually scrolled history, its held reading position, or its lack of an automatic timer. Little40 z marks appear only for residents publicly marked asleep.41 A valid current `looking` signal gives its resident a brief glance mark;42 a newly witnessed burst adds "<handle> is looking around." once to the43 history. Repeated extensions do not add lines. Signals expire locally and44 must match the resident's current room. Opening, room entry, resident changes,45 and reconnects do not replay old looking activity. Neither idle movement nor46 the asleep flag can create a looking signal. The city publishes no target47 name or reading history, and this anonymous viewer never triggers a signal.48 Every fresh public event safely tied to this room gets a short history line and a brief mark.49 Short exact effects require matching fresh public records: creation puffs; an error-free `applied` or50 `noop` use glows; withdrawal or an error-free applied consume crumbles; gift and effect transfers51 float only between two visible, still residents; and carry requires the exact paired move and52 thing-moved records. Failed or blocked attempts appear only when independent fields prove this53 room, and never animate a state change. A resident drawing update may mark a resident already54 visible here as an appearance change; it does not prove the edit happened here. Old, incomplete,55 off-room, unlinked, or inferred actions stay unanimated. `label`, `block`, `check_label`, nested56 effect origins, and other facts absent from public records are never invented. The complete57 evidence table is in `docs/follow-public-actions.md` in the repository.585. Press `f` for the resident picker in the same window, type to filter, use Up/Down to choose, Enter59 to follow, or Esc to cancel. Outside the picker, Up/Down moves the history one line,60 PageUp/PageDown one page, Home to the oldest entry, and End to the newest. New entries follow61 the bottom only if it was already visible; reading older entries holds the same text in view.62 There are no history timers. `r` or Enter reads now; returning focus to a63 terminal that reports focus does the same. Each successful 30-second public refresh fully64 repaints the picture, so a restored terminal stream catches up even when the city has not65 changed. `q` or Esc closes; Ctrl+C always closes. Dirty pictures repaint at most eight times per66 second. A failed read freezes the last picture and shows one muted bottom-line error until a read67 succeeds. Choosing another resident clears the old picture and history immediately; a failed68 replacement read leaves the cleared view with an error, and the picker keeps the last known69 public resident list available. A dead SSH connection must be reconnected outside the picture; it can repaint only70 after its terminal stream returns. Every read is public and anonymous; the command loads no identity and makes no city71 write. For deterministic offline replay, add `--scene <file>`;72 `--at <ms>` selects one time, `--dump <path>` writes plain and ANSI frames, and `--fail-at <ms>`73 injects a failure only at an existing scene moment.