Research log Small Model Experimentation
GitHub

Qwen3.5-4B Verifier vs Visible Selector Showdown

A cheap test makes slow self-checking pointless

The one idea you need

Picking the best of eight code drafts is like hiring: run each past one cheap screening test, and the handful that survive are so close in quality that a quick gut-feel judgment ranks them as well as slow, careful deliberation.

The question

When a small model writes eight candidate programs and you must pick one to ship, is it worth having it slowly reason through which one is correct?

What we found

No. When you can run even a single example test on each candidate, that filter alone lifts the share of shipped programs that fully work from 77% to 85%. Adding a free, instant self-confidence rating reaches 87% — matching a careful step-by-step self-check that costs five times the compute. Slow deliberation only earns its keep when no test can be run.

Why it matters

When your task ships an example test, spend compute running it first, then break ties among survivors with the model's free instant confidence score. Reserve slow step-by-step self-verification for settings where you cannot execute the code at all.

Random pick vs best selector77% → 87%share of chosen programs that pass every hidden test
Cost of slow self-checking5x the computefor zero extra accuracy once a test exists
Programs that pass the example but still failabout 1 in 156.6% of test-passers fail the hidden tests
Gap to a perfect picker closed83%of the distance from a random pick to a flawless one
On this page
  1. Results at a glance
  2. Overview
  3. Report
    1. Summary
    2. Research Program Fit
    3. Method
    4. Results
    5. Controls
    6. Oracle Versus Deployable Evidence
    7. Interpretation
    8. Next Experiments
    9. Artifact Manifest
  4. Experiment log
  5. Figures
  6. Data files
  7. Reproduce
  8. Related

Results at a glance 3

Which selector picks a working solution most often?

How to read

Each bar is one method for picking one of eight programs; height is the share of picks that pass every hidden test (taller is better), running from random pick at 77% up to a non-deployable perfect picker at 89%.

0%25%50%75%100%pass@1pass@177.1%no-think verifierno-think verifier80%visible test onlyvisible test only85%thinking verifierthinking verifier86%visible + no-think verifiervisible + no-think verifier87%visible + thinking verifiervisible + thinking verifier87%oracle pass@8oracle pass@889%

Takeaway → The test-plus-free-confidence bar reaches 87%, level with the five-times-costlier deliberate check and just below the 89% perfect ceiling; cheap methods capture almost all the gain.

Data table
selectorselection accuracy
pass@177.1%
no-think verifier80%
visible test only85%
thinking verifier86%
visible + no-think verifier87%
visible + thinking verifier87%
oracle pass@889%

Numbers from experiments/qwen35_4b_verifier_selector_showdown/runs/summary.json

Technical framing

Which selector picks the right candidate? (100 MBPP tasks, k=8 pool) — Visible test + a free no-think verifier hits 0.870, tying the 5x-costlier thinking verifier and closing 83% of the pass@1-to-oracle gap.

Compute cost per task for each picking method

How to read

Each bar is estimated compute per task for one method; shorter is cheaper. The two deliberate self-check bars tower near 4,960 while the test and quick-confidence options sit down at 960.

0200040006000pass@1pass@1120visible test onlyvisible test only960no-think verifierno-think verifier960visible + no-think verifiervisible + no-think verifier960thinking verifierthinking verifier4960visible + thinking verifiervisible + thinking verifier4960

Takeaway → The deliberate check costs about five times the cheap combo yet, from the accuracy chart, buys no extra accuracy — the visual signature of wasted spend.

Data table
selectorestimated tokens per task
pass@1120
visible test only960
no-think verifier960
visible + no-think verifier960
thinking verifier4960
visible + thinking verifier4960

Numbers from experiments/qwen35_4b_verifier_selector_showdown/runs/summary.json

Technical framing

Token cost per task: the thinking verifier's edge is expensive — Thinking-verification costs ~5x the visible+no-think combo yet delivers no extra accuracy, so it is Pareto-dominated when a visible test exists.

Ranking the survivors: quick versus deliberate self-check

How to read

Two bars show how reliably each self-check sorts a truly-correct survivor above a secretly-broken one; higher is better, and a coin flip would score 50%. Deliberate scores 76%, quick 70%.

00.20.40.60.8thinking verifierthinking verifier0.758no-think verifierno-think verifier0.701

Takeaway → The free quick check trails the costly one only slightly, because after the test filters candidates few broken survivors remain to sort apart.

Data table
verifier modeAUROC (true-pass vs false-pass, among visible-passers)
thinking verifier0.758
no-think verifier0.701

Numbers from experiments/qwen35_4b_verifier_selector_showdown/runs/summary.json

Technical framing

Ranking survivors of the visible test: no-think verification nearly suffices — Once the visible test filters candidates, only 6.6% are false-passes and the cheap no-think verifier ranks them almost as well as thinking.

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

