Highlights
- Verification hardening — the training/dataset gates now fail closed on the attack surface found in a whole-project audit: train-GPU corroboration reads signed NRAS
hwmodelclaims, not the miner-editable sidecar (#236); the manifestgpu_architectureis bound to the signedhwmodel(#238); attested eval samples are bound to their benchmark key so a passing sample can't be cross-mapped (#230); the canonical-pin grace window is honored on the scores path (#232); verified runs no longer drop benchmarks the frontier lacks (#234); the accepted-registry snapshot applies the mix's unexportable-row filter (#240); and malformed proof-bundle scores fail closed instead of crashing verify (#244). - DPO training track (#268) — miners can submit an Axolotl
rl: dporecipe trained on a canonical preference dataset, verified and scored exactly like SFT (scoring is a held-out benchmark delta, independent of training method). The one "this is SFT" chokepoint is now track-aware and the reward-gatecheck_canonical_dataset_claimselects the preference pin fortrain_objective: "dpo"bundles (fail-closed without a pin) — SFT verification is byte-identical. - CI pipeline (#247) —
ruff/ruff format/pyright/pyteston every push & PR as a least-privilegepull_requestjob (no secrets to forks); all GitHub Actions SHA-pinned; Dependabot added; vendoredtritonbench/excluded from ruff. - CoT recovery (#247) — when a teacher (GPT 5.6) returns encrypted/empty reasoning, Claude Fable 5 backfills a plaintext rationale so SFT rows keep a usable
<think>trace (taggedmetadata.cot_recovery); best-effort, never discards a generated trajectory. - GPU-wheel vLLM serve stack (#247) — installs the official
vllm==0.25.0+cu129wheel + matching PyTorch (no CPU-only torch, no minutes of JIT at engine start) for fast TritonBench eval, and fixes a real_gpu_architectureUnboundLocalErroron the auto-detect path (surfaced by the new pyright gate). - Package version 0.2.0 (was
0.1.3). - Dataset gate pinned to SparkProof v0.3.0 (#273).
DPO training track (new capability)
SparkDistill's training track verifies reproducibility + measured quality, not the training algorithm — so preference tuning drops in as a recipe type with no new scoring machinery.
- An SFT recipe (no
rlkey) keeps its exact prior behavior and must use the canonical SFT mix; arl: dporecipe must use the canonical preference path. The two tracks' accepted datasets/pins are disjoint (canonical_pref_sha256besidecanonical_sft_sha256), so a DPO submission can never satisfy the SFT pin or vice-versa. - The reward-gate check is track-aware: a bundle declaring
train_objective: "dpo"is verified against the canonical preference pin (pref_manifest.pref_sha256/canonical_pref_hf_url) and fails closed if no preference pin is configured. - The preference signal is GPU-attested, not human-labeled: pairs come from SparkProof's verified-vs-failed kernels (
sparkproof-export-dpo --pair-type correctness), sha256-pinned and attested in the bundle manifest (SparkProof v0.3.0).
Still to come for end-to-end DPO submission: publishing the canonical preference dataset + pref_manifest pin, prepare_mining_dpo, the DPO-aware PR-body citation + grace window, and the dpo.yaml example recipe.
Pairs with SparkProof v0.3.0
The dataset registry gate now checks out SparkProof at the immutable v0.3.0 release commit (not the moving main), so every dataset submission is verified against exactly the released verifier — the one carrying the DPO correctness pairs and the attested preferences_sha256 bundle pin, plus the v0.3.0 dataset-quality + attestation hardening. Reproducible and auditable; bump deliberately to adopt a newer SparkProof release.
Also in this release
- Registry mix export routes through SparkProof's publish path (
trajectory_to_messages_record), skipping empty/failed rows and preferring multi-turn episodes. - Claim binding uses the signed NRAS
eat_nonce, and TDX binding reads REPORTDATA fromquote_b64— never the editable JSON sidecars. - Attested GSM8K regression samples can no longer forge a score by duplicating a
problem_id. - Training-track merges seed / raise
runs/frontiers.jsonfrom verified non-REJECT scores. - Two env-dependent tests made deterministic (fallback dedupe + a SparkProof skip-guard) so the suite is green with or without a sibling SparkProof checkout.
Full notes: see the CHANGELOG.