From 8143e8661703811f2b32b46dbd029eb5544cd94e Mon Sep 17 00:00:00 2001 From: "pullfrog[bot]" <226033991+pullfrog[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2026 19:10:46 +0000 Subject: [PATCH 1/2] fix: declare host compatibility by capability, not a wrong minHost Issue #6. The manifest declared minHost 1.14.8, which is a Split Screen plugin version, while the plugin spec defines minHost as the minimum *Host (core)* version -- so the field claimed a core compatibility level the number says nothing about. No core version can honestly replace it: feedBack's VERSION file has read 0.3.0-alpha.2 since 2026-08-10, five weeks before highway.renderFrameAt() landed in f7c761c, and feedBack publishes no releases or tags. So 0.3.0-alpha.2 admits hosts that cannot export and anything higher names a release that does not exist. feedBack issue #102 says the same and proposes publishing a traceable baseline version. minHost is also advisory-only in the current host (no reference to it in static/js/plugin-loader.js). Remove the field and enforce the requirement by capability instead. The pre-flight check now names the side that is actually missing: the always-required highway.renderFrameAt() (feedBack f7c761c), or Split Screen's beginOfflineRender()/renderFrameAt()/endOfflineRender() bridge (Split Screen 1.14.8) when a split layout is being exported. Previously one message named both at once, so a stale Split Screen was indistinguishable from a stale host. Requiring the whole bridge is substantive, not cosmetic: Split Screen's renderFrameAt() returns false unless beginOfflineRender() has run, so a partial bridge always failed on frame 0 with a misleading 'visualization is not ready' error. It is now reported up front, by name. Also: document the two host floors separately from WebCodecs and FFmpeg in README.md and CLAUDE.md, drop the getCanvas() dependency that screen.js never used, correct CLAUDE.md's bridge attribution to Split Screen's own release wording (added in 2301dd5, completed in 87e3622a), and clear the Staff View 'known gap' note now that PR #4 has merged. screen.js has no exports, so tests/js/screen.test.js extracts the gate from the real source and drives it directly; custom-checks.yml runs it. --- .github/workflows/custom-checks.yml | 2 + CHANGELOG.md | 42 ++++++++++- CLAUDE.md | 106 ++++++++++++++++---------- README.md | 50 ++++++++++-- plugin.json | 5 +- screen.js | 42 +++++++++-- tests/js/screen.test.js | 113 ++++++++++++++++++++++++++++ 7 files changed, 306 insertions(+), 54 deletions(-) create mode 100644 tests/js/screen.test.js 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 1604106..9d2c345 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,4 +7,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] - +### Changed + +- **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 8ae2482..a13e7fa 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:219`; `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:281`; `songInfo.full_mix_url` is the *preferred* audio source, falling back to `audio.currentSrc` / - `audio.src` / `window._juceAudioUrl` at `screen.js:227` — the whole + `audio.src` / `window._juceAudioUrl` at `screen.js:289` — the whole export only bails when all four are empty, so a host with no `getSongInfo` at all can still export via the `