The thinking verifier is Pareto-dominated: standalone barely beats visible (0.860 vs 0.850) at ~5x cost, and in combination the no-think verifier ties it (both 0.870). Best deployable = visible + no-think verifier (0.870, ~free), closing 83% of the pass@1->oracle gap. C2 false-pass rate here is only 6.6%.

Overview

Research Program

  • Program: evidence_conditioned_selection
  • Program question: is the model's own thinking-verifier (C10) worth its cost as a deployable selector, and does combining it with the visible test break the C2 false-pass wall?
  • Prior anchors: qwen35_4b_generator_verifier_gap (C10: thinking-verifier is strong standalone), qwen35_4b_thinking_budget_controller (visible-test selector, bounded by false-passes).

Question

On one k=8 candidate pool, compare deployable selectors head-to-head at matched cost: pass@1, visible-only, no-think verifier, thinking verifier, visible+verifier, oracle. Does self-verification beat / complement the visible test, and is thinking-verification worth its ~5x token cost?

Setup

  • Reuse the generator-verifier pool (100 MBPP tasks x k=8 no-think candidates, with full-test labels + the model's thinking/no-think black-box P(correct) already computed). Add a visible-test (first-assert) label per candidate. Fully offline (no new generation).
  • Selectors pick one candidate per task -> its true full-test pass. Cost = estimated tokens/task (stated assumptions). See analysis/analyze.py.

Run

../../.venv/bin/python scripts/build_pool.py    # add visible-test labels (torch-free)
../../.venv/bin/python analysis/analyze.py       # selectors + false-pass breakdown + figure

Results

Full results in reports/report.md.

selector (deployable)accuracy~tok/task
pass@10.771120
visible-only0.850960
thinking verifier0.860~4960
visible + no-think verifier0.870960
visible + thinking verifier0.870~4960
oracle pass@80.890

The thinking verifier is Pareto-dominated: standalone barely beats visible (0.860 vs 0.850) at ~5x cost, and in combination the no-think verifier ties it (both 0.870). Best deployable = visible + no-think verifier (0.870, ~free), closing 83% of the pass@1->oracle gap. C2 false-pass rate here is only 6.6%.

Interpretation

Refines C10: cheap self-verification (no-think) + the cheap visible test is the deployable sweet spot; thinking-verification's expensive edge only matters in verifier-only settings (no cheap execution signal). When a visible test exists, spend tokens on it + a free no-think verifier, not on thinking-verification.

Artifacts

  • src/tasks.py; scripts/build_pool.py; analysis/analyze.py. data/pool.jsonl + copied gv_records/labels; runs/summary.json, analysis/selectors.png. No external artifacts.

Report

Rendered from reports/report.md

Summary

Head-to-head deployable selection signals on one k=8 MBPP candidate pool, at matched cost: does the model's own thinking-verifier (claim C10) beat / break the visible-test false-pass wall the earlier thinking controller was bounded by? The matched-cost lens tempers C10. The visible test alone is already a strong, nearly-free selector (0.850, from pass@1 0.771 toward oracle 0.890). The thinking verifier is Pareto-dominated: standalone it reaches 0.860 (barely above visible's 0.850) at ~5× the token cost, and in combination the no-think verifier ties it (both 0.870) — once the cheap visible test does the coarse filtering, ranking the survivors is easy enough that no-think verification suffices. Best deployable = visible + no-think verifier: 0.870 at ~free cost, closing 83% of the pass@1→oracle gap by catching false-passes. So thinking-verification's expensive standalone edge (the big win in the generator-verifier experiment) evaporates whenever a cheap visible signal exists — its value is confined to verifier-only settings.

Research Program Fit

Follows up qwen35_4b_generator_verifier_gap (C10) and qwen35_4b_thinking_budget_controller under evidence_conditioned_selection. It supplies the matched-cost, deployable comparison the C10 result begged for, and answers whether self-verification is worth its token cost as a selector.

