Release 0.4.0 — cut the accumulated Unreleased section - #2
Conversation
plugin.json and package.json have both sat at 0.3.0 since 2026-07-08 while four commits landed on main. The plugin manager keys update detection off `version`, so none of that work was ever offered to anyone already on 0.3.0. Minor rather than patch: the unreleased block carries a new Metronome feature and a removal (study-mode preroll count-in) alongside the fixes, so 0.3.1 would have understated it. Also records 2883dfa in the changelog, which shipped without an entry — _buildWsUrl decoded the filename but never re-encoded it before splicing it into the highway URL, so '&', '#' or '?' in a name could override the arrangement parameter or truncate the path. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B4NYejYW2dW7dNtYh7srDy
This repo's ci.yml calls the shared reusable-ci.yml, which runs the test suites and nothing else. The org's original-repo plugins run their own custom-checks.yml instead, so enforcement was split down the middle: forks got tests but no spec checks, originals got spec checks but not always tests. A cross-repo audit found defects on both sides of that line. Three targeted jobs rather than the originals' full sixteen — version-bumped-on-change, changelog-updated, and idempotent-top-level-guard. These are the ones that map to defects actually found in these repos: versions and changelogs going stale while functional source shipped, and screen.js re-executing on reload without a guard. Jobs self-skip where they do not apply. The right home for these is got-feedback/.github's reusable-ci.yml, so every repo picks them up from one reference instead of four copies. The file says so, and says to delete it when that lands. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B4NYejYW2dW7dNtYh7srDy
There was a problem hiding this comment.
Important
The [0.4.0] cut is missing a changelog entry for commit 2929344 (got-feedBack#24, "keep one staff-system row of lookahead visible") — a user-facing auto-scroll fix that shipped on 2026-07-23, after the 0.3.0 release. Every other post-0.3.0 functional commit is recorded; this one slipped, which is exactly the defect class this PR exists to close.
Reviewed changes
- Version release 0.4.0 — cut the accumulated
[Unreleased]section into[0.4.0] — 2026-08-13, recording the Metronome feature, the study-preroll removal, and the pickup/cursor/WS-URL fixes; syncedplugin.jsonandpackage.json0.3.0 → 0.4.0. - New
compliance.ymlworkflow — three self-skipping jobs (version-bumped-on-change,changelog-updated,idempotent-top-level-guard) enforcing the plugin-spec checks the audit found missing for fork-derived plugins, documented as a stopgap untilgot-feedback/.github'sreusable-ci.ymlhosts them.
The version cut, plugin.json/package.json sync, and the three jobs' base-commit handling and set -eu pipelines all check out; the workflow passes on this repo's own screen.js.
ℹ️ Nitpicks
version-bumped-on-changecomparesOLD_VERSION != NEW_VERSION, so a downgrade would satisfy the "bump" check. An ordering comparison would be stricter, though for a targeted stopgap the inequality check is defensible.idempotent-top-level-guardrequires somewindow.__*flag file-wide, and this repo already haswindow.__feedBackStaffviewArrangementSubscribed(screen.js:819) — so the job can never trip here again, even if a future PR adds an unguarded top-level listener. Fine as a cross-repo gate, but it's a one-time check, not ongoing protection.
Big Pickle (free) | 𝕏
…en compliance Review feedback on PR #2. The 0.4.0 cut missed commit 2929344 (got-feedBack#24, "keep one staff-system row of lookahead visible"), a user-facing auto-scroll change that landed 2026-07-23 — after the 0.3.0 release. Every other post-0.3.0 functional commit was recorded; this one slipped, which is the same defect class the release itself exists to close. Compliance workflow, same fixes as the sibling repos: diff against the merge base rather than the base tip (a stale branch was being failed for a bump it did not owe), require the [Unreleased] section itself to change rather than merely touching CHANGELOG.md, count .css as functional source, and record the guard job's known limitation. The [Unreleased] check would have caught this PR's own subject. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B4NYejYW2dW7dNtYh7srDy
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — delta since the prior pullfrog review (33263a8), one commit (e53055b):
- Recorded the got-feedBack#24 scroll-lookahead fix — added the
_svUpdateMarkerauto-scroll entry toCHANGELOG.md's[0.4.0]Fixed list. Verified the entry's claims against the code (screen.js:3474-3510): next-staff-system lookahead at a ~25% top inset, backward-seek guard at the 15% top edge, last-row centre fallback, page-layout-only. Accurate. - Hardened
compliance.yml— both version/changelog jobs now diff against the merge base instead ofpull_request.base.sha(so a stale branch isn't failed for a bump it doesn't owe);changelog-updatednow compares the[Unreleased]section between merge-base and HEAD rather than just requiringCHANGELOG.mdto be touched;.csscounts as functional source; the guard job's known limitation is documented in-code.
I simulated the new unreleased()/merge-base logic against this repo's actual history: the awk extraction correctly isolates [Unreleased], the release PR itself has no functional source so all three jobs self-skip, and the workflow passes on this repo's own screen.js. Both prior review threads are addressed and resolved.
Big Pickle (free) | 𝕏

Found during a cross-repository audit of the eight feedBack repos.
The problem
plugin.jsonandpackage.jsonhave both sat at 0.3.0 since 2026-07-08 while four commits landed onmain. The plugin manager keys update detection offversion, so none of that work was ever offered to anyone already on 0.3.0 — it was written, merged, and then invisible.Minor, not patch
I started with 0.3.1 for the one unrecorded fix, then read the whole
[Unreleased]block. It also carries a new Metronome feature and a removal (study-mode preroll count-in), so a patch bump would have understated the release. Cut as[0.4.0] — 2026-08-13, withpackage.jsonsynced to match.Changelog
One commit had shipped with no entry at all —
2883dfa, "Percent-encode the filename in_buildWsUrl". Now recorded under Fixed:Worth keeping the original commit's framing: filenames come from the app's own library data attributes rather than being directly attacker-supplied here, and the socket stays same-origin, so this was a robustness bug rather than a demonstrated exploit. Covered by
tests/ws_url.test.js.Also in here
compliance.yml— this repo'sci.ymlcalls the sharedreusable-ci.yml, which runs the test suites and nothing else, so fork-derived plugins had no spec enforcement while the org's original-repo plugins had enforcement but not always tests. Three targeted jobs rather than the originals' full sixteen:version-bumped-on-change,changelog-updated,idempotent-top-level-guard— the ones that map to defects the audit actually found.version-bumped-on-changeandchangelog-updatedare precisely the checks that would have caught this PR's own subject, which is the argument for adding them here.The right long-term home is
got-feedback/.github'sreusable-ci.yml, so every repo picks them up from one reference instead of four copies. The file says so, and says to delete it when that lands.All 130 tests across the 12 test files still pass.
Generated by Claude Code