diff --git a/.github/workflows/custom-checks.yml b/.github/workflows/custom-checks.yml index c35633f..a788e81 100644 --- a/.github/workflows/custom-checks.yml +++ b/.github/workflows/custom-checks.yml @@ -38,6 +38,8 @@ jobs: PY - name: Check JavaScript syntax run: node --check screen.js + - name: Run screen.js behaviour tests + run: node --test tests/js/screen.test.js - name: Reject print calls in routes run: | ! grep -nE '(^|[^A-Za-z0-9_])(print|traceback\.print_exc)[[:space:]]*\(' routes.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c246aa..73304c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,3 +47,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 whole export, so leaving it captured would have baked a clock frozen at t=0 into every precomposed layer. **Exported videos no longer show the song metadata, clock or Up Next line.** +- **Host compatibility is now checked by capability, and reported per + component.** The single failure message ("does not provide deterministic + frame rendering. Update the host and Splitscreen plugin") named both sides + at once, so an out-of-date Split Screen was indistinguishable from an + out-of-date feedBack host. The exporter now names the missing interface and + the build that introduced it, and checks the two requirements separately: + `highway.renderFrameAt()` is a feedBack requirement for every export, while + Split Screen's `beginOfflineRender()` / `renderFrameAt()` / + `endOfflineRender()` bridge is required only when a split layout is being + exported. + +### Removed + +- **`minHost: "1.14.8"` from `plugin.json`.** The plugin spec defines + `minHost` as the minimum *Host (core)* version, and `1.14.8` is a Split + Screen plugin version, so the field claimed a core compatibility level the + number says nothing about. No core version can replace it honestly: + feedBack's `VERSION` has read `0.3.0-alpha.2` since 2026-08-10, before + `highway.renderFrameAt()` landed in `f7c761c` on 2026-09-16, and feedBack + publishes no releases — so `0.3.0-alpha.2` would admit hosts that cannot + export, and anything higher would name a release that does not exist. + `minHost` is also advisory-only in the current host. See + get-flashbacks/feedBack issue #102. The manifest will regain the field when + a feedBack release identifies a baseline. + +### Fixed + +- **A partial Split Screen offline-render bridge is reported as a version + problem instead of a generic render failure.** The bridge calls were + individually optional-chained, so a Split Screen build providing + `renderFrameAt()` without `beginOfflineRender()` / `endOfflineRender()` got + past the pre-flight check and then failed on the first frame with "The + selected visualization is not ready for offline rendering" — which says + nothing about the actual cause. (It did not corrupt the video: Split + Screen's own `renderFrameAt()` returns `false` unless `beginOfflineRender()` + has run.) All three hooks are now required together whenever Split Screen is + active, and the message names which are missing. +- **`README.md` no longer lists `highway.getCanvas()` as a host dependency.** + It is never called; highway canvases are read from the DOM snapshot instead. diff --git a/CLAUDE.md b/CLAUDE.md index 8e729c6..c4591cb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -11,37 +11,71 @@ this file covers the parts an agent needs that the README doesn't. - **Single-highway export:** `window.highway.renderFrameAt(time)`, added to feedBack core in `f7c761c` (Sep 16) — see `get-flashbacks/feedBack` - issue #102 for the org-wide core-compatibility audit that pins this - floor (it does not pin the Splitscreen floor — see that bullet). The - export also calls - `window.highway.getSongInfo()` (`screen.js:533`; `songInfo.full_mix_url` + issue #102 for the org-wide core-compatibility audit (it tracks this + dependency but deliberately does **not** pin a version for it; see the + `minHost` bullet). The export also calls + `window.highway.getSongInfo()` (`screen.js:589`; `songInfo.full_mix_url` is the *preferred* audio source, falling back to `audio.currentSrc` / - `audio.src` / `window._juceAudioUrl` (`screen.js:541`) — the whole + `audio.src` / `window._juceAudioUrl` at `screen.js:597` — the whole export only bails when all four are empty, so a host with no `getSongInfo` at all can still export via the `