Research log Small Model Experimentation
GitHub

Qwen Disagreement-Probe Program Induction

Caution helped; the clever tie-breaker quiz did not

The one idea you need

A small model writes several short programs to reformat messy text — dates, prices, names. Because the programs disagree on some inputs, you feed it those tricky cases and ask it to judge which output is right, hoping its verdicts reveal the single best program.

The question

When a small model writes several programs to reformat text, does quizzing it on the inputs where those programs disagree help pick the best one?

What we found

No. The disagreement quiz picked the same programs whether its judge answers were real, randomly assigned, or skipped entirely — all three landed at 64% of tasks fully solved. The only genuine gain came from a plain caution rule: run a generated program only when it clearly fits, otherwise answer each item by hand. That rule lifted fully-solved tasks from 56% to 64%.

Why it matters

When a small model writes code to handle a task, invest in a conservative fallback that runs the code only when it clearly fits — not elaborate schemes to rank rival programs, which here changed no decisions at all.

Tasks fully solved: plain answering vs adding caution56% → 64%share of 25 tasks solved exactly, before and after the cautious program gate
Extra tasks won by the disagreement quiznonereal-quiz, random-quiz, and no-quiz gates all tied at 64%
Tasks where the quiz changed the choice0 of 25quiz-gated and no-quiz decisions were identical on every task
Where the gains landed29% → 57%number-formatting tasks solved exactly; every other category matched plain answering
On this page
  1. Results at a glance
  2. Overview
  3. Report
    1. Question
    2. Setup
    3. Main Result
    4. Interpretation
    5. Verdict
    6. Program Diagnostics
    7. Charts
    8. Task Details
    9. Family Summary
    10. Limitations
    11. Artifacts
  4. Experiment log
  5. Figures
  6. Data files
  7. Reproduce
  8. Related

Results at a glance 6

How many tasks each method fully solved

How to read

Bars show the share of tasks solved exactly right, one per method — plain by-hand answering, program only, and gates using real, random, no, or scrambled quiz answers; taller is better.

0%20%40%60%80%direct row-by-rowdirect row-by-row56%program onlyprogram only40%gate (no probes)gate (no probes)64%disagreement-probe gatedisagreement-probe gate64%random-probe gaterandom-probe gate64%shuffled-label gateshuffled-label gate56%

Takeaway → The real-quiz, random-quiz, and no-quiz gates land at exactly the same height, so the disagreement quiz bought nothing — the caution gate, not the quiz, delivered the lift.

Data table
methodfull-task exact
direct row-by-row56%
program only40%
gate (no probes)64%
disagreement-probe gate64%
random-probe gate64%
shuffled-label gate56%

Numbers from experiments/qwen_disagreement_probe_program_induction/analysis/summary.csv

Technical framing

Full-task exact match: gated program use ties across probe variants — The simple direct-fallback gate lifts 56% to 64%; disagreement probes add nothing beyond it (probe and random-probe gates also 64%).

Tasks improved versus tasks broken, compared to plain answering

How to read

For each method, one bar counts tasks it improved over plain answering and another counts tasks it broke, out of 25; more improved and fewer broken is better. Raw programs broke six to fourteen tasks; both caution gates broke none.

051015disagreement-probe gatedisagreement-probe gate20gate (no probes)gate (no probes)20program onlyprogram only26monolithic programmonolithic program27shuffled recursiveshuffled recursive114

Takeaway → Running programs unguarded wrecks many tasks; the cautious gate keeps the two wins while breaking nothing — its whole value is restraint.

Data table
methodtasks helpedtasks hurt
disagreement-probe gate20
gate (no probes)20
program only26
monolithic program27
shuffled recursive114

Numbers from experiments/qwen_disagreement_probe_program_induction/analysis/summary.csv

Technical framing

Tasks helped vs hurt relative to direct answering (25 tasks) — Raw generated programs hurt 6-7 tasks; the conservative fallback gates keep the 2 wins while hurting none.

Tasks solved by category: plain answering vs the quiz gate

How to read

Paired bars per text-format category compare plain answering against the disagreement-quiz gate; taller is better. Every category matches except number-formatting, where the gate rises from about 29% to about 57%.

0%25%50%75%100%BillingCodeBillingCode100%100%CityCity0%0%CurrencyCurrency100%100%DateTimeDateTime28.6%28.6%EmailEmail100%100%FilePathFilePath100%100%NameName100%100%NumberNumber28.6%57.1%PhonePhone100%100%RatingRating100%100%

