Research log Small Model Experimentation
GitHub

Qwen3.5-4B Real Sample Verify Commit

The weak link is writing code

The one idea you need

Think of an editor choosing the best essay from a stack of drafts a writer produced. On easy prompts a good draft always exists, so any editor succeeds. On hard prompts, if not one draft is actually correct, even a flawless editor cannot pick a winner.

The question

When a small coding model writes several attempts at a problem and a checker picks one to submit, is the weak link the picking or the writing?

What we found

It's the writing. When a 4-billion-parameter model writes several code attempts per problem, choosing is not the bottleneck. On easier problems nearly every attempt is already correct, so the best result sits near 97%. On harder problems at least one attempt is correct only 60% of the time, and the trained checker captures that entire 60% — grabbing the first attempt that passes the visible examples reaches only 55%. No checker can invent programs that were never written.

Why it matters

Building a write-several-then-pick loop for a small model? Spend effort generating more and better attempts, not on a smarter checker. The checker already captures nearly every correct program that exists in the pool.

Chance a correct attempt exists, harder problems35% → 60%as you go from one attempt to many per problem, then it plateaus
Trained checker vs grabbing the first that passes visible tests, harder problems60% vs 55%the checker keeps every correct attempt; the quick habit leaves some behind
Easier problems solvedabout 97%nearly every single attempt was already correct
Attempts needed on easier problemsunder 2 on averagethe loop stops early once an attempt passes the visible tests
On this page
  1. Results at a glance
  2. Overview
  3. Report
    1. Objective
    2. Candidate Generation
    3. Key Result
    4. Readout
    5. Fixed-Budget Summary
    6. Adaptive-Budget Summary
    7. Interpretation
    8. Figures
    9. Reproduction
  4. Experiment log
  5. Figures
  6. Data files
  7. Reproduce
  8. Related

Results at a glance 6

How often a correct answer gets submitted, easier versus harder problems

How to read

Two groups of bars, one per problem set. Within each: the ceiling of problems where a correct attempt existed, the result of grabbing the first attempt that passed the visible example tests, and the trained checker's choice. Taller means more problems solved.

0%25%50%75%100%60%55%60%MBPP eval96.7%96.7%96.7%HumanEval

Takeaway → The trained checker reaches the same height as the ceiling on both sets, losing nothing; the harder set's ceiling itself is simply lower.

Data table
Datasetpool coverage ceilingfirst visible-passing commitSFT verifier commit
MBPP eval60%55%60%
HumanEval96.7%96.7%96.7%

Numbers from report table (reports/qwen35_4b_real_sample_verify_commit_report.md, Key Result + Fixed-Budget Summary)

Technical framing

Coverage is the bottleneck, not selection (pass rate at max budget) — The SFT verifier captures the full candidate-pool ceiling on both sets; missing MBPP accuracy comes from no correct sample existing, not bad selection.

Chance a correct attempt exists as you write more attempts per problem

How to read

Two lines, the harder set and the easier set. The horizontal axis is how many attempts you write per problem; the vertical axis is the share of problems where at least one attempt is correct. Higher and rising is better.

20%40%60%80%100%120%2468HumanEvalMBPP eval

Takeaway → The easier line starts near the top and barely moves; the harder line climbs from a third of problems to about six in ten, then flattens well below it.

Data table
Sampling budget (candidates per task; 9 = max)MBPP evalHumanEval
135%90%
235%90%
450%93.3%
860%96.7%
960%96.7%

Numbers from report table (Fixed-Budget Summary) / reports/summary_fixed_budget.csv

Technical framing

Candidate-pool coverage vs sampling budget — HumanEval is nearly solved at 1 sample; MBPP coverage climbs from 35% to 60% and plateaus, leaving a 40% generator-side gap.

Attempts written per problem with smart early stopping

How to read

Two groups of bars, harder set and easier set. Bars show the average number of attempts written per problem: always writing the maximum, an ideal stop-as-soon-as-solved rule, and a learned stopping rule. Fewer attempts is cheaper and better.

024687.85.354.2MBPP eval5.471.61.7HumanEval

Takeaway → The learned rule writes far fewer attempts than always writing the maximum, especially on the easier set — the same results for a fraction of the work.

