Research log Small Model Experimentation
GitHub

Qwen3.5-4B Code ABI Oracle Coverage Ladder

Toolbox builds most tasks but can't pick winners

The one idea you need

Picture a bin of certified, pre-tested parts. Instead of writing code from scratch, you snap together at most three of these building-block functions to solve a task. This experiment asks how many real programming problems a few dozen such parts can cover.

The question

Can a fixed library of small, already-tested code functions be combined to correctly solve most everyday programming problems, without writing any new code from scratch?

What we found

Yes, mostly. Snapping together at most three verified functions produced a passing solution for 84% of 160 small programming tasks, up from just 13% with a bare-bones library. But the library is a foundation, not a solver: when you accept the first program that passes one public test, only 59% are actually correct, because most passing candidates still fail hidden tests.

Why it matters

When generating code with small models, never trust a single public test: most programs that pass one still fail on hidden cases. Restrict generation to verified building blocks, and run a full test suite before accepting any candidate.

Tasks the toolbox could solve13% → 84%bare-bones library vs full library, share of 160 tasks
Right when accepting the first passing program59%95 of 160 tasks actually correct
Passing programs that still fail hidden testsabout 4 in 5628 of 793 candidates that passed the shown test
Tasks needing just one building block94 of 134solved with no combining
On this page
  1. Results at a glance
  2. Overview
  3. Report
    1. Purpose
    2. ABI Rungs
    3. Headline Results
    4. Final Rung by Slice
    5. Winning Program Depths
    6. Gate Read
    7. Remaining Uncovered Tasks
    8. Files
  4. Experiment log
  5. Figures
  6. Data files
  7. Reproduce
  8. Related

Results at a glance 4

Bigger toolbox builds more tasks, but auto-picking stays unreliable

How to read

Left to right the toolbox grows from tiny to full. For each, one bar is the share of 160 tasks it can build at all, the other the share where the first program passing one test is actually correct. Taller is better.

0%25%50%75%100%12.5%10.6%core57.5%41.9%expanded83.8%59.4%final

Takeaway → Both bars rise as the toolbox grows, but the 'actually correct' bar stays far below the 'can be built' bar: being expressible does not mean being auto-solved.

Data table
ABI rungoracle coverage (any candidate passes all tests)first visible-consistent candidate correct
core12.5%10.6%
expanded57.5%41.9%
final83.8%59.4%

Numbers from README table; reports/coverage_summary_initial.json, coverage_summary_expanded.json, coverage_summary_final.json

Technical framing

ABI oracle coverage climbs the rung ladder, first-visible selection lags — The final reusable ABI can express 134/160 tasks, but naive first-visible selection only gets 95/160 — a coverage gate, not a solver.

Coverage stays high across task types except the catch-all bucket

How to read

Each group is a task category. One bar is the share of that category's tasks the full toolbox can build, the other the share where the first passing program is actually correct. Taller is better.

0%25%50%75%100%dict_counterdict_counter100%66.7%list_tuplelist_tuple89.5%77.2%numericnumeric79.2%50%otherother62.5%25%string_regexstring_regex95.5%68.2%

Takeaway → Every category clears roughly four-fifths coverage except the mixed 'other' bucket, where both building and picking the right program drop sharply.

Data table
task sliceoracle coveragefirst visible candidate correct
dict_counter100%66.7%
list_tuple89.5%77.2%
numeric79.2%50%
other62.5%25%
string_regex95.5%68.2%

Numbers from report table (reports/final_report.md); reports/coverage_summary_final.json

Technical framing

Final-rung coverage by task slice — Coverage stays above 79% in every classified slice except the catch-all 'other' bucket, where both coverage and selection drop.

A single test fools far fewer builds as the toolbox grows

How to read

Left to right the toolbox grows from tiny to full. Each bar is the share of tasks where a program passed the one shown test yet was still wrong. Here lower is better.

0%20%40%60%58.3%core22%expanded8.8%final

Takeaway → The fooled-by-one-test bar falls from 58% to 9% as the toolbox grows, but real checking is still needed since most individual candidates stay wrong.

Data table
ABI rungfalse visible pass (among tasks with a visible-consistent candidate)
core58.3%
expanded22%
final8.8%