Takeaway → All of the gate's advantage comes from number-formatting tasks; everywhere else it simply equals plain answering.

Data table
task familydirect row-by-rowdisagreement-probe gate
BillingCode100%100%
City0%0%
Currency100%100%
DateTime28.6%28.6%
Email100%100%
FilePath100%100%
Name100%100%
Number28.6%57.1%
Phone100%100%
Rating100%100%

Numbers from report table (Family Summary), experiments/qwen_disagreement_probe_program_induction/reports/qwen_disagreement_probe_program_induction_report.md

Technical framing

Full-task exact by task family: direct vs probe-gated — All of the gated method's gain comes from Number tasks; every other family matches direct answering exactly.

Item-by-item accuracy by method

How to read

Bars show the share of individual items transformed exactly right, one per method; taller is better. All gated variants tie near 83%, plain answering trails slightly, and the ungated program arms fall to 45% or below.

0%25%50%75%100%Recursive gatedRecursive gated82.7%Probe gatedProbe gated82.7%Random-probe gatedRandom-probe gated82.7%Direct rowDirect row80.7%Shuffled-probe gatedShuffled-probe gated80.7%Direct batchDirect batch76%Recursive programRecursive program44.7%Probe programProbe program44.7%Monolithic programMonolithic program40.7%Recursive shuffledRecursive shuffled6%

Takeaway → At the item level the gated methods tie again, while trusting raw programs roughly halves accuracy and scrambled answers collapse it to near nothing.

Data table
MethodRow exact
Recursive gated82.7%
Probe gated82.7%
Random-probe gated82.7%
Direct row80.7%
Shuffled-probe gated80.7%
Direct batch76%
Recursive program44.7%
Probe program44.7%
Monolithic program40.7%
Recursive shuffled6%

Numbers from experiments/qwen_disagreement_probe_program_induction/analysis/summary.csv

Technical framing

Row-level exact match by method — At the row level all gated variants tie at 82.7%; ungated program arms roughly halve accuracy and shuffled labels collapse to 6%.

How often a fitting program is actually trusted

How to read

Per method, bars show the share of tasks where a generated program passed the visible examples or was actually used — this measures supply of usable programs, not final accuracy. Programs fit on 52% of tasks; the cautious gates trust only 40 to 44%.

0%20%40%60%Recursive programRecursive program52%Probe programProbe program52%Recursive oracleRecursive oracle52%Monolithic programMonolithic program48%Recursive gatedRecursive gated44%Probe gatedProbe gated40%Random-probe gatedRandom-probe gated40%Recursive shuffledRecursive shuffled20%Shuffled-probe gatedShuffled-probe gated0%

Takeaway → Programs often fit the shown examples, yet the gate deliberately trusts fewer of them, trading coverage for safety; scrambled-answer quizzes trust none.

Data table
MethodTrain-pass rate
Recursive program52%
Probe program52%
Recursive oracle52%
Monolithic program48%
Recursive gated44%
Probe gated40%
Random-probe gated40%
Recursive shuffled20%
Shuffled-probe gated0%

Numbers from experiments/qwen_disagreement_probe_program_induction/analysis/summary.csv

Technical framing

Share of tasks with a train-passing program used or found, by method — Programs pass visible examples on 52% of tasks, but the conservative gates only trust them on 40-44%; shuffled-label probes trust none.

Item accuracy by category: plain answering vs raw programs

How to read

Paired bars per category compare plain answering against raw unguarded programs at the item level; taller is better. They match on prices, emails, phones, and ratings, but programs collapse on file paths, billing codes, and especially dates and times.

0%25%50%75%100%BillingCodeBillingCode100%0%CityCity66.7%33.3%CurrencyCurrency100%100%DateTimeDateTime59.5%9.5%EmailEmail100%100%FilePathFilePath100%0%NameName100%66.7%NumberNumber76.2%45.2%PhonePhone100%100%RatingRating100%100%

Takeaway → Raw programs handle simple formats fine but fall apart on structured ones, explaining why running them unguarded is risky.

Data table
Task familyDirect rowRecursive program (ungated)
BillingCode100%0%
City66.7%33.3%
Currency100%100%
DateTime59.5%9.5%
Email100%100%
FilePath100%0%
Name100%66.7%
Number76.2%45.2%
Phone100%100%
Rating100%100%