Data table
Datasetfixed max budgetoracle stopSFT stop controller
MBPP eval7.85.354.2
HumanEval5.471.61.7

Numbers from report table (Adaptive-Budget Summary + Fixed-Budget Summary) / reports/summary_adaptive_budget.csv

Technical framing

Adaptive stopping cuts sample cost vs always sampling to max — The learned stop controller matches the 96.7% HumanEval ceiling with 1.7 samples instead of 5.5, trading 5pp on MBPP (55% vs 60%) for fewer samples.

Do smarter picking rules beat simple ones for choosing a submission

How to read

Each group of bars is one picking rule, from the best-possible pick down to simple habits like taking the first attempt that passed the visible tests or the answer most attempts agree on. Bar height is share of problems solved; taller is better. Shown for both sets.

0%25%50%75%100%oracle_coverageoracle_coverage60%96.7%base_verifierbase_verifier60%96.7%sft_verifiersft_verifier60%96.7%shortest_visibleshortest_visible60%96.7%first_visiblefirst_visible55%96.7%public_signature_majoritypublic_signature_majority55%96.7%

Takeaway → Nearly every bar sits at the same height within each set — smarter picking rules do not beat simple ones; only a couple dip slightly on the harder set.

Data table
Selection policyMBPP eval (20 tasks)HumanEval (30 tasks)
oracle_coverage60%96.7%
base_verifier60%96.7%
sft_verifier60%96.7%
shortest_visible60%96.7%
first_visible55%96.7%
public_signature_majority55%96.7%

Numbers from experiments/qwen35_4b_real_sample_verify_commit/reports/summary_fixed_budget.csv (budget 9 rows)

Technical framing

Which selection policy commits the right answer (max budget) — Verifier scoring matches the oracle on both sets; only first-visible and signature-majority drop 5pp on MBPP.

How much accuracy each early-stopping rule keeps

How to read

Three stopping rules side by side per set: an ideal stop-as-soon-as-solved rule and two practical learned rules. Bar height is the share of problems still solved after stopping early; taller means less accuracy given up. Shown for both sets.

0%25%50%75%100%oracle_stoporacle_stop60%96.7%sft_stop_controllersft_stop_controller55%96.7%threshold_sft_scorethreshold_sft_score55%96.7%

Takeaway → On the easier set all three match; on the harder set the practical rules sit slightly below the ideal one — a small accuracy cost for stopping early.

Data table
Stopping policyMBPP evalHumanEval
oracle_stop60%96.7%
sft_stop_controller55%96.7%
threshold_sft_score55%96.7%

Numbers from experiments/qwen35_4b_real_sample_verify_commit/reports/summary_adaptive_budget.csv

Technical framing

Adaptive stopping: what accuracy each controller keeps — Learned stopping matches the HumanEval ceiling but gives back 5pp vs oracle stopping on MBPP in exchange for fewer samples.

Attempts actually written versus the maximum allowed

How to read

Two lines, harder and easier set. The horizontal axis is the number of attempts allowed per problem; the vertical axis is how many were actually written before an attempt passed the visible tests and writing stopped. Lower means it stopped sooner.

02.557.5102468MBPP evalHumanEval

Takeaway → Both lines bend below the maximum at higher limits — writing stops early once an attempt passes the visible tests, and the easier set stops sooner than the harder one.

Data table
Sampling budget (candidates allowed)MBPP evalHumanEval
111
221.97
443.73
87.455.4
97.85.47

Numbers from experiments/qwen35_4b_real_sample_verify_commit/reports/summary_fixed_budget.csv (sampled_candidates_mean)

Technical framing

Samples actually drawn vs nominal budget — Even fixed-budget runs stop early on visible-test passes: at budget 8, HumanEval draws only 5.4 samples while harder MBPP draws 7.45.

In the author’s words from the Overview · “Summary”

Run the full sample -> verify -> commit loop using genuine Qwen3.5-4B code samples. The primary measurement decomposes final pass rate into candidate-pool coverage and selector capture.

Overview

This top-level README was generated during repository normalization because the imported experiment did not include one.

How To Read

Start with the primary report, then inspect data/, reports/, analysis/, src/, and scripts/ as available. This folder remains self-contained; do not move its run data into shared directories.

