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
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.
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.
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.
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.
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.
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.
| 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 |
| Side | Result |
|---|---|
| main~1 | 40 pass, 0 fail |
| cleaned HEAD | 40 pass, 0 fail |
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.
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).
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).