Numbers from experiments/qwen_disagreement_probe_program_induction/analysis/family_summary.csv

Technical framing

Row exact by task family: direct answering vs raw generated programs — Ungated programs match direct answering on Currency/Email/Phone/Rating but collapse on BillingCode, FilePath, and especially DateTime.

In the author’s words from the Report · “Interpretation”

Direct row-by-row answering solves 56.0% of tasks under strict full-task exactness. The selected executable program without probe selection solves 40.0%. The non-probe gated method solves 64.0%. The disagreement-probe gated method solves 64.0%. Random-probe gated selection solves 64.0%, and shuffled-label probe selection solves 56.0%. The disagreement-probe gated method helps 2 tasks and hurts 0 tasks relative to direct row-by-row answering. The hidden diagnostic oracle over train-passing generated programs solves 40.0%, and at least one candidate passes visible examples on 52.0% of tasks. The shuffled-label control checks whether probe labels matter. The random-probe control checks whether disagreement ranking matters. … Read the full result →

Overview

Standalone experiment for selecting task-local executable transformation programs with model-labeled disagreement probes.

Large reusable artifacts are stored under:

/workspace/large_artifacts/qwen_disagreement_probe_program_induction

Primary outputs:

Report

Rendered from reports/qwen_disagreement_probe_program_induction_report.md

Question

Can model-labeled disagreement probes select better task-local executable programs than visible examples alone?

The method asks the model to write Python transform(row) candidate functions. Candidate programs are executed on visible examples. Synthetic probe inputs are generated from the visible examples, ranked by candidate disagreement, and labeled by the model. Program selection uses visible examples plus probe labels. Held-out rows are used only for final scoring.

Setup

  • Run: main_v1
  • Dataset: public text-transformation tasks.
  • Tasks: 25
  • Visible examples per task: 4
  • Held-out cap per task: 6
  • Program variants: monolithic,robust
  • Repair rounds: 1
  • Disagreement probes per task: 4
  • Probe label variants: plain,consistency
  • Probe score threshold for gated use: 0.67
  • Elapsed seconds: 1556.2

Main Result

methodtasksrow_exactfull_task_exacttrain_pass_ratetasks_helped_vs_directtasks_hurt_vs_direct
recursive_gated_direct2582.7%64.0%44.0%20
probe_gated_direct2582.7%64.0%40.0%20
random_probe_gated_direct2582.7%64.0%40.0%20
direct_batch2576.0%60.0%21
direct_row2580.7%56.0%00
shuffled_probe_gated_direct2580.7%56.0%0.0%00
recursive_program2544.7%40.0%52.0%26
probe_program2544.7%40.0%52.0%26
recursive_oracle2544.7%40.0%52.0%26
monolithic_program2540.7%36.0%48.0%27
recursive_shuffled256.0%4.0%20.0%114

Interpretation

Direct row-by-row answering solves 56.0% of tasks under strict full-task exactness. The selected executable program without probe selection solves 40.0%. The non-probe gated method solves 64.0%. The disagreement-probe gated method solves 64.0%. Random-probe gated selection solves 64.0%, and shuffled-label probe selection solves 56.0%.

The disagreement-probe gated method helps 2 tasks and hurts 0 tasks relative to direct row-by-row answering. The hidden diagnostic oracle over train-passing generated programs solves 40.0%, and at least one candidate passes visible examples on 52.0% of tasks.

The shuffled-label control checks whether probe labels matter. The random-probe control checks whether disagreement ranking matters. A useful result should beat direct answering, the non-probe gate, and both probe controls.

Verdict

Disagreement probes did not add measurable selection power in this run. The probe-gated method tied the non-probe gate at 64.0% and tied the random-probe gate at 64.0%. Probe-gated and non-probe gated decisions differed on 0 of 25 tasks, while probe-gated and random-probe gated outcomes matched on 25 of 25 tasks.

The deployable gain came from the conservative direct-fallback gate: it used generated programs on 11 tasks and improved full-task exactness from 56.0% to 64.0% without hurting any direct-answer successes. The disagreement-probe gate used generated programs on 10 tasks, and the random-probe gate used generated programs on 10 tasks, but neither improved on that simpler gate.

Program Diagnostics

The raw executable-program arm is not deployable by itself: train-passing programs can be too narrow, often literal branches or partial parsers. The gated arms use a generated program only when the selected train-passing candidate does not look like a literal example table and its probe agreement clears the configured threshold; otherwise they fall back to direct row-by-row answering.

