Deterministic run ID derived from generation parameters, so the same
(domain, size, seed, difficulty, hard_neg_ratio, singleton_master_fraction,
locale) always produces the same output filename regardless of output
format (IPC vs Parquet) or how many times it’s run — and, just as
important, a different filename whenever any of these parameters
differ, since they all affect the generated data. singleton_master_fraction
and locale were missing from this list until this was flagged as a bug:
two runs differing only in --singleton-master-fraction
or --locale produced the exact same filename, so the second run silently
overwrote the first’s output.
The exact set of --difficulty / Python difficulty= values accepted —
derived from DIFFICULTY_MAP so there is one source of truth. The CLI
(main.rs) already rejects anything else via clap::PossibleValuesParser;
this exists so the PyO3 generate() binding (lib.rs) can reject an
unrecognized value too instead of silently falling back to medium via
difficulty_settings’s own fallback above.