description: "Verify closed bug fixes haven't regressed — dynamically discovers and checks" argument-hint: "--issues <N,N,N> --limit <N> --label <label>"
Regression Verification Audit
Confirm that previously-fixed bugs are still fixed. This audit dynamically discovers closed bug issues from GitHub, locates each fix and its guard test, and reports any fix that has gone missing as a Regression of #NNN.
See .claude/commands/_audit-common.md for project layout, severity, dedup,
context rules, and the per-finding format. See .claude/commands/_audit-severity.md
for the severity scale. This file only adds the regression-specific flow.
Parameters (from $ARGUMENTS)
--issues <N,N,N>: Verify only these issue numbers (e.g.,--issues 9,16,1516).--limit <N>: Max closed issues to verify (default: 50).--label <label>: Issue label filter (default:bug).
Step 1 — Discover fixed issues
gh issue list --repo matiaszanolli/ByroRedux --state closed --label bug \
--limit 50 --json number,title,body,closedAt,labels
With --issues, fetch those numbers directly (gh issue view <N> --repo matiaszanolli/ByroRedux --json number,title,body,closedAt,labels) instead.
Default
--label bugstructurally misses closed issues carrying only thedocumentation/doc-rotlabels (e.g. #1818, a doc-rot fix) — pass--label bug,documentation,doc-rotto include doc-rot regressions in the discovery pass. To scope a regression sweep to one title, filter on the game axis instead:--label game:skyrim(likewisegame:fnv,game:fo3,game:fo4,game:fo76,game:oblivion,game:starfield).
For each issue, pull out:
- Number + title — the regression handle.
- File references — backtick-quoted paths in the body (
crates/nif/...). - Acceptance criteria / fix description — what the fix is supposed to do.
- Related
#NNNN— phased fixes split across several issues (e.g. #1210 → #1255 → #1257) regress as a set; verify the whole chain, not just the head.
Discovery window caveat. The repo has 1600+ closed issues. The default
--limit 50only covers the most-recently-closed bugs, so older high-value fixes get no coverage unless you raise--limitor pass them via--issues. The unconditional Step 4 fragile-area checks are the safety net for fixes that landed as proactive refactors and were never an issue at all — run them every time regardless of which issues Step 1 surfaced.Fresh verification candidates (recent decompiler-safety + LC wave). Recently-closed, high-churn fixes worth an explicit
--issuespass while they're still warm: #1815 (decompiler recursion-depth cap in the boolean-collapse pass), #1816 (translate_pexmissingcatch_unwind), #1728 (Skyrim-BE/Starfield round-trip test for the.pexreader), #1740 (DA10.pexbyte-equality parity test), #1731 (VWD record-header flag parse + expose), #1718 (ragdoll bone/constraint-drop telemetry on bone-name miss). Note #1651 (BGSM/BGEM GL→Gamebryo blend factors) was itself a WRONG fix — its premise was disproven and reverted by #1823; don't re-verify #1651 as if it still holds. Several of these touch the import→material boundary that Step 4 already pins — cross-check there.
Step 2 — Locate each fix and its guard
For each issue, work the fix → guard-test chain:
- Find the fix commit.
git log --oneline --grep="#<N>"(commits useFix #<N>: …andfix/<N>-…branch merges).git show <commit> --statshows which files moved. - Confirm the fix is present in the live tree. Read the referenced file(s)
at the symbol named in the issue/commit (prefer
grep -n "fn <name>"over a line number — the post-Session-34/35 module splits invalidate old line refs). - Find the guard test. Tests live as
*_tests.rssiblings next to the module they cover (e.g.crates/nif/src/blocks/interpolator_tests.rs), or as#[cfg(test)] mod testsinline. To locate one:grep -rn "<N>" crates/ byroredux/ --include='*.rs'— many tests cite the issue number in a name or comment (fn fix_1516_…,// #1516).- Failing that, grep the fixed symbol or a keyword from the title across
*_tests.rssiblings of the fix file.
- Run the guard to prove it still passes. Crate packages are named
byroredux-<crate>(e.g.cargo test -p byroredux-nif <test_name>,cargo test -p byroredux-renderer,cargo test -p byroredux-core).
Step 3 — Assign a status
- PASS — fix code confirmed present and a guard test exists (ideally run green).
- PARTIAL — fix code present but no guard test. Flag as a hardening gap.
- FAIL — fix code missing or its guard now fails. This is the regression.
Report it with
Status: Regression of #<N>per the_audit-commonfinding format. - UNVERIFIABLE — the issue body names no file/symbol and no fix commit is findable. Note it and move on; don't guess.
Step 4 — Unconditional fragile-area checks
These guard fixes/contracts whose breakage is invisible to GitHub-issue discovery — most landed as refactors, not closed bugs — so check them every run regardless of Step 1's window. A FAIL here is still reported as a regression (reference the relevant issue if one exists, else describe the contract).
NIFAL canonical-translation tier (spec: docs/engine/nifal.md; see also
/audit-nifal for the dimension-level checklist):
- Single material boundary.
byroredux/src/material_translate.rs(fn translate_material) must remain the onlyImportedMesh → Materialsite — per-game material classification lives here, never in a shader.Material(crates/core/src/ecs/components/material.rs)metalness/roughnessmust stay plain resolvedf32fields — no reintroducedOption<f32>and no render-time classifier. The resolve-once contract is the boundary filling overrides +Material::resolve_pbr(which callsclassify_pbr_keyword) filling only the unresolved slots. - Typed particle emitters.
NiPSysEmitter/NiPSysEmitterCtlr/NiPSysEmitterCtlrData/NiPSysGrowFadeModifiermust still parse as typed blocks (crates/nif/src/blocks/particle.rs, dispatched incrates/nif/src/blocks/mod.rs), feedextract_emitter_params/extract_emitter_rate(crates/nif/src/import/walk/mod.rs→ImportedEmitterParamsincrates/nif/src/import/types.rs), and be consumed byapply_emitter_params(byroredux/src/systems/particle.rs). A regression to opaqueNiPSysBlockshows up as zero-sized emitters or clobbered colors. - Collision shape coverage.
BhkMultiSphereShape+BhkConvexListShapemust still translate to aCollisionShapeincrates/nif/src/import/collision/mod.rs(they were previously dropped toNone).
Disney BSDF + GPU struct contracts (recent shader wave):
- The Disney/Burley lobe now lives in
crates/renderer/shaders/include/pbr.glsl(split out oftriangle.frag; the GLSL-PathTracer MIT attribution block stays top-of-triangle.frag, Burley 2012 cite). The per-reservoirresRadiance[]array was retired (#1369 factoring → commit 218b425b, which removed the ReSTIR reservoir G-buffer attachment): WRS is register-local now, recomputing the unshadowed radiance from the light index viashadowableLightRadianceincrates/renderer/shaders/include/lighting.glsl. A regression here is a reintroduced per-thread reservoir array or a re-added G-buffer reservoir attachment — verify the array stays gone, not "intact". #[repr(C)]GPU structs hold their size pins incrates/renderer/src/vulkan/scene_buffer/gpu_instance_layout_tests.rs:GpuInstance= 128 B (gpu_instance_is_128_bytes_std430_compatible) andGpuCamera= 352 B (gpu_camera_is_352_bytes). Run them:cargo test -p byroredux-renderer gpu_.
Output
Write to: docs/audits/AUDIT_REGRESSION_<TODAY>.md (YYYY-MM-DD).
Per-issue entry
## #<ISSUE>: <Title>
- **Status**: PASS | PARTIAL | FAIL | UNVERIFIABLE
- **Closed**: <date>
- **Fix commit**: <hash> (or "not found")
- **Fix site**: `<path>` (`<symbol>`)
- **Fix present**: Yes / No / Unknown
- **Guard test**: `<test name>` in `<path>` — passes / fails / none
- **Notes**: <concerns>
Summary table
| Issue | Title | Status | Fix Present | Guard |
|-------|-------|--------|-------------|-------|
For any FAIL, surface it as a Regression of #NNN finding (base format in
_audit-common.md) and suggest:
/audit-publish docs/audits/AUDIT_REGRESSION_<TODAY>.md
TDD Red-Green-Refactor
Testing
Skill that guides Claude through the complete TDD cycle.
Web Accessibility Audit
Testing
Performs a comprehensive web accessibility audit following WCAG standards.
UAT Test Case Generator
Testing
Generates structured and comprehensive user acceptance test cases.