Files
goldeneye-pc-port/docs/dev/findings-index.csv
T
James Dansereau 3dcceaafd9 ci: route windows-build to self-hosted runner (G2); land ROM-gated sweep workflow (G1) (#65)
* ci: route windows-build to self-hosted runner (G2); land ROM-gated sweep workflow (G1)

G2: windows-build now runs on the self-hosted box (corpyvt6agent01) for
push/workflow_dispatch, using local ccache instead of the actions/cache
round-trip and skipping msys2/setup-msys2's install once packages are
already present. pull_request always stays on windows-latest — fork PRs
must never reach a box that will hold a ROM.

G1: adds .github/workflows/selfhosted.yml, a dispatch-only workflow that
builds + runs the 21-level headless sweep (tools_pc/verify.sh sweep --json)
against a runner-cached ROM. Inert until manually dispatched.

Still pending (manual, physical steps on the box — not done by this
commit, see docs/dev/notes/SELFHOSTED-RUNNER-PLAN.md rollout table):
- register corpyvt6agent01 as a runner against this repo
- confirm MSYS2 at C:\msys64 with the required mingw64 package set
- one-time ROM seed into {runner_home}/_rom-seed/
- first workflow_dispatch sweep + parity check against a local run
- flip G1 from workflow_dispatch to push:[main] once green

Claude-Session: https://claude.ai/code/session_01J5PZ3sTHiuW6MdQnepasSU

* fix(selfhosted.yml): remove invalid concurrency.max-parallel key

Found by testing: dispatching the workflow failed with a hard parse
error (HTTP 422, "Unexpected value 'max-parallel'"). GitHub Actions'
workflow-level `concurrency` block only supports `group` and
`cancel-in-progress` — `max-parallel` is a job `strategy:` key for
matrix jobs, not a concurrency-block key. Serialization was already
achieved via group + cancel-in-progress:false; the stray key just
blocked every dispatch.

Claude-Session: https://claude.ai/code/session_01J5PZ3sTHiuW6MdQnepasSU

* fix(selfhosted.yml): register the msys2 shell wrapper (setup-msys2 step)

Found by testing: the first fixed dispatch failed every msys2-shell step
with "msys2: command not found". Unlike ci.yml's windows-build, this
workflow used `shell: msys2 {0}` without ever running msys2/setup-msys2,
which is what registers that shell alias for the runner — MSYS2 being
pre-installed on the box doesn't help if Actions doesn't know the shell
exists. Adds the same setup-msys2 step ci.yml uses, with update:false
since the packages are expected already present (fast no-op per plan).

Claude-Session: https://claude.ai/code/session_01J5PZ3sTHiuW6MdQnepasSU

* ci: stop reinstalling MSYS2 per run on the self-hosted box

The self-hosted paths (selfhosted.yml; ci.yml windows-build's push/
dispatch route) no longer call msys2/setup-msys2 or pacman -S at all.
MSYS2 + the mingw64 package set are now assumed hand-maintained on
corpyvt6agent01 (docs/dev/notes/SELFHOSTED-RUNNER-PLAN.md), invoked by
calling its bash directly (`C:\msys64\usr\bin\bash.exe -leo pipefail
"{0}"`, the same invocation setup-msys2's generated wrapper uses) with
MSYSTEM=MINGW64 so /etc/profile still puts mingw64/bin on PATH.

Adds tools_pc/check-selfhosted-deps.sh: a fast, install-free check that
exits 0 immediately when the required packages (toolchain, cmake,
SDL2, zlib, python, ccache, zip, unzip) are present, or fails with the
exact `pacman -S --needed ...` line to run otherwise — so a missing
package on the box surfaces immediately with a clear fix, instead of
as a confusing failure deeper in the build.

ci.yml's windows-latest (PR) path is unchanged: ephemeral runners still
get a full msys2/setup-msys2 install every time, since there's nothing
to persist there.

Claude-Session: https://claude.ai/code/session_01J5PZ3sTHiuW6MdQnepasSU

* fix: use msys2/setup-msys2 release:false instead of a raw bash-path shell

The previous attempt (invoking C:\msys64\usr\bin\bash.exe directly as a
custom `shell:` command) failed on the actual runner with "Second path
fragment must not be a drive or UNC name" — a real limitation, not a
typo; it failed identically in both files, including the one with a
static (non-templated) shell string, so it wasn't the ${{ }} expression
either.

Root-caused by reading msys2/setup-msys2's actual source: `release:
false` makes it reuse the existing C:\msys64 as-is (hardcoded path in
that branch, confirmed in main.js) instead of downloading+installing a
fresh copy, and — verified in the same source — omitting `update` and
`install` skips every pacman call entirely (just one `uname -a` + a
pacman.conf sed tweak, no network). This is the officially documented
mechanism for self-hosted runners with a pre-existing MSYS2 install
(see the action's README, "release" section).

ci.yml's windows-build now runs setup-msys2 unconditionally but with
release/update/install all keyed off github.event_name: full install on
windows-latest (PR, ephemeral), reuse-only on the self-hosted box
(push/dispatch). selfhosted.yml always uses release:false. Both then
run tools_pc/check-selfhosted-deps.sh to verify the box's hand-
maintained packages are actually present.

Claude-Session: https://claude.ai/code/session_01J5PZ3sTHiuW6MdQnepasSU

* fix(selfhosted.yml): cp -r for the ROM sidecar directories

Found by testing with the ROM seed actually in place: pcmodels-ntsc-final
and pccg-ntsc-final are directories (not single files, unlike
ge007.ntsc-final.z64), so a plain `cp` failed with "omitting directory"
and left the seed step failing on every run even with the seed populated.

Claude-Session: https://claude.ai/code/session_01J5PZ3sTHiuW6MdQnepasSU

* ci: drive MSYS2 MINGW64 directly via ci-shell.cmd, drop msys2 shell shim

The self-hosted runs were dying with 'msys2: command not found' because the
msys2/setup-msys2 action's shell shim was never registered on the box. Replace
the dependency on that shim with a small committed launcher (tools_pc/ci-shell.cmd)
that headlessly reproduces the local 'MSYS2 MINGW64' terminal:

  - MSYSTEM=MINGW64 + /mingw64/bin on PATH
  - NON-login bash, so it keeps the workspace cwd (a login shell cd's to $HOME
    and would break every relative path in the workflow)
  - -e -o pipefail for GitHub-style error propagation

Both workflows now set defaults.run.shell to C:\msys64\ci-shell.cmd {0}; a
bootstrap step (shell: cmd) refreshes the launcher from the repo into C:\msys64
each run. selfhosted.yml drops setup-msys2 entirely; ci.yml keeps it only for
the ephemeral windows-latest PR path (which installs MSYS2 at C:\msys64).

.gitattributes: force CRLF for *.cmd so cmd.exe parses the launcher correctly.

* Revert "ci: drive MSYS2 MINGW64 directly via ci-shell.cmd, drop msys2 shell shim"

This reverts commit a976b2589c.

* docs(D244): log self-hosted-runner link failure — undefined reference to objectiveGetStatus_WEAK

First real build attempt on the reinstalled corpyvt6agent01 box (run
34707798707) fails at link with an unresolved #pragma weak alias. A local
repro of the identical alias pattern links fine on current MSYS2
(gcc 16.2.0/binutils 2.47); the box reports gcc 16.1.0 — likely a stale
toolchain, consistent with rollout step 2's earlier package-hygiene gap.

Claude-Session: https://claude.ai/code/session_01CUFSnpgrAyQSDVHoQQ6Sx3

* fix(verify.sh): surface run.log tail on NO-FRAMES instead of silently discarding it

sweep mode's per-level run.log (the game process's own stdout/stderr, where
an SDL/GL init failure would show up) was captured into a mktemp capdir but
unconditionally rm -rf'd with no diagnostic ever printed for the NO-FRAMES
(no-crash) case -- every level failed this way on the self-hosted runner's
first real sweep attempt with zero clue why.

Claude-Session: https://claude.ai/code/session_01CUFSnpgrAyQSDVHoQQ6Sx3

* fix(selfhosted.yml): stop deleting the ROM seed dir -- cache save silently fails on this box

actions/cache/save has been failing to persist the ROM cache entry on
corpyvt6agent01 (WARNING annotation, tar.exe exit code 2) but doesn't fail
the step -- by design, a cache-save failure is non-fatal, so the workflow
carried on and the now-unconditional "Delete one-time seed dir" step wiped
the only copy of the ROM every single run. Every dispatch since has failed
at "Seed ROM cache" with an empty seed dir and an empty cache -- exactly
the user-reported "it wipes out the ROM data each run".

Fix: don't delete the seed dir. It's cheap disk (three files, a few hundred
MB) and the existing restore-then-seed-if-missing logic already treats it as
the fallback source whenever the cache comes back empty, so leaving it in
place is safe and makes the workflow tolerant of the cache-save bug until
that's root-caused separately.

Claude-Session: https://claude.ai/code/session_01CUFSnpgrAyQSDVHoQQ6Sx3

* fix(verify.sh): sweep --json never actually produced a verdict array; fix NO-FRAMES diagnostic clipping it further

Two bugs, found together while chasing the self-hosted runner's first real
sweep attempt:

1. sweep mode's `out=$(verify_level ...); echo "$out" | head -1` always
   discarded emit_verdict's second (--json) output line -- RESULTS_JSON was
   declared for assembling a verdict array but never populated or printed,
   so `sweep --json` has never produced anything but `[]` for the
   workflow's "Extract JSON verdict" step. Now builds and prints a real
   `[{...}, {...}]` array before the RC exit.

2. My own D244-session addition (printing a NO-FRAMES level's run.log tail)
   wrote to stdout, which the same `out=$(...)/head -1` capture turned into
   the *new* first line, clipping the real verdict summary. Moved to stderr,
   which bypasses that capture.

Claude-Session: https://claude.ai/code/session_01CUFSnpgrAyQSDVHoQQ6Sx3

* docs: regenerate findings-index.csv for D244

Claude-Session: https://claude.ai/code/session_01CUFSnpgrAyQSDVHoQQ6Sx3
2026-09-12 15:33:07 -04:00

16 KiB

1# GENERATED by tools_pc/gen_findings_index.py -- do not hand-edit.
2# Grep this to pick which findings.md entries to read; it is not authoritative.
3labelbucketone_linerstatus_raw
4D24-D30RESOLVEDgreen threads / kernel / crash handlerresolved
5D31-D42RESOLVEDboot ABI: ANIM_DATA, music seq-table, libaudio banks, Globalimagetable rebase, GL context, rsp toggleresolved
6D43-D50RESOLVEDmodel-file loading → offline sidecar "Plan B" (d43_emit.py); D50.6 texCopyGdls full-slot copyresolved
7D51-D58RESOLVEDfont pixeldata, osGetCount tick rate, model RW pools, cseq BE header, synth slots, RLE menu bg, watch raw offsets, gun-barrel DLresolved
8D59-D68RESOLVEDintro render: blood-RLE clobber, DMA validate, OSMesgQueue, HEADS/BODIES sentinels, romCopy width, image_entry, Globalimagetable BE→LEresolved
9D70-D74RESOLVEDintro-logo pixels: C-array bswap, UV path, sinf/cosf DVAL(), texture-import truncationresolved
10D75OPENfront-end 3D model transforms (D77 audio split out below —OPEN (parked). M-32 triage (see §F "D75 ADDENDUM"):
11D76 · D164PROPOSEDdisclaimer/legal screen only draws line 1 —fix proposed (not applied —
12D159FIXEDfront-end wallet-Bond photo "interlaced"/combed (RC1 / D149) —FIXED (#ifdef PORT no-op the swap in image.c)
13D161FIXEDDepot (-level_30) ceiling = bright-blue speckle + radial rays (B2).FIXED (port/fast3d/gfx_pc.cpp)
14D165 · D166FIXEDinput-layer polish (M-31, port-only, port/src/input.c):FIXED
15D180 · D181PARTIALnative-PC input pass (QoL run, qol/native-pc-input-menu):LANDED, config-gated, feel-checks owed
16D186PARTIALVideo.FpsCap throttles the sim, not just presentation (M-39 diag, M-42 clamp).CLAMP LANDED (port/fast3d/gfx_sdl2.cpp, port/src/video.c); real fix owed
17D187FIXEDHUD ammo-type/weapon icon vanished at -O2 (M-46 root-cause, M-47 fix + verify).FIXED (src/game/gunfire.c, #ifdef AVOID_UB); PR #19
18D188FIXEDLinux -O2 boot crash:FIXED (src/libultrare/libc/xprintf.c, src/sprintf.c, #ifdef PORT); PR #22
19D189FIXEDLinux -fstack-protector aborts on the decomp's latent stack-buffer overruns (M-48) —FIXED (CMakeLists.txt, src/game/stan.c #ifdef PORT); PR #23
20D190?Linux -level_45 SIGSEGV at load in add_ptr_to_objective (objective.c:64) (M-48, open).CLOSED — not a port bug; level 45 is MP-only and has no solo setup file in the ROM (root-caused M-105, reproduced on Windows).
21D191FIXEDWindows -O2 release-bundle crash:FIXED + PLAYTEST-VERIFIED (M-79).
22D193FIXEDNPC AI locomotion is too slow —FIXED + user-playtest-verified (M-81) —
23D194OPENMouse input needs another tuning pass —OPEN — root cause and fix direction known, not implemented.
24D195OPENTransparency / alpha surfaces broken on Control (M-49, user playtest) —OPEN — not investigated (M-49), needs a capture
25D197OPENCharacter face/head textures wrap around the head, seen on Silo (M-49, user playtest).OPEN — not investigated (M-49), needs a capture
26D198FIXEDalAdpcmPull/_decodeChunk used K0_TO_PHYS (an unconditional & 0x1FFFFFFF mask) on 64-bit heap pointers (src/libultra/audio/load.c).FIXED (src/libultra/audio/load.c) —
27D199PARTIALPhase-3 software audio mixer:LANDED (port/src/mixer.c, port/include/mixer.h, include/PR/abi.h) —
28D200FIXED-level_09 segfault: reverb's ALDelay.input/output are u32 —FIXED — 5-line cast in reverb.c (this session)
29D196FIXEDOS mouse cursor stays visible after closing the F10 options overlay in click-to-lock mode (M-49, user playtest).FIXED (6e758f1d, merged to main) —
30D192OPENFront-end mission/level-select grid pointer still can't reach the outer cells —OPEN — root-caused, not fixed (M-49)
31D221FIXEDSELECT FILE screen: the mouse hit-box for a file slot is vertically offset from its visible box —FIXED (M-91) — root cause was NOT a coordinate/origin mismatch:
32D222OPENHigh Video.FovScale breaks culling —OPEN — root cause known, not fixed.
33D223FIXEDQoL ask: mouse-wheel weapon cycling should be directional like a normal PC shooter —FIXED (M-105, port/src/input.c) —
34D224FIXEDQoL gap (M-87, from a PD-PC-port survey):DEPRIORITIZED (M-87, user call).
35D225OPENDev-tooling QoL (M-87, user ask):OPEN — root-caused, not implemented.
36D226OPENQoL ask: player-adjustable HUD scale for the ammo counter, bottom-left pickup/item status text, and top-of-screen dialogue/subtitle text.OPEN — root cause / call sites identified, not designed or implemented.
37D227FIXEDSky renders as two independently-moving halves —FIXED (M-100b, PR #43) —
38D229OPENWater on IsWater levels renders green and pulses blue<->green on an interval (M-101, user playtest, Frigate -level_26; Surface 2 also an IsWater level).OPEN — pre-existing (A/B proven), mechanism partly identified, not root-caused.
39D230OPENIn-level music quality:OPEN — not investigated.
40D233FIXEDAll levels (intermittent):FIXED (port/fast3d/gfx_pc.cpp, gfx_sp_tri1) —
41D234OPENDam: guard towers along the dam structure invisible except the first one (M-106, user QA report).OPEN — not root-caused.
42D244OPENSelf-hosted CI runner (corpyvt6agent01) link failure:OPEN, not yet fixed. Next:
43D228OPENAK47 (and other) weapon models still show WHITE missing-texture patches after D217's texpool-alignment fix —OPEN — newly split out, not investigated.
44D204FIXEDPC audio ran ~2 % below real time permanently:FIXED (port/src/audio.c, port/src/libultra.c, port/include/audio.h) —
45D203OPENSteam Deck (SteamOS, x86_64 Linux) v0.1.0 release bundle:OPEN — negative idle repros only; not yet reproduced with input.
46D201FIXEDsrc/libultra/audio/bnkf.c bank/instrument/sound/wavetable relocation offsets were s32, truncating the real 64-bit base pointer.FIXED (src/libultra/audio/bnkf.c) —
47D202RESOLVEDSilenced PPK plays a "slap" instead of a gunshot, PLUS user reports broader real-time audio corruption (M-52 → M-59 → REOPENED M-60 → M-61/M-62 closed the data…ROOT CAUSE ESTABLISHED (M-66); DISPOSITION C IMPLEMENTED + MEASURED (M-66b) —
48D206FIXEDPC played every SFX one bank slot too high —FIXED (M-76, src/snd.c:1001, #ifdef PORT → soundArray[soundIndex - 1], N64 line verbatim under #else).
49D207PROPOSEDAlarm klaxon starves combat SFX and (per user) doesn't recover after it stops —MONITORING (M-77c: user reports the alarm is acceptable in play after D206; no fix shipped) —
50D208FIXEDPlayer weapon-fire sound goes permanently silent mid-firefight (all other SFX unaffected) —FIXED + user playtest-verified (M-78d) —
51D209FIXEDEvery AI character in the game is locked to a *walk* animation regardless of the speed the ailist commands —FIXED + user-playtest-verified (M-81).
52D210FIXEDchrToPatrol() leaves act_patrol.lastvisible60 uninitialised on PC —FIXED (chraction.c:3872, #ifdef PORT → self->act_patrol.lastvisible60 = -1;, N64 line under #else).
53D205RESOLVEDPC plays wrong/extra SFX for gameplay events the user can A/B against N64:CLOSED (M-78) — root cause was D206; all four symptoms resolved + user-confirmed by ear vs N64.
54D152+FIXEDD152 addendum (M-31):FIXED (src/snd.c, port/src/libultra.c, #ifdef PORT) —
55D168FIXEDGE_PCDUMP / F12 PPM captures were vertically flipped —FIXED (port/fast3d/gfx_opengl.cpp); D114 / D116 reclassified as capture-orientation artifacts (below).
56D169FIXEDFront-end mouse pointer can't reach the outer cells of the mission/level-select grid —FIXED (M-33, port/src/input.c, port-only, no #ifdef PORT).
57D178FIXEDPre-mission briefing screen:FIXED (M-36) — high confidence
58D175OPENIn-game stutter / brief hang during normal play (user QA report):OPEN — observed, not investigated
59D176FIXEDSurface exterior renders wrong (-level_36), two independent defects.(a) "scrolls too fast/tiles too visibly" ROOT-CAUSED + FIXED (see "D176(a) —
60D177FIXEDLadders non-functional —FIXED (M-36) — high confidence; interactive climb test owed
61D172FIXEDBullet-impact / blood / spark particles render magenta or cyan instead of dark red (M-82, ROOT CAUSE FOUND + FIXED).FIXED (port/fast3d/gfx_pc.cpp gfx_lod_tile_offset):
62D174OPEN"No blood effect" (user QA report).OPEN — observed; first step = BUNKER1 firefight with regenerated sidecars
63D183OPENM-36 Family A ("texture line/pitch shear") is DISPROVEN for the Surface repro (-level_36).Hypothesis DISPROVEN + diagnostics shipped; D176(b)/D182(2) still OPEN
64D173OPENThird-person Bond model spawns too high (user QA report):OPEN — observed, not investigated.
65D179FIXEDPackaged build crashes after the logos —Diagnosed, not fixed —
66D180PARTIALNative-PC input pass (M-XX QoL run, qol/native-pc-input-menu, port-only).LANDED, port-only, no #ifdef PORT.
67D181PARTIALGame.ScreenShakeIntensity —LANDED behind config, default = original.
68D184PARTIALF10 port-layer options overlay —LANDED, port-only, no #ifdef PORT in src/.
69D211PARTIALPC FOV slider — Video.FovScale (M-83 QoL wave, port-only, WIDESCREEN-FOV-PLAN.md Phase 4).PARTIAL — M-84 refix:
70D212PARTIALAnisotropic-filtering config wiring —LANDED, port-only. Build clean.
71D213PARTIALOn-screen FPS readout —LANDED, port-only. Build clean; bunker1 no-op confirmed.
72D214PARTIALKeyboard rebinding — [Input.Bind] config section (M-83, port-only, PD parity, Phase 4 debt).PARTIAL — M-84: code PASS (alt/ctrl); one doc-only fix.
73D215FIXED1P weapon viewmodel never drew in-level —FIXED (src/game/gunfire.c, #ifdef PORT).
74D216PARTIALGame.SkipIntro — boot straight to the file-select menu (M-83, port + one #ifdef PORT game-code line, PD parity, Phase 4 quick win).LANDED + VERIFIED this session.
75D217FIXED1P weapon viewmodel + third-person Bond model textures render garbled —FIXED (M-90/M-92/M-97; PR #47 texpool alignment + PR #49 CI-cache palette key) —
76D218PROPOSEDWide FOV exposes the per-level draw-distance / fog boundary —Logged (M-84), fix proposed + parked.
77D219OPENPPK explosions render purple on Dam (M-87, user QA, "not 3D but noting").OPEN — observed, not investigated.
78D220PARTIAL1P muzzle flash position shifts upward at higher Video.FovScale (M-87, user QA, Jungle/M16).ANALYZED (M-91) — the suspected unscaled-viewmodel root does NOT hold; this is correct perspective behavior, likely cosmetic/QoL.
79D85OPENroom primary/secondary DL → texLoadFromGdl garbageOPEN (safety-netted; widen/pool fixes landed, geometry now renders)
80D86 · D87RESOLVEDmodelInitRwData truncated ptr · attract-demo BE ramromfilestructureresolved
81D88.4RESOLVEDpropDefs polymorphic record stream not byteswapped → setupDoor crashresolved (d88_propdefs.py); layout audit M-20 → D132
82D132PROPOSEDD88 propDefs layout audit (M-20):proposed fix (not applied) —
83D157FIXEDCampaign never unlocks the next level (M-30, user bug —FIXED (src/bondtypes.h, #ifdef PORT —
84D160PARTIALDam level-end cutscene (Bond off the dam / bungee) never plays —DIAGNOSTIC SHIPPED, not root-caused (c95713f5, #ifdef PORT + GE_D160=1):
85D89-D92RESOLVEDstage-load→frame: stan zero-fill overrun, portal address trunc, chr/AI spawn ptrsresolved
86D93-D102RESOLVEDstruct-pun / hardcoded-size pass:resolved (D95 pool bump partial)
87D103-D107RESOLVEDBUNKER1 viewport height, depth-buffer clear (G_CLEAR_DEPTH_EXT), portal near-plane, LOD mip tileresolved
88D108-D112RESOLVEDskeletal models: d43_emit.py put_f32 byte-reversal bugresolved
89D113-D116FIXEDportal BFS ok · matrix chain ok · player raw-offset audit + gunfire.c THROW* · HUD text X-mirrorD114/D116 CLOSED — NOT A BUG (M-33, see D168):
90D117OPENframe nondeterminism root-caused; GE_DETERM deferred; framediff.py structural.OPEN (mode attempted, not achieved)
91D118RESOLVEDSDL input layer (port/src/input.c); M-24 mouse-look rework:resolved (D118a residual)
92D150FIXEDwatch OBJECTIVES / BRIEF page crash:FIXED (src/str.c #ifdef PORT); interactive re-verify pending
93D137FIXEDright-mouse (aim-sight) crash:FIXED (src/game/gunfire.c #ifdef PORT —
94D119 · D120FIXEDguard-attack weapons_held[]->chr pun crash · blood-stain PointUsage[] chain hangD119 fixed · D120 FIXED (M-30)
95D120FIXEDBlood-decal PointUsage[] chain —FIXED (tools_pc/d43_emit.py).
96D121RESOLVEDWS1 frictionless per-level boot:resolved
97D122FIXEDper-level prop/item model-load crash (Dam/Facility/Runway modelLoad/modelInitRwData):converter fixed; residual chr/fast3d crashes on those levels are separate
98D123FIXEDcrash class C1: chrIsNotDeadOrShot NULL deref on 6 levels (Dam/Runway/Frigate/Statue/Streets/Cradle).converter fixed (OBJ_ID_WORDS); C1 cleared on all 6, residual crashes are fast3d (C2)
99D125RESOLVEDcrash classes C3+C6 (Aztec/Bunker2/Surface2):resolved (M-16b) — line 374 → 8 NULs; all 21 sidecars regen'd; Aztec -level_28 now PASSES (was C3 CRASH).
100D126RESOLVEDcrash classes C3r/C4/C6 (Bunker2 -level_27 door7F054FB4 propobj.c:13523, Depot -level_30 prop.c:902, Surface2 -level_43 loadobjectmodel.c:393):resolved — d88_propdefs.py PROPDEF_PC_BYTES[30/32/33/35]=24 + typed handler; loadobjectmodel.c sizepropdef PORT returns 6.
101D124FIXEDcrash class C2: fast3d bad texture pointer.Jungle fixed (port/src/gimgfixup.c); Facility → D130
102D131RESOLVEDcrash class C2m (Jungle -level_37):resolved — seg_addr() restores the module high word for any fallthrough w1 in [0x40000000, 0x70000000) (module fixed-based at 0x140000000, no ASLR; DRAM/KSEG0/segmented/phys all handled earlier).
103D133RESOLVEDintro render triage (M-20):RESOLVED — not a regression, parked (D75/D76, GRAPHICS-BACKLOG.md)
104D134FIXEDFrame-2 boot hang / sweep "NO-FRAMES" flakiness —FIXED (port/src/libultra.c)
105D135FIXEDFirefight crash — bgTestHitOnObj (propobj.c:8446) is an unported N64 GBI parser (M-22, WS6 playtest).FIXED (src/game/propobj.c, #ifdef PORT —
106D136RESOLVEDStage-unload crash — objFree obj->prop reads float garbage (M-22, WS6 Facility playthrough).ROOT-CAUSED → D139 (it was NOT a layout bug —
107D139FIXEDStage-unload crash root cause + fix (M-23).FIXED (src/game/cleanup_objects.c, #ifdef PORT —
108D140FIXEDPause-menu crash (M-23 open → M-27 fixed).FIXED (src/game/bondview.h, src/game/bondview2.c; #ifdef PORT).
109D141FIXEDWatch-menu item-model crash (M-27), exposed by D140.FIXED (src/game/gunfire.c, #ifdef PORT).
110D152OPENMission-failed / objective-failed → permanent black screen (M-28, user bug report —MITIGATED (port/src/libultra.c, M-28, #ifdef PORT/port-only).
111D154FIXEDbg.c room-geometry ray/hit-test GBI parser port (M-28, WRITTEN / UNVERIFIED / UNCOMMITTED).M-30 re-audit + fixes (still playtest-gated for final verify).
112D156PARTIALFacility outro-cutscene "hang" —GUARDED (src/game/model.c, #ifdef PORT):
113D155FIXEDFacility outro-cutscene end → "hang" = unclamped deltaFrames spiral (M-29, user bug report).FIXED (src/game/frametiming.c, #ifdef PORT —
114D153RESOLVED-level_09 frame ~900–1400 0xc0000005 = D117/D134 load flakiness, NOT a bug (M-28).NOT A BUG — closed. Run anchors on a quiet machine.
115D151FIXEDWatch data all blank —FIXED (src/bondtypes.h, #ifdef PORT —
116D130RESOLVEDcrash class C2 (Facility -level_34, Runway -level_35):resolved — stage all 6 N64 fields in a local f[6] before writing any.
117D164PROPOSEDDisclaimer / legal screen only draws the first line (D76 root cause, M-31).FIX PROPOSED, NOT APPLIED (front.c is owned by another agent this session).
118D165FIXEDFront-end menu cursor doesn't feel like a mouse pointer (M-31, user bug B5 follow-up).FIXED (port/src/input.c; Input.MenuPointerMode, Input.HipfirePitchSpeed added).
119D166FIXEDHipfire mouse pitch is digital while yaw is analog —FIXED (port/src/input.c).
120D235OPENWrong textures load after dying/restarting a level —OPEN — needs: does it repro on a *fresh* level boot (rules out reload-state) vs only after death/restart (confirms it); which surfaces; a screenshot.
121D236OPENSurface 1: 2D billboard trees render as a wall/sheet of tree texture instead of discrete camera-facing tree sprites (M-106, user QA report).OPEN — not investigated
122D237OPENQoL ask (M-106, user QA):OPEN — not designed; port-only
123D238OPENQoL ask (M-106, user QA):OPEN — not designed; port-only (port/src/input.c + config.c)
124D239OPENQoL ask (M-106, user QA):OPEN — supersedes/re-confirms the M-82 always-grab removal item; port-only