feat(website): browse Nightly, RC and Stable release tabs #638
No reviewers
Labels
No labels
area/accessibility
area/audio
area/input
area/install
area/menu
area/renderer
area/saves
area/upscaling
beanstalk: approved @ 1697603
beanstalk: approved @ 2c5a62e
beanstalk: approved @ 4fd82b7
beanstalk: approved @ 64d6d09
beanstalk: approved @ 6f91fae
beanstalk: approved @ 70a78f9
beanstalk: approved @ 8015c9a
beanstalk: approved @ 8d361dc
beanstalk: approved @ 9d8356e
beanstalk: approved @ abf2227
beanstalk: approved @ d82f202
beanstalk: approved @ e5f1e40
beanstalk: approved @ ee8ab5f
ci: approved
good first issue
gpu/amd
gpu/igpu
gpu/intel
gpu/nvidia
help wanted
kind
bug
kind
chore
kind
docs
kind
feature
kind
performance
kind
question
needs measurements
platform/linux
platform/macos
platform/steam-deck
platform/windows
preview
priority
critical
priority
high
priority
low
regression
status
blocked
status
confirmed
status
duplicate
status
invalid
status
needs-info
status
wontfix
testing wanted
ci: approved
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Longshot!638
Loading…
Reference in a new issue
No description provided.
Delete branch "bibiburl/Longshot:docs/release-summary"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Type: feat · Risk: low · Tested on: Linux, Chromium 153, bounded live collection, fixture and game-free tests · Needs: renewed review; existing publication blockers resolved before deployment
Why
Players can switch between Nightly, Release candidate and Stable to see the latest published game build, relevant changes and release notes. Release tabs update after publication and on the hourly fallback. This revision addresses Jordan’s review.
What changed
Replayed the release-tab commits directly onto main
aa95d35f; this PR no longer includes or depends on #634’s hero, or #611’s download changes. The tabs compose with #611 and Jordan’s hero #768.not; no unbounded compare request is made. The RC panel currently displays 50 of 109 changes, explicitly labelled.Screenshots
After: this PR @
0ebd90c7, Release candidate at 1440 px, light. The current RC shows the newest 50 of 109 source changes.Before, mobile Nightly, and empty Stable channel
Before: main @
aa95d35f, 1440 px, light; no release-tab section.After: this PR @
0ebd90c7, Nightly at 390 px, light.After: this PR @
0ebd90c7, Stable at 1440 px, light; explicitly unavailable until published.Integration with #611, #709 and Jordan’s #768 hero (local only)
Browser checks: clicking RC updates the hash to
#release-rc, deep links restore the panel, and keyboard navigation remains usable. Standalone homepage accessibility audits at 1440/390 report 0 violations, with one incomplete contrast rule for gradient backgrounds/decorative glyphs; screenshots were inspected manually. The old main hero has an inherited halo overflow, which the #768 combination removes; the release panels fit.Measurements
Verdict: summary collection stays bounded as release history grows, failures degrade channel panels, and incident ownership is verified. These are website/source-change descriptions, not gameplay performance claims.
Hardware: Linux x86_64, Chromium 153 and the pinned Node/npm environment; no GPU or gameplay benchmark.
Scene: built website on loopback, desktop 1440 px and mobile 390 px, light and dark themes.
Method: functional test counts on the named untouched baseline and PR branch; one live release-collection observation where listed, not an interleaved performance measurement.
How to reproduce: in website/, run npm ci, npm run build, npm run check and node --test tests/*.test.ts; at the repository root run python -I -B tests/run_all.py. Use local Astro preview for static behavior and Wrangler for download routes.
aa95d35f0ebd90c7The live observation is a functional check, not a latency guarantee or repeated benchmark. Category counts cover only the displayed commits; the full range is linked.
Flags and settings
Only Website’s failure-email behavior changes; there are no new game switches.
enable-email-notificationsTesting
Tested: pinned dependencies; static site build (16 pages); website tests; publication checks; complete game-free suite; six refresh-workflow tests, including execution of the real dispatch shell command and actual concurrency expression with fake contexts; incident spoofing/identity fixtures; source-range cap, partial outage, pruning, branding and tab hash regressions;
git diff --check. Browser evidence accompanies the screenshots. #611, #638, #709 and #768 merge without conflict in a temporary local combination.The website failure is the same HDR Native condition assertion as untouched main. Publication checks still reject existing progress-feed branding in #603, #615 and #715; #731 handles that separately. Release-summary validation passes. The same 14 failing files reproduce on untouched main
aa95d35f:tests/test_appimage_player_build.py,tests/test_bake_portability.py,tests/test_cpm_discovery.py,tests/test_crash_dialog.py,tests/test_env_on.py,tests/test_lift_cleanup_error.py,tests/test_linux_preflight.py,tests/test_make_game_cache.py,tests/test_mods_size_table.py,tests/test_options_budget_once.py,tests/test_pipeline_tour.py,tests/test_readback_late.py,tests/test_vk_pgo.py,tests/test_walk_key.py. No new failing files.Combined integration: #611 + #638 + #709 + #768 merges cleanly, builds 18 pages and runs 125 website tests successfully with the same existing HDR-condition failure. Sixteen checks (home, Install, Transfer a save and Launcher × desktop/mobile × light/dark) have no horizontal overflow. A separate #768 mobile-light tagline contrast finding remains:
#ffe100on#146cea, 20 px normal text, 3.67:1, below 4.5:1. This PR does not modify that hero; resolve it in the hero review before deployment.Not tested: real Actions job-token identity, runner dispatch/queue execution, email delivery, Cloudflare production deployment, Firefox/Safari or game execution. Local workflow tests use fake endpoints; they do not claim a deployed workflow.
Must be tested:
Risks
The latest 50 commits are deliberately a bounded window, not the entire release history; the total and Compare link make that limit visible. An unavailable panel may temporarily replace known release details after an upstream outage. Curated highlights need editorial maintenance and only appear in a displayed range. Incidents require a readable authenticated
/useridentity; failure to verify it is reported without writing to arbitrary issues. Revert the release-tab and refresh-workflow changes to disable them.Compatibility: no game files, save formats, launcher behavior, renderer ABI or dependencies change. Main remains the only production source. No dependency on #634; the tabs fit #768 and the download callout from #611.
Issues
See #635, #580, #611, #634, #768, #731 and the linked review above.
Checklist
Everyone
type(scope): description) of the status line's type.main.python -I -B tests/run_all.pypasses (any failure that also fails onmainis named).third_party/untouched (a new folder with aPROVENANCE.mdinstead).When it applies
Assisted-by:trailers.tests/that reads changed source updated in this PR, not weakened.First attempt for #635 — actual website output, not a mockup. After: this PR @
6f72040e, built with the pinned dependencies and served by the local Wrangler Worker. Before: #634 @a826af4c. Desktop captures use a 1440px viewport; mobile uses 390px. The hero's existing punchline varies on reload.The new section shows Nightly 170, its publication date, three reviewed highlights, and all six source commits since Nightly 164. No stable release exists at capture time. Once one does, prereleases compare with the latest stable; a new stable compares with the previous stable. Launcher versions stay separate.
After: this PR @

6f72040e— dark section:After: this PR @

6f72040e— light section:Full-resolution homepage comparisons:
Additional after views:
Validation: 107/107 website tests pass; 16 pages build; no horizontal page overflow at 320–1920px in either theme; native disclosure works with Enter and visible focus. Section-scoped axe reports 0 violations, 22 passes and one incomplete gradient-contrast category per theme. The affected palette's gradient endpoints were checked separately (minimum 6.15:1 text contrast). No browser errors. These checks are not a full accessibility or real-device certification.
The inherited publication guard still rejects public wording from progress issue #615. The repository game-free suite reports 500 passed, 13 known baseline failures and 69 skipped; details are in the PR description. No game or runtime experiment was performed.
Still WIP, with native dependencies and status/blocked: #264 → #611 → #634 → #638. Do not approve/merge out of order. No hosted preview or deployment was requested.
Attached nine before/after desktop, mobile and expanded-change screenshots and linked them from the description. Native dependencies are #264, #611 and #634; status/blocked and the ordered approval/merge hold remain. Final website result: 107 tests pass, 16 pages build, and the inherited #615 wording guard still blocks publication. Kept WIP; no hosted preview or deployment requested.
Updated first attempt: Nightly / Release candidate / Stable tabs, with an explicit Release candidate badge. After: this PR @
6fc80620; before: first attempt @ 6f72040e. These are rendered screenshots from the local Worker, not mockups.The tabs currently show Nightly 170 versus Nightly 164 (six source changes), RC 3 versus RC 2 (twelve), and “No stable release yet.” Each available channel has its own highlights and complete source links. Older RCs never compare against a stable published after them. The checked timestamp now includes UTC time.
Other views:
Validation: 112/112 website tests pass; 16 pages build. All three tabs in both themes at 320, 390, 768, 1024, 1440 and 1920px fit without horizontal overflow. Arrow wrapping, Home/End, Enter/Space, Tab into panels, the RC disclosure and deep links pass. Blocking all page scripts leaves every channel readable and anchor navigation working. Axe reports zero violations for all six channel/theme states; Nightly and RC retain one incomplete gradient-contrast category, Stable has none. No normal-preview browser errors.
The repository game-free suite remains 500 passed, the same 13 baseline failures and 69 skipped (100s). Publication is still blocked by the inherited #615 wording check; no guard was bypassed. Full details are in the updated description.
Freshness: the existing workflow is already configured for an hourly rebuild at :07, website-source pushes on main and manual rebuilds. Successful builds refresh release data; handwritten highlights remain editorial. No workflow change, hosted preview request or deployment was made.
Keep WIP and the ordered hold: #264 → #611 → #634 → #638.
Added Nightly, Release candidate and Stable tabs at
6fc80620, with independent release ranges, explicit RC badges, accessible keyboard controls and a readable no-script fallback. UTC timestamps now include the time. Attached ten current screenshots; 112 website tests and the 16-page build pass. The inherited #615 publication blocker and #264 → #611 → #634 → #638 hold remain. Existing hourly refresh behavior is documented; deployment automation is unchanged.WIP: feat(website): show latest build and release changesto WIP: feat(website): browse Nightly, RC and Stable release tabsReframed this PR around the Nightly, Release candidate and Stable tabs, with the current tab screenshots leading the visual evidence. Added supporting automatic refresh after successful release publication, the existing hourly fallback, a shared production queue and one failure issue per outage that closes after recovery. Failure emails are enabled as a secondary route. Head
a1346080: 119 website tests and 5 workflow tests pass; the full game-free suite has 501 passes, the same 13 recorded baseline failures and 69 skips. The #615 publication-wording blocker remains. No live dispatch, alert, preview or deployment was performed. Keep WIP and do not approve, merge or deploy before #264 → #611 → #634 are approved in order and merged.Checklist finalized: the new source-reading workflow test is included, and rollout verification is explicitly a manual maintainer check. WIP and the ordered dependency hold are unchanged.
Added the current tabbed screenshots directly to the main PR description: all three channel states, mobile views, both themes and full-size homepage links. The earlier version without tabs is explicitly marked superseded so reviewers know which design this PR proposes. WIP and prerequisite order are unchanged.
Confirmed #264 merged at
d7aeaa26on 2026-11-15 at 03:24 UTC. The main description now marks that prerequisite complete and shows the remaining order: #611 → #634 → #638. Keep this PR WIP and blocked until the remaining prerequisites are approved and merged in order. The current-main checklist is now pending because the stack still needs reconciliation and revalidation against the merged results; no code, preview or deployment was changed.WIP: feat(website): browse Nightly, RC and Stable release tabsto feat(website): browse Nightly, RC and Stable release tabsMarked ready for review at the author’s explicit request (#611 was already non-WIP). #264 is merged; the remaining approval/merge order stays #611 → #634 → #638. The description records the current merge conflicts and outstanding validation; unchecked work remains unchecked. Dependencies and blocked labels are preserved. No code, approval, merge or deployment was performed.
Reviewed at
a1346080(only this PR's three commits on top of #634). The workflow side is sound:IS_PR.The tabs follow the ARIA tabs pattern properly and work without JavaScript. 119 website tests pass, and a live collection takes 12 API calls. Changes needed:
Blocking
The nightly comparison will stop every production deploy.
progress-request.ts:16).buildReleaseSummaryreturns null andcheck-site.ts(~61–70) fails, so nothing deploys: not the hourly refresh, not a website fix. Same-repo PR previews fail too.Anyone can take over the refresh incident (
website/scripts/report-refresh.mjs~22). It treats any open issue whose body starts with the marker as the incident, whoever posted it. Someone opens an issue starting with<!-- longshot-website-refresh-failure -->, and then:Match on the poster (the Actions user) or a label.
Should fix
The baseline depends on which nightlies are still unpruned (
release-summary.ts:39). With no stable, a prerelease compares againstolder[0], the previous build of any channel, and Release keeps only 5 nightlies.:172) throws and (1) follows.Comparing an rc with the previous rc avoids both.
Curated highlights mostly don't show.
release-highlights.json(a1f0c539,4b9fad06,fabcd2c0) are in no visible range today, and a nightly highlight is visible for about an hour.chore(agents)commit. Prefer feat/fix/perf.A commit subject can't be edited, and
check-site.ts:64applies the branding check to subjects.publicGameTextleaves several single names alone, so one such subject would block deploys for as long as it's in a range. None of main's current subjects trip it, but neutralising or dropping such subjects is safer than failing the build.In
website.yml:pull_request_target: [labeled]) also create runs in each PR's preview group. If Forgejo keeps one pending run per group, adding any label during a preview build can cancel the newest commit's preview.Smaller points:
ReleaseSummary.astro~162–174 repeats the base rules inside the 30rem query.tests/test_website_refresh.pyonly checks the YAML for substrings.This is built on #634, which won't merge (#768 replaces the hero), so it needs moving onto main or #611. The tabs sit below the hero and fit #768's design as they are.
Review drafted with Claude Code and checked by Jordan.
a1346080980ebd90c776Updated review screenshots for
0ebd90c7. The main description will use these current images. Before images are mainaa95d35f. Individual after images show only this PR; combined images are a local integration of #611, #638, #709 and #768, not a deployed site.Combined integration: no merge conflicts, 18 pages built, 125 website tests pass with the same existing HDR-condition failure. All 16 viewport/theme/route layout checks have no horizontal overflow. The mobile light hero from #768 has a separate tagline contrast finding (3.67:1 versus 4.5:1 required); the download and release-tab changes do not edit that hero.
Addressed Jordan’s review in
0ebd90c7, rebased directly onto mainaa95d35fwith no #634/#611 commits. Release ranges now use bounded paginated commit requests (50 displayed plus full count and Compare link), failed channels degrade independently, RC baselines ignore nightly pruning, and incidents require the authenticated author. Added regression coverage, player-facing highlight selection and shareable tab hashes; isolated unrelated label queues and disabled repeat Website emails. Current screenshots and validation are in the main post. Please re-check this head. Neither this update nor the integration preview requests deployment.Re-checked at
0ebd90c7. Points 1–6 are fixed:It merges cleanly with main, #611 and #768. One blocker is left, and it's about one line:
The refresh reporter fails on every production run (
website/scripts/report-refresh.mjs:19). A job token authenticates as the Actions user, whose ID is −2:GET /useranswersid: -2(Forgejo'smodels/user/user_system.go,services/auth/method/action_task_token.go). The new checkidentity.id < 1throws on that. So "Report production refresh health" fails on every main run, and a run that deployed fine still ends red. A real outage never opens an incident, and with Website emails now off, nobody hears about it. The test misses it because its mock returnsid: 42(refresh-report.test.ts:12). Accepting the Actions user (id === -2, loginforgejo-actions) keeps the protection, because other accounts still can't post as it. A mock withid: -2would catch it.Small notes, not blocking:
github.run_idis empty when Forgejo evaluatesconcurrency, so every unrelated-label run shareswebsite-ignored-. That's harmless, since the job is skipped and nothing is cancelled, but theignored-42case intest_website_refresh.py:73checks something that can't happen.release.yml:27addsenable-email-notifications: true, which turns on failure emails for the whole Release workflow. If that's intended, worth saying so in the description.Review drafted with Claude Code and checked by Jordan.
0ebd90c776733f20c345Rebased onto
main@7bacf846. One conflict inwebsite/scripts/check-site.ts(therelease-summary.tsimport next to main'spublic-copy.tsimport): kept both imports. The PR's own diff is the same files and line counts as before. No tests were run here; the test boxes stay yours.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.