Found during ACE-083 review (#199). Pre-existing on main @ 439ecd1; ACE-083 narrows the window (its scope filter shrinks table_set) but does not close it.
F11 §3 is explicit: "the same SQL against the same model version produces the same findings, in the same order, in every process."
runtime.py::_shared_dimension picks the shared dimension for a chasm finding by walking table_set, which is a set. Where two candidate dimensions both qualify, which one is picked depends on iteration order, and therefore on PYTHONHASHSEED. The fan branch was deliberately given sorted() for exactly this reason; the chasm side's dimension pick was not.
The current _sales_org fixture has one candidate dimension, so no test can exercise it today. A repro needs a model where two tables both face the measure tables.
Related and already fixed in #199, so do not confuse them: three sorted() calls in _preflight_select (the chasm agg_sources, the fan loop's agg_sources, and many_tables) were unguarded by any test, and test_the_aggregate_report_is_the_same_in_every_process now catches the removal of each one by mutation. This issue is the fourth site, which has no sorted() at all.
Fix is to make the pick deterministic (sort the candidates, or state a tiebreak), plus a fixture with two qualifying dimensions and a subprocess probe over several hash seeds, following the idiom in tests/test_ace083_trap_soundness.py::test_the_aggregate_report_is_the_same_in_every_process.
Found during ACE-083 review (#199). Pre-existing on
main@439ecd1; ACE-083 narrows the window (its scope filter shrinkstable_set) but does not close it.F11 §3 is explicit: "the same SQL against the same model version produces the same findings, in the same order, in every process."
runtime.py::_shared_dimensionpicks the shared dimension for a chasm finding by walkingtable_set, which is aset. Where two candidate dimensions both qualify, which one is picked depends on iteration order, and therefore onPYTHONHASHSEED. The fan branch was deliberately givensorted()for exactly this reason; the chasm side's dimension pick was not.The current
_sales_orgfixture has one candidate dimension, so no test can exercise it today. A repro needs a model where two tables both face the measure tables.Related and already fixed in #199, so do not confuse them: three
sorted()calls in_preflight_select(the chasmagg_sources, the fan loop'sagg_sources, andmany_tables) were unguarded by any test, andtest_the_aggregate_report_is_the_same_in_every_processnow catches the removal of each one by mutation. This issue is the fourth site, which has nosorted()at all.Fix is to make the pick deterministic (sort the candidates, or state a tiebreak), plus a fixture with two qualifying dimensions and a subprocess probe over several hash seeds, following the idiom in
tests/test_ace083_trap_soundness.py::test_the_aggregate_report_is_the_same_in_every_process.