test_27_five_standalone_scripts_and_full_mit_headers (test_stages.Package.test_27_five_standalone_scripts_and_full_mit_headers) ... ok
test_28_actual_snippets_and_required_metadata (test_stages.Package.test_28_actual_snippets_and_required_metadata) ... ok
test_29_canonical_fixture_body_matches_recorded_original_sha (test_stages.Package.test_29_canonical_fixture_body_matches_recorded_original_sha) ... ok
test_01_grid_walk_and_wall (test_stages.PureRules.test_01_grid_walk_and_wall) ... ok
test_02_single_crate_push (test_stages.PureRules.test_02_single_crate_push) ... ok
test_03_single_crate_wall_is_atomic (test_stages.PureRules.test_03_single_crate_wall_is_atomic) ... ok
test_04_pair_moves_opposite (test_stages.PureRules.test_04_pair_moves_opposite) ... ok
test_05_either_box_can_be_pushed (test_stages.PureRules.test_05_either_box_can_be_pushed) ... ok
test_06_partner_wall_rejects_whole_move (test_stages.PureRules.test_06_partner_wall_rejects_whole_move) ... ok
test_07_direct_box_wall_rejects_whole_move (test_stages.PureRules.test_07_direct_box_wall_rejects_whole_move) ... ok
test_08_shared_destination_rejects_whole_move (test_stages.PureRules.test_08_shared_destination_rejects_whole_move) ... ok
test_09_swap_and_player_new_cell_reject_whole_move (test_stages.PureRules.test_09_swap_and_player_new_cell_reject_whole_move) ... ok
test_10_player_old_cell_guard_with_synthetic_invalid_state (test_stages.PureRules.test_10_player_old_cell_guard_with_synthetic_invalid_state) ... ok
test_11_candidate_validator_checks_old_and_new_player (test_stages.PureRules.test_11_candidate_validator_checks_old_and_new_player) ... ok
test_12_invalid_action_rejected_without_count (test_stages.PureRules.test_12_invalid_action_rejected_without_count) ... ok
test_13_reset_restores_all_play_state (test_stages.PureRules.test_13_reset_restores_all_play_state) ... ok
test_14_numbered_goals_are_not_interchangeable (test_stages.PureRules.test_14_numbered_goals_are_not_interchangeable) ... ok
test_15_solution_undo_and_terminal_freeze (test_stages.PureRules.test_15_solution_undo_and_terminal_freeze) ... ok
test_16_rejection_does_not_pollute_existing_history (test_stages.PureRules.test_16_rejection_does_not_pollute_existing_history) ... ok
test_17_final_room_exhaustive_solvability (test_stages.PureRules.test_17_final_room_exhaustive_solvability) ... ok
test_18_pair_coordinate_sum_is_invariant (test_stages.PureRules.test_18_pair_coordinate_sum_is_invariant) ... ok
test_19_canonical_equivalence_all_reachable_subset_edges (test_stages.PureRules.test_19_canonical_equivalence_all_reachable_subset_edges) ... ok
test_20_no_vertical_push_means_no_solution_in_room_b (test_stages.PureRules.test_20_no_vertical_push_means_no_solution_in_room_b) ... ok
test_30_independent_occupancy_oracle_for_room_b (test_stages.PureRules.test_30_independent_occupancy_oracle_for_room_b) ... ok
test_21_multiple_arrows_rejected_all_stages (test_stages.StubUI.test_21_multiple_arrows_rejected_all_stages) ... ok
test_22_reset_waits_for_release (test_stages.StubUI.test_22_reset_waits_for_release) ... ok
test_23_final_keyboard_solution_and_undo (test_stages.StubUI.test_23_final_keyboard_solution_and_undo) ... ok
test_24_all_ascii_text_is_inside_canvas (test_stages.StubUI.test_24_all_ascii_text_is_inside_canvas) ... ok
test_25_smoke_renders_12_frames_before_screenshot (test_stages.StubUI.test_25_smoke_renders_12_frames_before_screenshot) ... ok
test_26_headless_script_is_synthetic_and_deterministic (test_stages.StubUI.test_26_headless_script_is_synthetic_and_deterministic) ... ok

----------------------------------------------------------------------
Ran 30 tests in 0.116s

OK
