# Repository simplification

## Goal
Remove high-confidence duplicate and stale code without changing the active research behavior.

## Scope
In: duplicate hack-basis loading, duplicate problem loading, exact attic duplicate, stale imports.
Out: decomposing `train.py`, changing experiment semantics, editing unrelated user changes.

## Requirements
- R1: `vgrout.vhack` is the only hack-basis loader. Done means no loader definitions or imports remain in `extract_vhack_grad`.
- R2: `vgrout.data` is the only problem loader. Done means `vgrout.problems` is deleted and no imports remain.
- R3: exact duplicate attic scripts are removed. Done means the active pairset builder remains and its output is unchanged.
- R4: the active pipeline still runs. Done means `just smoke` passes.

## Tasks
- [x] T1 (R1-R3): Consolidate duplicate modules and imports.
  - verify: `rg 'vgrout\.problems|from \.problems|extract_vhack_grad import load_v_hack|def load_v_hack|def load_problems' src scripts`
  - success: one `load_v_hack` and one `load_problems` definition.
  - likely_fail: stale import raises during compile/import checks.
  - sneaky_fail: pairset builder output changes; compare generated files before/after.
  - UAT: repository search shows one canonical definition per concept.
- [x] T2 (R4): Run compile checks and `just smoke`.
  - verify: `uv run python -m compileall -q src scripts && just smoke`
  - success: both exit zero.
  - likely_fail: import or smoke traceback.
  - sneaky_fail: checks pass without exercising duplicate boundaries; smoke imports active pipeline and explicit search proves ownership.
  - UAT: linked verification log shows commands and exit status.
- [x] T3: Fresh-eyes review and address valid findings.
  - verify: external review of the diff.
  - success: no unresolved correctness finding.
  - likely_fail: stale caller or changed semantics found.
  - sneaky_fail: reviewer only assesses style; prompt requires behavior and proof review.
  - UAT: linked review artifact.

## Context
- Existing user changes in `src/vgrout/data.py`, `src/vgrout/eval.py`, plotting/results files, and docs are preserved.
- `scripts/attic/make_pairsets.py` differs from `scripts/pairset_build_progsets.py` only in the documented invocation path.

## Log
- `src/vgrout/extract_vhack_grad.py` and `src/vgrout/vhack.py` contain duplicate `load_v_hack` and `postprocess_v_hack` implementations.
- `src/vgrout/problems.py` is the older problem loader; `src/vgrout/data.py` is the active superset.
- Fresh-eyes review found `scripts/verify_vhack_heldout.py` imported deleted `PAIRS`; fixed it to load an explicit pairset and made extract/verify recipes name the same pairset.

## Results
- Ownership search: one `load_v_hack`, one `postprocess_v_hack`, and one `load_problems`.
- Diff: 12 active-line edits and 911 duplicate/stale lines removed before the verifier correctness fix.
- Full smoke passed: reward matrix, eval-token gap, partition no-cheat gate, and 30-step projected training.

## Verify
- `uv run python -m compileall -q src scripts`: PASS
- explicit import check for every repointed caller: PASS
- `just smoke`: PASS, full log at `/tmp/projected_grpo_repo_simplification_smoke.log`

## Failure mode check
- likely_fail: stale import after deleting duplicate modules -> explicit import check passes.
- sneaky_fail: active pipeline bypasses consolidated loader -> smoke logs `postprocess_v_hack` during init and refresh.
- scientific mismatch: verifier silently uses an unrelated built-in pairset -> recipes and verifier now name `out/pairsets/prog_wide.json`.

## Review
- `/tmp/projected_grpo_cleanup_review.md`
- Valid finding: broken `PAIRS` import in held-out verifier. Fixed.
- Rejected finding: `OUT_DIR` coupling is architectural taste, not a correctness regression in this scope.

## TODO
- Review whether `scripts/probe_distill.py` is still a maintained recipe; its `load_problems(cfg.n_problems)` calls currently omit required `env_modes`.
- Decompose `src/vgrout/train.py` only with dedicated behavioral gates; it is noisy but load-bearing.

## Errors
| Task | Error | Resolution |
|------|-------|------------|
