# VIDEO EVIDENCE — Ticket 056 — OpenBell watchtower (Ticket 070 re-filed / mission m-0187)

Standard: **Video Evidence Standard rev 1** (owner standing order, Slack ticket 056). One continuous take
per face on the RUNNING build, real flows start to finish, bound to the delivered build's hashes, broken
flows shown and named, honest method and gaps.

Build under test (frozen dist, sha256 pinned in `work/evidence/frozen-dist.json`):

| file | bytes | sha256 |
|---|---|---|
| `index.html` | 591 | `1a4c8cd311d3c2a499b29252922fbd9d84e67c466c84621f77d970bc054da23d` |
| `assets/index-Cb7s3UYz.js` | 824097 | `c68bc44b6e957608db6b5998a3cd823509bebb5d895edeed05d506532bfd6b0b` |
| `assets/index-DDpuraDg.css` | 102109 | `d27f53ae9252b1d5a07e551d3c8a410811ac7ba186610aeef9bcf350d7c43489` |
| `favicon.svg` | 351 | `9a111f03a97d493992665b03e828aa74e087b3ae3525ea9de19c0347c143e0e5` |

Served by the mission's own launcher on `http://127.0.0.1:4176` (dist directory = the frozen dist above),
which the VMs reach at `http://10.0.2.2:4176` through the QEMU user-net / emulator loopback route.

## Take 1 — Windows 11 VM (desktop face, 1440x900)

- **File:** `worker-2/footage/windows-walkthrough.mp4`
- **sha256:** `9cdb9cbfc965284f7ca620fd0545459786d797efb11d9de9327ffe00886594eb`
- **ffprobe:** H.264 `yuv420p`, 1440x900, 25/1 fps, 962 frames, 38.48 s, 748,162 B
- **Guest:** Windows 11 Enterprise LTSC Evaluation 10.0.26100, QEMU/KVM fresh qcow2 overlay
  `worker-2/vm/win11-overlay.qcow2` over the never-mutated m-0136 base (base sha256
  `6cfc6e5553e3a769108bf9b67b725665112470e7e9e6841df419fc48528f1e08`, unchanged);
  guest identity `NV-` / user `employee` (`evidence/guest-agent-hello.txt`).
- **URL under test:** `http://10.0.2.2:4176/` in Microsoft Edge (kiosk fullscreen).
- **Real input:** the guest-side PowerShell input agent (`rig/www/agent.ps1`) moves the REAL Windows
  cursor and clicks/hovers/wheels inside the guest; the action script is `tools/plan-windows.json`.
- **Flow on the take:** watchtower (three lanes) -> hover tooltips on the lane charts -> Prop firms
  detail (scroll, back) -> Kalshi detail (scroll, back) -> Meme coin detail (scroll, back) -> Refresh ->
  watchtower.
- **Capture method (honest):** under host load, `ffmpeg -f x11grab` of the QEMU SDL window came back
  with displaced/stale rectangles (the m-0169 defect; reproduced again at 06:08Z on this host in
  `/tmp/testgrab.mp4`). The take therefore samples QEMU's own framebuffer with HMP `screendump`
  (`tools/capture_win.py`) at ~2.78 Hz and assembles the samples to H.264 at 25 fps using
  each sample's real inter-frame duration, so the video runs at real time. No cuts and no composited
  stills; it is a sampled continuous take, and the sampling rate is declared here.
- **Build binding (guest-proven, not asserted):** the guest itself fetched the served assets and hashed
  them — `evidence/guest-guest-build-hashes.txt` shows every served file byte-identical to the frozen
  dist (`all_identical: true` for index/js/css/favicon).
- **Frames read:** `6` frames under `evidence/windows-frames/` opened and checked:
  three lanes with axes/grid/legend, hover tooltip with exact figure, each lane detail, Refresh
  updating the ET clock, no black/displaced frames.

## Take 2 — phone VM (phone face, 390x844 CSS)

- **File:** `worker-2/footage/phone-walkthrough.mp4`
- **sha256:** `05a6ccaaad25f5458523e3bd3eb078f7d984d8c4eed46fd0c670b9f79f410aed`
- **ffprobe:** H.264 `yuv420p`, 780x1688 (portrait; = 390x844 CSS @2x, 320 dpi),
  15840000/2038667 fps avg, 352 frames, 45.3 s, 5,711,983 B
- **Device:** isolated AVD clone `m0187phone` (`/var/tmp/m0187-avd`), serial `emulator-5572`,
  `wm size 780x1688` override / `wm density 320`; Android 15 google_apis x86_64; Chrome
  (`com.android.chrome`).
- **URL under test:** `http://10.0.2.2:4176/?face=mobile`.
- **Real input:** `adb shell input tap/swipe` on the real device (`tools/phone_take.py`), one take.
- **Flow on the take:** watchtower -> bottom-bar Kalshi detail (scroll) -> Watch -> Firms detail
  (scroll) -> Watch -> Meme detail (scroll) -> Watch -> scroll to Kalshi lane -> tap chart ->
  scroll back to top. The header refresh control added by the UX-review fixes is visible on every frame.
- **Capture method:** `adb shell screenrecord --size 780x1688 --bit-rate 6000000` of the real device
  framebuffer, pulled after the take; no compositing.
- **Build binding (phone-proven):** with the phone's Chrome DevTools socket forwarded over adb, the
  phone's own page ran `fetch()` over `/`, the JS, the CSS and the favicon; the returned bytes were
  carried out and SHA-256 hashed on the host — `evidence/phone-served-build.json` records all four
  identical to the frozen dist (`all_identical: true`).
- **Frames read:** `5` frames under `evidence/phone-frames/` opened: home with the phone
  refresh control, Kalshi detail with live-changing counters, Futures detail tables, Meme detail with
  amber realised P&L and clear throttle, bottom bar on every frame, portrait dimensions.
- **Tooltips on the take:** the phone take shows a tap tooltip with exact figures at ~43 s
  (`evidence/phone-frames/t43.png`: "Oct 31, 08:45 ET / Paper P&L · base fill $0.00"); an earlier
  rehearsal also showed that on this Android Chrome build a tap can occasionally be claimed by Chrome's
  touch-to-search rather than the chart — named here, not hidden.

## What was not captured / not checked

- The desktop take is sampled at ~2.78 Hz (see method); motion between samples is represented by real frame
  durations, not interpolated frames.
- The Windows take runs in Edge kiosk fullscreen, so the URL bar is not visible; the phone take shows
  the URL bar (`10.0.2.2:4176/?face=...`). Binding is by guest/phone-side asset hashes, not URL text.
- Reduced-motion behaviour in the VMs is not exercised by these takes (a separate headless
  reduced-motion probe is in `worker-1/evidence/reduced-motion.json`).
- No live-data truth check over hours is claimed; the takes show the desk sources answering live at
  capture time (3/3 in the header) and desk figures updating between captures.
