Repository navigation
docs: add a host/plugin compatibility matrix pinned to commits (#131) - #137
Conversation
|
Fixed by relabelling the commit subject — no content change. Diagnosis. The only failing job was Fix. The exclusion list is per-file, so the README link index entry is what makes this a core commit. The fork policy has no Verified. Task list (5/5 completed)
|
Up to standards ✅🟢 Issues
|
…131) #102 needs a maintained compatibility matrix, and the version string cannot express one: VERSION has read 0.3.0-alpha.2 since 2026-08-09 across 83 commits, so it cannot separate a build that has renderFrameAt from one that does not. This adds docs/compatibility.md with one row per host API/commit, naming the exact commit, the dependent plugins and features, whether the need is required or optional, and whether the commit is on upstream main or fork-only, plus the host and plugin revisions each row was audited against. The audit confirmed #102's mapping with two corrections (Lyrics Karaoke's dlc_paths use is a preferred path with a safepath.safe_join fallback, and Splitscreen feature-detects the f7c761c frame API rather than requiring it) and a date correction (f7c761c is 2026-09-17 UTC, not 09-16). Every row is marked source-audited, not runtime-certified. Docs only: no loader, capability, or minHost behaviour changes. Labeled core(docs): rather than docs: because README.md counts as a core path under docs/fork-maintenance.md ("What counts as core" — everything outside plugins/, docs/, tests/, scripts/, specs/, CHANGELOG.md and VERSION), so core-commit-labeling requires one of the core:/hook:/sync:/fix: prefixes. Upstream convention stays docs: when the same change goes to the org repo.
06e4f4e to
3fe9de8
Compare
There was a problem hiding this comment.
Important
The audit itself is unusually solid — I reproduced every commit SHA, committer date, ancestry relation and the entire upstream/fork column using the document's own documented commands, and all seven host file:line references are exact. What should be fixed before merge is five factual errors in the supporting prose, all in the same "this is the precise identity" class the document exists to provide: a VERSION date off by one day, a Splitscreen commit cited as shipped that never merged, a warning attributed to a code path that never warns, a plugin's actual gate named incorrectly, and two per-row check commands that report a fully capable build as missing the API. Each is a prose edit.
Reviewed changes
- New
docs/compatibility.md— a seven-row matrix mapping host APIs to the plugin features that need them, each row pinned to an exact commit with its UTC committer date, the hostfile:linesurface, the dependent plugins, required-vs-optional with the failure mode spelled out, upstream-or-fork, and the plugin revision audited. - "Why not version strings" — the complete
VERSIONhistory (four commits, ever) plus the commit ranges the single0.3.0-alpha.2string spans, and why that makes a commit hash the only usable identity today. - Row-by-row evidence sections — for each row, the host surface at HEAD plus the dependent plugin's actual import/call shape, with the degrade path traced rather than asserted.
- Supporting sections — the candidate baseline (
e5339c0) with its ancestry proof, theminHost-is-metadata status, copy-pasteable per-row check commands, three corrections to #102's dependency list, and an audit-metadata table that states what was not done. README.md/CHANGELOG.md— a docs-index entry and an[Unreleased]entry summarising the matrix.
Independently confirmed while reading: all seven row commits resolve with the exact dates in the table; the Upstream? column reproduces exactly via gh api repos/got-feedback/feedBack/compare/<sha>...main --jq .status (rows 1–4 ahead, rows 5–7 behind); upstream main really is eef58c8, which is why the last three rows cannot be upstream; the 278 / 83 commit ranges are right; the fork has no tags and no releases; b6169af6 is an ancestor of 0dcc913, so it genuinely contains none of the seven APIs; and Difficulty Ladder's unguarded import, Lyrics Karaoke's safe_join fallback and Feedpakr's insufficient-is not None guard all match what the document says.
ℹ️ The pins have no staleness signal
Every re-audit trigger the document lists — a commit superseded, a plugin's default branch moving past the audited revision, a release finally naming a baseline — is a silent event. Nothing in CI notices when one fires, and the failure mode is a confidently wrong table rather than a missing one. Piano already solves this exact problem in-ecosystem: tools/verify-host-surface.js re-checks its audited refs on a schedule so core drift fails loudly. The same shape would cover the seven plugin revisions here. Not a blocker for this sub-issue, but it is what decides whether this table is still true in six months.
ℹ️ Nitpicks
- Row 3, Chordr status string —
window.chordr.getChartTransformStatus()returns"unavailable"(screen.js:411, exposed at:1006);"no-owner"is the dispatch reason that only ever appears inside the console warning (:414-415). "Reports a no-owner state" reads as a verbatim value. - Row 2, Difficulty Ladder —
read_member_bytesreads the arrangement (routes.py:3099) and generic pack JSON side files (:3211); the manifest goes throughsloppak.load_manifest(:3080). "arrangement/manifest members" names one right and one wrong. - Row 1, Lyrics Karaoke — the
Nonereturn surfaces as 404 onlk_data/lk_playback, 400 onlk_align/lk_save_lyrics/lk_generate_pitch, and a 200 withis_sloppak: falseonlk_status. "A 404 the caller already handles" is faithful to the plugin's own docstring but not to all five call sites. - Row 2, Feedpakr — three of the four paths that reach the missing attribute are named;
/api/plugins/feedpakr/lyrics-textcallssloppak_mod.read_member_bytesdirectly with notryaround it, making it the least contained of the four. Worth naming, since the failure mode is the row's whole point.
big-pickle (free) | 𝕏
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Files Reviewed (2 files)
Verification notesIncremental diff ( Reviewed by free · Input: 0 · Output: 0 · Cached: 0 Previous Review Summaries (2 snapshots, latest commit 9475347)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 9475347)Status: No Issues Found | Recommendation: Merge Files Reviewed (2 files)
Verification notesIncremental diff ( Reviewed by free · Input: 0 · Output: 0 · Cached: 0 Previous review (commit 3fe9de8)Status: 5 Issues Found | Recommendation: Address before merge Overview
Issue Details (click to expand)All five findings below are already reported as active inline comments on this PR (by pullfrog[bot]); this review found no additional defects in the changed code. Each is a prose/factual correction in WARNING
Files Reviewed (3 files)
Verification notesIndependently re-checked against HEAD ( Reviewed by free · Input: 0 · Output: 0 · Cached: 0 |
- ec1157a is 2026-08-10 in UTC (committer date -06:00); fix the table row and the CHANGELOG entry. - Drop 87e3622a: it is a diverged Splitscreen side-branch commit, not reachable from main; 2301dd5 (1.14.8) is the commit on main. - The coordinated-frame path degrades silently; the warn-once fires only from beginOfflineRender(). - Difficulty Ladder gates its per-player write on fb.capabilities.dispatch, not playerContexts. - Prefix the Python check commands with PYTHONPATH=lib so a capable build does not read as absent. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UarYwGSPw2H3i54yUixA5G Signed-off-by: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
ℹ️ No critical issues — all five factual corrections landed exactly as flagged, and each one checks out against primary sources. One stale echo of the corrected claim survives in the summary table (inline).
Reviewed changes
- Corrected the
ec1157aVERSIONrow to2026-08-10and matched theCHANGELOG.mdentry, removing the local-vs-UTC slip the document exists to correct in #102's list. - Dropped the unmerged
87e3622afrom the Splitscreen 1.14.8 bridge citation, kept2301dd5as the single floor, and added an explicit "do not use it as a floor" note about the side-branch SHA Visual Export's own error text still cites. - Rewrote row 5's Splitscreen bullet — the coordinated-frame path degrades silently,
_canDriveFramesandrenderFrameAtare two separate predicates, and thecoordinated-frameswarn-once fires only frombeginOfflineRender(). - Rewrote row 6's Difficulty Ladder clause to name the real gate (
fb.capabilities.dispatch, literaltrueonly) and both fallback steps, instead ofplayerContexts. - Prefixed the two Python row checks with
PYTHONPATH=liband documented the repo-root / outside-pytest caveat that made them report a capable build as absent.
Each fix was re-verified from primary sources rather than taken from the reply: ec1157a's author and committer dates are both 2026-08-10T04:42:08Z; compare/87e3622a...main on Splitscreen returns diverged (24 ahead / 5 behind) while compare/2301dd5...main returns ahead, behind_by=0; _canDriveFrames at Splitscreen 1600e8c (screen.js:3814) requires setExternalFrameDriver and renderFrame, with renderFrameAt checked separately at :739 / :753 and :3842 returning without logging anything; Difficulty Ladder's _applyDifficultyForContext at 9ac046a gates on fb.capabilities.dispatch (:1450), accepts only a literal true (:1458), then falls through to the context-owned highway (:1464) and window.setMastery (:1469); and both prefixed Python checks now succeed from the repo root while the unprefixed form still raises ModuleNotFoundError, which is exactly what the new note says. CHANGELOG.md keeps CRLF on all 849 lines.
| Fix 👍s ➔ | View workflow run | Using big-pickle (free) | 𝕏
big-pickle (free) | 𝕏
The coordinated-frame path degrades silently; the evidence section was already corrected, this cell still said otherwise. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UarYwGSPw2H3i54yUixA5G Signed-off-by: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
✅ No new issues found — the last open finding is closed and the table is now internally consistent.
Reviewed changes
- Dropped
warns andfrom row 5'sRequired?cell (docs/compatibility.md:57), so the summary verdict now reads "optional for Splitscreen (feature-detected, degrades silently)" and agrees with the row-5 evidence 90 lines below, which documents that_startDeterministicFrames()early-returns with nothing logged and that thecoordinated-frameswarn-once fires only frombeginOfflineRender().
That was the whole delta — one cell in one table row. I read it against the full document rather than only the range-diff, to confirm the correction didn't leave the opposite claim echoing somewhere else: the summary cell, the row-5 detail (:147-153), and correction #2 in Corrections to #102's list (:265-268, "degrades to its per-panel self-scheduled loop", no warning claim) now all agree, and the fix preserves the wording the evidence section depends on — silent degrade for the live path, warn-once scoped to the offline-exporter entry point.
The doc is internally consistent across its other load-bearing claims: row verdicts match their evidence sections, the VERSION history table matches the 83/278 commit ranges quoted around it, the PYTHONPATH=lib caveat sits with both Python checks it explains, and the audit-metadata "Not done" row still matches the source-audit-only framing in the callout at the top. README.md and CHANGELOG.md are unchanged this round and both still carry their entries.
All six threads from the two prior pullfrog reviews are now resolved. Nothing here warrants changes before merge.
big-pickle (free) | 𝕏

Closes #131 (sub-issue 1/5 of #102). Docs only — no loader, capability, or
minHostbehaviour change, and no work started on the dependent sub-issues.What it adds
docs/compatibility.md— one row per host API from #102's dependency list, each with:Plus: why the version string can't answer any of this (a
VERSIONhistory table —0.3.0-alpha.2spans 83 commits and three of the seven APIs), a candidate-baseline section, theminHoststatus (passthrough metadata, no enforcement, no feature-scoped field in the manifest schema), copy-pasteable per-row check commands, links to Visual Export's #6/#7, and an audit-metadata table stating exactly what was and was not done.Corrections this audit found in #102's list
0dcc913. At5e9d586it imports the helper opportunistically and falls back tosafepath.safe_join; neither shape is weaker on containment. It's a preferred path, not a floor — anddifficulty_ladder's top-levelfrom dlc_paths import …genuinely is one, because a missing module fails the wholeroutes.pyimport and no generation route is ever registered.f7c761cis optional, and the dependent feature is deterministic/coordinated frame rendering — not LAN sharing, which depends on03e1c1dand is itself optional.f7c761cis 2026-09-17 UTC, not Sep 16 (local timezone in Define a verifiable core compatibility baseline for current plugins #102).Honesty notes
gh api repos/got-feedback/feedBack/compare/<sha>...main, not from the SHA being resolvable on GitHub:f7c761c,7633211ande5339c0all resolve upstream but are not on upstreammain.e5339c0is confirmed (viagit merge-base --is-ancestorfor all seven) to be the earliest commit descending from every row, so it is the cheapest single baseline identity — but the document says explicitly to name the row a feature needs, not the moving baseline.Checklist
mainCHANGELOG.md[Unreleased]updated