improvement-batch1 salvage triage (2026-10-17)
improvement-batch1 salvage triage (2026-10-17)
Section titled “improvement-batch1 salvage triage (2026-10-17)”Item: RELEASE-1.1 §3, “Salvage improvement-batch1 … cherry-pick what still applies rather than
merging.” Worker W15, overnight swarm 2026-10-16.
The finding that changes the item
Section titled “The finding that changes the item”This salvage was already done once, on branch salvage-batch1 (origin, last commit e2526c80,
2026-10-16 17:15). A Droid session cherry-picked 25 of these commits onto main, adapted them, and
took two bh-reviewer rounds. Round 2 left one copy blocker (Scatter/Momentum What’s New claim),
which e2526c80 then fixed. It was never re-reviewed or merged. Since then main moved 43 commits
(overnight merges: levelup-big-cards, polish-bestiary-copy, stats sheet work), and
salvage-batch1 now conflicts with main in 5 files: data/bestiary.json, main.gd,
tests/test_stats_sheet_view.gd, ui/level_up_panel.gd, ui/stats_sheet.gd.
So this pass did not redo the salvage from the 10-04 originals. The new branch
improvement-batch1-salvage takes the already-adapted, already-reviewed salvage-batch1
versions of the cheap commits onto current main, and leaves the risky remainder on
salvage-batch1. When salvage-batch1 is later merged with main, the picked commits carry the same
content, so they merge as no-ops.
Counts
Section titled “Counts”57 commits on origin/main..origin/improvement-batch1: 45 non-merge + 12 merge commits.
| Class | Count | Notes |
|---|---|---|
| already-on-main | 6 | quit confirm, dimension chip (2), chip tokens, death recap, literal-ratchet docs |
| superseded | 2 | pause Sound row (main has VolumeSettings in Settings), literal-ratchet refactor of branch UI |
| still-applies-cheap (picked) | 11 | plus the codex half of a salvage-batch1 follow-up fix |
| still-applies-risky | 9 | main.gd / sim / level_up_panel / hud / telemetry vocabulary |
| not-wanted (dev-only / bookkeeping) | 17 | punch-list ticks, capture harness, evidence docs, CLAUDE.md/skill doc edits |
| merge commits | 12 | not picked by definition |
Per-commit table
Section titled “Per-commit table”sb1 = the adapted commit on salvage-batch1. “Picked” = on improvement-batch1-salvage.
| improvement-batch1 | Subject | sb1 | Class | Why |
|---|---|---|---|---|
| dde9ab5d | fix(fx): boss reactions and the accumulator warning survive a busy frame | 6acf8699 | cheap, picked | fx_manager only; boss reaction / accumulator warning were dropped under the juice cap |
| b6b269fc | fix(audio): reserve per-frame slots for priority boss cues | 470ad1e8 | cheap, picked | audio_manager _route 10 lines; merges clean against sfx-synth-all |
| 9be8c576 | test(render): pin archetype type->shape coverage | 7a47b956 | cheap, picked | test only |
| b41cd2a9 | docs(polish): tick the three batch-1 punch-list items | - | not-wanted | punch-list bookkeeping |
| b6d9a8af | fix(fx): element colours and slam radius come from the sim data | 57e2ae9b | cheap, picked | sim side is one extra element key on the wildfire_pop fx event (no RNG, render-only consumer). Store-visible gain: Wildfire ring + ignite spark take the element colour; elite Brute slam ring shows its real radius |
| cdd6e045 | docs(polish): tick batch-2 punch-list items | - | not-wanted | bookkeeping |
| 011ae05a | fix(render): show the player’s burn/slow status, and raise the bomb telegraph | 37a983d2 | risky | main.gd hunk |
| a115686c | docs(polish): tick batch-3 punch-list items | - | not-wanted | bookkeeping |
| 3a405e91 | fx(warden): strafe thrust cue reads render_info “strafing” | c4bdb7f8 | cheap, picked | new fx node + vfx_library entry; BossWarden.strafing() already on main |
| 51f063c0 | render: draw Halo Chain tethers and the enemies their field buffs | 354fb4e8 (+6e7c6ec4) | risky | main.gd + sim/halo_chain_director.gd; an invisible-mechanic fix worth landing via salvage-batch1 |
| bbf0a414 | ui(hud): show the active Dimension after the choice popup | - | already-on-main | a0091223 (dimension chip) |
| 57e1572d | telemetry: run_end carries the death cause | d9daf9e6 | risky | main.gd + telemetry vocabulary; Worker deploy order |
| 0e31d92f | docs(polish): annotate batch-4 items | - | not-wanted | bookkeeping |
| f750832a | tools(polish): in-run capture harness | 2e7a671d | not-wanted | dev tool; tools/ui_capture covers this now |
| 37e8fc62 | feat(ui): bestiary shows “n / m DISCOVERED” counter | 3151214a (+7e8805c4 codex half) | cheap, picked | codex_overlay only |
| f0791f92 | docs(punch-list): stamp run 28 #2 commit hash | - | not-wanted | bookkeeping |
| 7325d96f | feat(ui): player-facing Sound row in the pause menu | - | superseded | main ships Music / Sound effects volume in Settings (audio/volume_settings.gd); also touched main.gd + save schema |
| 9fcc2152 | feat(ui): confirm before “Quit to menu” | - | already-on-main | bd22085e |
| 0280b028 | fix(hud): the Dimension chip was drawn half off-screen | - | already-on-main | chip rebuilt in a0091223 |
| caf9b8c3 | docs(punch-list): mark Run 15 #1 and Run 21 #1 done | - | not-wanted | bookkeeping |
| 16548afd | docs(polish): windowed-capture evidence | - | not-wanted | evidence for a branch state that no longer exists |
| 25ee905e | tools(polish): capture the boot menu and the post-run menu | d95c787a | not-wanted | dev tool |
| 6beebc34 | tools(polish): capture the pause menu and quit-confirm | 62c031be | not-wanted | dev tool |
| aea7c729 | tools(ui-sweep): stop the menu capture depending on the dev save | 8a3bdbb5 | cheap, picked | tooling fix, applies clean (the baseline PNG was not carried) |
| 844635e1 | docs(polish): windowed check for the Sound row | - | not-wanted | bookkeeping |
| b2d7680d | fix(ui): death recap classifies hazard and funzo as zone damage | - | already-on-main | patch-equivalent (git cherry -) |
| 7cabfc77 | docs(punch-list): close run 17 hazard advice | - | not-wanted | bookkeeping |
| 6236fc79 | fix(fx): scale the death dissolve with the dying body’s radius | 69cf7c17 | risky | sim/sim.gd |
| bb319f4d | tools(vfx): preview the real boss-size death dissolve | 0890cf52 | risky | depends on 6236fc79 |
| 627ee835 | docs(polish): record boss dissolve verification | - | not-wanted | bookkeeping |
| 226a4a76 | docs: VFX library cards must prove their named renderer | 540ec9f1 | not-wanted | CLAUDE.md conflicts, file is at the 30KB budget; leave to salvage-batch1 |
| bed1b9c5 | refactor(ui): branch-added UI reads live tokens | - | superseded | its chip/pause targets were rebuilt on main; codex part carried by the 7e8805c4 half |
| d9cfd0cb | fix(render): a dead boss no longer stays drawn under the Dimension popup | 790308b8 | risky | main.gd + test_main |
| b57b924f | docs: record the UI literal ratchet | - | already-on-main | docs/architecture/ui-tokens.md § The literal ratchet |
| 7fc5dd04 | refactor(ui): Dimension chip reads live tokens | - | already-on-main | main’s chip already reads Tokens |
| c4faf8bc | fix(content): codex and story text match live sim behaviour | a78a02b2 | cheap, picked | 2 conflict hunks with overnight polish-bestiary-copy (Skirmisher, Halo Chain), resolved to the branch text after checking the sim: Skirmisher flips strafe every shot (enemy_behaviors.gd:143), tethers re-form after TETHER_BREAK_COOLDOWN 1.0 s |
| 81ee849e | fix(ui): HUD, objective bar, level-up, dimension choice inside the safe area | 8938766e | risky | level_up_panel + hud; levelup-big-cards just merged |
| 258d2ede | test(story): one-step lessons report only step 0 | 25bcbbde | cheap, picked | test only |
| b994a37d | fix(fx): stop boss-death labels drawing over each other | 08bcb717 | risky | 5 sim boss files (small render_info stamps) |
| adb27a0e | docs(punch-list): close batch 7 | - | not-wanted | bookkeeping |
| 9b2dc4d7 | docs: RebindProbe walks whole panels; weakref() annotation | 85b779bb | cheap, picked | gotcha docs, applies clean |
| 154972a9 | docs(skills): base suite before parallel dispatch | 5d6ea8f8 | not-wanted | process doc; leave to salvage-batch1 |
| b865bc61 | fix(ui): level-up cards clear the side safe-area insets | 40bfc15e | risky | level_up_panel; re-check against the big-cards layout |
| 7db55fc9 | fix(content): Tank Missile codex names the Summoner | a29170a2 | cheap, picked | applied clean after the codex-text pick |
| 151fe616 | docs(punch-list): level-up side insets and Tank Missile done | - | not-wanted | bookkeeping |
What is left, and the ready path
Section titled “What is left, and the ready path”The risky nine live on salvage-batch1 with two review rounds behind them. To land them:
merge origin/main into salvage-batch1 (5 conflicts: bestiary.json is now trivial since this
branch carries the same text; main.gd; the level-up / stats-sheet trio needs real work against the
big-cards layout), re-run the fit tests at every ShopLayoutFixture profile, then a round-3
bh-reviewer. Its What’s New / store-copy bullets (a45f5f6e, ea7c5818, e2526c80) describe the whole
batch, so carry only the lines for commits that actually land.
Capture check (iPhone / iPad / TV) and a pre-existing bestiary bug
Section titled “Capture check (iPhone / iPad / TV) and a pre-existing bestiary bug”The one picked change with layout is the bestiary “n / m DISCOVERED” counter. tools/ui_capture
gained a codex scene (opened through the real start_menu.bestiary_requested path) and was run at
iPhone, iPad and TV. The counter sits right-aligned in the title row and reads cleanly on iPhone
and TV.
Comparing the same capture on origin/main surfaced bugs that are already on main, not caused by the pick, and not fixed here (codex layout + touch input is more than a salvage pick):
- iPad: the whole bestiary overflows to the right. The detail plate’s fixed minimums (list 220 + preview 300 + text 360 + margins) exceed iPad’s 985-unit canvas, so the card text, the stats row and now the counter (“32 / 32 DISCOV”) are cut at the screen edge. Same on main without the counter.
- All devices: the 32-row list has no scroll. Rows past about Accumulator (iPhone) or Beacon (TV) are drawn off-screen, so selecting them with a pad moves the cursor out of view.
- [Likely] iPhone/iPad touch-only: the browse cannot be navigated at all.
_inputtreats any screen touch as “close”, and nothing maps a swipe or a row tap to a selection, so a touch-only player only ever sees the first entry (Swarmer). Needs a device check. - iPhone: the 56-unit root margin ignores the safe-area insets (78 units on the left in the iPhone profile), so the title and list start inside the notch band.
Suggested follow-up: ScrollContainer around the list with the selection kept in view, row taps
select (tap the selected row or a close button to dismiss), margins from
Platform.safe_insets_units, and a fit test at every ShopLayoutFixture profile.