# Validation

`npm ci --include=dev` installs the locked Node tools. Run `npm run check` for JavaScript lint, checked JavaScript types, and API tests; `npm run build` runs the same gate for Vercel.

Python checks use Python 3.13, matching the worker container:

```sh
python -m pip install -r worker/requirements.txt -r worker/requirements-dev.txt
npm run lint:python
export FFMPEG_BIN="$(python -c 'import imageio_ffmpeg; print(imageio_ffmpeg.get_ffmpeg_exe())')"
python -m unittest discover -s worker -p 'test_*.py' -v
```

The optical-flow unit tests use synthetic arrays and injected flow estimators, so CI requires neither GPU weights nor inference-provider credentials. Encoder tests use an actual FFmpeg binary. They do not submit paid inference.

`npx playwright install chromium` followed by `npm run test:browser` tests eight desktop, phone, and landscape viewports with local observed-frame fixtures. It checks all source/enhanced/withheld frames, deterministic scrubbing, keyboard camera selection, touch-target sizes, logo/favicon presence, and viewport fit. It also checks that withheld motion does not request video. These tests do not certify the appearance of generated motion; each published clip still requires the separate motion review.

The GitHub Actions workflow has independent Tests, Lint, Typecheck, and Browser jobs. Its `Required checks` job fails if any dependency fails, is canceled, or is skipped. Official Actions are pinned by immutable commit SHA; npm dependencies use a lockfile.

Deployments come from Vercel's Git integration, not from GitHub Actions: a push to main deploys production, and other branches deploy previews. Vercel builds with the install/build commands in vercel.json (`npm ci --include=dev` and `npm run build`), so failed JavaScript checks block a deployment. Vercel does not wait for the Actions jobs, so a failing browser or Python check does not stop a production deployment of main.

To enforce the gate on merging, the repository's main-branch protection or ruleset must require `Required checks`. Creating a workflow alone does not change repository protection. The managed GitHub connection does not have repository administration permission.


October 19 localized preview update: lint, type checking, 28 Node tests, 182 Python tests and 117 browser checks pass. Another 18 browser checks cover the final video zoom behavior, entering the available preview interval, and the updated research page across nine viewports.

The experimental Allen clip contains 73 frames at 2816 × 1920. The viewer maps 0–3000 model milliseconds to 0–2877 receipt milliseconds. Only the taxi in that interval is synthesized. All 73 final composite frames were visually reviewed, including the segmentation transition at frames 6–7. The mask-consensus helper reproduces all 73 rendered masks exactly. Full motion quality approval remains false.


## Allen multi-object interval, October 19, 2026

Published candidate: receipt 2877–5876 ms, extending the taxi baseline to the next observation. Selected opaque masks add three continuing pedestrians, a dog and a separate entering pedestrian. Seven later gaps still hold enhanced observations.

Validation:
- Lint, TypeScript and all 28 Node tests pass. Catalog tests verify generated-frame counts, source anchors and interval ownership rather than a fixed one-clip sample.
- All 144 browser checks pass across nine viewport configurations, including forward/backward interval selection, paused seeks, original anchors and gesture-only zoom. Video fixtures now serve HTTP byte ranges.
- The compositor's six regressions pass; the last complete worker CI run has 188 passing tests. Ruff passes for the renderer and compositor.
- A Chromium check using the actual CDN assets decoded both 2816 × 1920 clips and sought between them four times. Receipt times 1438.5 and 4376.5 ms each selected model time 1500 ms. At 390 × 844 the page width remains 390 and the viewer fits above the fold.
- Both delivery codecs decode 73 unique frames at 24 fps. Before encoding, anchors equal the accepted enhanced observations and all intermediate HUD pixels equal the previous observed bitmap. Lossy-codec HUD mean absolute error stays below 0.63/255 in this check.

Every raw proposal frame and final composite frame was inspected. The full-scene proposal's invented van is excluded. Its late entering-pedestrian mask was replaced with a separately reviewed local crop. The second interval has individual 2816 × 1920 WebP artifacts and 1408 × 960 display previews.

See [the expansion record](allen-motion-expansion.json) for proposals, masks, hashes, costs, reproduction steps and the remaining visual limitations. The candidate remains experimental; these checks do not recover the unrecorded trajectory as ground truth.


## First interval pedestrian revision

All 73 final frames were inspected. Two pedestrians now cross behind and then left of the signal pole. SAM track 10, which covered part of the pole, was excluded. The old pedestrian footprint uses a clear patch from observation 3. The accepted taxi region is asserted identical to its previous pre-encode output in all 73 frames.

Both codecs decode 73 unique 2816 × 1920 frames at 24 fps. Intermediate HUD mean absolute error after encoding stays below 0.63/255. Individual full-resolution WebP files now accompany the first interval's lighter previews. See [the revision record](allen-motion-span-00.json) for masks, costs and remaining limitations.


## Third Allen interval and renderer validation

Receipt 5876–8874 ms adds four moving pedestrians and one dog while the taxi stays observed. All 73 final frames were visually inspected. Both 2816 × 1920 codecs decode 73 unique frames at 24 fps; intermediate timestamp error stays below 0.62/255 after encoding. Before encoding the timestamps and enhanced endpoints are exact.

All 219 Python tests and Ruff pass. The 17 new recipe tests also pass with Python -O. The hardened renderer reproduces all 73 cached composites exactly in verification-only mode; its taxi-hood comparison uses the observed image. The Node suite passes 39 tests, including 11 offline artifact-download tests.

Completed assets are materialized into Vercel static hosting from a size-and-SHA-256-pinned manifest. A missing or corrupt artifact fails the build. Once production serves the assets, future builds read that production copy first; the temporary sandbox is only a bootstrap origin. Keep an archive of the output artifacts when retiring the production site.


## October 20: continuous presentation during asset handoffs

The original production player reproduced a white/pale flash with a delayed first video response: the source image was hidden, the video had readyState 0, and the opaque stage skeleton was visible. The published asset audit found all 462 Allen image/video URLs available. All three MP4 files decoded to 73 frames each at 2816 × 1920; none contained a near-white frame.

The viewer now retains the last decoded image or video in a draw-only canvas until its replacement is ready. It releases that canvas's backing memory after presentation. Buffering and media errors preserve the picture, while the full skeleton is reserved for initial loading. Cross-origin pixels are never read back or exported. The next anchor image and next video are prefetched, including the first clip before looping.

Interpolated playback now covers the continuous reviewed 0–8874 ms excerpt: 217 distinct timeline positions and four observed anchors. Its scrubber, thumbnails and ticks use those bounds. Source and AI Enhanced retain all ten observations and the complete 29875 ms recording.

Seven browser regressions cover a delayed first video, a failed adjacent video, a delayed source anchor, superseded media responses, excerpt bounds with full-source access, loop prefetch and thumbnail downloads shared across rebuilt mode controls. Media-pixel comparisons exclude the intentionally changing status message.

Native-asset preview playback ran for 12 seconds at 1440 × 900 and 390 × 844. Both traversed all three clips and a loop with zero blank samples, zero opaque loading overlays and no backward clock jumps outside the loop. These are presentation checks, not certification of the generated motion as observed fact.