Summary

Run the full sample -> verify -> commit loop using genuine Qwen3.5-4B code samples. The primary measurement decomposes final pass rate into candidate-pool coverage and selector capture.

Report

Rendered from reports/qwen35_4b_real_sample_verify_commit_report.md

Objective

Run the full sample -> verify -> commit loop using genuine Qwen3.5-4B code samples. The primary measurement decomposes final pass rate into candidate-pool coverage and selector capture.

Candidate Generation

  • MBPP train records: 40.
  • MBPP eval records: 20.
  • HumanEval eval records: 30.
  • Direct samples per task: 8.
  • Model repair attempts per task: 1.
  • Temperatures: 0.2,0.7,1.0.
  • Max new tokens: 220.

No mutation-generated candidates are used. Every candidate is either a direct Qwen sample or a Qwen repair sample.

Key Result

  • MBPP eval coverage at max budget: 60.0%.
  • MBPP eval first-visible commit: 55.0%.
  • MBPP eval SFT verifier commit: 60.0%.
  • HumanEval coverage at max budget: 96.7%.
  • HumanEval first-visible commit: 96.7%.
  • HumanEval SFT verifier commit: 96.7%.
  • MBPP SFT stop controller: 55.0% using 4.20 samples on average.
  • HumanEval SFT stop controller: 96.7% using 1.70 samples on average.

Readout

On these genuine sampled pools, selection is not the main bottleneck. HumanEval is already easy for the generator at this budget: coverage reaches 96.7%, and first-visible, frozen verifier, SFT verifier, and oracle selection all match the ceiling. MBPP is coverage-limited: max-budget coverage is 60.0%, and the verifier can capture that ceiling, but it cannot create missing correct programs. The adaptive controller mostly trades a small amount of MBPP accuracy for fewer samples, while matching the HumanEval ceiling with far fewer samples.

Fixed-Budget Summary

DatasetPolicyBudgetVisible coverageSelected hidden-passCoverage capturedSamples seen
humanevalbase_verifier190.0%90.0%100.0%1.00
humanevalbase_verifier290.0%90.0%100.0%1.97
humanevalbase_verifier493.3%93.3%100.0%3.73
humanevalbase_verifier896.7%96.7%100.0%5.40
humanevalbase_verifier996.7%96.7%100.0%5.47
humanevalfirst_visible190.0%90.0%100.0%1.00
humanevalfirst_visible290.0%90.0%100.0%1.97
humanevalfirst_visible493.3%93.3%100.0%3.73
humanevalfirst_visible896.7%96.7%100.0%5.40
humanevalfirst_visible996.7%96.7%100.0%5.47
humanevaloracle_coverage190.0%90.0%100.0%1.00
humanevaloracle_coverage290.0%90.0%100.0%1.97
humanevaloracle_coverage493.3%93.3%100.0%3.73
humanevaloracle_coverage896.7%96.7%100.0%5.40
humanevaloracle_coverage996.7%96.7%100.0%5.47
humanevalpublic_signature_majority190.0%90.0%100.0%1.00
humanevalpublic_signature_majority290.0%90.0%100.0%1.97
humanevalpublic_signature_majority493.3%93.3%100.0%3.73
humanevalpublic_signature_majority896.7%96.7%100.0%5.40
humanevalpublic_signature_majority996.7%96.7%100.0%5.47
humanevalsft_verifier190.0%90.0%100.0%1.00
humanevalsft_verifier290.0%90.0%100.0%1.97
humanevalsft_verifier493.3%93.3%100.0%3.73
humanevalsft_verifier896.7%96.7%100.0%5.40
humanevalsft_verifier996.7%96.7%100.0%5.47
humanevalshortest_visible190.0%90.0%100.0%1.00
humanevalshortest_visible290.0%90.0%100.0%1.97
humanevalshortest_visible493.3%93.3%100.0%3.73
humanevalshortest_visible896.7%96.7%100.0%5.40
humanevalshortest_visible996.7%96.7%100.0%5.47
mbppbase_verifier135.0%35.0%100.0%1.00
mbppbase_verifier235.0%35.0%100.0%2.00
mbppbase_verifier450.0%50.0%100.0%4.00
mbppbase_verifier860.0%60.0%100.0%7.45
mbppbase_verifier960.0%60.0%100.0%7.80
mbppfirst_visible135.0%35.0%100.0%1.00
mbppfirst_visible235.0%35.0%100.0%2.00
mbppfirst_visible450.0%50.0%100.0%4.00
mbppfirst_visible860.0%55.0%91.7%7.45
mbppfirst_visible960.0%55.0%91.7%7.80
mbpporacle_coverage135.0%35.0%100.0%1.00
mbpporacle_coverage235.0%35.0%100.0%2.00
mbpporacle_coverage450.0%50.0%100.0%4.00
mbpporacle_coverage860.0%60.0%100.0%7.45
mbpporacle_coverage960.0%60.0%100.0%7.80
mbpppublic_signature_majority135.0%35.0%100.0%1.00
mbpppublic_signature_majority235.0%35.0%100.0%2.00
mbpppublic_signature_majority450.0%50.0%100.0%4.00
mbpppublic_signature_majority860.0%55.0%91.7%7.45
mbpppublic_signature_majority960.0%55.0%91.7%7.80
mbppsft_verifier135.0%35.0%100.0%1.00
mbppsft_verifier235.0%35.0%100.0%2.00
mbppsft_verifier450.0%50.0%100.0%4.00
mbppsft_verifier860.0%60.0%100.0%7.45
mbppsft_verifier960.0%60.0%100.0%7.80
mbppshortest_visible135.0%35.0%100.0%1.00
mbppshortest_visible235.0%35.0%100.0%2.00
mbppshortest_visible450.0%50.0%100.0%4.00
mbppshortest_visible860.0%60.0%100.0%7.45
mbppshortest_visible960.0%60.0%100.0%7.80

