feat(dev): test a change against a base, as a pack of what it changes #147

Merged
HumanBean merged 14 commits from klimovich008/Longshot:feat/dev-packs into main 2026-11-13 15:33:23 +00:00
Contributor

Why

Testing a change in the game needed a full build per change: about 20 minutes, then the shader preparation, and a new
folder of tens of GB. This lets a change be tested as a small pack over one shared base, in seconds for a renderer-only
change and minutes for a host change. It was merged into Hookshot as https://github.com/NotRexed/Hookshot/pull/2732
(ac117196, reviewed by Joey-Magnus) after Longshot forked; this is that change with Longshot's names.

What changed

  • scripts/dev_packs.py (new): base builds a commit once (a full build, kept; --seed takes a current game folder's
    shader caches, --predict-s budgets the predicted pipelines, --language), adopt uses an existing full build as the
    base, pack builds only what a change touches and rt makes a runtime from the base with packs over it; warm runs a
    warm-up command in a base's runtime and keeps its caches; ls lists bases and packs.
    • Routing: a change to gpu/vk/ files the game is not built from builds longshot_vk.dll alone (RX_VK_ONLY);
      anything else builds the game and keeps each module whose linked objects differ from the base's (never compared by
      bytes: both carry a fingerprint of every source).
    • A shader translator change (the files nx2/build.py hashes into the stamp) or a new shader seed makes the runtime
      prepare again.
    • Guards: a pack on another base is refused; output folders may not overlap the base, the checkout or each other;
      one job per base at a time (a busy marker).
  • tests/test_dev_packs.py (new, game-free): routing, the stamp, stamped objects, caches, module_changed, link
    inputs, generated files, runtimes, guards, the predict budget, warm-up, busy marker; each rule has a broken variant
    that must fail.
  • docs/development.md: "Testing a change against a base". AGENTS.md: one line in "Make the change".
  • From Hookshot's version: only the names (longshot.exe, longshot_vk.dll, the longshot_* caches and log files,
    LONGSHOT_NO_PREPARE, LONGSHOT_KEEP_BUILD_FILES), and AGENTS.md's line moved to this repository's list.

Flags and settings

Flag What it does Default now Recommendation Helps on Doesn't help on Untested on
none new A development script. It sets existing build switches for its own builds: LONGSHOT_NO_PREPARE, LONGSHOT_KEEP_BUILD_FILES, RX_VK_ONLY, RX_RELEASE, RX_TARGET (read), RX_VK_PREDICT_S (with --predict-s) — — — — —

Measurements

A development script: nothing in the game changes, so no frame rate is compared between main and this PR (main has no
such script). Each table names what it compares. RX 9070 XT (AMD 26.10.2), Ryzen 7 5700X3D, Windows 11.

main: 839e85ff (2026-11-13)
this PR: feat/dev-packs @ 2e898648
Hardware: RX 9070 XT (AMD 26.10.2), Ryzen 7 5700X3D, 64 GB, Windows 11

Our first Longshot base, main @ 839e85ff, was built with the script at 33bb3594: compile 340 s (0 failed), 36 min in all
with the preparation (Most), 25,303 noted and 9,687 compute pipelines built, 0 missed. The PR has since merged main
d956c9ea, whose changes to nx2/make_game.py and nx2/build.py since 839e85ff are AMD FSR 4 on Linux and the progress
bar's step shares: a Windows build without --fsr, as this base was, runs the same steps.

The predicted-pipeline budget (--predict-s), on Hookshot (where the script was merged as ac117196):

Hookshot main @ 46780503, full base Hookshot main @ 46780503, --predict-s 60 base
base build 52.6 min 22 min
predicted pipelines 1,790 s 101 s
standard test, 16:9, 2 valid pairs (fps) 62.1, 65.4 65.6, 64.3

Baseline: Hookshot main @ 46780503, full base. Also measured on Hookshot: a host-only pack's game module was byte-identical to the same change's
full build apart from 2 PE header bytes.

Testing

Tested: python -I tests/test_dev_packs.py passes on this branch (Windows 11, merged with Longshot main d956c9ea).
python -I -B tests/run_all.py (llvm-mingw 20261104): 497 passed, 4 failed, 36 skipped. The 4 failures
(nx2/test_nup_paths.py, tests/test_check_third_party.py, tests/test_display_pointer.py, tests/test_release.py)
fail the same way on unmodified main d956c9ea on this PC.

In use: our first Longshot base was built with this script (dev_packs.py base, at 33bb3594) from main 839e85ff on an
RX 9070 XT / Ryzen 7 5700X3D, Windows 11: the build (compile 340 s, 0 failed) and the shader preparation (Most: 25,303
noted and 9,687 compute pipelines built, 0 missed), 36 min in all, with base.json recording the commit, the language and
the build's outputs. Packs and runtimes over it follow in our next A/B runs.

