Pre-burn synthetic baseline — provenance & capture procedure (Decision D4)
==========================================================================

Purpose
  PR 7 (validate) compares the post-rebuild binary against a PRE-BURN
  baseline on the synthetic sweeps. `main` no longer runs end-to-end
  (it aborts at the calibrate() stub), so the baseline must come from a
  pre-burn git SHA.

Baseline SHA (confirmed by user, 2026-05-29)
  fc96902  "new calib system implemented"
  (Fallback if it fails to build/run cleanly: 7a1c700 "all tests passing
  with new calibration".)

Status: CAPTURE DEFERRED to just before PR 7.
  Rationale: the baseline is pinned to an IMMUTABLE SHA, so the snapshot
  window does NOT close as later PRs land — there is no urgency. Building
  the pre-burn binary via an editable install in the main tree would
  clobber the current `rigel` install, so the capture must run in an
  isolated environment. Doing that now (many PRs before it is used) buys
  nothing and adds risk. It will be run as the first step of PR 7.

Capture procedure (run before PR 7, in an ISOLATED env)
  # 1. Check out the baseline into a worktree.
  git worktree add /tmp/rigel-preburn fc96902

  # 2. Build it in a SEPARATE conda env (do NOT reuse the dev env —
  #    an editable install would re-point the `rigel` package).
  #    e.g.  conda create -n rigel-preburn ... ; conda activate rigel-preburn
  #    cd /tmp/rigel-preburn && pip install --no-build-isolation -e .

  # 3. Run the synthetic sweeps into THIS path (scratch/preburn/<cfg>/):
  #    for cfg in scripts/benchmark/configs/locus_simple_*.yaml; do
  #      python scripts/sim/locus_sweep.py -c "$cfg" \
  #        -o "/Users/mkiyer/proj/rigel/scratch/preburn/$(basename "$cfg" .yaml)"
  #    done

  # 4. Clean up.
  git worktree remove /tmp/rigel-preburn

PR 7 then runs the same sweeps on the post-rebuild binary into
scratch/postburn/ and diffs transcript-level quant (mrna/nrna/gdna), per
docs/caljointmodel/06_validation_plan.md §4.
