chore(release): play profiles are committed in assets/profiles/, not a tools.lock archive: tools.py assemble profile removed #572

Merged
HumanBean merged 1 commit from HumanBean/Longshot:build/no-profile-tool into main 2026-11-14 20:40:56 +00:00
Owner

Why

Play profiles are now committed in the repository under assets/profiles/ and used by every build (the renderer's, in #569). The other route, a profile archive in Longshot's package store named by a profile line in tools.lock, was never used (tools.lock says "No play profile yet") and is removed so there is one route, not two.

What changed

  • release tooling: scripts/tools.py loses assemble profile (the subcommand, --work, assemble_profile(), PROFILE) and the docstring and REQUIRED comment text about an optional play profile. install, check and fetch had no special handling for a profile line, so a tools.lock without one behaves exactly as today.
  • tools.lock: the comment no longer promises a profile line ("No play profile: play profiles are committed in assets/profiles/, not tools here."). Every tool line is byte-identical.
  • CI: .forgejo/workflows/build-linux.yml drops the "Play profile" step, which installed tools.lock's profile tool into work/ when there was one (there never was, so the step only ever printed and exited).
  • docs: RELEASING.md (Bump a tool: the assemble profile command and its note; One-time setup step 6), docs/releases.md (tools.lock section) and docs/development.md (Build times, "No hot pieces") now say play profiles are committed in assets/profiles/, not a tool.
  • checks: tests/test_tools_lock.py: test_the_profile (tested the removed assemble_profile) is replaced by test_no_play_profile_is_a_tool (tools.py has no assemble_profile/PROFILE and no "profile"/assemble profile text, assemble profile is refused, tools.lock has no profile line, and build-linux.yml installs none). The write_line append case in test_a_line_is_replaced_in_place uses a made-up zlib tool instead of profile, so it still checks that a new line is appended. The PROFILE assertion in test_check_requires_every_tool is gone; the "profile is not in REQUIRED" one stays.

Left on purpose: a checkout's own work/ files (hot_funcs.txt, hot_order.txt, longshot_pieces.prof) stay the developer route: nx2/make_game.py copies them and scripts/linux/appimage.sh carries them when they are there. The game-side hot list and profile are parked (#505); when they come back they go in assets/profiles/ too. docs/design.md's pipeline diagram ("-O2 with the play profile") describes that developer route and is unchanged. History docs are unchanged.

Flags and settings

None.

Measurements

None apply: this changes no player-facing behaviour. It touches a release script, a CI step that never did anything (no profile line has ever been in tools.lock), the docs and a check. The game doesn't run any of it, so it is measured by its game-free checks (AGENTS.md), which CI runs.

main: 7ff5256e (2026-11-14)
this PR: build/no-profile-tool @ 7c786e09

main @ 7ff5256e this PR @ 7c786e09
game-free checks (tests/run_all.py, CI) not run here not run here: left to CI

Testing

Tested: nothing was run on this PC: the checks are left to CI.

Not tested: the release workflow end to end. It is unaffected: tools.py check --require never required a profile, and the removed CI step exited early on every run because tools.lock had no profile line.

Needs other testers: None

Screenshots

Nothing on screen.

Risk and rollback

Low. Anyone with a local script that runs tools.py assemble profile now gets an argparse error. Reverting the commit brings the route back.

Reviewer notes

Start with scripts/tools.py and the new test_no_play_profile_is_a_tool in tests/test_tools_lock.py. #569 adds the committed profiles and a "step 0" about them in RELEASING.md's "A release candidate", which this PR leaves alone.

Issues

See #505

Checklist

For everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description).
  • Rebased on current main.
  • python -I -B tests/run_all.py run and passing (any failure that also fails on main is named above). (not run here: left to CI)
  • Tested in the game, or what wasn't is named under Testing.
  • Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests).
  • Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. (the game doesn't run this change, so its game-free checks measure it: unticked until CI passes)
  • 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.

If applicable

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • A check under tests/ that reads changed source updated in this PR, not weakened.
  • Docs updated.

🤖 Generated with Claude Code

## Why Play profiles are now committed in the repository under `assets/profiles/` and used by every build (the renderer's, in https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/569). The other route, a profile archive in Longshot's package store named by a `profile` line in `tools.lock`, was never used (`tools.lock` says "No play profile yet") and is removed so there is one route, not two. ## What changed - release tooling: `scripts/tools.py` loses `assemble profile` (the subcommand, `--work`, `assemble_profile()`, `PROFILE`) and the docstring and `REQUIRED` comment text about an optional play profile. `install`, `check` and `fetch` had no special handling for a `profile` line, so a `tools.lock` without one behaves exactly as today. - `tools.lock`: the comment no longer promises a profile line ("No play profile: play profiles are committed in assets/profiles/, not tools here."). Every tool line is byte-identical. - CI: `.forgejo/workflows/build-linux.yml` drops the "Play profile" step, which installed `tools.lock`'s `profile` tool into `work/` when there was one (there never was, so the step only ever printed and exited). - docs: `RELEASING.md` (Bump a tool: the `assemble profile` command and its note; One-time setup step 6), `docs/releases.md` (tools.lock section) and `docs/development.md` (Build times, "No hot pieces") now say play profiles are committed in `assets/profiles/`, not a tool. - checks: `tests/test_tools_lock.py`: `test_the_profile` (tested the removed `assemble_profile`) is replaced by `test_no_play_profile_is_a_tool` (tools.py has no `assemble_profile`/`PROFILE` and no `"profile"`/`assemble profile` text, `assemble profile` is refused, `tools.lock` has no `profile` line, and build-linux.yml installs none). The `write_line` append case in `test_a_line_is_replaced_in_place` uses a made-up `zlib` tool instead of `profile`, so it still checks that a new line is appended. The `PROFILE` assertion in `test_check_requires_every_tool` is gone; the "profile is not in REQUIRED" one stays. Left on purpose: a checkout's own `work/` files (`hot_funcs.txt`, `hot_order.txt`, `longshot_pieces.prof`) stay the developer route: `nx2/make_game.py` copies them and `scripts/linux/appimage.sh` carries them when they are there. The game-side hot list and profile are parked (https://git.magicbean.dev/MagicBeanDev/Longshot/issues/505); when they come back they go in `assets/profiles/` too. `docs/design.md`'s pipeline diagram ("-O2 with the play profile") describes that developer route and is unchanged. History docs are unchanged. ## Flags and settings None. ## Measurements None apply: this changes no player-facing behaviour. It touches a release script, a CI step that never did anything (no `profile` line has ever been in `tools.lock`), the docs and a check. The game doesn't run any of it, so it is measured by its game-free checks (AGENTS.md), which CI runs. main: 7ff5256e (2026-11-14) this PR: build/no-profile-tool @ 7c786e09 | | main @ 7ff5256e | this PR @ 7c786e09 | |---|---|---| | game-free checks (`tests/run_all.py`, CI) | not run here | not run here: left to CI | ## Testing **Tested:** nothing was run on this PC: the checks are left to CI. **Not tested:** the release workflow end to end. It is unaffected: `tools.py check --require` never required a profile, and the removed CI step exited early on every run because `tools.lock` had no `profile` line. **Needs other testers:** None ## Screenshots Nothing on screen. ## Risk and rollback Low. Anyone with a local script that runs `tools.py assemble profile` now gets an argparse error. Reverting the commit brings the route back. ## Reviewer notes Start with `scripts/tools.py` and the new `test_no_play_profile_is_a_tool` in `tests/test_tools_lock.py`. https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/569 adds the committed profiles and a "step 0" about them in RELEASING.md's "A release candidate", which this PR leaves alone. ## Issues See https://git.magicbean.dev/MagicBeanDev/Longshot/issues/505 ## Checklist ### For everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`). - [x] Rebased on current `main`. - [ ] `python -I -B tests/run_all.py` run and passing (any failure that also fails on `main` is named above). (not run here: left to CI) - [x] Tested in the game, or what wasn't is named under Testing. - [x] Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests). - [ ] Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. (the game doesn't run this change, so its game-free checks measure it: unticked until CI passes) - [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. ### If applicable - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] A check under `tests/` that reads changed source updated in this PR, not weakened. - [x] Docs updated. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chore(release): play profiles are committed in assets/profiles/, not a tools.lock archive: tools.py assemble profile removed
Some checks are pending
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
beanstalk/approval awaiting maintainer approval
CI / Conventional Commit title (pull_request) Successful in 3s
CI / Workflow lint (actionlint) (pull_request) Successful in 6s
Third-party parts / As their notes say (pull_request) Successful in 8s
PR description / Description follows the template (pull_request_target) Successful in 4s
7c786e09aa
The release route for a play profile (tools.py assemble profile packing work/'s files, tools.py add, an optional
profile line in tools.lock, and build-linux.yml's step installing it) was never used and is replaced by the profiles
committed in assets/profiles/. A checkout's own work/ files stay the developer route (nx2/make_game.py,
scripts/linux/appimage.sh).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Author
Owner

Description: a Measurements table (no numbers apply; CI runs the game-free checks), and 'Needs other testers: None' in the template's form.

Description: a Measurements table (no numbers apply; CI runs the game-free checks), and 'Needs other testers: None' in the template's form.
Author
Owner

Description: the Measurements section names main and this PR's commits.

Description: the Measurements section names main and this PR's commits.
HumanBean force-pushed build/no-profile-tool from 7c786e09aa
Some checks are pending
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
beanstalk/approval awaiting maintainer approval
CI / Conventional Commit title (pull_request) Successful in 3s
CI / Workflow lint (actionlint) (pull_request) Successful in 6s
Third-party parts / As their notes say (pull_request) Successful in 8s
PR description / Description follows the template (pull_request_target) Successful in 4s
to 4b20ef4b6e
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
beanstalk/approval awaiting maintainer approval
PR description / Description follows the template (pull_request_target) Has been cancelled
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
2026-11-14 20:22:46 +00:00
Compare
HumanBean changed title from WIP: chore(release): play profiles are committed in assets/profiles/, not a tools.lock archive: tools.py assemble profile removed to chore(release): play profiles are committed in assets/profiles/, not a tools.lock archive: tools.py assemble profile removed 2026-11-14 20:22:56 +00:00
Author
Owner

Rebased onto main 4e80ea63 (after #569 merged), no conflicts. Nothing run here.

Rebased onto main 4e80ea63 (after https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/569 merged), no conflicts. Nothing run here.
HumanBean force-pushed build/no-profile-tool from 4b20ef4b6e
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
beanstalk/approval awaiting maintainer approval
PR description / Description follows the template (pull_request_target) Has been cancelled
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
to a15a7a021b
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
PR description / Description follows the template (pull_request_target) Failing after 16s
CI / Conventional Commit title (pull_request) Successful in 13s
CI / Workflow lint (actionlint) (pull_request) Successful in 20s
Third-party parts / As their notes say (pull_request) Successful in 30s
beanstalk/approval awaiting maintainer approval
2026-11-14 20:23:55 +00:00
Compare
Author
Owner

Rebased onto main 414f56e2 (after #569 and #573 merged), no conflicts. Nothing run here.

Rebased onto main 414f56e2 (after https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/569 and https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/573 merged), no conflicts. Nothing run here.
HumanBean deleted branch build/no-profile-tool 2026-11-14 20:40:56 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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!572
No description provided.