Skip to content

Latest commit

 

History

History
111 lines (85 loc) · 4.98 KB

File metadata and controls

111 lines (85 loc) · 4.98 KB

AgentPets Cleanup Verification

Branch under test: verify/backfill-2026-06-30 (== cleaned main)
Baseline: main~1 (commit 2734682)
Date: 2026-06-30
Verdict: EQUIVALENT — no behavioral divergence detected


1. Refactors Characterized

G2-002 · interact_village dead branch → bare None

File: Game2/game/src/game.rs
The final expression of interact_village was if probe { None } else { None } — both branches returned None. Replaced with bare None.
Test: game::tests::interact_village_returns_none_on_empty_tile_g2_002 — asserts both probe=true and probe=false return None when the facing tile contains nothing interactive.

G2-003 · nested guards collapsed to !p.grown(&today)

File: Game2/game/src/game.rs
Truth-table across (grown, is_tree): the combined outer+inner condition is equivalent to !p.grown(&today) for all four combinations.
Test: game::tests::non_grown_plant_returns_growing_hint_g2_003 — verifies a fresh (non-grown) tree returns "It's still growing…" on probe and None on action; a grown tree routes through the tree-shake branch instead.

G2-005 · GameMode::Title(TitleState)GameMode::Title(Box<TitleState>)

File: Game2/game/src/game.rs
Box<T> derefs to T, so title.update_and_draw(ctx) is unchanged via Deref coercion.
Test: game::tests::title_state_box_wraps_and_transitions_g2_005 — constructs the game, confirms it stays in Title on idle frames, navigates to the start row, presses A, and asserts the mode transitions to Playing with the typed player name intact.

G2-007 · after % 3 == 0after.is_multiple_of(3)

File: Game2/engine/src/ui.rs
usize::is_multiple_of(3) is defined as self % rhs == 0 — identical for usize.
Test: ui::tests::typewriter_tick_fires_at_multiples_of_three_g2_007 — drives the typewriter at 20 ms/tick (1.1 chars/tick, floored to 1) and asserts tick() returns true exactly at chars 3 and 6, and false at 1, 2, 4, 5.

JS-004 · daysBetween removed from module export

File: Game/js/village.state.js
The function is still defined and used internally (fruit regrowth). Only its name was removed from the exports object. Confirmed: grep daysBetween Game/js/village.state.js shows the definition and internal call-site remain; no external caller exists in the test suite.

SW-001 · SpriteAnimationView.swift deleted

File: Sources/AgentPets/Views/SpriteAnimationView.swift
The file was a pass-through wrapper (var body: some View { AnimatedSpriteView(state: state) }) marked "Legacy entry point kept for compatibility." Confirmed: no remaining references in Sources/ after deletion. A native-GUI Swift/Xcode build is required to fully verify this component; that is outside the headless CI environment.


2. A/B Full Suite Results

cargo test --workspace (Game2 Rust, both sides)

Suite main~1 cleaned HEAD
burrow (engine) 27 pass, 0 fail 27 pass, 0 fail
village2 (game) 46 pass, 0 fail 46 pass, 0 fail
Total 73 / 73 73 / 73

node --test tests/*.test.mjs (Game JS, both sides)

Side Result
main~1 40 pass, 0 fail
cleaned HEAD 40 pass, 0 fail

3. Backfill Tests — A/B Status

New tests added to cleaned branch, then applied identically to main~1 worktree and re-run:

Test File main~1 cleaned
interact_village_returns_none_on_empty_tile_g2_002 game/src/game.rs PASS PASS
non_grown_plant_returns_growing_hint_g2_003 game/src/game.rs PASS PASS
title_state_box_wraps_and_transitions_g2_005 game/src/game.rs PASS PASS
typewriter_tick_fires_at_multiples_of_three_g2_007 engine/src/ui.rs PASS PASS

Post-backfill totals on cleaned HEAD: 28 engine + 49 game = 77 Rust tests, all pass.


4. Smoke

  • cargo build --workspace (native dev): clean (0 errors, 0 warnings on cleaned HEAD)
  • cargo build --release --target wasm32-unknown-unknown -p village2: success (2.11 s)
  • node --test Game2/tests-node/smoke.test.mjs (7 WASM headless sessions): 7 / 7 pass
    • boots to a drawing title screen
    • full session: new game, dialogue, walking, menus, tools
    • long idle simulation across day/night with NPC schedules
    • day rollover refreshes dailies and saves
    • save → reload → continue restores the village
    • garbage save is rejected gracefully (fresh title)
    • 60 seconds of chaos input never traps
  • Native GUI (Swift/Xcode, SW-001): not observable headlessly — Swift build requires Xcode. The deleted view had no callers (grep -r SpriteAnimationView Sources/ returns empty).

5. Final Verdict

EQUIVALENT. All six cleanup changes are behavior-preserving. No divergence was found across the full A/B suite (73 Rust + 40 JS tests), four targeted backfill tests (each passing on both main~1 and cleaned), and the WASM smoke harness (7 sessions).