feat(website): browse Nightly, RC and Stable release tabs #638

Open
bibiburl wants to merge 5 commits from bibiburl/Longshot:docs/release-summary into main
Member

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.

  • Bound each source summary to the newest 50 commits, with the full change count and Compare source link. Forgejo’s paginated commits endpoint excludes the baseline’s ancestry using not; no unbounded compare request is made. The RC panel currently displays 50 of 109 changes, explicitly labelled.
  • A failed channel shows an unavailable panel while other channels remain usable. A complete release collection outage produces a valid unavailable snapshot instead of stopping website publication. Malformed output is still rejected; unrelated publication guards remain in place.
  • Without an earlier stable, RC compares with the previous RC and Nightly with the previous Nightly. Nightly pruning cannot change an RC baseline. Tag resolution and baseline-ancestry validation remain required.
  • Highlight selection prefers features, fixes and performance changes. Exact-SHA editorial keys are checked against real repository commits; unknown or out-of-window keys produce explicit warnings. Retired the three inactive entries. Remaining branded immutable subjects get neutral display text with their source link preserved.
  • Refresh incidents must match the authenticated Actions user ID and the marker. A forged marker cannot suppress failures or receive recovery edits; an unverifiable identity causes no writes.
  • Disable Website’s repeated failure emails in favor of one incident per outage. Unrelated label events use their own concurrency group, preserving queued previews. Main-only deployment and the fork-preview approval gate are unchanged. Release’s existing failure-email setting remains.
  • Tab selections update the URL hash; deep links and keyboard navigation work. Removed duplicate mobile CSS.

Screenshots

After: this PR @ 0ebd90c7, Release candidate at 1440 px, light. The current RC shows the newest 50 of 109 source changes.

Release candidate tab

Before, mobile Nightly, and empty Stable channel

Before: main @ aa95d35f, 1440 px, light; no release-tab section.

Main before release tabs

After: this PR @ 0ebd90c7, Nightly at 390 px, light.

Nightly mobile

After: this PR @ 0ebd90c7, Stable at 1440 px, light; explicitly unavailable until published.

Stable channel

Integration with #611, #709 and Jordan’s #768 hero (local only)

Combined desktop light

Combined mobile dark

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.

Check Before: main @ aa95d35f After: this PR @ 0ebd90c7
Website tests 75 pass, 1 existing failure 111 pass, same 1 failure
Game-free suite 509 pass, 14 fail, 70 skip 510 pass, same 14 fail, 70 skip
Live release collection No release-tab collector 15 API calls, 2.699 seconds in one observation; Nightly 1/1, RC 50/109, Stable empty
Large-range fixture No release-tab collector 100,000 counted changes, only 50 commit records displayed; two bounded range requests

The 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.

Flag What it is Before this PR After this PR Effect Helps / doesn't help / untested Recommendation
Website enable-email-notifications Forgejo workflow failure emails true false One issue records an outage instead of repeat hourly emails Incident ownership/lifecycle tested with fake APIs; real Actions rollout pending Disabled; use the authenticated incident and Actions log

Testing

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: #ffe100 on #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:

  • Forgejo Actions and Cloudflare production, by hand after approved rollout: publish a test-approved release, inspect the main refresh, exercise one controlled refresh failure and recovery, expecting a single incident owned by the authenticated Actions account, an updated timestamp, and closure only after successful deployment. Resolve existing publication blockers before deployment.

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 /user identity; 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

  • One topic.
  • The title is a Conventional Commit (type(scope): description) of the status line's type.
  • Why gives the reason plainly and links the issues that fit (the tracker searched).
  • Measurements has a verdict, or one line saying why there is nothing to measure.
  • Testing names what was tested, what wasn't, and what must still be tested, where and how.
  • Rebased on current main.
  • python -I -B tests/run_all.py passes (any failure that also fails on main is named).
  • No game files, dumps, build output or generated files.
  • third_party/ untouched (a new folder with a PROVENANCE.md instead).
  • The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled.

When it applies

  • AI assistance recorded with Assisted-by: trailers.
  • A check under tests/ that reads changed source updated in this PR, not weakened.
  • Before/after screenshots attached with named commits and viewport/theme information.
  • Docs updated.
