diff --git a/.claude/skills/meta-audit/history/test-audit.jsonl b/.claude/skills/meta-audit/history/test-audit.jsonl index e6acd4c0..415773ac 100644 --- a/.claude/skills/meta-audit/history/test-audit.jsonl +++ b/.claude/skills/meta-audit/history/test-audit.jsonl @@ -7,3 +7,4 @@ {"type":"run","date":"2026-07-08","commit_sha":"37966b1e2242807ee4ffab2be789a1e2a514d636","pr_url":"https://github.com/stphung/quest/pull/705","agent_count":3,"scope":["tests/game_tick_tests/","tests/combat_tests/","tests/character_tests/","tests/zone_tests/","tests/fishing_tests/","tests/deep_tests/","tests/haven_tests/","tests/enhancement_tests/","tests/stormglass_tests/","tests/loom_tests/","tests/item_tests/","tests/achievement_tests/","tests/history_tests/","tests/misc_tests/"],"findings":[{"location":"src/combat/enemy_generation.rs (calc_zone_enemy_stats:37, generate_enemy_name:10), surfaced via tests/fishing_tests/fishing_core_coverage_test.rs:1065 (test_achievement_events_set_changed_flag_via_game_tick)","claim":"Production combat code calls rand::rng() directly instead of threading the caller's seeded RNG, breaking the tick loop's documented seeded-RNG determinism guarantee; enemy stat variance/name generation is non-deterministic every tick regardless of the rng passed to game_tick(), so combat pacing (and thus which tick an achievement fires on) can vary run to run. The test's own comment attributing this to item-drop RNG is stale -- drops.rs already threads rng correctly since the 2026-07-05 fix.","correct_value":"Thread rng: &mut impl Rng through calc_zone_enemy_stats/generate_enemy_name and their callers (generate_dungeon_enemy, generate_zone_enemy, etc. in src/combat/enemy_generation.rs, src/dungeon/generation.rs, src/dungeon/types.rs); flagged, not fixed -- multi-file production-code change out of test-audit scope","severity":"HIGH","category":"production-non-determinism","auto_fixed":false},{"location":"tests/achievement_tests/achievement_handlers_test.rs:19-33 and achievement_handler_coverage_test.rs:22-35","claim":"build_haven_tiers/build_haven_max_tiers duplicated verbatim (different names) across the two files","correct_value":"Extracted to shared tests/achievement_tests/helpers.rs; both files now use super::helpers (aliased where the coverage file's local name differed)","severity":"MEDIUM","category":"redundant-coverage","auto_fixed":true},{"location":"tests/fishing_tests/{fishing_core_coverage_test.rs:42, fishing_edge_cases_test.rs:30, fishing_extended_coverage_test.rs:40, fishing_integration_test.rs:24, behavior_lock_fishing_dungeon_test.rs:35}","claim":"fresh_state()/create_test_state() duplicated near-identically (only the cosmetic character name string differs) across 5 files","correct_value":"Extracted to shared tests/fishing_tests/helpers.rs::fresh_state(); files using the create_test_state name now alias it","severity":"LOW","category":"redundant-coverage","auto_fixed":true},{"location":"tests/misc_tests/prestige_cycle_test.rs (8 while loops: lines ~49,129,138,148,179,200,221,394 in the pre-fix file)","claim":"Unbounded `while state.character_level < N { apply_tick_xp(...) }` loops with no iteration cap, unlike the sibling loop in the same file (test_combat_to_prestige_full_loop) which asserts tick < 19_999","correct_value":"Added a `let mut iterations = 0; ... assert!(iterations < 1000, ...)` bound to each loop matching the existing convention","severity":"LOW","category":"missing-safety-bound","auto_fixed":true},{"location":"tests/game_tick_tests/tick_stage_coverage_test.rs:37 (run_ticks_collecting helper, 6+ call sites at up to 5,000 ticks)","claim":"Helper has no early-exit at all, unlike sibling loops in the same file that at least break on hit -- strictly worse instance of the known brute-force pattern","correct_value":"N/A -- adding a generic early-exit requires a per-call-site stopping predicate (each caller waits on a different event); flagged, not auto-fixed","severity":"MEDIUM","category":"brute-force-rng-loop","auto_fixed":false},{"location":"tests/achievement_tests/ 7 test-name pairs across achievement_handlers_test.rs, achievements_expanded_test.rs, achievement_coverage_test.rs (e.g. test_unlocked_count_starts_at_zero, test_grand_champion_at_100_wins)","claim":"Recurring redundant-coverage cluster first flagged 2026-07-05, still unresolved two audit cycles later; now also confirmed to include a third file (achievement_coverage_test.rs) for test_grand_champion_at_100_wins","correct_value":"N/A -- consolidating requires a judgment call on which file owns each behavior; flagged, not fixed","severity":"MEDIUM","category":"redundant-coverage","auto_fixed":false},{"location":"tests/misc_tests/prestige_cycle_test.rs:261,350 (test_combat_to_prestige_full_loop)","claim":"Recurring excessive-loop-count finding first flagged 2026-07-07, still present verbatim (20,000 + 2,000 tick full-combat-simulation loop)","correct_value":"N/A -- shrinking requires seed/target-level retuning; flagged, not fixed","severity":"MEDIUM","category":"excessive-loop-count","auto_fixed":false},{"location":"tests/deep_tests/deep_types_coverage_test.rs:521-528,583-590 and deep_tutorial_test.rs:456-473","claim":"3 tests construct a Layer/LayerRecord with 4x Outpost infrastructure via raw struct literals to test the 0.75 duration-reduction cap, bypassing build_infrastructure()'s AlreadyBuilt guard -- only Outpost (of 4 infrastructure types) gives nonzero reduction, so the real reachable ceiling via gameplay is 0.25, making the 0.75 cap dead code from the player's perspective","correct_value":"N/A -- keep one pure-function unit test documenting the clamp, consolidate the near-duplicate, and/or add a case going through build_infrastructure() to show the real reachable ceiling; changes test semantics/count, needs human review","severity":"MEDIUM","category":"structural-impossibility","auto_fixed":false},{"location":"tests/deep_tests/deep_economy_test.rs:869-878 and deep_types_coverage_test.rs:269-274","claim":"Infrastructure duration_reduction() table (outpost 25%, others 0%) tested verbatim twice with identical assertions","correct_value":"N/A -- delete one copy (recommend keeping deep_types_coverage_test.rs's copy); removes a test, needs human review","severity":"LOW","category":"redundant-coverage","auto_fixed":false},{"location":"tests/game_tick_tests/ fresh_state()/strong_state() helpers duplicated with subtle drift across 4 files","claim":"Same-purpose state-builder helpers duplicated across files with slightly different attribute setups","correct_value":"N/A -- consolidation candidate, not a correctness bug; needs human review to reconcile the drifted variants","severity":"LOW","category":"redundant-coverage","auto_fixed":false}]} {"type":"run","date":"2026-07-10","commit_sha":"e4c83025ade516f8aabfd7f4c9d83a16d211d969","pr_url":"https://github.com/stphung/quest/pull/716","agent_count":3,"scope":["tests/game_tick_tests/","tests/combat_tests/","tests/character_tests/","tests/zone_tests/","tests/fishing_tests/","tests/deep_tests/","tests/haven_tests/","tests/enhancement_tests/","tests/stormglass_tests/","tests/loom_tests/","tests/item_tests/","tests/achievement_tests/","tests/history_tests/","tests/misc_tests/"],"findings":[{"location":"tests/game_tick_tests/game_loop_orchestration_test.rs:458","claim":"test_debug_mode_suppresses_achievement_save_flag_for_leviathan ran game_tick once and only asserted inside an if-guard on a rare event, so it silently passed without exercising debug-mode suppression","correct_value":"Restructured to loop with break-on-event and assert unconditionally; this then surfaced a real regression (see next entry), fixed by calling process_fishing_tick directly instead of the full game_tick pipeline","severity":"HIGH","category":"masked-assertion","auto_fixed":true},{"location":"tests/game_tick_tests/game_loop_orchestration_test.rs:460-508","claim":"After the masked-assertion fix above started actually reaching the StormLeviathanCaught event, the test failed consistently across 10 verification runs (not flaky) because driving the full game_tick pipeline for thousands of ticks lets unrelated combat achievements unlock in the same window, also setting achievements_changed","correct_value":"Call core::tick_stages::process_fishing_tick directly (isolating the fishing stage from combat), mirroring the existing process_fishing_tick_storm_leviathan_caught_sets_flag_and_achievement unit test","severity":"HIGH","category":"test-design-flaw","auto_fixed":true},{"location":"tests/enhancement_tests/enhancement_coverage_test.rs:943-983","claim":"game_tick_soulforge_discovery_blocked_by_active_dungeon looped 1000x over the full tick pipeline to assert something guaranteed on iteration 1 (P=0 by construction, not RNG)","correct_value":"Reduced to 5 iterations","severity":"HIGH","category":"structural-impossibility-loop","auto_fixed":true},{"location":"tests/game_tick_tests/game_loop_orchestration_test.rs:424-455,762-797,814-849","claim":"3 tests wrapped their real assertion in an if-guard on a rare precondition (character_level>=10, achievement unlocked, item dropped) with no failure on the untriggered branch","correct_value":"Assert the precondition explicitly before the real check, so an unmet precondition fails loudly instead of silently skipping verification","severity":"MEDIUM","category":"masked-assertion","auto_fixed":true},{"location":"tests/combat_tests/combat_submodules_test.rs:30-108, tests/combat_tests/combat_damage_pipeline_test.rs:30-95","claim":"Near-identical combat test helpers (fresh_state, derived, seeded_rng, etc.) duplicated and drifted (different seeds) across two files","correct_value":"Extracted to shared tests/combat_tests/helpers.rs, seeded_rng parameterized to preserve each call site's original seed","severity":"MEDIUM","category":"duplicate-helpers","auto_fixed":true},{"location":"tests/enhancement_tests/enhancement_coverage_test.rs:987-1020","claim":"game_tick_soulforge_discovery_idempotent_after_discovery looped 500x over an already-guaranteed-false condition","correct_value":"Reduced to 5 iterations","severity":"MEDIUM","category":"structural-impossibility-loop","auto_fixed":true},{"location":"tests/enhancement_tests/enhancement_edge_cases_test.rs:577-591","claim":"test_discovery_never_fires_below_p15 looped 1000x despite its own comment stating probability is exactly 0.0 via an early-return check","correct_value":"Reduced to 10 iterations","severity":"MEDIUM","category":"structural-impossibility-loop","auto_fixed":true},{"location":"tests/item_tests/item_combat_coverage_test.rs:655,709,726,771","claim":"4 tests average only 20 samples from production functions using unseeded rand::rng(), making failures non-reproducible (though currently low-risk given wide multiplier margins)","correct_value":"Bumped sample counts 20->200 as a cheap mitigation; full fix needs a _with_rng variant in src/combat/enemy_generation.rs (production change, out of scope)","severity":"MEDIUM","category":"unseeded-rng","auto_fixed":true},{"location":"tests/misc_tests/prestige_cycle_test.rs:281-417 (test_combat_to_prestige_full_loop)","claim":"Full combat-to-prestige simulation loop runs up to 20,000+2,000 ticks through the whole update_combat/derived-stats/spawn pipeline, slowest test in scope","correct_value":"Left as-is — changing what this integration test proves needs human judgment, not a mechanical fix","severity":"MEDIUM","category":"heavy-simulation-loop","auto_fixed":false},{"location":"tests/character_tests/character_dungeon_coverage_test.rs:32, tests/character_tests/character_prestige_edge_test.rs:64, tests/character_tests/character_coverage_test.rs (make_state_at_level)","claim":"item_with_affix and state builder helpers duplicated/drifted across character_tests files","correct_value":"Extracted to shared tests/character_tests/helpers.rs (base_item, item_with_affix, state_at); 23 make_state_at_level call sites renamed to state_at","severity":"LOW","category":"duplicate-helpers","auto_fixed":true},{"location":"tests/deep_tests/deep_mercenary_test.rs:108,135,175","claim":"3 Monte Carlo distribution tests used n=10,000 with a tolerance ~12 standard errors wide, far more samples than needed","correct_value":"Reduced n to 1500 (tolerance unchanged, still ~4.6 SE wide); verified 8x consecutive runs with no flakiness","severity":"LOW","category":"excessive-loop-count","auto_fixed":true},{"location":"tests/enhancement_tests/enhancement_test.rs:107-120,187-196, tests/enhancement_tests/enhancement_coverage_test.rs:731","claim":"f64::EPSILON used as tolerance for computed (non-literal) float comparisons, giving zero margin if the computation path ever changes","correct_value":"Swapped to 1e-9 for defense-in-depth on computed-value assertions only","severity":"LOW","category":"float-equality-margin","auto_fixed":true},{"location":"tests/haven_tests/haven_dungeon_coverage_test.rs:635-645","claim":"Comment said 'exactly 500ms ago' but code used Duration::from_millis(501); not currently flaky but misleading and could invite a real boundary-flake fix later","correct_value":"Updated comment to '501ms ago (500ms threshold + 1ms buffer to avoid boundary flake)'","severity":"LOW","category":"misleading-comment","auto_fixed":true},{"location":"tests/item_tests/item_pipeline_test.rs:1101-1107 (test_tier_stored_on_generated_items)","claim":"Looped 50x with unseeded RNG to assert item.tier<=9, a structurally-guaranteed invariant (P=1) unrelated to RNG variance","correct_value":"Rewritten to use a seeded ChaCha8Rng with a few reps, mirroring the sibling test_generated_items_always_have_positive_attributes pattern","severity":"LOW","category":"structural-impossibility-loop","auto_fixed":true},{"location":"tests/misc_tests/prestige_cycle_test.rs:50,136,151,167,204,231,258,437","claim":"Identical level-up-loop boilerplate duplicated 6+ times","correct_value":"Extracted level_up_to(rng, state, target_level, xp_chunk) helper","severity":"LOW","category":"duplicate-helpers","auto_fixed":true},{"location":"tests/history_tests/history_git_test.rs:18, tests/history_tests/history_integration_test.rs:7","claim":"Identical meta() CommitMetadata builder duplicated across two files with no shared helpers module","correct_value":"Extracted to tests/history_tests/helpers.rs, wired via mod helpers in tests/history_tests.rs","severity":"LOW","category":"duplicate-helpers","auto_fixed":true},{"location":"tests/game_tick_tests/tick_stages_coverage_test.rs:33-48, tests/game_tick_tests/game_loop_orchestration_test.rs:37-49, plus create_strong_character variants across 4+ files","claim":"Drifted duplicate state-builder helpers across 4+ game_tick_tests files with subtle differences (one sets Constitution/caches derived stats, others don't)","correct_value":"Not auto-fixed — reconciling drifted variants needs human judgment, flagged 2026-07-08, still unresolved","severity":"LOW","category":"duplicate-helpers","auto_fixed":false},{"location":"tests/deep_tests/ (12 files: deep_integration_test.rs, deep_mercenary_test.rs, deep_mission_test.rs, etc.)","claim":"Heavy setup (seeded_rng, make_merc, DeepState/GameState construction) duplicated across 12 files with no shared helpers.rs, unlike fishing_tests/loom_tests which already have one","correct_value":"Not auto-fixed — consolidating requires reconciling test logic across files, human judgment","severity":"LOW","category":"duplicate-helpers","auto_fixed":false},{"location":"tests/game_tick_tests/tick_integration_test.rs:1069-1074 (test comment)","claim":"Test documents that production functions (spawn_enemy_if_needed, apply_tick_xp, enemy_generation.rs) call thread_rng()/rand::rng() internally instead of the injected seeded RNG, so game_tick_tests are not fully deterministic despite passing a seeded RNG","correct_value":"Not auto-fixed — requires threading rng: &mut impl Rng through production functions, out of test-file-only scope","severity":"MEDIUM","category":"production-non-determinism","auto_fixed":false},{"location":"~40 locations across game_tick_tests/, enhancement_tests/, fishing_tests/, stormglass_tests/, item_pipeline_test.rs","claim":"Brute-force RNG-search loops (loop until rare event fires, no deterministic shortcut) tracked as known debt since 2026-07-02","correct_value":"Intentionally left as-is per skill guidance — needs seed research or production RNG-injection change, outside auto-fix scope","severity":"LOW","category":"known-debt-brute-force-rng","auto_fixed":false}]} {"type":"run","date":"2026-07-11","commit_sha":"64e8b1bec360019875305713d52265a2fe086c08","pr_url":"https://github.com/stphung/quest/pull/721","agent_count":3,"scope":["tests/game_tick_tests/","tests/combat_tests/","tests/character_tests/","tests/zone_tests/","tests/fishing_tests/","tests/deep_tests/","tests/haven_tests/","tests/enhancement_tests/","tests/stormglass_tests/","tests/loom_tests/","tests/item_tests/","tests/achievement_tests/","tests/history_tests/","tests/misc_tests/"],"findings":[{"location":"tests/stormglass_tests/storm_lure_test.rs:146","claim":"1000-seed loop proving CatchMiss never occurs with 0.0 lure bonus","correct_value":"Structural impossibility per the `if lure_catch_bonus > 0.0` branch in generate_fish_with_rank, not a probability roll; reduced to 100 seeds","severity":"LOW","category":"excessive-loop-count","auto_fixed":true},{"location":"tests/fishing_tests/fishing_core_coverage_test.rs:1087-1094","claim":"Comment blamed items::drops::try_drop_from_mob/try_drop_from_boss for calling rand::rng() directly as the cause of a 3500-iteration loop bound","correct_value":"items::drops was already fixed in #692 to thread a caller rng; the actual remaining non-determinism source is combat::enemy_generation (generate_enemy_name/calc_zone_enemy_stats/generate_zone_enemy_name) still calling rand::rng() directly. Comment corrected; loop bound left unchanged since the underlying non-determinism is still present","severity":"MEDIUM","category":"stale-comment","auto_fixed":true},{"location":"src/combat/enemy_generation.rs (generate_enemy_name, calc_zone_enemy_stats, generate_zone_enemy_name)","claim":"Production code calls rand::rng() directly instead of threading a caller-supplied RNG, unlike items/drops.rs (fixed in #692)","correct_value":"Genuine non-determinism bug, root cause of fishing_core_coverage_test.rs's documented flakiness workaround; fix requires threading an RNG parameter through several call sites (dungeon generation, zone spawning, main tick loop) — a production-code refactor needing human review, not applied this run","severity":"HIGH","category":"non-seeded-rng-production","auto_fixed":false},{"location":"tests/game_tick_tests/game_loop_test.rs:24-26","claim":"simulate_tick() constructs a fresh ChaCha8Rng::seed_from_u64(42) on every call instead of threading one rng across a multi-tick loop, so RNG draws never advance across ticks","correct_value":"Fix requires changing simulate_tick's signature to thread a persistent rng, which changes the RNG draw sequence feeding existing assertions across game_loop_test.rs, game_loop_orchestration_test.rs, game_tick_behavior_test.rs, tick_integration_test.rs, tick_stage_coverage_test.rs, tick_stages_coverage_test.rs — needs human review before applying","severity":"MEDIUM","category":"broken-rng-reuse","auto_fixed":false},{"location":"tests/deep_tests/deep_mission_test.rs:48, deep_mission_lifecycle_test.rs:47, deep_types_coverage_test.rs:38, deep_missions_coverage_test.rs:46","claim":"make_merc fixture duplicated across 4 deep_tests files with no shared helpers module","correct_value":"Not a simple duplicate: deep_missions_coverage_test.rs hardcodes resilience:10/expertise:8 instead of deriving from archetype.base_stats() like the other 3, and deep_types_coverage_test.rs has a different signature (status param instead of power). Consolidating needs care to avoid silently changing test semantics — needs human review","severity":"LOW","category":"duplicated-fixture","auto_fixed":false},{"location":"tests/achievement_tests/*.rs (3 files)","claim":"7 byte-for-byte duplicate test functions across 3 achievement test files","correct_value":"Removing/consolidating tests needs explicit human sign-off per skill guidance","severity":"LOW","category":"duplicate-tests","auto_fixed":false},{"location":"tests/item_tests/item_pipeline_test.rs:235,279,799,1164","claim":"Monte Carlo item-generation tests with zero-margin strict < ordering assertions on large sample sizes","correct_value":"Tests use fixed seeds (deterministic, not actually flaky run-to-run) but are brittle to production rarity-curve changes; changing assertion tightness or sample size is a behavior change needing human review, not auto-fixed","severity":"LOW","category":"tight-probabilistic-margin","auto_fixed":false}]} +{"type":"run","date":"2026-07-12","commit_sha":"eba3c3a6f3a6d1f330b8700df18030f2c814d32f","pr_url":"https://github.com/stphung/quest/pull/726","agent_count":3,"scope":["tests/game_tick_tests/","tests/combat_tests/","tests/character_tests/","tests/zone_tests/","tests/fishing_tests/","tests/deep_tests/","tests/haven_tests/","tests/enhancement_tests/","tests/stormglass_tests/","tests/loom_tests/","tests/item_tests/","tests/achievement_tests/","tests/history_tests/","tests/misc_tests/"],"findings":[{"location":"tests/game_tick_tests/tick_integration_test.rs:1069-1073","claim":"Comment claims spawn_enemy_if_needed and apply_tick_xp use thread_rng() internally","correct_value":"Both functions are already fully deterministic and take rng: &mut R as a parameter; comment was stale","severity":"MEDIUM","category":"stale-comment","auto_fixed":true},{"location":"tests/game_tick_tests/tick_integration_test.rs:1003","claim":"test_game_tick_debug_mode_suppresses_achievement_save loops 500 ticks for a pure no-crash smoke test","correct_value":"50 ticks is sufficient to exercise the debug-mode code path","severity":"LOW","category":"excessive-loop-count","auto_fixed":true},{"location":"tests/game_tick_tests/game_tick_behavior_test.rs:244 and tests/game_tick_tests/tick_stages_coverage_test.rs:1050","claim":"Two tests both named test_boss_kill_always_drops_item test the same guarantee at unit vs integration layer","correct_value":"Needs human judgment on whether to rename/consolidate; not auto-fixed","severity":"LOW","category":"duplicate-test-name","auto_fixed":false},{"location":"tests/game_tick_tests/game_loop_test.rs:19, tick_integration_test.rs:22, tick_stage_coverage_test.rs:21","claim":"fn test_rng() -> ChaCha8Rng duplicated identically in 3 files","correct_value":"Should be extracted to a shared test helper module; needs human review of module structure","severity":"LOW","category":"helper-duplication","auto_fixed":false},{"location":"tests/stormglass_tests/storm_lure_test.rs:443","claim":"test_no_lure_no_bonus_behavior_unchanged loops 1000 seeds for a structurally-guaranteed invariant (storm_lure_active=false gates every mutation branch)","correct_value":"100 seeds is sufficient (project norm for structural-impossibility checks)","severity":"MEDIUM","category":"excessive-loop-count","auto_fixed":true},{"location":"tests/fishing_tests/fishing_core_coverage_test.rs:534","claim":"test_discoveries_never_both_dungeon_and_fishing_same_tick loops 500 seeds for a structurally-guaranteed mutual exclusion (if !discovered_dungeon guard)","correct_value":"100 seeds is sufficient","severity":"MEDIUM","category":"excessive-loop-count","auto_fixed":true},{"location":"tests/deep_tests/deep_mercenary_test.rs:166","claim":"test_roll_recruit_quality_rank4_no_common loops 200x for a structurally-guaranteed 0% Common chance at Rank 4","correct_value":"100 iterations is sufficient","severity":"LOW","category":"excessive-loop-count","auto_fixed":true},{"location":"tests/fishing_tests/fishing_extended_coverage_test.rs:424 and :450","claim":"Two tests loop 200x each for structural range/membership bounds enforced by random_range()/array indexing","correct_value":"100 iterations each is sufficient","severity":"LOW","category":"excessive-loop-count","auto_fixed":true},{"location":"tests/fishing_tests/fishing_edge_cases_test.rs:431","claim":"test_leviathan_catch_phase_starts_after_10_encounters loops 200x for a structural check (encounters>=10 => can't return Escaped)","correct_value":"100 iterations is sufficient","severity":"LOW","category":"excessive-loop-count","auto_fixed":true},{"location":"tests/stormglass_tests/stormglass_test.rs:547","claim":"P15-guard tick loop runs 200x for a boolean-guard structural check; own comment already noted 200 was overkill","correct_value":"100 iterations is sufficient","severity":"LOW","category":"excessive-loop-count","auto_fixed":true},{"location":"tests/deep_tests/deep_types_coverage_test.rs:529 and tests/deep_tests/deep_tutorial_test.rs:456","claim":"test_layer_total_duration_reduction_caps_at_75_percent and test_layer_duration_reduction_capped are near-identical duplicate tests across two files in the same test binary","correct_value":"Should consolidate to one location; needs human review before deleting either copy","severity":"MEDIUM","category":"redundant-coverage","auto_fixed":false},{"location":"tests/deep_tests/ (6 files) and tests/stormglass_tests/ (2 files)","claim":"seeded_rng()/rng_from()/state-builder helpers independently redefined across 6 deep_tests files and 2 stormglass_tests files; no shared helpers.rs module unlike fishing_tests/loom_tests","correct_value":"Add tests/deep_tests/helpers.rs and tests/stormglass_tests/helpers.rs to consolidate; needs human review of module/import structure","severity":"LOW","category":"helper-duplication","auto_fixed":false},{"location":"tests/fishing_tests/fishing_integration_test.rs:368","claim":"test_all_spot_names_used iterates 1500 seeds with a bare magic number, no documented statistical justification unlike sibling tests","correct_value":"Could derive iteration bound from FISHING_DISCOVERY_CHANCE (0.05) x 8 spots or reduce with documented justification; left unchanged this run to avoid risking new flakiness without empirical verification","severity":"LOW","category":"excessive-loop-count","auto_fixed":false},{"location":"tests/achievement_tests/achievement_handlers_test.rs and tests/achievement_tests/achievements_expanded_test.rs","claim":"6 exact-duplicate test names/bodies across two achievement test files (test_unlocked_count_starts_at_zero, test_unlock_percentage_zero_when_empty, test_take_newly_unlocked_returns_and_drains, test_take_newly_unlocked_does_not_affect_unlocked_state, test_get_progress_none_for_untracked, test_unlock_records_timestamp)","correct_value":"Consolidate into a single location; needs human review to confirm neither copy has diverged before deletion","severity":"MEDIUM","category":"redundant-coverage","auto_fixed":false},{"location":"tests/misc_tests/prestige_cycle_test.rs:270","claim":"test_combat_to_prestige_full_loop runs up to 20,000 real per-tick combat simulation iterations to grind level 1 to 10","correct_value":"Could apply larger apply_tick_xp chunks per iteration (as test_complete_prestige_cycle_first_prestige already does) to cut iterations 10-100x; needs re-verification against seed 42 before changing, so flagged for human review rather than auto-fixed","severity":"MEDIUM","category":"excessive-loop-count","auto_fixed":false},{"location":"tests/item_tests/item_pipeline_test.rs:964-985","claim":"test_pipeline_prestige_produces_better_average_power runs n=3000 (6000 total) RNG-driven item generations for a directional comparison","correct_value":"Could likely reduce to 500-1000 samples; needs empirical verification across seeds before changing to avoid introducing flakiness","severity":"LOW","category":"excessive-loop-count","auto_fixed":false},{"location":"tests/achievement_tests/ (4 files)","claim":"achievement_coverage_test.rs, achievement_handler_coverage_test.rs, achievement_handlers_test.rs, achievements_expanded_test.rs have broadly overlapping handler-surface coverage beyond the 6 exact duplicates already itemized","correct_value":"Needs a follow-up ownership-boundary mapping pass; not itemized further per audit-effort guidance","severity":"LOW","category":"redundant-coverage","auto_fixed":false}]}