**Bead document** from Bead: Image Pose Uxui · [canonical source](https://redfish.acequia.io/guerin/.agents/74c30681-2b0c-48b2-b2a8-9e21190a4926/log.md) · discussion: Talk: Image Pose Uxui
Append-only build narrative. Each `- <ISO> [<role>] <msg>` line is a tick (read by both the bead-local `repo/dashboard.html` and the global `.agents/dashboard.html`). - 2026-06-16 [devops] bead hatched from #pose-ux-ui; mounts wired (pose/camera + devops beads). - 2026-06-16 [devops] step-00: `git init repo/` on main; taos-engine mounted as vendor (hosted ion bundle by URL), not imported. - 2026-06-16 [devops] orchestration spine up: project.json + repo/dashboard.html (hill chart + steps + agents + log tail) + running/ telemetry. - 2026-06-16 [UX] step-01: BYOK startup panel — 3D-tiles key gate (Cesium ion token default = the key we already have; Google-key field stubbed). localStorage. - 2026-06-16 [UI] step-02/03: image pane (load by id from set-space-time imageMeta/+imagePose/) ∥ 3D pane (taos-engine + Google photoreal tiles, AWS-terrarium DEM fallback). - 2026-06-16 [UX] step-04 active: live 6-DOF+fov pose readout from the steered camera; match-overlay opacity slider (snapshot-view-as-pose foundation). - 2026-06-16 [testing] step-06 dispatched to solver-agent: standalone solver.js (campanile PnP / bundle-adjust) building in parallel. - 2026-06-16 [devops] deploy: first bead-sync (MKCOL + 19 files) → live at the canonical bead URI (auth-gated). - 2026-06-16 [testing] step-06 DONE: solver-agent delivered solver.js (LM bundle-adjust; soft weighted constraints + soft prior regularizes the single-image depth/scale gauge). self-test rms 0.57px, synthetic pose recovered; caught 2 real bugs in bring-up (ENU→cam rotation, back-substitution index). - 2026-06-16 [UX] step-05 DONE: campanile pin loop + 'solve' button wired into calibrate-3d.html; solved pose holds in the readout until re-steer; save → bead tags method campanile-solve. - 2026-06-16 [testing] step-09 PENDING: CDP pixel verification on a real GPU still owed (WebGPU never headless). - 2026-06-16 [UX] dashboard redesign (Stephen feedback: too small, too dev-y): big friendly type, Open-the-calibrator as the primary action, plain-language crux + what-works + heads-up, and the open questions made INTERACTIVE — tap an answer and it PUTs to answers/<id>.json (read back on load). Less console, more "decide and go". - 2026-06-16 [devops] FOUND the Google Maps key: chat session ee545049 ("find my google maps api for photorealistic 3d tiles") → wired in realtime-earth/viewer-3d/js/config.js. Verified GET tile.googleapis 3dtiles/root.json → HTTP 200. Saved to .credentials/api-keys/google-maps-3d-tiles.json. - 2026-06-16 [liaison] DASHBOARD MESSAGES received (the interactive answers worked): (q-90s) "search the beads — naimark gave a google tech talk on viewfinder"; (q-next) "left side should be a STAC loader + browser, image grid like set-space-time". Both resolved. - 2026-06-16 [system-strategy] q-90s FOUND: Naimark 'Viewfinder/Flickrize Google Earth' Google Tech Talk (LRAj21y23r8) + Gleicher&Witkin 'Through-the-Lens Camera Control' (SIGGRAPH 1992) + campanile-camera-calibration.md at dev/team/owen-duncan/image-match/ (chat 7b79c9e2). It's the direct ancestor of this app and validates our solver beat-for-beat. Captured in note 02; mounted as 'viewfinder-prior-art'. The UI pattern's name = Through-the-Lens Camera Control. - 2026-06-16 [UI] q-next → step-10 active: rebuild the left pane as a STAC loader + image-grid browser (à la set-space-time). - 2026-06-17 [UI] step-10 (picker half) SHIPPED: `<stac-menu>` reusable web control at santafe.live/lib/stac-menu.js — menu of the 7 STACs we have (seeded from /lib/stac-registry.json = the dev-STAC union) + add/remember/remove others (localStorage), emits `stac-select`. **Subscribes to the Redfish app style guide** (`/styles/acequia-tokens.css`, the `--acq-*` tokens served on every subdomain; shadow-DOM @import + token-mapped vars with dark fallbacks). Demo/reference: santafe.live/lib/stac-menu-demo.html. NEXT: drop it into calibrate-3d's left pane + an item grid → click item → calibrate. - 2026-06-16 [devops] Stephen: "use taos-engine not cesium". taos-samples google-3d-tiles.md pointed to the DIRECT path (src/geo/google_tiles.ts GoogleTilesSource). Added resolveGoogleTiles/GoogleTilesSource to the _build facade, rebuilt the bundle (vite, +362ms), redeployed agentscript/lib/taos-engine-ion.js (additive — ants/fire unaffected; both resolveGoogleTiles + resolveIonAsset now export). Switched calibrate-3d.html off ion → resolveGoogleTiles(GOOGLE_KEY); BYOK gate now a single Google-key field pre-filled with the key we have. Mounted #taos-samples + #taos-recipes. - 2026-06-17 [testing] CDP-on-GPU verification (Chrome :9333, local static serve): FOUND the app was fully broken — duplicate `function fmt` is a SyntaxError in an ES module, so the whole `<script type=module>` never ran (every deploy since the two-panel change shipped a non-loading app). Removed the dup. Re-verified: navigator.gpu adapter OK, taos-engine init `window.__cal.google=true` (Google photoreal tiles streaming), both View-Camera + Image-Pose panels populate, orbit-drag moves the camera (heading 0→323°, pitch −14→−6°), 0 console errors. Screenshots in 2026-06-16/artifacts/verify/ (_cal-load.png, _cal-orbit.png). step-09 done.