**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](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/638#issuecomment-24095). ## 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. - Bound each source summary to the newest **50 commits**, with the **full change count** and Compare source link. Forgejo’s paginated commits endpoint excludes the baseline’s ancestry using `not`; no unbounded compare request is made. The RC panel currently displays 50 of 109 changes, explicitly labelled. - A failed channel shows an unavailable panel while other channels remain usable. A complete release collection outage produces a valid unavailable snapshot instead of stopping website publication. Malformed output is still rejected; unrelated publication guards remain in place. - Without an earlier stable, RC compares with the previous RC and Nightly with the previous Nightly. Nightly pruning cannot change an RC baseline. Tag resolution and baseline-ancestry validation remain required. - Highlight selection prefers features, fixes and performance changes. Exact-SHA editorial keys are checked against real repository commits; unknown or out-of-window keys produce explicit warnings. Retired the three inactive entries. Remaining branded immutable subjects get neutral display text with their source link preserved. - Refresh incidents must match the authenticated Actions user ID **and** the marker. A forged marker cannot suppress failures or receive recovery edits; an unverifiable identity causes no writes. - Disable Website’s repeated failure emails in favor of one incident per outage. Unrelated label events use their own concurrency group, preserving queued previews. Main-only deployment and the fork-preview approval gate are unchanged. Release’s existing failure-email setting remains. - Tab selections update the URL hash; deep links and keyboard navigation work. Removed duplicate mobile CSS. ## Screenshots After: this PR @ `0ebd90c7`, Release candidate at 1440 px, light. The current RC shows the newest 50 of 109 source changes. ![Release candidate tab](https://git.magicbean.dev/attachments/4fa77026-03a9-4768-b5fc-a9b32279d6e3) <details><summary>Before, mobile Nightly, and empty Stable channel</summary> Before: main @ `aa95d35f`, 1440 px, light; no release-tab section. ![Main before release tabs](https://git.magicbean.dev/attachments/d57da974-7667-4fce-b85a-fae7ee631f63) After: this PR @ `0ebd90c7`, Nightly at 390 px, light. ![Nightly mobile](https://git.magicbean.dev/attachments/a0ba541a-72c3-4b41-b78d-b830bcc0a9fe) After: this PR @ `0ebd90c7`, Stable at 1440 px, light; explicitly unavailable until published. ![Stable channel](https://git.magicbean.dev/attachments/d5f8f993-48d9-4791-8f29-0cfba66ada37) </details> <details><summary>Integration with #611, #709 and Jordan’s #768 hero (local only)</summary> ![Combined desktop light](https://git.magicbean.dev/attachments/36ddfab2-5238-4dd6-b624-3090b3955833) ![Combined mobile dark](https://git.magicbean.dev/attachments/ffe73e89-cf3e-4e3a-862e-2155ff644d73) </details> 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. | Check | Before: main @ aa95d35f | After: this PR @ 0ebd90c7 | |---|---|---| | Website tests | 75 pass, 1 existing failure | 111 pass, same 1 failure | | Game-free suite | 509 pass, 14 fail, 70 skip | 510 pass, same 14 fail, 70 skip | | Live release collection | No release-tab collector | 15 API calls, 2.699 seconds in one observation; Nightly 1/1, RC 50/109, Stable empty | | Large-range fixture | No release-tab collector | 100,000 counted changes, only 50 commit records displayed; two bounded range requests | The 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. | Flag | What it is | Before this PR | After this PR | Effect | Helps / doesn't help / untested | Recommendation | |---|---|---|---|---|---|---| | Website `enable-email-notifications` | Forgejo workflow failure emails | true | false | One issue records an outage instead of repeat hourly emails | Incident ownership/lifecycle tested with fake APIs; real Actions rollout pending | Disabled; use the authenticated incident and Actions log | ## Testing **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: `#ffe100` on `#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:** - Forgejo Actions and Cloudflare production, by hand after approved rollout: publish a test-approved release, inspect the main refresh, exercise one controlled refresh failure and recovery, expecting a single incident owned by the authenticated Actions account, an updated timestamp, and closure only after successful deployment. Resolve existing publication blockers before deployment. ## 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 `/user` identity; 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 - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`) of the status line's type. - [x] Why gives the reason plainly and links the issues that fit (the tracker searched). - [x] Measurements has a verdict, or one line saying why there is nothing to measure. - [x] Testing names what was tested, what wasn't, and what must still be tested, where and how. - [x] Rebased on current `main`. - [x] `python -I -B tests/run_all.py` passes (any failure that also fails on `main` is named). - [x] No game files, dumps, build output or generated files. - [x] `third_party/` untouched (a new folder with a `PROVENANCE.md` instead). - [x] The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled. ### When it applies - [x] AI assistance recorded with `Assisted-by:` trailers. - [x] A check under `tests/` that reads changed source updated in this PR, not weakened. - [x] Before/after screenshots attached with named commits and viewport/theme information. - [x] Docs updated.
Assisted-by: Codex (OpenAI)
Assisted-by: Codex (OpenAI)
Assisted-by: Codex (OpenAI)
Assisted-by: Codex (OpenAI)
Assisted-by: Codex (OpenAI)
Render maintained menu code with bundled fonts and deterministic UI-only state; record capture and reviewed sources separately. Share the image with the settings guide and validate site paths containing spaces.

Assisted-by: Codex (OpenAI)
Assisted-by: Codex (OpenAI)
Assisted-by: Codex (OpenAI)
Add real-view captures for Manage saves, game file selection and import confirmation with isolated synthetic state. Keep capture dependencies and source review in the screenshot manifest, and verify image links and transfer-step placement.

Assisted-by: Codex (OpenAI)
Stage and fingerprint the Launcher statistics opt-out and explicit NuGet configuration. Recapture neutral example paths, guard fixture ownership, document contributor review, restore Frizti, and retain main's complete HDR wording. Review the settings image against rebased menu sources.

Assisted-by: Codex (OpenAI)
docs(settings): refresh the development menu example
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 6s
CI / Workflow lint (actionlint) (pull_request) Successful in 9s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 8s
Third-party parts / As their notes say (pull_request) Successful in 9s
PR description / Description follows the template (pull_request_target) Successful in 4s
f035bbd54f
Recapture the real menu after main changed the output-resolution label to reduced. Record current capture provenance and label the guide image as an illustrative development build.

Assisted-by: Codex (OpenAI)
docs(guides): simplify instructions and align save transfers
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 5s
CI / Workflow lint (actionlint) (pull_request) Successful in 8s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 11s
Third-party parts / As their notes say (pull_request) Successful in 14s
PR description / Description follows the template (pull_request_target) Successful in 4s
Website / Website on Cloudflare (pull_request_target) Successful in 1m11s
d7c62a39d4
Shorten launcher guide copy, make screenshots the full-size links, and align transfer steps and captions with the article. Repair the stale Audio output restart test without weakening its assertion.

Assisted-by: Codex (OpenAI)
docs(guides): review screenshots against current main and simplify mobile navigation
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 3s
CI / Workflow lint (actionlint) (pull_request) Successful in 5s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 5s
Third-party parts / As their notes say (pull_request) Successful in 6s
PR description / Description follows the template (pull_request_target) Successful in 3s
Website / Website on Cloudflare (pull_request_target) Successful in 1m55s
b905befe78
Integrate main cf605c85 and record why all nine changed menu dependencies leave the retained Graphics capture accurate. Preserve capture provenance. Keep one mobile hamburger per page and remove the duplicate Menu row.

Assisted-by: Codex (OpenAI)
fix(website): unify mobile hamburger styling
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 3s
CI / Workflow lint (actionlint) (pull_request) Successful in 5s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 6s
Third-party parts / As their notes say (pull_request) Successful in 10s
PR description / Description follows the template (pull_request_target) Successful in 3s
Website / Website on Cloudflare (pull_request_target) Has been skipped
31a18758e3
Use Starlight icons and shared button styles for home and guide navigation, including light/dark and expanded states.

Assisted-by: Codex (OpenAI)
docs(install): restore Linux launcher permission step
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Successful in 6s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 6s
beanstalk/approval awaiting maintainer approval
Third-party parts / As their notes say (pull_request) Successful in 9s
PR description / Description follows the template (pull_request_target) Failing after 5s
b792d80516
Restore the AppImage executable-permission instruction before Build and link the platform setup guides.

Assisted-by: OpenAI Codex
docs(guides): refresh captures from current menu and launcher
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Successful in 9s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 11s
Third-party parts / As their notes say (pull_request) Successful in 15s
PR description / Description follows the template (pull_request_target) Failing after 7s
beanstalk/approval Test farm not requested
e4627be1ee
Integrate main b2911d33, regenerate seven UI-only screenshots, record capture provenance and refresh version-specific guidance. Support registered menu text fields in the website catalogue and neutralize the new item name reported in issue 584.

Assisted-by: OpenAI Codex
Integrate main e9bed614. Record the Graphics source review and new threaded-rendering dependency while retaining original capture provenance. Update the restart-list regression and distinguish installed and portable Windows backup locations.

Assisted-by: GPT-6 Astra

Co-Authored-By: GPT-6 Astra <[email protected]>
docs(guides): integrate final main snapshot for review
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 5s
CI / Workflow lint (actionlint) (pull_request) Successful in 10s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 12s
Third-party parts / As their notes say (pull_request) Successful in 14s
PR description / Description follows the template (pull_request_target) Successful in 6s
a0a93f11fe
Integrate main 2b1d38c6 and record that all 59 menu inputs and the capture helpers still match the reviewed sources. Keep original image provenance unchanged.

Assisted-by: GPT-6 Astra

Co-Authored-By: GPT-6 Astra <[email protected]>
Add responsive artwork, clearer release metadata and a shared download shell. Keep publication and source guards intact.

Assisted-by: OpenAI Codex

Co-Authored-By: OpenAI Codex <[email protected]>
Merge bibiburl/docs/guide-screenshots at a0a93f11, preserving its seven original UI images, provenance, source guards, save instructions and matching navigation controls.

Assisted-by: OpenAI Codex

Co-Authored-By: OpenAI Codex <[email protected]>
fix(website): refresh progress filters after native reset
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 12s
CI / Workflow lint (actionlint) (pull_request) Successful in 18s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 20s
Third-party parts / As their notes say (pull_request) Successful in 29s
PR description / Description follows the template (pull_request_target) Successful in 15s
Website / Website on Cloudflare (pull_request_target) Has been skipped
18e1efcd1a
Handle change-only selection events and defer reset rendering until the browser has restored the form values.

Assisted-by: OpenAI Codex

Co-Authored-By: OpenAI Codex <[email protected]>
fix(website): make guide tables and code keyboard accessible
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 5s
CI / Workflow lint (actionlint) (pull_request) Successful in 9s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 9s
Third-party parts / As their notes say (pull_request) Successful in 10s
PR description / Description follows the template (pull_request_target) Failing after 16s
02f0299c73
Name the guide table columns and keep horizontal scroll surfaces keyboard reachable without client JavaScript. Preserve table semantics and show focus clearly.

Assisted-by: Codex (OpenAI)
docs(website): add a theme-aware trails hero
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Successful in 6s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 6s
Third-party parts / As their notes say (pull_request) Successful in 9s
Website / Website on Cloudflare (pull_request_target) Has been skipped
PR description / Description follows the template (pull_request_target) Failing after 4s
a826af4c0e
Introduce the agreed full-width Longshot hero with original SVG trails, shared primary button styling and light/dark palettes. Preserve the prerequisite launcher guidance, responsive branding and accessible fairy interaction.

Assisted-by: Codex (OpenAI)
feat(website): show latest build and release changes
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request_target) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 3s
CI / Workflow lint (actionlint) (pull_request) Successful in 6s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 5s
PR description / Description follows the template (pull_request_target) Successful in 5s
Third-party parts / As their notes say (pull_request) Successful in 9s
6f72040e19
Add a theme-aware release summary with exact published commit ranges, reviewed highlights and a complete source-change disclosure. Keep launcher versions separate and reject incomplete release metadata before publication.

