=== CPUREF-0.3 Grok independent suite (15 core + 5 adapted additions) ===
test_corner_pass_links_identity_marker (test_cpu_reference.TestFourCorners.test_corner_pass_links_identity_marker)
Identity: a marker in the source's post-collision slot q must arrive exactly at K. ... ok
test_four_corner_symmetry_srt (test_cpu_reference.TestFourCorners.test_four_corner_symmetry_srt)
Mirror the lower-left SRT corner case to the other three corners; values must match. ... ok
test_leaf_mass_momentum_8_steps (test_cpu_reference.TestIdentityTransportConservation.test_leaf_mass_momentum_8_steps) ... ok
test_matches_independent_implementation (test_cpu_reference.TestIdentityTransportConservation.test_matches_independent_implementation) ... ok
test_coalescence_slots_reads_owner (test_cpu_reference.TestOwnershipPoison.test_coalescence_slots_reads_owner) ... ok
test_collision_and_explosion_counts (test_cpu_reference.TestOwnershipPoison.test_collision_and_explosion_counts) ... ok
test_hop_sources_never_outer (test_cpu_reference.TestOwnershipPoison.test_hop_sources_never_outer) ... ok
test_inputs_not_mutated_and_maps_readonly (test_cpu_reference.TestOwnershipPoison.test_inputs_not_mutated_and_maps_readonly) ... ok
test_invalid_input_entries_ignored_and_poisoned (test_cpu_reference.TestOwnershipPoison.test_invalid_input_entries_ignored_and_poisoned) ... ok
test_make_spec_api (test_cpu_reference.TestOwnershipPoison.test_make_spec_api) ... ok
test_nonfinite_active_input_rejected (test_cpu_reference.TestOwnershipPoison.test_nonfinite_active_input_rejected) ... ok
test_leaf_conservation_and_collision_moments_8_steps (test_cpu_reference.TestSRT.test_leaf_conservation_and_collision_moments_8_steps) ... ok
test_matches_independent_implementation (test_cpu_reference.TestSRT.test_matches_independent_implementation) ... ok
test_identity_changes_expected_packet (test_cpu_reference.TestSRTCornerOracle.test_identity_changes_expected_packet) ... ok
test_srt_oracle (test_cpu_reference.TestSRTCornerOracle.test_srt_oracle) ... ok
test_eight_unique_keys_and_child_packets (test_tron_additions.TestCornerIndividualPackets.test_eight_unique_keys_and_child_packets) ... ok
test_coalesce_paths_reconstructed_test_side (test_tron_additions.TestRetainedDiagnostics.test_coalesce_paths_reconstructed_test_side) ... ok
test_hop2_mask_semantics (test_tron_additions.TestRetainedDiagnostics.test_hop2_mask_semantics) ... ok
test_srt_coarse_and_fine_nan_masks_equal (test_tron_additions.TestSRTNanMask.test_srt_coarse_and_fine_nan_masks_equal) ... ok
test_diagnostic_field_delta (test_tron_additions.TestV02V03FieldDelta.test_diagnostic_field_delta)
Compare top-level diagnostic keys and budget keys between v0.2 and v0.3. ... ok

----------------------------------------------------------------------
Ran 20 tests in 0.480s

OK
reference: /workspace/amr_tests_v03/cpu_reference_v0.3.py API CPUREF-0.3
sha256 bba2a06a9f6517b32079ffff15e4060d8c3b7ed35f16ca134e1877226c9e4e1e cpu_reference_v0.3.py
sha256 ade5d4827f971aed7174b59d83769e7aa542338e625a9fc8db1e8b1805cb74ca test_cpu_reference.py
sha256 8e7a6a90b85e64c7326719e7b8bca2f6d34fb4c80690f0685f7e291ab93bd2a4 test_tron_additions.py
python 3.13.5 numpy 2.5.3 Linux-6.12.94+-x86_64-with-glibc2.41

reference corner_links lists 8 uniquely keyed corner-pass links

corner SRT symmetry values: {'LL': np.float64(0.02798201349283891), 'LR': np.float64(0.027982013492838912), 'UL': np.float64(0.02798201349283891), 'UR': np.float64(0.02798201349283891)}

[identity] leaf0=[255.98790565531962, 7.683069168222897, -5.122316610476732] leaf8=[255.98790565532028, 7.683069168222904, -5.122316610476715] drift=[6.536993168992922e-13, 7.105427357601002e-15, 1.687538997430238e-14]

