Skip to content

feat(autodata): v2.2 — Evalchemy-style val-set objective for the meta-loop#50

Merged
webdevtodayjason merged 1 commit into
mainfrom
codex/autodata-v22
Jul 6, 2026
Merged

feat(autodata): v2.2 — Evalchemy-style val-set objective for the meta-loop#50
webdevtodayjason merged 1 commit into
mainfrom
codex/autodata-v22

Conversation

@webdevtodayjason

Copy link
Copy Markdown
Contributor

Summary

Replaces the noisy v2.1 reward (per-batch Δ=1 keep-rate) with a held-out, ground-truth-graded lift objective: lift(P) = acc(weak | few-shot of kept traces) − acc(weak alone) on a fixed labeled val set, graded by the same trusted verifier as the Δ-filter (the Evalchemy verifier role). In-context-learning lift as a torch-free proxy for fine-tuning lift — stable and comparable round-over-round, which raw keep-rate wasn't (the root cause of v2.1's noisy ~25%-best yields).

  • valset.py (new): evaluate() + valset_lift() + self-check demo.
  • meta.py: objective="yield"|"valset"; early-stop acceptance gated on an exact one-sided McNemar test (stdlib math.comb, paired on the same probes) + val_min_n guard (default 12, α=0.05) — review found the raw-proportion stop declared lift on noise with small n; reproduced live and fixed with regression tests.
  • v2.1 yield path byte-for-byte unchanged (test-locked). Config/CLI/HTTP route all wire the new objective (--objective valset, cfg.objective).
  • 627 passed, 1 xfailed; ruff clean. 30 autodata tests incl. 4 locking the significance guard.

Live fleet run + RESULTS recording follows post-merge (A7 acceptance).

🤖 Generated with Claude Code

https://claude.ai/code/session_017NziXzqT1L9kj2T1byA3Ak

…-loop

The honest v1/v2.1 finding: live yield was noisy/low (best ~25%) and the root
cause is the EVAL SIGNAL, not the optimizer. The v2.1 reward — the per-batch Δ=1
keep-rate — re-samples fresh tasks every round (so it wobbles for reasons
unrelated to P) and rides exact-match arithmetic's thin ZPD. Optimizing that
proxy chases noise.

v2.2 swaps the proxy for a held-out, GT-graded LIFT objective (the Open-Thoughts/
Evalchemy move):

    lift(P) = acc(weak | few-shot of D(P)) − acc(weak alone)   on a FIXED val set

- valset.py: evaluate() + valset_lift() — score the weak solver on a fixed,
  ground-truth-labeled val set, cold (baseline) and primed with a few-shot sample
  of the round's kept teacher traces. In-context learning as a torch-free proxy
  for fine-tuning lift; graded by the same trusted verifier the Δ-filter uses
  (core.judge_correct → verify.py). Stable + comparable round-over-round.
- meta.py: meta_optimize(objective="valset") tracks best_lift/best_score, feeds
  the lift trajectory to the prompt-optimizer, stops at val_target. The v2.1
  objective="yield" path is the untouched default — nothing regresses.
- core.AutoDataConfig: objective / val_set / val_shots / val_target config keys.
- run.py: --objective valset CLI flag.
- Pure HTTP + stdlib only; fully offline-testable via injected fake clients
  (valset.demo, meta.demo_valset, + pytest cases). Live endpoints are the
  operator's to run.
- V2_DESIGN.md: v2.2 marked implemented, objective documented, RESULTS placeholder.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017NziXzqT1L9kj2T1byA3Ak
@webdevtodayjason webdevtodayjason merged commit 07fa4b8 into main Jul 6, 2026
1 check passed
@webdevtodayjason webdevtodayjason deleted the codex/autodata-v22 branch July 6, 2026 17:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant