utils.checkpoints_enabled() disables checkpoints under user threading/multiprocessing. The docstring justifies it as "hash chain ordering is non-deterministic across concurrent saves" — but that's not true anymore.
Per-chain hashing means each chain starts a fresh hashlib.sha256() seeded with its own _starting_step_hash (query/dataset.py:2739). Two concurrent chains produce stable, deterministic hashes regardless of .save() ordering.
Walked through single-chain construction patterns under user threading/multiprocessing — no realistic case where it corrupts that chain's hash. Non-deterministic UDFs are already a separate limitation.
Surfaced from #1633.
utils.checkpoints_enabled()disables checkpoints under user threading/multiprocessing. The docstring justifies it as "hash chain ordering is non-deterministic across concurrent saves" — but that's not true anymore.Per-chain hashing means each chain starts a fresh
hashlib.sha256()seeded with its own_starting_step_hash(query/dataset.py:2739). Two concurrent chains produce stable, deterministic hashes regardless of.save()ordering.Walked through single-chain construction patterns under user threading/multiprocessing — no realistic case where it corrupts that chain's hash. Non-deterministic UDFs are already a separate limitation.
Surfaced from #1633.