Codex's reviews (comments above) found the cache-family, recovery-marker and workflow-folder cases fixed here. At 8254a11b
they found that a base whose shader preparation fails (no usable Vulkan, a stuck driver, a game that can't start) lost its
compiled build, and that LONGSHOT_NO_PREPARE no longer skipped it: both fixed (e6f67e69, 243143a3), each with a case in
test_prepare_outcomes that fails on the code before; a sol review of 8254a11b..243143a3 found nothing more.

Not tested: a pack and a runtime over the Longshot base yet (next), and Linux.

Needs other testers:

  • Linux: base on main, then one host-only and one renderer-only pack and rt over them; the host pack should keep
    only longshot, the renderer pack only longshot_vk.so (T-PYS2).

Screenshots

Nothing on screen.

Risk and rollback

A script and its test only; nothing in the game, the builders or a release reads it. Reverting the commit removes it.
Bases, packs and runtimes are built from the game and never leave the PC (the docs section says so).

Reviewer notes

The routing (route, renderer_read_by_game) and module_changed are the parts worth reading first.

Issues

See https://github.com/NotRexed/Hookshot/pull/2732

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).
  • 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. (Not applicable: no game change; see Measurements.)
  • 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 Testing a change in the game needed a full build per change: about 20 minutes, then the shader preparation, and a new folder of tens of GB. This lets a change be tested as a small pack over one shared base, in seconds for a renderer-only change and minutes for a host change. It was merged into Hookshot as https://github.com/NotRexed/Hookshot/pull/2732 (ac117196, reviewed by Joey-Magnus) after Longshot forked; this is that change with Longshot's names. ## What changed - `scripts/dev_packs.py` (new): `base` builds a commit once (a full build, kept; `--seed` takes a current game folder's shader caches, `--predict-s` budgets the predicted pipelines, `--language`), `adopt` uses an existing full build as the base, `pack` builds only what a change touches and `rt` makes a runtime from the base with packs over it; `warm` runs a warm-up command in a base's runtime and keeps its caches; `ls` lists bases and packs. - Routing: a change to `gpu/vk/` files the game is not built from builds `longshot_vk.dll` alone (`RX_VK_ONLY`); anything else builds the game and keeps each module whose linked objects differ from the base's (never compared by bytes: both carry a fingerprint of every source). - A shader translator change (the files `nx2/build.py` hashes into the stamp) or a new shader seed makes the runtime prepare again. - Guards: a pack on another base is refused; output folders may not overlap the base, the checkout or each other; one job per base at a time (a busy marker). - `tests/test_dev_packs.py` (new, game-free): routing, the stamp, stamped objects, caches, `module_changed`, link inputs, generated files, runtimes, guards, the predict budget, warm-up, busy marker; each rule has a broken variant that must fail. - `docs/development.md`: "Testing a change against a base". `AGENTS.md`: one line in "Make the change". - From Hookshot's version: only the names (`longshot.exe`, `longshot_vk.dll`, the `longshot_*` caches and log files, `LONGSHOT_NO_PREPARE`, `LONGSHOT_KEEP_BUILD_FILES`), and AGENTS.md's line moved to this repository's list. ## Flags and settings | Flag | What it does | Default now | Recommendation | Helps on | Doesn't help on | Untested on | |---|---|---|---|---|---|---| | none new | A development script. It sets existing build switches for its own builds: `LONGSHOT_NO_PREPARE`, `LONGSHOT_KEEP_BUILD_FILES`, `RX_VK_ONLY`, `RX_RELEASE`, `RX_TARGET` (read), `RX_VK_PREDICT_S` (with `--predict-s`) | — | — | — | — | — | ## Measurements A development script: nothing in the game changes, so no frame rate is compared between main and this PR (main has no such script). Each table names what it compares. RX 9070 XT (AMD 26.10.2), Ryzen 7 5700X3D, Windows 11. main: 839e85ff (2026-11-13) this PR: feat/dev-packs @ 2e898648 Hardware: RX 9070 XT (AMD 26.10.2), Ryzen 7 5700X3D, 64 GB, Windows 11 Our first Longshot base, main @ 839e85ff, was built with the script at 33bb3594: compile 340 s (0 failed), 36 min in all with the preparation (Most), 25,303 noted and 9,687 compute pipelines built, 0 missed. The PR has since merged main d956c9ea, whose changes to nx2/make_game.py and nx2/build.py since 839e85ff are AMD FSR 4 on Linux and the progress bar's step shares: a Windows build without `--fsr`, as this base was, runs the same steps. The predicted-pipeline budget (`--predict-s`), on Hookshot (where the script was merged as ac117196): | | Hookshot main @ 46780503, full base | Hookshot main @ 46780503, `--predict-s 60` base | |---|---|---| | base build | 52.6 min | 22 min | | predicted pipelines | 1,790 s | 101 s | | standard test, 16:9, 2 valid pairs (fps) | 62.1, 65.4 | 65.6, 64.3 | Baseline: Hookshot main @ 46780503, full base. Also measured on Hookshot: a host-only pack's game module was byte-identical to the same change's full build apart from 2 PE header bytes. ## Testing **Tested:** `python -I tests/test_dev_packs.py` passes on this branch (Windows 11, merged with Longshot main d956c9ea). `python -I -B tests/run_all.py` (llvm-mingw 20261104): 497 passed, 4 failed, 36 skipped. The 4 failures (`nx2/test_nup_paths.py`, `tests/test_check_third_party.py`, `tests/test_display_pointer.py`, `tests/test_release.py`) fail the same way on unmodified main d956c9ea on this PC. In use: our first Longshot base was built with this script (`dev_packs.py base`, at 33bb3594) from main 839e85ff on an RX 9070 XT / Ryzen 7 5700X3D, Windows 11: the build (compile 340 s, 0 failed) and the shader preparation (Most: 25,303 noted and 9,687 compute pipelines built, 0 missed), 36 min in all, with `base.json` recording the commit, the language and the build's outputs. Packs and runtimes over it follow in our next A/B runs. Codex's reviews (comments above) found the cache-family, recovery-marker and workflow-folder cases fixed here. At 8254a11b they found that a base whose shader preparation fails (no usable Vulkan, a stuck driver, a game that can't start) lost its compiled build, and that `LONGSHOT_NO_PREPARE` no longer skipped it: both fixed (e6f67e69, 243143a3), each with a case in `test_prepare_outcomes` that fails on the code before; a sol review of 8254a11b..243143a3 found nothing more. **Not tested:** a pack and a runtime over the Longshot base yet (next), and Linux. **Needs other testers:** - Linux: `base` on main, then one host-only and one renderer-only pack and `rt` over them; the host pack should keep only `longshot`, the renderer pack only `longshot_vk.so` (T-PYS2). ## Screenshots Nothing on screen. ## Risk and rollback A script and its test only; nothing in the game, the builders or a release reads it. Reverting the commit removes it. Bases, packs and runtimes are built from the game and never leave the PC (the docs section says so). ## Reviewer notes The routing (`route`, `renderer_read_by_game`) and `module_changed` are the parts worth reading first. ## Issues See https://github.com/NotRexed/Hookshot/pull/2732 ## Checklist ### For everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`). - [x] Rebased on current `main`. - [x] `python -I -B tests/run_all.py` run and passing (any failure that also fails on `main` is named above). - [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). - [x] Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. (Not applicable: no game change; see Measurements.) - [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)