Method

  • Reuse the generator-verifier candidate pool (100 MBPP tasks × k=8 no-think candidates, with full-test execution labels + the model's thinking/no-think black-box verifier P(correct) already computed). Add a fresh visible-test label per candidate (passes the first assert — the deployable signal the controller used). All offline.
  • Deployable selectors (per task pick one candidate → its true full-test pass): pass@1 (random single); visible-only (first visible-passer); no-think / thinking verifier (max P(A)); visible+verifier (among visible-passers, max P(A)); oracle pass@k (non-deployable ceiling).
  • Cost: estimated tokens/task (no-think candidate ~120; thinking-verification ~500; visible test / no-think verification ≈ 0 extra generation) — stated assumptions, for the Pareto picture, not measured per-item.

Results

selector (deployable)accuracy~tokens/taskgap closed (pass@1→oracle)
pass@1 (random single)0.771120
visible-only (first visible-pass)0.85096066%
no-think verifier (max P_A)0.80096024%
thinking verifier (max P_A)0.860~496075%
visible + no-think verifier0.87096083%
visible + thinking verifier0.870~496083%
ORACLE pass@8 (non-deployable)0.890960100%

C2 false-pass wall: visible-pass rate 0.818; 6.6% of visible-passers full-fail (43 false-passes). Among visible-passers, the verifier ranks true>false at AUROC 0.758 (think) / 0.701 (no-think). Figure: analysis/selectors.png.

Finding 1 — the visible test is already a strong, nearly-free selector

Visible-only reaches 0.850 (66% of the oracle gap) at ~0 extra tokens. The C2 false-pass rate on this pool is modest (6.6% of visible-passers), so there is limited headroom for any verifier to add.

Finding 2 — the thinking verifier is Pareto-dominated

Standalone thinking-verifier 0.860 barely beats visible-only 0.850, at ~5× the token cost. Combined, visible+thinking (0.870) equals visible+no-think (0.870): the thinking verifier's large standalone edge over no-think (0.860 vs 0.800) disappears once the visible test pre-filters, because ranking visible-passers is an easier discrimination that no-think verification handles nearly as well (AUROC 0.701 vs 0.758).

Finding 3 — best deployable selector = visible + no-think verifier (0.870, ~free)

It beats visible-only by +2pp (catching false-passes the first-visible-passer rule commits) at the same cost, closing 83% of the pass@1→oracle gap. Thinking-verification is not worth its 5× token cost here.

Controls

Same pool for every selector (paired). The +2pp of visible+verifier over visible-only is small (~2 tasks at n=100, within per-condition noise) but paired and mechanistic (it reranks visible-passers to avoid false-passes). The oracle is the non-deployable ceiling.

Oracle Versus Deployable Evidence

All selectors except the oracle read only visible info (visible test + the model's own black-box judgment), so their accuracies are deployable. pass@8 = 0.890 is the non-deployable ceiling.

Interpretation

This refines C10. Self-verification does help selection, but cheap self-verification (no-think) combined with the cheap visible test is the deployable sweet spot — thinking-verification's expensive edge only matters in verifier-only settings (no cheap execution-based signal), which is exactly the regime the generator-verifier experiment measured. The durable lesson: when a cheap ground-truth-ish signal (a visible test) exists, spend tokens on it plus a free no-think verifier, not on expensive thinking-verification; the matched-cost lens flips the standalone ranking.

Limitations

  • MBPP (basic, likely contaminated), n=100, single seed; the modest C2 false-pass rate (6.6%) caps verifier headroom on this pool — a harder pool with more false-passes could favor the (stronger) thinking verifier.
  • Token costs are estimates (stated assumptions), not measured per-item; the accuracy ranking is exact.
  • Not run: the matched-cost-vs-more-sampling arm (spend the ~4000 verification tokens on more candidates to raise coverage) — but visible+no-think-verifier already Pareto-dominates the thinking verifier at ~5× less cost.

Next Experiments

  • Harder / contamination-controlled pool with a higher false-pass rate — does the thinking verifier's edge survive when the visible test is weaker?
  • Matched-cost vs more-sampling: is any verifier worth its tokens vs just raising k?

Artifact Manifest

See artifact_manifest.yaml. Offline; small pool/summary + figure in-repo; candidate pool reused from qwen35_4b_generator_verifier_gap.

Experiment log 2

Show the running log (2 entries)

Scaffold

Matched-cost, deployable follow-up to the generator-verifier gap (C10): is the thinking-verifier worth its cost as a selector vs the cheap visible test? Fully offline -- reuses the generator-verifier candidate pool (k=8, P(A) signals + full_pass) and adds a visible-test (first-assert) label per candidate.

Results (see reports/report.md)

Deployable selectors on the k=8 pool: pass@1 0.771, visible-only 0.850, no-think verifier 0.800, thinking verifier 0.860, visible+no-think verifier 0.870, visible+thinking verifier 0.870, oracle 0.890. C2 false-pass rate 6.6%. The thinking verifier is Pareto-dominated (0.860 at ~5x cost); no-think ties it in the combination. Best deployable = visible + no-think verifier (0.870, ~free), closing 83% of the pass@1->oracle gap. Tempers C10: thinking-verification's edge only matters in verifier-only settings; when a visible test exists, use it

  • a free no-think verifier.

Figures 1

selectors
selectors · analysis/

Data files 1

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

Reproduce

Smoke test

../../.venv/bin/python scripts/build_pool.py

Full run

../../.venv/bin/python scripts/build_pool.py && ../../.venv/bin/python analysis/analyze.py

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

Browse the experiment folder on GitHub ↗