Numbers from report table (reports/final_report.md); reports/coverage_summary_*.json

Technical framing

Task-level false-visible-pass rate falls as the ABI grows — Richer ABIs cut single-visible-test false passes from 58% to 9%, but per-candidate hidden-wrong pressure stays near 80% — verification is still required.

Most solved tasks need just one building block

How to read

Each bar is how many of the 134 solved tasks were built from a chain of that many functions: one, two, or three. Taller means more tasks at that complexity.

025507510094depth 131depth 29depth 3

Takeaway → The single-block bar towers over the rest: 94 of 134 tasks need one piece, so genuine multi-block assembly covers only 40 tasks.

Data table
winning ABI program depthcovered tasks (final rung)
depth 194
depth 231
depth 39

Numbers from report table (reports/final_report.md, 'Winning Program Depths')

Technical framing

Most covered tasks need only a depth-1 ABI program — 94 of 134 covered tasks are solved by a single primitive; genuine composition (depth 2-3) accounts for 40 tasks.

In the author’s words from the Overview

Final report: reports/final_report.md reports/figures/ Main result on the first 160 MBPP test records: final reusable ABI oracle coverage reached 134/160 (83.75%) under the available tests. First visible-consistent candidate accuracy was 95/160 (59.4%), so this is a compiler/substrate coverage gate, not a deployable solver by itself.

Overview

Standalone no-training experiment for a code-primitive ABI oracle coverage gate.

The experiment measures whether a small verified ABI of deterministic code primitives can express decomposable MBPP-style tasks. It does not train or save model checkpoints. It builds task slices, enumerates ABI candidate programs, verifies them by execution, and reports coverage, false-visible-pass rates, candidate counts, and task-slice diagnostics.

Final report:

  • reports/final_report.md
  • reports/figures/

Main result on the first 160 MBPP test records: final reusable ABI oracle coverage reached 134/160 (83.75%) under the available tests. First visible-consistent candidate accuracy was 95/160 (59.4%), so this is a compiler/substrate coverage gate, not a deployable solver by itself.

Report

Rendered from reports/final_report.md

Purpose

This standalone no-training experiment asks whether a finite verified code-primitive ABI can express a meaningful slice of MBPP-style Python tasks before spending any compute on a compiler model.

The run uses the first 160 records from the MBPP test split. Each task gets one visible test for visible-consistency accounting, while oracle coverage is measured against every available test in the task record. The experiment does not train Qwen, does not save checkpoints, and does not use reference source code as a template.

ABI Rungs

  • core: small generic string/list/dict/numeric kernels.
  • expanded: broad reusable kernels for row-sum sorting, counters, simple geometry, bit operations, list transforms, and regex/string transforms.
  • final: expanded plus reusable algorithmic utility kernels such as sequence recurrences, tuple/list conversions, range sums, run-length encoding, divisor/bit counts, and small dynamic reducers.

Headline Results

rungoracle coveragefirst visible candidate correctvisible-any taskstask-level false-visible-passcandidate-level hidden-wrong among visiblemean candidates/task
core20/160 (12.5%)17/160 (10.6%)4828 (58.3%)110 (81.5%)66.9
expanded92/160 (57.5%)67/160 (41.9%)11826 (22.0%)425 (78.0%)164.2
final134/160 (83.8%)95/160 (59.4%)14713 (8.8%)628 (79.2%)224.0

Oracle coverage ladder

First-visible ladder

Final Rung by Slice

sliceoracle coveragefirst visible candidate correcttask-level false-visible-passmean candidates/task
dict_counter9/9 (100.0%)6/9 (66.7%)0 (0.0%)188.8
list_tuple51/57 (89.5%)44/57 (77.2%)4 (7.3%)234.9
numeric38/48 (79.2%)24/48 (50.0%)5 (11.6%)201.8
other15/24 (62.5%)6/24 (25.0%)3 (16.7%)313.5
string_regex21/22 (95.5%)15/22 (68.2%)1 (4.5%)161.1

Final coverage by slice

Final false pass by slice

Winning Program Depths

Covered task count by winning ABI depth: 1: 94, 2: 31, 3: 9.

Winning depths

Gate Read

The oracle coverage gate clears for the intended decomposable-code direction: the final reusable ABI covers 134/160 tasks (83.75%) under the available test suites, with coverage above 79% in every automatically classified slice except other.

