Repository navigation
fix: declare host compatibility by capability, not a wrong minHost - #15
Conversation
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.
Not up to standards ⛔🔴 Issues
|
| Category | Results |
|---|---|
| Security | 1 critical 1 high |
🟢 Metrics 39 complexity · 0 duplication
Metric Results Complexity 39 Duplication 0
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
|
Addressed both findings from the kilo-code review in commit 1. 2. The interesting part is what the reviewer's framing missed: the suite was already proving it reads the shipped source, so the duplicate declaration wasn't making it test the wrong code — it was a latent fragility. So I verified the fix by mutation rather than by the green run:
The third is new to this PR and is the one that matters for this fix — it only goes red because the constant is now genuinely extracted and evaluated. Also green: One note for you, not blocking: this PR still takes Task list (9/9 completed)
|
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Both findings from the previous review are resolved in the latest commits: Files Reviewed (2 files)
Previous Review Summary (commit 8143e86)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 8143e86)Status: 2 Issues Found | Recommendation: Address before merge Overview
Issue Details (click to expand)SUGGESTION
Files Reviewed (7 files)
The capability gate itself is sound: the core check and the Split Screen bridge check are correctly separated, the error path restores Reviewed by free · Input: 0 · Output: 0 · Cached: 0 |
…colon
CLAUDE.md cited screen.js lines 281/289/390; the code is at 282/290/391.
230 was already correct.
block("const SPLIT_BRIDGE =") brace-matched an array literal, so it
swallowed frameDriverProblem along with it and the rebuilt body declared
that function twice -- legal only because new Function bodies are sloppy
mode. Extract the constant to its terminating semicolon instead.
|
@pullfrog this PR now conflicts with The two Codacy findings on Generated by Claude Code |
|
Merged
Verification (all green): As requested, I did not merge the PR, and the two Codacy findings were left alone. Two pre-existing doc inaccuracies I noticed but did not touch, since they are outside the conflict:
Task list (7/7 completed)
|
Resolve the conflicts with main (PR #14, perf: pipeline encoding, cache compositor pixels, stream exports) without dropping either side's intent. screen.js keeps main's export-session transport (streaming encoder sink, session mux, audio upload, encoder backpressure, compositor object) and this branch's capability gate, so the Split Screen bridge calls stay unguarded: frameDriverProblem() already requires all three hooks whenever a split layout is exported, which is the point of the change. plugin.json moves 0.2.2 -> 0.3.1. main already bumped to 0.3.0 and neither version is released (both sets of entries sit under [Unreleased]), so this branch's user-visible bump lands on top of main's instead of reverting it. CHANGELOG.md keeps both sides' entries in one [Unreleased] section, ordered Added, Changed, Removed, Fixed. README.md keeps main's progress-reporting and FEEDBACK_PUBLIC_ORIGIN sections ahead of this branch's four-part Requirements breakdown. CLAUDE.md keeps main's encoder-pipeline section and this branch's corrections (issue #102 does not pin a floor; the Staff View note is a fix, not a gap), with screen.js line citations renumbered for the merged file.

Fixes #6.
What this does
Replaces the manifest's host version declaration with a capability check that can tell users which component is actually too old.
Note this reverses a prior attempt: commit
7e9f52c("Updated minHost to 1.14.8") is already onmain. This PR removes the field rather than replacing it with a different number. If you expectedminHostto end up with a value, this is the part to push back on — reasoning below.Why
minHostis removed instead of correctedminHostwas1.14.8, which is a Split Screen plugin version. Per plugin-spec §4.1,minHostmeans the minimum Host (core) version — so the field described a core compatibility level that the number says nothing about.No core version can replace it honestly:
VERSIONhas read0.3.0-alpha.2sinceec1157ac(2026-08-10) — five weeks beforerenderFrameAt()landed inf7c761c(2026-09-17T02:36:07Z) — andf7c761c's own parentbe5f27areports the same string.mainstill reads it today.0.3.0-alpha.2names a release that does not exist.So
0.3.0-alpha.2would admit ~5 weeks of hosts that cannot export, and any higher value is fiction. feedBack #102 declines to pin a floor for this API and proposes publishing a traceable baseline version instead — this PR follows that, andCLAUDE.mdrecords when to restore the field.It also buys little today:
minHostis advisory-only in the current host. I grepped all of feedBack'sstatic/js/plugin-loader.jsforminHost|min_host|minimum|requireHost— zero matches, and no version-gating code path exists in the module. A wrong value would not have warned anyone; it would only mislead a future enforcing host.The enforcement that replaces it
frameDriverProblem()inscreen.jschecks the two requirements separately and names the failing one:highway.renderFrameAtf7c761c; does not blame Split ScreenPreviously one message named both at once ("Update the host and Splitscreen plugin"), so a stale Split Screen was indistinguishable from a stale host.
Requiring the whole bridge is substantive, not cosmetic. Split Screen's
renderFrameAt()starts withif (!active || !_offlineRenderActive || ...) return false(screen.js:684in that repo), sobeginOfflineRender()is a precondition of painting any frame. A build exposingrenderFrameAtwithout it could never export — it died on frame 0 with "The selected visualization is not ready for offline rendering", which says nothing about the cause. That case is now reported up front by name. To be precise about what this does not fix: it did not produce a corrupted video before, since Split Screen's own guard returnedfalse.Attribution of the bridge
Split Screen's v1.14.20 release notes describe the hooks as "deterministic offline-render hooks added in
2301dd5and completed in87e3622a." This PR cites both and takes the floor as 1.14.8, where87e3622aset the manifest and whose parent7cd0ec5is manifest1.14.7with nobeginOfflineRender. (I'd initially written that2301dd5did not introduce the bridge — upstream's own wording corrects that.)Other changes
README.md— requirements split into four independent sections (feedBack host / Split Screen / WebCodecs / FFmpeg). Dropshighway.getCanvas(), whichscreen.jsnever calls.CLAUDE.md— host contract updated with the verified history; also clears a stale "Known gap" note about Staff View that survived PR Fix Staff View notation never appearing in exported video #4 (fb03961) merging. Unrelated to Declare the correct minimum host version #6 but it was actively wrong in a file I was editing; easy to drop if you'd rather split it.tests/js/screen.test.js+ a CI step —screen.jshas no exports, so the test extracts the gate from the real source by brace matching (the same idiom feedBack core uses intests/js/highway_external_frame_driver.test.js) and drives it directly. Verified by mutation: disabling the core check fails 3 tests, removing thesplitActiveguard fails 2.Verification
node --check screen.js,node --test tests/js/screen.test.js(9 pass),python -m pytest -q tests/(7 pass), and every step incustom-checks.ymlall pass locally.Follow-ups (deliberately not in this PR)
CHANGELOG.mdhas no## [0.2.1]section. v0.2.1 was cut as a GitHub release (e05e4be, prerelease), and Split Screen v1.14.20 publicly names "Visual Export v0.2.1" as the peer floor for deterministic split export — so that version has no in-repo record of what it contained. Reconstructing it from git history risks recording something inaccurate in a permanent artifact, and PR perf: pipeline encoding, cache compositor pixels, stream exports #14 independently targets0.3.0; I left it alone. Entries here stay under[Unreleased]perCLAUDE.md.0.3.0and rewrites the compositor. This branch takes0.2.2, so one of the two will need adjusting at merge time.big-pickle(free) | 𝕏