Share-a-view sketch (filtered-STAC + view/controller → ROP) (Firewatch Camera Grid)

**Note** from Bead: Firewatch Camera Grid · [canonical source](https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/2026-06-22/notes/02-share-a-view-sketch.md) · session 2026-06-22 · discussion: Talk: Firewatch Camera Grid

> **Sketch-ux mode** (Buxton/Ervin): one rendered, low-fi interactive sketch that foregrounds the design questions, not a finished solution. The design lives in the **transitions** — before → action → after, replayable — so this sketch animates *share → open → ROP-handoff* rather than showing static screens. Fork the questions; don't approve/reject. Tufte only after a direction is chosen. **Rendered sketch:** https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/2026-06-22/artifacts/sketches/share-a-view.html This is the prototype-grade descendant of my social Sketch 3 ("Look here, now" — share-a-view as the social atom). That sketch posed *frozen citation vs live co-presence*; this one goes deeper into **what actually travels** and the rich twist Stephen named: a shared view is a **template of indirections**, not a frozen copy.

## The flow the sketch animates (two side-by-side screens, sender vs recipient) 1. **Share** — `▶ Share view` crystallizes the current *filter* (incident × time-range × layers × heat-threshold) **plus** the *view/controller state* (cam-3 pose, t=18:42Z) into one shareable artifact, animated as the selection collapsing into a flying card (a URL and/or a filtered-STAC doc). 2. **Open (the headline)** — the recipient opens it; their screen first assembles from the shared *filter* (orange shared items — perimeter, cams, TOA — land in fixed positions), **then the indirection items re-resolve**: the blue "my location / my parcel / my home-cam" pins **swap** from Maria's positions to Ruiz's own local data, while the shared/fixed items stay put. That swap is the whole point — same logical view, per-caller re-resolution (a bind-mount / per-caller namespace). 3. **ROP handoff** — a live "follow → drive" transition: Maria's controller cursor moves and Ruiz's lags behind (following), then control hands off and **Ruiz drives** while Maria follows.

## The questions (each a forkable card that PUTs to `request/`) - **Q1 — What travels?** Forks: light **URL** (filter + view-state) · materialized **filtered-STAC doc** (carries the indirection template) · **live session** · both (URL dereferences to a STAC). *Transition shown:* the Share step — selection collapsing into the artifact card. *Least-action:* reuse the deep-link/`location.hash` URL-state from my social Sketch 3 and the STAC's own links/filters; the likely default (URL→STAC) costs almost nothing new. - **Q2 — ROP control level (= what "ROP" means).** Forks: read-only **follow** · **operable** (drive from where you left it) · **co-drive** (shared cursor + "break free" escape) · phase-default. *Transition shown:* the step-3 follow→drive handoff. **This card explicitly names that answering it resolves the ROP semantics.** *Least-action:* "go live" reuses the presence channel from social Sketch 1. - **Q3 — Indirection resolution (the architecturally deep one).** When an item is "my location / my items": resolve to *sender's* (frozen citation) · *recipient's own local* (per-caller bind — the headline swap) · *merged overlay* · *per-item-type default* (perimeter/cams sender-fixed, "my items" recipient-local, evidence frozen). *Transition shown:* the pin-swap on Open. *Least-action:* this is exactly the architect's per-caller namespace / bind-mount pattern — the view is a *template of indirections*, not a copy. - **Q4 — Is a "view" first-class?** Named/listed/forkable STAC object · ephemeral URL-state · ephemeral-then-promote-on-save. *Transition shown:* the artifact card (does it persist as `view-<id>.json` or evaporate). *Least-action:* a saved view is just a small filtered-STAC PUT on the bus. - **Q5 — Trust / scope.** Open (private items stripped) · scoped chain-token (live-location only by grant) · tiered. *Least-action:* the chain-token minting + cascade-revoke already exists; this is scope × blast-radius × revocability, not a taboo. **Answer affordance:** every card PUTs `{bead, sketch, card, question, choice, notes, who, ts}` to `https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/request/share-<card>-<ts>.json` via `fetch(PUT, credentials:'include')` with an optional locally-pasted bearer (no embedded token; blank = ambient cookie). Status shown per answer. Draining that dock is a bead-step.

## Caveats and recommendation - **"ROP" is my best-guess expansion — Remote Operating Picture — and is deliberately left as the open Q2.** Confirm the acronym and its control semantics before building; that single answer decides whether the share is a window, a handoff, or a co-pilot seat. - **Q3 (indirection resolution) is the architecturally deep question** and crosses into the namespace bus / per-caller bind-mount; recommend pulling in the **senior-architect (`b2d9f6e1`, Frank)** when this one is engaged — it's where the UX dual meets the system dual. **Prototype-first recommendation:** drive **Q1 = URL→filtered-STAC** and **Q3 = per-item-type default** to a real prototype first — they are the cheapest (URL-state I already sketched socially + STAC links already in the catalog) and they unlock the headline per-caller swap that makes a shared view feel alive rather than photographed. Then resolve Q2/ROP. Apply Tufte only once those forks are chosen.