Assisted-by: Codex (OpenAI)
Author
Member

Superseded screenshots — earlier version without tabs. The current Nightly / Release candidate / Stable design is shown directly in the main PR description. These images are retained only as historical comparison.

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 — dark release section

After: this PR @ 6f72040e — light section:
After: this PR @ 6f72040e — light release 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.

> **Superseded screenshots — earlier version without tabs.** The current Nightly / Release candidate / Stable design is shown directly in [the main PR description](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/638). These images are retained only as historical comparison. 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 — dark release section](https://git.magicbean.dev/attachments/5b24f04a-d71f-49c3-8fcd-920d55782cca) After: this PR @ 6f72040e — light section: ![After: this PR @ 6f72040e — light release section](https://git.magicbean.dev/attachments/d817b371-fdfa-4a7b-b85d-0be9b936187a) Full-resolution homepage comparisons: - [Before: #634 @ a826af4c — dark](https://git.magicbean.dev/attachments/083700bc-3d33-4f56-bacf-10a94c2c0181) - [After: this PR @ 6f72040e — dark](https://git.magicbean.dev/attachments/9a3394fa-cd0f-445f-bf4d-ca72a3179ea8) - [Before: #634 @ a826af4c — light](https://git.magicbean.dev/attachments/31a4bec6-2e29-4feb-a8cf-d9508c78800c) - [After: this PR @ 6f72040e — light](https://git.magicbean.dev/attachments/6cc86438-1d23-46ba-b7c9-f74fe5cd697f) Additional after views: - [Dark mobile, 390px](https://git.magicbean.dev/attachments/0481cdf8-3bc7-4964-aae6-b028144d4bf0) - [Light mobile, 390px](https://git.magicbean.dev/attachments/2b76756b-68df-4929-b4ca-7e2acaa2a140) - [All six source changes expanded with the keyboard](https://git.magicbean.dev/attachments/67db90a8-727f-4ce9-bf97-00fb8273b42f) 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.**
Author
Member

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.

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.
feat(website): add nightly, release candidate and stable tabs
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 5s
CI / Workflow lint (actionlint) (pull_request) Successful in 6s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 6s
Third-party parts / As their notes say (pull_request) Successful in 9s
PR description / Description follows the template (pull_request_target) Successful in 3s
6fc80620db
Collect an independent release comparison for each channel, identify RCs explicitly, and retain useful empty states. Add keyboard-accessible tabs with a readable no-script fallback and show the snapshot time in UTC.

Assisted-by: Codex (OpenAI)
Author
Member

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.

After: 6fc80620 — Nightly, dark
After: 6fc80620 — Release candidate, light
After: 6fc80620 — Stable empty state, dark

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.

Updated first attempt: **Nightly / Release candidate / Stable tabs**, with an explicit Release candidate badge. After: this PR @ `6fc80620`; [before: first attempt @ 6f72040e](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/638#issuecomment-21684). 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. ![After: 6fc80620 — Nightly, dark](https://git.magicbean.dev/attachments/265307c7-5df3-44e3-8fd9-9d6c0eaf06a1) ![After: 6fc80620 — Release candidate, light](https://git.magicbean.dev/attachments/4f236171-25e3-49bd-923c-d30a0df27346) ![After: 6fc80620 — Stable empty state, dark](https://git.magicbean.dev/attachments/5d08f1f0-0650-4bbe-80a8-7305a4c2ceb8) Other views: - [Nightly, light](https://git.magicbean.dev/attachments/954c434b-7c9d-4867-8664-d0b8695a8462) - [Release candidate, dark](https://git.magicbean.dev/attachments/9b2417a2-f53a-4704-9432-8669a3ff308b) - [Stable, light](https://git.magicbean.dev/attachments/c31d6e84-47fa-47f7-9e20-58e909588a1e) - [Release candidate on mobile, dark](https://git.magicbean.dev/attachments/cc592b25-6249-475e-b9d8-85534146c8ac) - [Stable on mobile, light](https://git.magicbean.dev/attachments/2686a465-45e5-4645-a71d-dfcab4c4309f) - [Full homepage, dark](https://git.magicbean.dev/attachments/0c4a709c-97c3-4e8c-92f8-c4b5f759cd69) - [Full homepage, light](https://git.magicbean.dev/attachments/5cb93709-ffa9-4cf9-9f5b-ce642d8b6fca) 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.**
Author
Member

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.

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.
feat(website): refresh release tabs after publication
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 2s
CI / Workflow lint (actionlint) (pull_request) Failing after 5s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 5s
Third-party parts / As their notes say (pull_request) Successful in 8s
PR description / Description follows the template (pull_request_target) Failing after 19s
a134608098
Dispatch the website from completed releases, retain the hourly fallback, and report production failures with a single incident issue that closes on recovery.

Assisted-by: Codex (OpenAI)
bibiburl changed title from WIP: feat(website): show latest build and release changes to WIP: feat(website): browse Nightly, RC and Stable release tabs 2026-11-15 02:19:22 +00:00
Author
Member

Reframed 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.

Reframed 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.
Author
Member

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.

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.
Author
Member

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.

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.
Author
Member

Confirmed #264 merged at d7aeaa26 on 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.

Confirmed #264 merged at d7aeaa26 on 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.
bibiburl changed title from WIP: feat(website): browse Nightly, RC and Stable release tabs to feat(website): browse Nightly, RC and Stable release tabs 2026-11-15 04:41:48 +00:00
Author
Member

Marked 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.

Marked 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.
madebyjordan requested changes 2026-11-15 11:01:48 +00:00
Dismissed
madebyjordan left a comment

Reviewed at a1346080 (only this PR's three commits on top of #634). The workflow side is sound:

  • Untrusted code can't reach the dispatch or the incident reporter. Release dispatches only after a push-triggered publish, and the report step is skipped whenever IS_PR.
  • Production now always deploys main.

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

  1. The nightly comparison will stop every production deploy.

    • Once a stable exists, a nightly's baseline is that stable, and the range grows with every merge.
    • Forgejo's compare endpoint slows with it, timed live: 300 commits took 15 s, 819 took 30.4 s, and 2,261 took 50 s and returned 7 MB. The timeout is 30 s × 3 attempts (progress-request.ts:16).
    • After that, buildReleaseSummary returns null and check-site.ts (~61–70) fails, so nothing deploys: not the hourly refresh, not a website fix. Same-repo PR previews fail too.
    • At main's pace, that's one to two weeks after the first stable.
    • Fix: cap or paginate the range (the count plus a Compare link), and let a failed channel degrade its own panel instead of failing the build.
  2. 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:

    • real failures never open an incident;
    • the next successful deploy uses the job token to comment on that stranger's issue and close it.

    Match on the poster (the Actions user) or a label.

Should fix

  1. The baseline depends on which nightlies are still unpruned (release-summary.ts:39). With no stable, a prerelease compares against older[0], the previous build of any channel, and Release keeps only 5 nightlies.

    • rc.4 compares against rc.3 today only because the nightlies before it were pruned; when it was new, its baseline was a nightly.
    • If an rc is tagged on a commit older than a nightly published before it, the ancestry check (:172) throws and (1) follows.

    Comparing an rc with the previous rc avoids both.

  2. Curated highlights mostly don't show.

    • Three of the six keys in release-highlights.json (a1f0c539, 4b9fad06, fabcd2c0) are in no visible range today, and a nightly highlight is visible for about an hour.
    • Nothing checks that a key is a real commit, so a typo is silently ignored.
    • Without curation the newest three commits of any type show, so the live nightly headline is a chore(agents) commit. Prefer feat/fix/perf.
  3. A commit subject can't be edited, and check-site.ts:64 applies the branding check to subjects. publicGameText leaves 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.

  4. In website.yml:

    • Line 25: failure emails go out on every failed scheduled run, so (1) means 24 a day.
    • Label events (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.
  5. Smaller points:

    • ReleaseSummary.astro ~162–174 repeats the base rules inside the 30rem query.
    • tests/test_website_refresh.py only checks the YAML for substrings.
    • Clicking a tab doesn't update the hash, so a chosen channel can't be shared once JavaScript is on.

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.

Reviewed at a1346080 (only this PR's three commits on top of #634). The workflow side is sound: - Untrusted code can't reach the dispatch or the incident reporter. Release dispatches only after a push-triggered publish, and the report step is skipped whenever `IS_PR`. - Production now always deploys main. 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** 1. **The nightly comparison will stop every production deploy.** - Once a stable exists, a nightly's baseline is that stable, and the range grows with every merge. - Forgejo's compare endpoint slows with it, timed live: 300 commits took 15 s, 819 took 30.4 s, and 2,261 took 50 s and returned 7 MB. The timeout is 30 s × 3 attempts (`progress-request.ts:16`). - After that, `buildReleaseSummary` returns null and `check-site.ts` (~61–70) fails, so nothing deploys: not the hourly refresh, not a website fix. Same-repo PR previews fail too. - At main's pace, that's one to two weeks after the first stable. - Fix: cap or paginate the range (the count plus a Compare link), and let a failed channel degrade its own panel instead of failing the build. 2. **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: - real failures never open an incident; - the next successful deploy uses the job token to comment on that stranger's issue and close it. Match on the poster (the Actions user) or a label. **Should fix** 3. **The baseline depends on which nightlies are still unpruned** (`release-summary.ts:39`). With no stable, a prerelease compares against `older[0]`, the previous build of any channel, and Release keeps only 5 nightlies. - rc.4 compares against rc.3 today only because the nightlies before it were pruned; when it was new, its baseline was a nightly. - If an rc is tagged on a commit older than a nightly published before it, the ancestry check (`:172`) throws and (1) follows. Comparing an rc with the previous rc avoids both. 4. **Curated highlights mostly don't show.** - Three of the six keys in `release-highlights.json` (a1f0c539, 4b9fad06, fabcd2c0) are in no visible range today, and a nightly highlight is visible for about an hour. - Nothing checks that a key is a real commit, so a typo is silently ignored. - Without curation the newest three commits of any type show, so the live nightly headline is a `chore(agents)` commit. Prefer feat/fix/perf. 5. A commit subject can't be edited, and `check-site.ts:64` applies the branding check to subjects. `publicGameText` leaves 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. 6. In `website.yml`: - Line 25: failure emails go out on every failed scheduled run, so (1) means 24 a day. - Label events (`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. 7. Smaller points: - `ReleaseSummary.astro` ~162–174 repeats the base rules inside the 30rem query. - `tests/test_website_refresh.py` only checks the YAML for substrings. - Clicking a tab doesn't update the hash, so a chosen channel can't be shared once JavaScript is on. 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.*
bibiburl force-pushed docs/release-summary from a134608098
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 2s
CI / Workflow lint (actionlint) (pull_request) Failing after 5s
Guide screenshots / Guide images and local UI source review (pull_request) Successful in 5s
Third-party parts / As their notes say (pull_request) Successful in 8s
PR description / Description follows the template (pull_request_target) Failing after 19s
to 0ebd90c776
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Failing after 7s
Guide screenshots / Guide images and local UI source review (pull_request) Failing after 6s
Third-party parts / As their notes say (pull_request) Successful in 8s
PR description / Description follows the template (pull_request_target) Successful in 3s
Website / Website on Cloudflare (pull_request_target) Has been skipped
2026-11-15 12:24:56 +00:00
Compare
Author
Member

Updated review screenshots for 0ebd90c7. The main description will use these current images. Before images are main aa95d35f. Individual after images show only this PR; combined images are a local integration of #611, #638, #709 and #768, not a deployed site.

638-before-main-home

638-after-rc

638-after-nightly-mobile

638-after-stable

combined-home-1440-light

combined-home-390-dark

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.

Updated review screenshots for `0ebd90c7`. The main description will use these current images. Before images are main `aa95d35f`. Individual after images show only this PR; combined images are a local integration of #611, #638, #709 and #768, not a deployed site. ![638-before-main-home](https://git.magicbean.dev/attachments/d57da974-7667-4fce-b85a-fae7ee631f63) ![638-after-rc](https://git.magicbean.dev/attachments/4fa77026-03a9-4768-b5fc-a9b32279d6e3) ![638-after-nightly-mobile](https://git.magicbean.dev/attachments/a0ba541a-72c3-4b41-b78d-b830bcc0a9fe) ![638-after-stable](https://git.magicbean.dev/attachments/d5f8f993-48d9-4791-8f29-0cfba66ada37) ![combined-home-1440-light](https://git.magicbean.dev/attachments/36ddfab2-5238-4dd6-b624-3090b3955833) ![combined-home-390-dark](https://git.magicbean.dev/attachments/ffe73e89-cf3e-4e3a-862e-2155ff644d73) 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.
Author
Member

Addressed Jordan’s review in 0ebd90c7, rebased directly onto main aa95d35f with 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.

Addressed Jordan’s review in 0ebd90c7, rebased directly onto main aa95d35f with 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.
madebyjordan left a comment

Re-checked at 0ebd90c7. Points 1–6 are fixed:

  • The comparison is bounded: a live build makes 15 API calls in 3.5 s, and a 2,056-commit range takes 0.93 s with an exact count.
  • A failed channel shows "unavailable" without failing the build.
  • RC baselines no longer depend on pruning.
  • Highlights prefer feat/fix/perf and skip unknown commits.
  • Branded subjects are neutralised.

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 /user answers id: -2 (Forgejo's models/user/user_system.go, services/auth/method/action_task_token.go). The new check identity.id < 1 throws 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 returns id: 42 (refresh-report.test.ts:12). Accepting the Actions user (id === -2, login forgejo-actions) keeps the protection, because other accounts still can't post as it. A mock with id: -2 would catch it.

Small notes, not blocking:

  • github.run_id is empty when Forgejo evaluates concurrency, so every unrelated-label run shares website-ignored-. That's harmless, since the job is skipped and nothing is cancelled, but the ignored-42 case in test_website_refresh.py:73 checks something that can't happen.
  • release.yml:27 adds enable-email-notifications: true, which turns on failure emails for the whole Release workflow. If that's intended, worth saying so in the description.
  • If collection fails as a whole (repository or release list), a deploy now succeeds and shows every tab as unavailable until the next run. That's fine once the reporter works; today nothing would say so.

Review drafted with Claude Code and checked by Jordan.

Re-checked at 0ebd90c7. Points 1–6 are fixed: - The comparison is bounded: a live build makes 15 API calls in 3.5 s, and a 2,056-commit range takes 0.93 s with an exact count. - A failed channel shows "unavailable" without failing the build. - RC baselines no longer depend on pruning. - Highlights prefer feat/fix/perf and skip unknown commits. - Branded subjects are neutralised. 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 /user` answers `id: -2` (Forgejo's `models/user/user_system.go`, `services/auth/method/action_task_token.go`). The new check `identity.id < 1` throws 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 returns `id: 42` (`refresh-report.test.ts:12`). Accepting the Actions user (`id === -2`, login `forgejo-actions`) keeps the protection, because other accounts still can't post as it. A mock with `id: -2` would catch it. Small notes, not blocking: - `github.run_id` is empty when Forgejo evaluates `concurrency`, so every unrelated-label run shares `website-ignored-`. That's harmless, since the job is skipped and nothing is cancelled, but the `ignored-42` case in `test_website_refresh.py:73` checks something that can't happen. - `release.yml:27` adds `enable-email-notifications: true`, which turns on failure emails for the whole Release workflow. If that's intended, worth saying so in the description. - If collection fails as a whole (repository or release list), a deploy now succeeds and shows every tab as unavailable until the next run. That's fine once the reporter works; today nothing would say so. *Review drafted with Claude Code and checked by Jordan.*
HumanBean force-pushed docs/release-summary from 0ebd90c776
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Failing after 7s
Guide screenshots / Guide images and local UI source review (pull_request) Failing after 6s
Third-party parts / As their notes say (pull_request) Successful in 8s
PR description / Description follows the template (pull_request_target) Successful in 3s
Website / Website on Cloudflare (pull_request_target) Has been skipped
to 733f20c345
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
PR description / Description follows the template (pull_request_target) Successful in 3s
CI / Conventional Commit title (pull_request) Successful in 3s
CI / Workflow lint (actionlint) (pull_request) Failing after 4s
Guide screenshots / Guide images and local UI source review (pull_request) Failing after 5s
Third-party parts / As their notes say (pull_request) Successful in 8s
2026-11-15 18:48:30 +00:00
Compare
Owner

Rebased onto main @ 7bacf846. One conflict in website/scripts/check-site.ts (the release-summary.ts import next to main's public-copy.ts import): 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.

Rebased onto `main` @ 7bacf846. One conflict in `website/scripts/check-site.ts` (the `release-summary.ts` import next to main's `public-copy.ts` import): 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.
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
PR description / Description follows the template (pull_request_target) Successful in 3s
CI / Conventional Commit title (pull_request) Successful in 3s
CI / Workflow lint (actionlint) (pull_request) Failing after 4s
Guide screenshots / Guide images and local UI source review (pull_request) Failing after 5s
Third-party parts / As their notes say (pull_request) Successful in 8s
This pull request doesn't have enough approvals yet. 0 of 1 approvals granted.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'docs/release-summary:bibiburl-docs/release-summary'
git switch 'bibiburl-docs/release-summary'
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Longshot!638
No description provided.