Adaptive-Budget Summary

DatasetPolicyVisible coverageSelected hidden-passCoverage capturedMean samples used
humanevaloracle_stop96.7%96.7%100.0%1.60
humanevalsft_stop_controller96.7%96.7%100.0%1.70
humanevalthreshold_sft_score96.7%96.7%100.0%1.60
mbpporacle_stop60.0%60.0%100.0%5.35
mbppsft_stop_controller55.0%55.0%100.0%4.20
mbppthreshold_sft_score55.0%55.0%100.0%4.20

Interpretation

This experiment uses genuinely sampled candidate pools, so the central fork is visible directly: under this sampling setup, the verifier is not failing on subtle visible-passing near-misses at this scale. The dominant open problem is generating a correct candidate on harder MBPP tasks. For HumanEval, the first visible-passing sample is usually already correct, so verifier posttraining and adaptive control add little accuracy headroom, though adaptive stopping reduces sample cost.

The main limitation is scale: this run uses 20 MBPP eval tasks and 30 HumanEval tasks because genuine Qwen sampling is the expensive step. The conclusion should be read as a measured pilot of the real candidate distribution, not as a final benchmark score.

The next high-leverage step is generator-side: increase coverage through better sampling, repair, or verifier-guided self-improvement. Verifier work should focus on larger, more adversarial sampled pools, because this run did not surface a meaningful selector wall.

Figures

Reproduction

python scripts/sample_candidates.py --mbpp-train 40 --mbpp-eval 20 --humaneval-eval 30 --samples-per-task 8 --repair-per-task 1 --max-new-tokens 220 --generation-batch-size 4 --temperatures 0.2,0.7,1.0 --top-p 0.95
python scripts/build_verifier_examples.py
python scripts/train_action_sft.py --train data/train_verifier_examples.jsonl --output-dir /workspace/large_artifacts/qwen35_4b_real_sample_verify_commit/models/verifier_sft_lora --loss-out reports/verifier_sft_training_losses.json --method sampled_semantic_verifier_sft --max-steps 160 --batch-size 2 --grad-accum 2
python scripts/eval_commit.py --records data/mbpp_train_records.jsonl --policy sft_verifier --name sft_verifier --out reports/eval/mbpp_train_sft_verifier.json --budgets 1,2,4,8,max --adapter-dir /workspace/large_artifacts/qwen35_4b_real_sample_verify_commit/models/verifier_sft_lora
python scripts/build_stop_examples.py --scores reports/eval/mbpp_train_sft_verifier.json --budgets 1,2,4,8,max
python scripts/train_action_sft.py --train data/train_stop_examples.jsonl --output-dir /workspace/large_artifacts/qwen35_4b_real_sample_verify_commit/models/stop_sft_lora --loss-out reports/stop_sft_training_losses.json --method sampled_generation_budget_stop_sft --max-steps 120 --batch-size 2 --grad-accum 2
bash scripts/run_evaluation_suite.sh
python scripts/make_report.py