feat(dev): test a change against a base, as a pack of what it changes
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 3s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (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
Third-party parts / The same as upstream (pull_request) Has been cancelled
f16e6c8c7d
Ported from Hookshot's https://github.com/NotRexed/Hookshot/pull/2732 (merged there as ac117196), with
Longshot's names: longshot.exe, longshot_vk.dll, the longshot_* cache and log files, LONGSHOT_NO_PREPARE and
LONGSHOT_KEEP_BUILD_FILES. AGENTS.md's line moved into this repository's "Make the change" list.

scripts/dev_packs.py builds a base once per commit (a full build, kept), then a pack of only the modules a change
touches: a renderer-only change builds the renderer DLL alone, any other the game, keeping each module whose linked
objects differ from the base's. rt makes a runtime from the base with packs over it. For development and A/B runs
only, never for a player build; bases, packs and runtimes are built from the game and never leave the PC.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
HumanBean left a comment

The port reads cleanly, and the routing and module_changed hold up against nx2/build.py as it is now: the stamp files and dirs, host_hos_main.o / vk_vk_menu.o, the host_deps lines, the objs.rsp / vk_objs.rsp link lists and the include walk from host/ all match.

One thing has to change before this merges. cmd_base records outputs after the base's shader prepare has run in the game folder, so the files the prepare writes beside the game and that CACHES / WRITTEN_IN_PLAY don't list count as build outputs. mkw_vk_pipelines.stamp is the one that matters. Depending on the GPU, longshot_compute_variants.bin and longshot_module_ids.bin are others. A game pack builds with LONGSHOT_NO_PREPARE=1, so none of them are in game-out. generated_changes then lists them as deleted and rt removes them from the runtime. With no stamp file, pcache_stamp::check drops mkw_vk_pipelines.bin and every play file at the first start (vk_draw.cpp pcache_drop_stale), so every game-pack runtime starts with a cold pipeline cache. The no-pack runtime keeps its cache, which breaks the "one difference" A/B the docs promise. Details are inline. A case for this in test_generated_and_runtime (a stamp file written by the base's prepare survives a game pack's rt) would keep it fixed.

The other inline comments are nits.

For the description (not blocking review, but pr status flags it): the Measurements table is missing, and the Linux test request is still to open.

The port reads cleanly, and the routing and `module_changed` hold up against `nx2/build.py` as it is now: the stamp files and dirs, `host_hos_main.o` / `vk_vk_menu.o`, the `host_deps` lines, the `objs.rsp` / `vk_objs.rsp` link lists and the include walk from `host/` all match. One thing has to change before this merges. `cmd_base` records `outputs` after the base's shader prepare has run in the game folder, so the files the prepare writes beside the game and that `CACHES` / `WRITTEN_IN_PLAY` don't list count as build outputs. `mkw_vk_pipelines.stamp` is the one that matters. Depending on the GPU, `longshot_compute_variants.bin` and `longshot_module_ids.bin` are others. A game pack builds with `LONGSHOT_NO_PREPARE=1`, so none of them are in `game-out`. `generated_changes` then lists them as `deleted` and `rt` removes them from the runtime. With no stamp file, `pcache_stamp::check` drops `mkw_vk_pipelines.bin` and every play file at the first start (vk_draw.cpp `pcache_drop_stale`), so every game-pack runtime starts with a cold pipeline cache. The no-pack runtime keeps its cache, which breaks the "one difference" A/B the docs promise. Details are inline. A case for this in `test_generated_and_runtime` (a stamp file written by the base's prepare survives a game pack's `rt`) would keep it fixed. The other inline comments are nits. For the description (not blocking review, but `pr status` flags it): the Measurements table is missing, and the Linux test request is still to open.
@ -0,0 +63,4 @@
# nx2/version.py's describe(), a fingerprint of every source, so those two objects differ in every build of another tree)
MODULES = ((("longshot.exe", "longshot.map", "objs.rsp", "host_hos_main.o"),
("longshot_vk.dll", "longshot_vk.map", "vk_objs.rsp", "vk_vk_menu.o")) if WINDOWS else
(("longshot", None, "objs.rsp", "host_hos_main.o"), ("longshot_vk.so", None, "vk_objs.rsp", "vk_vk_menu.o")))
Owner

Nit: on Linux, build.py links with -Map= too (longshot.map, longshot_vk.so.map in sa/build), so the maps could be kept here as on Windows, for crash offsets in a Linux pack. This isn't needed for this PR.

Nit: on Linux, build.py links with `-Map=` too (`longshot.map`, `longshot_vk.so.map` in `sa/build`), so the maps could be kept here as on Windows, for crash offsets in a Linux pack. This isn't needed for this PR.
@ -0,0 +72,4 @@
TRANSLATOR = tuple("gpu/vk/%s/" % d for d in STAMP_DIRS) + tuple("gpu/vk/" + f for f in STAMP_FILES)
RENDERER_ONLY = ("gpu/vk/", "third_party/imgui/", "third_party/fidelityfx")
INCLUDE = re.compile(r'#\s*include\s+"([^"]+)"')
NO_MODULE = ("docs/", "tests/", ".github/", ".claude/")
Owner

Nit: Longshot keeps its forge files in .forgejo/, so a change there routes as game and runs a full game pack for nothing. Add .forgejo/ (and .github/ can stay for the upstream merges).

Nit: Longshot keeps its forge files in `.forgejo/`, so a change there routes as `game` and runs a full game pack for nothing. Add `.forgejo/` (and `.github/` can stay for the upstream merges).
@ -0,0 +76,4 @@
HEADERS = (".h", ".hpp", ".hh", ".inc", ".inl")
SOURCES = (".c", ".cc", ".cpp") + HEADERS
# (files the game writes beside itself while it runs, besides the caches: never a build's output, so never "deleted" by a pack)
WRITTEN_IN_PLAY = ("longshot_options.ini", "longshot_log.txt", "longshot_driver_faults.txt", "longshot_prepared.bin.warming")
Owner

Related to the comment on b["outputs"]: the game also writes longshot_log.1.txt, longshot_load_start.txt(.waited), longshot_frames.csv and longshot_pipelines.bin.built beside itself. If outputs are recorded before the prepare, this list matters much less. If you keep the exclusion approach instead, it needs those too.

Related to the comment on `b["outputs"]`: the game also writes `longshot_log.1.txt`, `longshot_load_start.txt(.waited)`, `longshot_frames.csv` and `longshot_pipelines.bin.built` beside itself. If outputs are recorded before the prepare, this list matters much less. If you keep the exclusion approach instead, it needs those too.
@ -0,0 +387,4 @@
if a.predict_s > 0:
prepare(game, b)
b["build_s"] = round(time.time() - t)
b["outputs"] = build_outputs(game)
Owner

Blocking: this runs after the prepare has run in game (make_game.py's own prepare when --predict-s is 0, prepare(game, b) above otherwise). Anything the prepare writes beside the game that isn't in CACHES or WRITTEN_IN_PLAY gets recorded as a build output. That includes mkw_vk_pipelines.stamp (pcache_stamp.h), longshot_compute_variants.bin, longshot_module_ids.bin, and longshot_prepare_skipped after a skipped prepare. A game pack builds with LONGSHOT_NO_PREPARE=1, so generated_changes reports all of them as gone, and rt deletes them from the runtime. Without the stamp, pcache_stamp::check treats the folder as unstamped and drops mkw_vk_pipelines.bin and the play files at the first start, so every game-pack runtime runs with a cold pipeline cache against a warm no-pack runtime.

The simplest fix is to always build the base with LONGSHOT_NO_PREPARE=1, record outputs here before the prepare, and then call prepare(game, b) (with or without the budget). A stricter exclusion list would also work, but it can drift as the renderer adds files.

Blocking: this runs after the prepare has run in `game` (make_game.py's own prepare when `--predict-s` is 0, `prepare(game, b)` above otherwise). Anything the prepare writes beside the game that isn't in `CACHES` or `WRITTEN_IN_PLAY` gets recorded as a build output. That includes `mkw_vk_pipelines.stamp` (pcache_stamp.h), `longshot_compute_variants.bin`, `longshot_module_ids.bin`, and `longshot_prepare_skipped` after a skipped prepare. A game pack builds with `LONGSHOT_NO_PREPARE=1`, so `generated_changes` reports all of them as gone, and `rt` deletes them from the runtime. Without the stamp, `pcache_stamp::check` treats the folder as unstamped and drops `mkw_vk_pipelines.bin` and the play files at the first start, so every game-pack runtime runs with a cold pipeline cache against a warm no-pack runtime. The simplest fix is to always build the base with `LONGSHOT_NO_PREPARE=1`, record `outputs` here before the prepare, and then call `prepare(game, b)` (with or without the budget). A stricter exclusion list would also work, but it can drift as the renderer adds files.
@ -0,0 +578,4 @@
else:
cmd_rt(argparse.Namespace(dir=d, runtime=rt, packs=[]))
for cmd in a.run:
argv = [x.replace("{runtime}", rt) for x in shlex.split(cmd)]
Owner

Nit: shlex.split in POSIX mode treats backslashes as escapes, so on Windows --run "C:\Games\rt\longshot.exe" becomes C:Gamesrtlongshot.exe. The docstring says it's split POSIX-style, but a Windows user will trip over it. Consider shlex.split(cmd, posix=os.name != "nt") (and stripping the quotes it leaves), or say in docs/development.md to use forward slashes.

Nit: `shlex.split` in POSIX mode treats backslashes as escapes, so on Windows `--run "C:\Games\rt\longshot.exe"` becomes `C:Gamesrtlongshot.exe`. The docstring says it's split POSIX-style, but a Windows user will trip over it. Consider `shlex.split(cmd, posix=os.name != "nt")` (and stripping the quotes it leaves), or say in docs/development.md to use forward slashes.
fix(dev): changes under .forgejo/ build nothing, as .github/ already didn't
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 3s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (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
Third-party parts / The same as upstream (pull_request) Has been cancelled
5dc34020cd
Longshot's workflows and templates live in .forgejo/; without it a CI-only change took the game route and rebuilt
both modules. A route case covers it (it fails without the fix). Found by Codex's review.

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

Pushed 5dc34020: changes under .forgejo/ (Longshot's workflows and templates) now build nothing, as .github/ already didn't; before, a CI-only change rebuilt the game. New route case, which fails without the fix. Found in Codex's review. test_dev_packs passes.

Pushed 5dc34020: changes under .forgejo/ (Longshot's workflows and templates) now build nothing, as .github/ already didn't; before, a CI-only change rebuilt the game. New route case, which fails without the fix. Found in Codex's review. test_dev_packs passes.
fix(dev): seed the play caches too, read the language as make_game.py does, UTF-8 test fixtures
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 3s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (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
Third-party parts / The same as upstream (pull_request) Has been cancelled
896b76ecae
From Codex's two source reviews of the port:
- base --seed copied CACHES only; the pipeline cache's play files (mkw_vk_pipelines_play_<n>.bin, which is_cache()
  already knows) can hold the latest pipelines alone, so a seeded base lost them. It now copies every cache file the
  seed holds. New test: a cache, a play file and two other files; only the caches arrive.
- game_language skipped a comment only when its # was the first character, and took any other line as the language.
  It now calls make_game.py's folder_language (a known code; comments, indented too, and unknown lines skipped).
- The test's link lists are written as UTF-8, as link_list reads them.
Both new checks fail on the previous code.

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

Pushed 896b76ec, from Codex's two source reviews: --seed now copies the play cache files too (mkw_vk_pipelines_play_.bin; is_cache() already knew them), game_language uses make_game.py's folder_language (indented comments and unknown lines skipped), and the test's link lists are written as UTF-8. New checks for the seed and the language, each failing on the previous code. test_dev_packs passes.

Pushed 896b76ec, from Codex's two source reviews: --seed now copies the play cache files too (mkw_vk_pipelines_play_<n>.bin; is_cache() already knew them), game_language uses make_game.py's folder_language (indented comments and unknown lines skipped), and the test's link lists are written as UTF-8. New checks for the seed and the language, each failing on the previous code. test_dev_packs passes.
fix(dev): play caches are caches in a base's outputs and a pack's changes too
All checks were successful
PR description / Description follows the template (pull_request_target) Successful in 6s
defd599a05
With --seed copying the play cache files, build_outputs and generated_changes still skipped the fixed cache names only:
a seeded play file was recorded as a build output, and a pack whose build lacked it listed it as gone, so the pack's
runtime lost it. Both now skip every is_cache() file. The runtime test seeds a play file before the outputs are recorded
and gives the pack's build another: neither is an output, a change or gone. Each half fails when reverted. From
Codex's final source pass.

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

Pushed defd599a, from Codex's final source pass: a base's recorded outputs and a pack's generated changes now skip every cache file (is_cache()), the play caches too, so a seeded play file is never listed as gone and dropped from a pack's runtime. The runtime test seeds one before the outputs are recorded and gives the pack another; each half of the fix fails the test when reverted. test_dev_packs passes.

Pushed defd599a, from Codex's final source pass: a base's recorded outputs and a pack's generated changes now skip every cache file (is_cache()), the play caches too, so a seeded play file is never listed as gone and dropped from a pack's runtime. The runtime test seeds one before the outputs are recorded and gives the pack another; each half of the fix fails the test when reverted. test_dev_packs passes.
fix(dev): the pipeline cache's stamp is part of the cache family
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 10s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (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
Third-party parts / The same as upstream (pull_request) Has been cancelled
220791ed56
mkw_vk_pipelines.stamp (gpu/vk/pcache_stamp.h) was neither in CACHES nor a play file: a seed left it out and a game pack
could list it as gone, and without it the renderer drops the copied pipeline cache and its play files even for the same
translator. It is a cache now, so seeds copy it and a base's outputs and a pack's changes skip it. The tests seed it and
check it is copied and never an output; the renderer-name check reads gpu/vk's headers too. The test fails without it.
From Codex's spec pass.

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

Pushed 220791ed, from Codex's spec pass: the pipeline cache's stamp (mkw_vk_pipelines.stamp, gpu/vk/pcache_stamp.h) is now one of the caches, so a seed copies it and a base's outputs and a pack's changes never list it; without it the renderer drops the copied pipeline cache and its play files. The tests seed it and check both; they fail without it. test_dev_packs passes.

Pushed 220791ed, from Codex's spec pass: the pipeline cache's stamp (mkw_vk_pipelines.stamp, gpu/vk/pcache_stamp.h) is now one of the caches, so a seed copies it and a base's outputs and a pack's changes never list it; without it the renderer drops the copied pipeline cache and its play files. The tests seed it and check both; they fail without it. test_dev_packs passes.
Author
Contributor

Pushed 94170793, from Codex's review: a pack's list of files gone now skips caches too, so an outputs list a base recorded before the caches' family was complete (play files, the stamp) can't make a pack delete them. Test: such a list with the stamp, a play file and a generated file the build no longer makes; only the generated file is gone. It fails without the filter. test_dev_packs passes.

Pushed 94170793, from Codex's review: a pack's list of files gone now skips caches too, so an outputs list a base recorded before the caches' family was complete (play files, the stamp) can't make a pack delete them. Test: such a list with the stamp, a play file and a generated file the build no longer makes; only the generated file is gone. It fails without the filter. test_dev_packs passes.
fix(dev): a pack never deletes a cache, even from an older base's outputs list
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 3s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (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
Third-party parts / The same as upstream (pull_request) Has been cancelled
94170793db
generated_changes built its gone list straight from the base's recorded outputs: a base recorded before the caches'
family was complete (the play files, the pipeline stamp) could still make a pack delete them. Caches are skipped there
too now. The runtime test gives an outputs list with the stamp and a play file beside a generated file the build no
longer makes: only the generated file is gone. It fails without the filter. From Codex's review.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
fix(dev): the renderer's whole cache family, checked both ways; docs match the routing
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 7s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (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
Third-party parts / The same as upstream (pull_request) Has been cancelled
636c445e2e
From Codex's final reviews (stage378 standards-941, spec-941):
- CACHES now lists every file the renderer keeps beside the game between runs: the program cache plain or compressed
  and its index (longshot_programs.zst.bin/.zst.idx), the modules' ids, the pipeline notes predicted and built, the
  compute variants, the older state list it still reads, beside the ones already there. Seeds copy them; a base's
  outputs, a pack's changes and its gone list skip them.
- Files the game writes while it runs (the preparation's skip marker, the slow-load notes, reports, the rotated log) are
  never a build's output.
- The renderer-name check reads the derived names, and a new check goes the other way: every .bin/.idx the renderer
  names is a cache or one of the two files a build makes, so a new cache file fails the test until it is classified.
  Taking one out (compute variants) fails it.
- docs/development.md: both modules are kept for a game build; a renderer-only change (a shader) builds and keeps the
  renderer alone, as route() does (a route case for a shader and its generated header).

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

Pushed 636c445e, from Codex's final reviews: the renderer's whole cache family in one pass (the compressed program cache and its index, module ids, the built pipeline notes, compute variants, the older state list), the files the game writes while it runs kept out of a base's outputs, and a check in both directions (every .bin/.idx the renderer names must be a cache or a build's own file, so a new cache file fails the test until it is classified). The docs now say a renderer-only change keeps the renderer alone, as the routing does, with a route case for a shader. test_dev_packs passes.

Pushed 636c445e, from Codex's final reviews: the renderer's whole cache family in one pass (the compressed program cache and its index, module ids, the built pipeline notes, compute variants, the older state list), the files the game writes while it runs kept out of a base's outputs, and a check in both directions (every .bin/.idx the renderer names must be a cache or a build's own file, so a new cache file fails the test until it is classified). The docs now say a renderer-only change keeps the renderer alone, as the routing does, with a route case for a shader. test_dev_packs passes.
fix(dev): the preparation's recovery markers are never a build's output nor deleted by a pack
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 7s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (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
Third-party parts / The same as upstream (pull_request) Has been cancelled
33bb359415
longshot_pipelines.bin.predicting, .running and .built.warming (vk_draw.cpp) mark a preparation under way: a crash mid
prediction leaves one so the next start finishes the work. A base could record one as an output, and a host-only pack
without it would delete it. They join the files written in play, which a base's outputs and a pack's gone list both
skip now (the gone list also for an older base's list). The runtime test seeds one and lists the three in a legacy
outputs list; each half of the fix fails it when reverted. From Codex's standards review of 636c445e.

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

Pushed 33bb3594, from Codex's standards review: the preparation's recovery markers (longshot_pipelines.bin.predicting, .running, .built.warming) are files written while the game runs, so a base never records them as outputs and a pack never deletes them, also from an older base's list; a crash mid-prediction keeps its marker for the next start. Test extended; each half fails when reverted. test_dev_packs passes.

Pushed 33bb3594, from Codex's standards review: the preparation's recovery markers (longshot_pipelines.bin.predicting, .running, .built.warming) are files written while the game runs, so a base never records them as outputs and a pack never deletes them, also from an older base's list; a crash mid-prediction keeps its marker for the next start. Test extended; each half fails when reverted. test_dev_packs passes.
Author
Contributor

From Codex's review: Final source review and the game-free dev-packs fixture pass at 33bb3594. Restoring the earlier cache family, marker output classification or marker deletion handling makes the corresponding check fail. This covers cache/stamp preservation, legacy output lists, recovery markers and the documented build routes. Symlink-specific cases were skipped on this Windows account. Fresh Longshot base construction and shader preparation have not been checked by Codex; no measured stutter or build-time gain is claimed from these fixtures.

From Codex's review: Final source review and the game-free dev-packs fixture pass at 33bb3594. Restoring the earlier cache family, marker output classification or marker deletion handling makes the corresponding check fail. This covers cache/stamp preservation, legacy output lists, recovery markers and the documented build routes. Symlink-specific cases were skipped on this Windows account. Fresh Longshot base construction and shader preparation have not been checked by Codex; no measured stutter or build-time gain is claimed from these fixtures.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
fix(dev): the predicted pipelines' keys file is a cache too
Some checks failed
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 6s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (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
Third-party parts / The same as upstream (pull_request) Has been cancelled
33f821aac4
Main's #158 added longshot_pipelines.bin.predicted_keys (the predicted pipelines' keys, stamped and read by the census:
vk_draw.cpp predicted_keys_write). It joins the cache family, so seeds copy it and a base's outputs and a pack's changes
skip it; the renderer-name check strips the suffix before .predicted. From Codex's review.

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

Merged main 9a186f71 (no force-push) and pushed 33f821aa: main's new longshot_pipelines.bin.predicted_keys (#158) joins the cache family. run_all: 497 passed, 4 failed, 36 skipped; the 4 fail the same on unmodified main here. In use: our first Longshot base (main 839e85ff) was built with this script: compile 340 s, 0 failed, Most preparation 25,303 + 9,687 pipelines, 0 missed, 36 min.

Merged main 9a186f71 (no force-push) and pushed 33f821aa: main's new longshot_pipelines.bin.predicted_keys (#158) joins the cache family. run_all: 497 passed, 4 failed, 36 skipped; the 4 fail the same on unmodified main here. In use: our first Longshot base (main 839e85ff) was built with this script: compile 340 s, 0 failed, Most preparation 25,303 + 9,687 pipelines, 0 missed, 36 min.
fix(dev): a base records its outputs before its preparation
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 8s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (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
Third-party parts / The same as upstream (pull_request) Has been cancelled
8254a11bb4
From HumanBean's review: the outputs were recorded after the shader preparation had run in the game folder, so anything it
writes beside the game that no list names would count as a build output, which a game pack (built without preparing)
then lists as gone and rt deletes. The base now builds with LONGSHOT_NO_PREPARE=1, records its outputs, then prepares
(with the budget when set): what the preparation writes can't be taken for an output, whatever the renderer adds later.
prepare() passes make_game.py's Compile shaders level (the folder's choice, else Most), as make_game.py's own does.
New test: a preparation that writes the stamp and a file no list names; neither is an output, the shader seed is, and
the preparation runs once with the level. It fails when the outputs are recorded after the preparation.
docs: warm --run is split POSIX-style, so Windows paths take forward slashes.

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

Thanks for the careful review, HumanBean. Each point:

  1. Blocking (outputs recorded after the prepare): fixed both ways.
    • The structural fix you suggested is in 8254a11b. The base builds with LONGSHOT_NO_PREPARE=1, records outputs, then runs prepare(game, b), with the budget when one is set and with make_game.py's Compile shaders level as make_game.py passes it. Nothing the prepare writes can be taken for an output any more.
    • The new test_outputs_before_prepare has a fake prepare write mkw_vk_pipelines.stamp and a file no list names. Neither ends up in outputs, while the shader seed does. The test fails when the outputs are recorded after the prepare.
    • Before that, the cache family was completed (220791ed, 636c445e, 33f821aa): the stamp, longshot_compute_variants.bin, longshot_module_ids.bin, the compressed program cache and its index, .built, and .predicted_keys.
    • A pack's gone list also skips caches and files written in play, even from a list an older base recorded (94170793, 33bb3594).
    • A check now goes the other way too: every .bin/.idx the renderer names must be classified.
  2. Files the game writes beside itself: longshot_log.1.txt, longshot_load_start.txt(.waited), longshot_frames.csv, longshot_prepare_skipped and the recovery markers are in WRITTEN_IN_PLAY, and .built is a cache (636c445e, 33bb3594). With the outputs now recorded before the prepare, this list matters much less, as you said, but it stays as a second guard.
  3. shlex.split and Windows paths: docs/development.md now says --run is split POSIX-style, so Windows paths take forward slashes (8254a11b). Our own caller passes cygpath -m paths. If you'd rather have posix=False on Windows, I can switch it.
  4. .forgejo/: routes as nothing to build now, .github/ kept, with a route case (5dc34020).
  5. Linux maps: agreed, not needed for this PR; left for a follow-up.

Description: the Measurements table is in. A Linux test request (host-only and renderer-only packs over one base) is being opened.

Thanks for the careful review, HumanBean. Each point: 1. **Blocking (outputs recorded after the prepare):** fixed both ways. - The structural fix you suggested is in 8254a11b. The base builds with `LONGSHOT_NO_PREPARE=1`, records `outputs`, then runs `prepare(game, b)`, with the budget when one is set and with make_game.py's Compile shaders level as make_game.py passes it. Nothing the prepare writes can be taken for an output any more. - The new `test_outputs_before_prepare` has a fake prepare write `mkw_vk_pipelines.stamp` and a file no list names. Neither ends up in `outputs`, while the shader seed does. The test fails when the outputs are recorded after the prepare. - Before that, the cache family was completed (220791ed, 636c445e, 33f821aa): the stamp, `longshot_compute_variants.bin`, `longshot_module_ids.bin`, the compressed program cache and its index, `.built`, and `.predicted_keys`. - A pack's gone list also skips caches and files written in play, even from a list an older base recorded (94170793, 33bb3594). - A check now goes the other way too: every `.bin`/`.idx` the renderer names must be classified. 2. **Files the game writes beside itself:** `longshot_log.1.txt`, `longshot_load_start.txt(.waited)`, `longshot_frames.csv`, `longshot_prepare_skipped` and the recovery markers are in `WRITTEN_IN_PLAY`, and `.built` is a cache (636c445e, 33bb3594). With the outputs now recorded before the prepare, this list matters much less, as you said, but it stays as a second guard. 3. **`shlex.split` and Windows paths:** docs/development.md now says `--run` is split POSIX-style, so Windows paths take forward slashes (8254a11b). Our own caller passes `cygpath -m` paths. If you'd rather have `posix=False` on Windows, I can switch it. 4. **`.forgejo/`:** routes as nothing to build now, `.github/` kept, with a route case (5dc34020). 5. **Linux maps:** agreed, not needed for this PR; left for a follow-up. Description: the Measurements table is in. A Linux test request (host-only and renderer-only packs over one base) is being opened.
klimovich008 changed title from WIP: feat(dev): test a change against a base, as a pack of what it changes to feat(dev): test a change against a base, as a pack of what it changes 2026-11-13 10:33:35 +00:00
From Codex's sol reviews of 8254a11b: the base now always prepared through subprocess.run(check=True), so a PC
with no usable Vulkan (exit 3) or a stuck driver (exit 4) lost a compiled base before base.json was written, where
make_game.py's own preparation leaves the work to the first start. The base's preparation is no longer fatal: the
reason goes to base.json's not_prepared. A runtime's preparation still stops on failure. LONGSHOT_NO_PREPARE (set
and not 0, as make_game.py reads it) skips a base's preparation again. The predicted-key file is named literally
in the seed and outputs checks, so dropping it from CACHES fails them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
fix(dev): a base's preparation that cannot start keeps the base too
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 3s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (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
Third-party parts / The same as upstream (pull_request) Has been cancelled
243143a35f
From Codex and the sol review of e6f67e69: subprocess.run raises OSError when the game cannot start at all (a
missing DLL, launch denied, a noexec filesystem), before any exit status, so a base still lost base.json. As
make_game.py prepare_shaders does, a base's preparation catches it and records the reason; a runtime's still
raises. test_prepare_outcomes gains the case.

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

Pushed e6f67e69 and 243143a3, from Codex's sol reviews of 8254a11b: a base whose shader preparation fails (exit 3 no usable Vulkan, exit 4 a stuck driver, or a game that cannot start at all) now keeps its compiled build, with the reason in base.json's not_prepared, as make_game.py's own preparation leaves the work to the first start; a runtime's preparation still stops on failure. LONGSHOT_NO_PREPARE (set and not 0) skips a base's preparation again. The predicted-key file is named literally in the seed and outputs checks. New test_prepare_outcomes fails on 8254a11b; a sol review of 8254a11b..243143a3 found nothing more. run_all: 497 passed, 4 failed (the same 4 as unmodified main here), 36 skipped.

Pushed e6f67e69 and 243143a3, from Codex's sol reviews of 8254a11b: a base whose shader preparation fails (exit 3 no usable Vulkan, exit 4 a stuck driver, or a game that cannot start at all) now keeps its compiled build, with the reason in base.json's not_prepared, as make_game.py's own preparation leaves the work to the first start; a runtime's preparation still stops on failure. LONGSHOT_NO_PREPARE (set and not 0) skips a base's preparation again. The predicted-key file is named literally in the seed and outputs checks. New test_prepare_outcomes fails on 8254a11b; a sol review of 8254a11b..243143a3 found nothing more. run_all: 497 passed, 4 failed (the same 4 as unmodified main here), 36 skipped.
Merge main d956c9ea into feat/dev-packs
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 4s
2e898648af
docs/development.md: main's new "Build times" section and this branch's "Testing a change against a base" were added
at the same place; both kept, this branch's first.

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

Merged main d956c9ea (no force-push) as 2e898648: main's new "Build times" section in docs/development.md had been added where this PR's section is; both are kept, this PR's first. run_all on the merge: 497 passed, 4 failed, 36 skipped; the 4 (test_nup_paths, test_check_third_party, test_display_pointer, test_release) fail the same way on unmodified d956c9ea here (test_builder_dlss_update passes now, after #179). test_dev_packs passes.

Merged main d956c9ea (no force-push) as 2e898648: main's new "Build times" section in docs/development.md had been added where this PR's section is; both are kept, this PR's first. run_all on the merge: 497 passed, 4 failed, 36 skipped; the 4 (test_nup_paths, test_check_third_party, test_display_pointer, test_release) fail the same way on unmodified d956c9ea here (test_builder_dlss_update passes now, after #179). test_dev_packs passes.
Author
Contributor

@HumanBean could you take another look when you have time? Your blocking point (outputs recorded after the preparation) is fixed in 8254a11b, with test_outputs_before_prepare; the other four are answered in my reply above, each with its commit. Since then: a base whose preparation fails now keeps its build (e6f67e69, 243143a3, test_prepare_outcomes), and main d956c9ea is merged in (2e898648). run_all on the head: 497 passed, and the 4 that fail on unmodified main here fail the same way. Thanks!

@HumanBean could you take another look when you have time? Your blocking point (outputs recorded after the preparation) is fixed in 8254a11b, with `test_outputs_before_prepare`; the other four are answered in my reply above, each with its commit. Since then: a base whose preparation fails now keeps its build (e6f67e69, 243143a3, `test_prepare_outcomes`), and main d956c9ea is merged in (2e898648). run_all on the head: 497 passed, and the 4 that fail on unmodified main here fail the same way. Thanks!
HumanBean deleted branch feat/dev-packs 2026-11-13 15:33:25 +00:00
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 4s
Some workflows are waiting to be reviewed.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 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!147
No description provided.