[identity] max |ref - independent| over 3 steps = 0.000e+00

slots=100 (corner-pass 8), unique reads=400, max read multiplicity=1

counts: coarse cells collided once=192, fine twice=256, ghost explosion writes=320; tick validation OK

[srt] leaf0=[256.01002619890596, 7.680601714336587, -5.120130711410963] leaf8=[256.0100261989044, 7.680601714336586, -5.120130711410962] drift=[-1.5347723092418164e-12, -8.881784197001252e-16, 8.881784197001252e-16]

[srt] max |ref - independent| over 3 steps = 2.776e-16

[identity corner] expected=0.026777777777777775 got=np.float64(0.026777777777777775); srt-expected differs by 1.204e-03

[srt corner] expected=0.02798201349283891 got=np.float64(0.02798201349283891) diff=0.000e+00 (uncoalesced g8=0.028027777777777776)

[8 corner keys] ['lower_left_q7', 'lower_left_q8', 'lower_right_q5', 'lower_right_q6', 'upper_left_q5', 'upper_left_q6', 'upper_right_q7', 'upper_right_q8']; packets 3xg8+1xmid8, weights 0.25, avg=0.02798201349283891

[coalesce_paths test-side] 100 rows x 4; hist={('corner_pass', 'A', 'I'): 8, ('corner_pass', 'I', 'I'): 24, ('face_or_diag_from_patch', 'A', 'A'): 180, ('face_or_diag_from_patch', 'I', 'A'): 188}

[hop2_valid] matches independent derivation; valid inner=1060; reads hop2-valid=400

[srt masks] coarse+fine NaN masks equal over 3 steps; max diff 2.776e-16

[v0.2→v0.3 fields] removed=['coalesce_paths', 'explosion_count', 'fine_valid_after'] added=['hop2_valid']; budget rename closure_error→bookkeeping_check; corner_packets 4→8
peak_rss_MiB 42.6171875
RESULT OK testsRun 20

=== open-corner negative control ===
test_open_vs_closed (__main__.OpenCornerNegativeControl.test_open_vs_closed) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.215s

OK
[identity] coalesce rows closed=100 open=92 dropped=8
[identity] seed=1 steps=1 closed: max|leaf drift|=5.551e-17 max|interface_residual|=2.109e-15 | OPEN: max|leaf drift| (mass,mx,my)=(0.000e+00,5.551e-17,2.776e-17) max|interface_residual|=1.776e-15
[identity] seed=1 steps=8 closed: max|leaf drift|=2.776e-16 max|interface_residual|=2.276e-15 | OPEN: max|leaf drift| (mass,mx,my)=(0.000e+00,2.220e-16,2.776e-16) max|interface_residual|=2.665e-15
[identity] seed=2 steps=1 closed: max|leaf drift|=3.331e-16 max|interface_residual|=1.971e-15 | OPEN: max|leaf drift| (mass,mx,my)=(0.000e+00,1.665e-16,3.331e-16) max|interface_residual|=2.665e-15
[identity] seed=2 steps=8 closed: max|leaf drift|=5.684e-14 max|interface_residual|=2.998e-15 | OPEN: max|leaf drift| (mass,mx,my)=(5.684e-14,2.220e-16,3.331e-16) max|interface_residual|=2.665e-15
[srt] coalesce rows closed=100 open=92 dropped=8
[srt] seed=1 steps=1 closed: max|leaf drift|=2.269e-14 max|interface_residual|=2.831e-15 | OPEN: max|leaf drift| (mass,mx,my)=(2.078e-03,8.560e-04,2.620e-04) max|interface_residual|=2.078e-03
[srt] seed=1 steps=8 closed: max|leaf drift|=4.040e-14 max|interface_residual|=4.774e-15 | OPEN: max|leaf drift| (mass,mx,my)=(2.078e-03,8.560e-04,2.620e-04) max|interface_residual|=2.078e-03
[srt] seed=2 steps=1 closed: max|leaf drift|=4.078e-14 max|interface_residual|=2.331e-15 | OPEN: max|leaf drift| (mass,mx,my)=(5.660e-04,2.359e-04,6.755e-04) max|interface_residual|=6.755e-04
[srt] seed=2 steps=8 closed: max|leaf drift|=4.078e-14 max|interface_residual|=2.554e-15 | OPEN: max|leaf drift| (mass,mx,my)=(6.526e-04,5.767e-04,1.401e-03) max|interface_residual|=1.401e-03