The result does not make the ABI a deployable solver by itself. First-visible selection is only 95/160 (59.4%), and candidate-level hidden-wrong pressure among visible-consistent candidates remains high at 628 wrong visible-consistent candidates out of 793 total visible-consistent candidates. This means compiler training should use constrained decoding plus verification and should not rely on one public test or first visible-consistent selection.

The strongest caution is that this is test-suite oracle coverage, not a proof of semantic equivalence. Some candidates can satisfy all available tests while being semantically too broad, too narrow, or coincidentally correct. The package keeps these candidates visible in data/abi_coverage_records_final.jsonl so those cases can be audited.

Remaining Uncovered Tasks

Uncovered task IDs after the final rung:

20, 25, 31, 36, 47, 55, 56, 60, 77, 111, 122, 123, 124, 125, 129, 134, 136, 137, 147, 148, 150, 153, 158, 159, 160, 164

The residual is a mix of specialized number theory, bespoke formulas, tasks with ambiguous or thin test suites, and algorithmic problems outside the current ABI. The next step should not be to keep adding one-off kernels indefinitely. The useful next gate is a compiler-training pilot on this frozen final ABI, paired with stronger generated counterexample tests for covered tasks and a held-out slice that excludes primitives added after inspection.

Files

  • configs/experiment.json: run configuration.
  • scripts/run_coverage_ladder.py: ABI oracle evaluator.
  • scripts/make_report.py: report and figure generator.
  • data/abi_coverage_records_initial.jsonl: core rung records.
  • data/abi_coverage_records_expanded.jsonl: expanded rung records.
  • data/abi_coverage_records_final.jsonl: final rung records.
  • reports/coverage_summary_initial.json: core summary.
  • reports/coverage_summary_expanded.json: expanded summary.
  • reports/coverage_summary_final.json: final summary.
  • reports/figures/: generated charts.

Experiment log 1

Show the running log (1 entry, 2026-06-27)

2026-06-27

  • Created standalone experiment package.
  • Copied generic safe Python execution and JSONL utilities into this package.
  • Planned no-training code ABI oracle coverage ladder over MBPP test tasks.
  • Primary gate: measure whether a verified primitive ABI can express decomposable real-code task slices before any compiler training.
  • Implemented scripts/run_coverage_ladder.py.
  • Ran core ABI rung on 160 MBPP test records:

    • oracle coverage: 20/160 (12.5%)
    • first visible-consistent candidate correct: 17/160 (10.6%)
    • mean candidates/task: 66.9
  • Inspected misses and added broad reusable primitives for row-sum sorting, counters, string/list transforms, simple formulas, bit predicates, and regex-style tasks.
  • Ran expanded ABI rung:

    • oracle coverage: 92/160 (57.5%)
    • first visible-consistent candidate correct: 67/160 (41.9%)
    • mean candidates/task: 164.2
  • Inspected remaining misses and added a final broad utility layer: tuple/list conversions, sequence recurrences, run-length encoding, range sums, divisor/bit counts, pairwise reducers, and small geometry.
  • One final-rung run hung because some enumeration-style primitives were tried outside their intended domain. Killed that run and added explicit numeric/domain bounds before rerunning.
  • Ran final ABI rung:

    • oracle coverage: 134/160 (83.75%)
    • first visible-consistent candidate correct: 95/160 (59.4%)
    • task-level visible-pass/no-full-winner rate among visible-any tasks: 13/147 (8.8%)
    • candidate-level hidden-wrong rate among visible-consistent candidates: 628/793 (79.2%)
    • mean candidates/task: 224.0
  • Generated charts and standalone report at reports/final_report.md.
  • Gate read: code-ABI oracle coverage is high enough to justify a compiler-training pilot on a frozen ABI, but selection/verification remains unresolved and the result is test-suite coverage rather than proof of semantic equivalence.

Figures 5

final coverage by slice
final coverage by slice · reports/figures/
final visible false pass by slice
final visible false pass by slice · reports/figures/
first visible ladder
first visible ladder · reports/figures/
oracle coverage ladder
oracle coverage ladder · reports/figures/
winning depths final
winning depths final · reports/figures/

Data files 3

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 ↗