Experiment log 12

Show the running log (12 entries)

Date: 2026-06-25

Experiment directory: /workspace/experiments/qwen35_4b_real_sample_verify_commit

Large artifacts directory: /workspace/large_artifacts/qwen35_4b_real_sample_verify_commit

Objective

Run the sample -> verify -> commit loop on genuinely sampled Qwen3.5-4B code completions, not mutation-derived candidate pools. The goal is to measure real candidate-pool coverage and selector capture without assuming that a correct candidate is present or that incorrect candidates are easy to reject.

The primary measurement is:

final pass@1 = candidate coverage ceiling x selector capture

Where:

  • candidate coverage ceiling means at least one sampled candidate passes hidden tests.
  • selector capture means the selected candidate is hidden-correct when the pool contains a hidden-correct candidate.
  • Hidden tests are used only for evaluation labels, verifier training labels, and oracle diagnostic arms. Selection inputs at eval time remain leak-free.

Hypothesis

The candidate distribution itself can dominate the result. If genuine Qwen sampling creates realistic subtle-bug near-misses, selection may collapse even when coverage is high. If coverage is low, the wall is the generator rather than the verifier.

This run is designed to distinguish three outcomes:

  1. High coverage and high selector capture: sample + verify + commit is deployable.
  2. High coverage and poor selector capture: verifier/selection is the wall.
  3. Low coverage: generation is the wall.

Model And Data

Base model: /workspace/.cache/huggingface/models--Qwen--Qwen3.5-4B/snapshots/851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a

Datasets:

  • MBPP train subset: 40 records.
  • MBPP eval subset: 20 records.
  • HumanEval eval subset: 30 records.

Candidate generation:

  • Direct samples per task: 8.
  • Repair attempts per task: 1.
  • Temperatures: 0.2,0.7,1.0.
  • Top-p: 0.95.
  • Max new tokens: 220.
  • Seed: 20260625.
  • HumanEval public tests used during candidate filtering: up to 3.
  • No mutation-generated candidates.

Candidate pool manifest:

SplitRecordsMean candidatesMean parsed/safeMean visible-passersCoverageVisible coverage
MBPP train406.9256.6754.07577.5%77.5%
MBPP eval207.8007.5003.20060.0%60.0%
HumanEval eval305.4675.3334.43396.7%96.7%

Implementation Notes

The package is intentionally split so the downloadable experiment directory does not contain large checkpoints or adapters:

Core scripts:

  • scripts/sample_candidates.py: genuine Qwen direct sampling plus Qwen repair sampling.
  • scripts/build_verifier_examples.py: verifier SFT data from parsed/safe public-failing negatives plus visible-passing positives/negatives.
  • scripts/train_action_sft.py: shared LoRA trainer for semantic verifier and stop controller.
  • scripts/eval_commit.py: fixed-budget commit policies.
  • scripts/build_stop_examples.py: adaptive generation-budget STOP/MORE training examples.
  • scripts/tune_threshold.py: threshold baseline tuning on MBPP train.
  • scripts/eval_adaptive_budget.py: adaptive generation-budget policies.
  • scripts/make_report.py: standalone markdown report, CSV summaries, and figures.
  • scripts/run_evaluation_suite.sh: reruns fixed-budget, threshold, and adaptive evaluation after adapters exist.

Debugging And Fixes

