**Chat log** from Bead: Snow Globe Harvard Spheres · [canonical source](https://redfish.acequia.io/guerin/.agents/6a8f0a99-c255-4a5c-9c4a-9097d0ee9cd8/2026-06-11/chats/2026-06-11-snow-globe-bead-start.md) · session 2026-06-11 · discussion: Talk: Snow Globe Harvard Spheres *Verbatim chat log: immutable provenance. The bead's copy is ground truth; wiki edits here are a fork, never the record.*
Session: Claude (CE / Claude Code extension, VS Code) with Stephen. Incremental log; user prompts verbatim.
**Stephen (verbatim):** > start-bead snow-globe-harvard-spheres bead-mount beads around https://harvardviz.live/sphere > propfind that directory and understand the structure and purpose > > we are going to plan a "snow globe" viewer that puts in a 3D model appearing inside a "snow globe" effect. the view camera could be set for sweet spot rendering. later we can detect users and their eyes and do motion parallax view dependent rendeging. if people are distributed around and some threshold sphere angle apart we can segment the faces of the globe rendering to the viewpoint of the person in the center of that angle **Claude (summary):** - Re-read `.agents/beads.md` (root-files spec: README/about/names/keywords), surveyed sibling beads for sphere prior art — none own this thread (1057235a = route-flip, 883c513f = doorbell; sphere mentions tangential). Opened new bead `6a8f0a99-c255-4a5c-9c4a-9097d0ee9cd8`. - PROPFIND survey: `harvardviz.live/sphere/` answers WebDAV only on WebDisk port 2078 (netrc; DAV root = doc root); plain 443 is static cPanel. Canonical app is `redfish.acequia.io/guerin/apps/sphere/` (Nephele, Bearer JWT) — controller/viewer/admin/qr pages + `playlists/{active,approved,proposed,items,items-proposed}` + `media/` + `maps/`. Read `sphere-viewer.html` (200%-width equirect layers, translateX rotation, acequia group `sphere-control`, item types video|image|iframe) and the original `plan.md` CMS design (web-map → equirect warping). - Findings → [notes/00-sphere-namespace-survey.md](../notes/00-sphere-namespace-survey.md). Key integration fact: `type:"iframe"` items give a full equirect layer — a snow-globe page can ship with zero changes to the existing CMS. - Plan → [notes/01-snow-globe-viewer-plan.md](../notes/01-snow-globe-viewer-plan.md): CubeCamera-at-eye → equirect directional-lookup shader (exact for the viewer-facing hemisphere); antipodal eye for the far side; `xRotation` reused as model turntable; MediaPipe tracker publishing viewer angles over the same group state; angular-Voronoi segmentation with seam blending + hysteresis for multi-viewer; epics E1–E4. - Bead-mounted the sphere namespace in [names.json](../../names.json) (sphere-front-door, sphere-app, sphere-viewer, sphere-controller, sphere-admin, sphere-playlists, acequia-js). - Planning only this turn — no app code written, nothing deployed.
**Stephen (verbatim):** > another phase will be to have any media being displayed to specify the companion controller that specifies what runs on the controller screen. > > Also gallery and playlist had some weird flow patterns and may have been buggy too. **Claude (summary):** - Read `sphere-controller.html` and `sphere-admin.html` in full to ground both threads. - Companion-controller phase → [notes/02-companion-controller-protocol.md](../notes/02-companion-controller-protocol.md): optional `companion: {url, label, mode}` on item JSON; controller mounts the companion iframe (same acequia group, `?group=&itemId=`) while the item is active; item-scoped `itemState[itemId]` group state; Spin Globe becomes the default companion; trust rides the existing propose→approve flow. Added as epic E5. - Flow audit → [notes/03-controller-flow-audit.md](../notes/03-controller-flow-audit.md). Confirmed bugs: (1) admin approve never strips `status:"pending"` so proposal-flow items are permanently filtered out of the controller's picker; (2) approve's media-move checks `d.src` but the controller writes `url` — uploaded media never leaves `media/proposed/`; (3) fresh uploads can't be added to the proposer's own playlist; (4) relative-vs-absolute fetch mix breaks the playlist dropdown off-origin. Plus flow weirdness: browse/control conflation, rotation-integrator drift, reject leaks media, GET+PUT+DELETE instead of MOVE, iframe items unpreviewable. Audit only — nothing fixed.
**Stephen (verbatim, mid-task):** > the cube camera is weak. esp in the era of 3dGS. we could webgpu some shader i'm sure to render that light ray for the view dependency. the sphere pixel off access to the center could even render differently based on viewpoint. its the dual of specular where you seeing a ray through a cord in the sphere. **Claude (summary):** - Rendering correction → [notes/04-chord-ray-rendering-webgpu-3dgs.md](../notes/04-chord-ray-rendering-webgpu-3dgs.md): every sphere texel is a window pixel; per-texel ray E→P traverses a bounded **chord** of the globe; view dependence = transmissive dual of specular (a light field L(P,d) on the sphere skin; today's equirect content is the degenerate diffuse case). WebGPU compute with swappable evaluators: ray-traced Gaussian splatting (3DGRT-style, SH color from true ray direction — enables capture-to-globe content), SDF/procedural (snow, calibration grids), CubeCamera demoted to WebGL2 fallback. Multi-viewer segmentation becomes nearly free (per-thread eye choice vs K re-renders). Forward-compatible with a light-field skin. Plan §1 annotated, epic E6 added.
**Stephen (verbatim):** > mount-beads that have to do with catalog and cataloging. your admin tool is a catalog manager **Stephen (verbatim, mid-task):** > make sure to understand the beads **Claude (summary):** - Grepped the commons for catalog beads, then **read** the candidates rather than mounting by keyword count (per the mid-task instruction): `#incident-cataloging` (c38c1239 — catalog noun + cataloging verb, Sandy mission, holds the santafe.live catalog-manager artifact), `#catalog` (90f902e0 — canonical STAC catalog duck-typed to per-viewer projections), `cataloging-incident` (97559992 — bag-of-files → citable catalog.json, Sorrento), catalog-ops (b3461c66 — producer/acquisition half), `incident-viewer-app` (cbf8b027 — consumer app, itself born of a bead-mount union), and the **bead-mount protocol** (975f5db5/2026-06-11/skills/bead-mount.md). - Mounted per that protocol: [namespace.json](../../namespace.json) (read set = the five catalog beads, `incident-cataloging` priority; this bead sole create target) + durable aliases in [names.json](../../names.json). - Stephen's recognition captured in [notes/05-sphere-admin-as-catalog-manager.md](../notes/05-sphere-admin-as-catalog-manager.md): sphere items = catalog Items, playlists = cataloging-as-a-verb (compose/sequence), `active/current.json` = binding, admin = catalog manager, sphere viewer = another duck-typed projection target. The audit's bug classes (status-in-record vs location-in-tree; src/url drift; copy-promote vs MOVE) are catalog-schema problems the catalog model already answers. Companion field (note 02) = a small STAC extension. Convergence: incident layers and 3DGS captures become globe content via the shared catalog.
**Stephen (verbatim):** > propfind https://harvardviz.live/greg/ as example items that could have controllers. his pages need to be converted to view and controller. the viewer should be scaled to 2:1 aspect full screen > > then make a plan and start using devops on this one **Claude (summary):** - PROPFIND `:2078/greg/`: 8 demos + index (`satellite, seismic, terminator, coriolis, magnetic, pulsar, harmonics, demos-v2`). Shared anatomy verified in three pages: `<canvas 1920×960>` (already 2:1 equirect) + `#menu` + ~340px `#pnl` of `mkTog`/`mkSl` controls, all behavior driven by `input`/`change` events; **no acequia**. - Plan → [notes/06-greg-demos-view-controller-plan.md](../notes/06-greg-demos-view-controller-plan.md): one page, three faces via `?role=viewer|controller|<none>` + a shared `sphere-faces.js` shim; param bridge republishes panel events through `itemState[itemId].params` and replays them on the viewer by re-dispatching the same events (zero demo-logic edits); viewer face = chrome hidden, canvas letterboxed full-screen at 2:1 via the page's own `fitCV()`; each demo becomes an item JSON with `companion` per note 02. - Devops started per the epic/step methodology → [dev/](../../dev/README.md): STATE / WORK-QUEUE (epics G1 pilot → G2 rollout → G3 on-sphere, then snow-globe E1–E6) / journal / decisions. Decision 0001: stage in bead artifacts, never write into `greg/` — binding is Stephen's. - **step-01 built**: [artifacts/greg-faces/sphere-faces.js](../artifacts/greg-faces/sphere-faces.js) + staged `sphere-harmonics.html` (diff vs Greg's original = one `<script type="module">` line; ESM syntax check passed). Status: BUILT / VERIFY-PENDING — the live two-window sync check (spec AC2–AC5) still needs a browser session.