The probe score distribution is reported separately because a method that only wins by falling back everywhere is not a useful program selector.

Charts

Method full-task exact

Row scatter

Wins and losses

Family breakdown

Train-passing candidates

Probe agreement scores

Task Details

task_idfamilyheldout_rowsdirect_full_exactrecursive_full_exactrecursive_gated_full_exactprobe_gated_full_exactrandom_probe_gated_full_exactshuffled_probe_gated_full_exactrecursive_oracle_full_exactrecursive_train_pass_countprobe_gated_used_programprobe_gated_scoreprobe_gated_helped_vs_directprobe_gated_hurt_vs_direct
Number.000044Number6FalseTrueTrueTrueTrueFalseTrue1True0.75TrueFalse
Number.000093Number3FalseTrueTrueTrueTrueFalseTrue1True0.75TrueFalse
BillingCode.000002BillingCode6TrueFalseTrueTrueTrueTrueFalse0False0FalseFalse
City.000011City3FalseFalseFalseFalseFalseFalseFalse1False0FalseFalse
Currency.000004Currency6TrueTrueTrueTrueTrueTrueTrue1True1FalseFalse
DateTime.000012DateTime6FalseFalseFalseFalseFalseFalseFalse1True1FalseFalse
DateTime.000035DateTime6TrueFalseTrueTrueTrueTrueFalse0False0FalseFalse
DateTime.000077DateTime6FalseFalseFalseFalseFalseFalseFalse0False0FalseFalse
DateTime.000083DateTime6FalseFalseFalseFalseFalseFalseFalse0False0FalseFalse
DateTime.000088DateTime6FalseFalseFalseFalseFalseFalseFalse0False0FalseFalse
DateTime.000094DateTime4TrueFalseTrueTrueTrueTrueFalse0False0FalseFalse
DateTime.000098DateTime6FalseFalseFalseFalseFalseFalseFalse0False0FalseFalse
Email.000013Email6TrueTrueTrueTrueTrueTrueTrue2True1FalseFalse
FilePath.000001FilePath6TrueFalseTrueTrueTrueTrueFalse0False0FalseFalse
Name.000013Name6TrueTrueTrueTrueTrueTrueTrue2False0.5FalseFalse
Name.000026Name6TrueFalseTrueTrueTrueTrueFalse0False0FalseFalse
Name.000028Name6TrueTrueTrueTrueTrueTrueTrue2True1FalseFalse
Number.000048Number4TrueFalseTrueTrueTrueTrueFalse0False0FalseFalse
Number.000074Number6FalseFalseFalseFalseFalseFalseFalse0False0FalseFalse
Number.000075Number6FalseFalseFalseFalseFalseFalseFalse0False0FalseFalse
Number.000081Number6FalseFalseFalseFalseFalseFalseFalse1False0FalseFalse
Number.000088Number6TrueTrueTrueTrueTrueTrueTrue1True1FalseFalse
Phone.000005Phone6TrueTrueTrueTrueTrueTrueTrue1True1FalseFalse
Phone.000017Phone6TrueTrueTrueTrueTrueTrueTrue1True1FalseFalse
Rating.000001Rating6TrueTrueTrueTrueTrueTrueTrue1True1FalseFalse

Family Summary

familydirect_rowmonolithic_programprobe_gated_directrecursive_gated_directrecursive_oraclerecursive_program
BillingCode101100
City000000
Currency111111
DateTime0.28600.2860.28600
Email111111
FilePath101100
Name10.667110.6670.667
Number0.2860.4290.5710.5710.4290.429
Phone111111
Rating101111

Limitations

Generated code is sandboxed by a conservative AST pass, so some potentially valid programs may be rejected. The benchmark tasks are public text transformations and do not cover arbitrary software engineering problems. Full-task exact is intentionally strict and can be much lower than row accuracy.

Artifacts

  • Run directory: /workspace/experiments/qwen_disagreement_probe_program_induction/runs/main_v1
  • Summary: analysis/summary.csv
  • Task details: analysis/task_summary.csv
  • Candidate programs: analysis/candidates.csv
  • Probe labels: analysis/probe_labels.csv
  • Figures: analysis/figures/

Experiment log 4

Show the running log (4 entries)