This run intentionally used the real model and real Python execution, so several harness issues surfaced and were fixed:

  1. MBPP prompt construction initially used the wrong field name (text instead of normalized task_text). Fixed prompt builders to use normalized task text.
  2. The Qwen model implementation rejected generator= in generate. Fixed sampling to set torch.manual_seed per completion instead.
  3. Qwen initially emitted thinking text rather than code-only completions. Fixed prompts to use the tokenizer chat template with enable_thinking=False where supported.
  4. The static safety checker rejected safe typing imports such as from typing import List. Fixed import checking to validate the module name, not each imported alias as a module.
  5. HumanEval prompts with only a function signature and docstring were being accepted as valid because the entry function existed. Fixed validation to require a non-docstring function body.
  6. Verifier training data initially had too few negatives because genuine visible-passers were often correct. Fixed build_verifier_examples.py to include parsed/safe public-failing candidates as negative examples by default, while keeping --visible-only available.
  7. Report generation initially mixed MBPP train scoring files into fixed-budget summaries. Fixed make_report.py to exclude _train_ evaluation files.

Training

Verifier SFT:

python scripts/train_action_sft.py \
  --train data/train_verifier_examples.jsonl \
  --output-dir /workspace/large_artifacts/qwen35_4b_real_sample_verify_commit/models/verifier_sft_lora \
  --loss-out reports/verifier_sft_training_losses.json \
  --method sampled_semantic_verifier_sft \
  --max-steps 160 \
  --batch-size 2 \
  --grad-accum 2

Verifier training examples:

  • Total: 267.
  • Positive: 148.
  • Negative: 119.
  • Includes parsed/safe public-failing negatives.

Stop controller SFT:

python scripts/train_action_sft.py \
  --train data/train_stop_examples.jsonl \
  --output-dir /workspace/large_artifacts/qwen35_4b_real_sample_verify_commit/models/stop_sft_lora \
  --loss-out reports/stop_sft_training_losses.json \
  --method sampled_generation_budget_stop_sft \
  --max-steps 120 \
  --batch-size 2 \
  --grad-accum 2

Stop controller training examples:

  • Total: 200.
  • STOP: 153.
  • MORE: 47.

The threshold baseline was tuned on MBPP train verifier scores. Best threshold: -19.875, with MBPP-train selected hidden-pass 77.5% at 2.75 samples average.

Fixed-Budget Results

Budgets are candidate-prefix budgets. max means all available generated candidates for that record.

DatasetPolicyMax-budget coverageMax-budget selected hidden-passCoverage captured
MBPP evaloracle coverage60.0%60.0%100.0%
MBPP evalfirst visible60.0%55.0%91.7%
MBPP evalpublic-signature majority60.0%55.0%91.7%
MBPP evalshortest visible60.0%60.0%100.0%
MBPP evalbase verifier60.0%60.0%100.0%
MBPP evalSFT verifier60.0%60.0%100.0%
HumanEval evaloracle coverage96.7%96.7%100.0%
HumanEval evalfirst visible96.7%96.7%100.0%
HumanEval evalpublic-signature majority96.7%96.7%100.0%
HumanEval evalshortest visible96.7%96.7%100.0%
HumanEval evalbase verifier96.7%96.7%100.0%
HumanEval evalSFT verifier96.7%96.7%100.0%

Coverage curves:

DatasetBudget 1Budget 2Budget 4Budget 8Max
MBPP eval35.0%35.0%50.0%60.0%60.0%
HumanEval eval90.0%90.0%93.3%96.7%96.7%

Adaptive Generation-Budget Results

The adaptive resource here is number of generated candidates inspected before committing, matching the real-code cost structure more closely than probe/test count.

DatasetPolicyVisible coverageSelected hidden-passCoverage capturedMean samples used
MBPP evaloracle stop60.0%60.0%100.0%5.35
MBPP evalthreshold on SFT verifier score55.0%55.0%100.0%4.20
MBPP evalSFT stop controller55.0%55.0%100.0%4.20
HumanEval evaloracle stop96.7%96.7%100.0%1.60
HumanEval evalthreshold on SFT verifier score96.7%96.7%100.0%1.60
HumanEval evalSFT stop controller96.7%96.7%100.0%1.70

Interpretation

This pilot uses genuine sampled pools and the outcome is clear: on these pools, selection is not the main bottleneck.

For HumanEval, Qwen sampling already creates a correct visible-passing candidate on 96.7% of the sampled tasks, and the first visible-passing candidate is already hidden-correct whenever coverage exists. That leaves almost no selection headroom for either the base verifier or the SFT verifier.