Setup

  • Created a fresh standalone experiment directory.
  • Large artifacts are kept under /workspace/large_artifacts/qwen_disagreement_probe_program_induction.
  • Primary metric: strict full-task exact on held-out rows.
  • Secondary metrics: row exact, generated-program train-pass rate, probe-label usefulness, and candidate-selection flips.

Run smoke_no_qwen

  • Time UTC: 2026-06-27T18:05:55.692908+00:00
  • Elapsed seconds: 0.8
  • Config: {"answer_max_new_tokens": 64, "batch_max_new_tokens": 320, "code_max_new_tokens": 520, "heldout_cap": 3, "max_probe_pool": 40, "min_heldout": 3, "no_qwen": true, "probe_count": 3, "probe_label_variants": "plain", "probe_score_min": 0.75, "repair_max_new_tokens": 560, "repair_rounds": 1, "repair_variants": "minimal,broaden,conditional", "run_name": "smoke_no_qwen", "run_shuffled": true, "sample_seed": 20260627, "task_limit": 3, "train_n": 4, "variants": "monolithic,robust"}
  • Tasks: 3
  • Direct row-by-row full-task exact: 0.0%
  • Recursive selected-program full-task exact: 0.0%
  • Recursive gated-direct full-task exact: 0.0%
  • Disagreement-probe gated-direct full-task exact: 0.0%
  • Recursive train-pass rate: 0.0%
  • Recursive oracle among train-passing candidates: 0.0%

Run smoke_qwen_5

  • Time UTC: 2026-06-27T18:10:38.193113+00:00
  • Elapsed seconds: 255.2
  • Config: {"answer_max_new_tokens": 48, "batch_max_new_tokens": 220, "code_max_new_tokens": 420, "heldout_cap": 3, "max_probe_pool": 40, "min_heldout": 3, "no_qwen": false, "probe_count": 3, "probe_label_variants": "plain", "probe_score_min": 0.67, "repair_max_new_tokens": 420, "repair_rounds": 1, "repair_variants": "minimal,broaden,conditional", "run_name": "smoke_qwen_5", "run_shuffled": true, "sample_seed": 20260627, "task_limit": 5, "train_n": 4, "variants": "monolithic,robust"}
  • Tasks: 5
  • Direct row-by-row full-task exact: 60.0%
  • Recursive selected-program full-task exact: 20.0%
  • Recursive gated-direct full-task exact: 60.0%
  • Disagreement-probe gated-direct full-task exact: 60.0%
  • Recursive train-pass rate: 80.0%
  • Recursive oracle among train-passing candidates: 20.0%

Run main_v1

  • Time UTC: 2026-06-27T18:37:15.412379+00:00
  • Elapsed seconds: 1556.2
  • Config: {"answer_max_new_tokens": 56, "batch_max_new_tokens": 300, "code_max_new_tokens": 420, "heldout_cap": 6, "max_probe_pool": 40, "min_heldout": 3, "no_qwen": false, "probe_count": 4, "probe_label_variants": "plain,consistency", "probe_score_min": 0.67, "repair_max_new_tokens": 420, "repair_rounds": 1, "repair_variants": "minimal,broaden,conditional", "run_name": "main_v1", "run_shuffled": true, "sample_seed": 20260627, "task_limit": 25, "train_n": 4, "variants": "monolithic,robust"}
  • Tasks: 25
  • Direct row-by-row full-task exact: 56.0%
  • Recursive selected-program full-task exact: 40.0%
  • Recursive gated-direct full-task exact: 64.0%
  • Disagreement-probe gated-direct full-task exact: 64.0%
  • Recursive train-pass rate: 52.0%
  • Recursive oracle among train-passing candidates: 40.0%
  • Interpretation: disagreement probes did not add measurable selection power. Probe-gated, non-probe gated, and random-probe gated selection all reached 64.0%; shuffled probe labels fell back to the direct baseline at 56.0%. Probe-gated and non-probe gated outcomes differed on 0/25 tasks, so the deployable gain came from conservative program/direct gating rather than probe-based discrimination.

Figures 6

family breakdown
family breakdown · analysis/figures/
method full task exact
method full task exact · analysis/figures/
probe agreement scores
probe agreement scores · analysis/figures/
row scatter direct vs recursive
row scatter direct vs recursive · analysis/figures/
train passing candidates
train passing candidates · analysis/figures/
wins losses vs direct
wins losses vs direct · analysis/figures/

Data files 12

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

Reproduce

The run commands are documented inside the experiment folder (see the README).

Browse the experiment folder on GitHub ↗