For MBPP, max-budget coverage is only 60.0%. The verifier can capture that ceiling, but it cannot create candidates that sampling missed. This points at generation/repair coverage as the current wall, not verifier ranking.

The adaptive generation-budget result is useful but modest. On HumanEval, the controller matches the 96.7% ceiling after inspecting only about 1.7 samples on average. On MBPP, the SFT stop controller and tuned threshold trade 5 points of accuracy for fewer inspected samples relative to oracle-stop/max-budget selection.

The important fork is therefore:

  • Not enough evidence for a selector wall in this sampled-pool pilot.
  • Strong evidence that MBPP needs better candidate generation or repair.
  • HumanEval at this small scale is too forgiving to stress the verifier.

Limitations

  1. Scale is small because genuine Qwen3.5-4B sampling is expensive on the available hardware: 20 MBPP eval tasks and 30 HumanEval eval tasks.
  2. HumanEval appears too easy under this sampling setup because public-visible passers are usually hidden-correct.
  3. MBPP coverage is the decisive bottleneck, but this experiment does not yet improve the generator.
  4. Verifier SFT data is small and partly trained with public-failing negatives; this is appropriate for a pilot but not a final verifier benchmark.
  5. The code execution harness uses subprocess timeouts and static checks, not a full container sandbox.

Decision

The next high-impact experiment should move upstream to coverage: verifier-guided self-improvement or repair generation on genuine sampled failures, still reported as coverage x selector capture. A larger verifier-only run is lower priority unless the candidate generator can produce harder realistic near-miss pools where coverage is high and first-visible selection fails.

The concrete next step I would run:

  1. Generate larger genuine candidate pools on MBPP train/eval.
  2. Use the verifier/executor to identify public-failing and hidden-failing candidates.
  3. Train a repair generator or rejection-sampling distillation loop on verifier-selected candidates.
  4. Re-run this exact coverage x selection report to see whether MBPP coverage rises above 60% without reducing selector capture.

Reproduction Commands

python scripts/sample_candidates.py --mbpp-train 40 --mbpp-eval 20 --humaneval-eval 30 --samples-per-task 8 --repair-per-task 1 --max-new-tokens 220 --generation-batch-size 4 --temperatures 0.2,0.7,1.0 --top-p 0.95
python scripts/build_verifier_examples.py
python scripts/train_action_sft.py --train data/train_verifier_examples.jsonl --output-dir /workspace/large_artifacts/qwen35_4b_real_sample_verify_commit/models/verifier_sft_lora --loss-out reports/verifier_sft_training_losses.json --method sampled_semantic_verifier_sft --max-steps 160 --batch-size 2 --grad-accum 2
python scripts/eval_commit.py --records data/mbpp_train_records.jsonl --policy sft_verifier --name sft_verifier --out reports/eval/mbpp_train_sft_verifier.json --budgets 1,2,4,8,max --adapter-dir /workspace/large_artifacts/qwen35_4b_real_sample_verify_commit/models/verifier_sft_lora
python scripts/build_stop_examples.py --scores reports/eval/mbpp_train_sft_verifier.json --budgets 1,2,4,8,max
python scripts/train_action_sft.py --train data/train_stop_examples.jsonl --output-dir /workspace/large_artifacts/qwen35_4b_real_sample_verify_commit/models/stop_sft_lora --loss-out reports/stop_sft_training_losses.json --method sampled_generation_budget_stop_sft --max-steps 120 --batch-size 2 --grad-accum 2
bash scripts/run_evaluation_suite.sh
python scripts/make_report.py

Figures 6

humaneval adaptive budget
humaneval adaptive budget · reports/figures/
humaneval coverage curve
humaneval coverage curve · reports/figures/
humaneval fixed budget accuracy
humaneval fixed budget accuracy · reports/figures/
mbpp adaptive budget
mbpp adaptive budget · reports/figures/
mbpp coverage curve
mbpp coverage curve · reports/figures/
mbpp fixed budget accuracy
mbpp fixed budget accuracy · reports/figures/

Data files 12

Result tables and metrics copied from the experiment folder — preview inline or open the raw file.

Reproduce

Run steps are documented inside the experiment folder (README and scripts).

Browse the experiment folder on GitHub ↗