Research log Small Model Experimentation
GitHub

Qwen3.5-4B Operator Inventory Search Pilot

Finished2026-06-24imported · line ZOperator and Skill InventoriesGitHub ↗
Search finds any operation already in its toolbox

The one idea you need

Several math operations — add up, keep the largest, keep the first — all take a list of numbers and return one number, so they look identical from outside, like kitchen gadgets that each take a bowl and hand back one item. Only running each on the same inputs reveals which one matches.

The question

When several math operations all turn a list of numbers into one number and look identical from the outside, can a program figure out which one was actually used?

What we found

Yes, but only if that operation sits on the program's list of candidates. Given the full set of seven operations, the program recovered the correct hidden one every time — matching against examples alone already solved about nine in ten cases, and a couple of extra probing inputs closed the rest to perfect. A shorter list that left the operation out recovered zero. Search was never the bottleneck; stocking the candidate was.

Why it matters

When a small model must identify which operation produced some outputs, spend effort widening the roster of candidate operations and adding a couple of probing test inputs — not on training the model to recover operations that plain example-matching already handles.

Hidden operations correctly recovered0% → 100%list that left them out, versus the full list of seven operations
Solved with no follow-up questionsabout 9 in 10full seven-operation list, matching against examples alone
Solved after two extra test inputs100%targeted probing inputs close the remaining gap
Hardest single operation77%greatest-common-divisor, which most often looks identical to another operation
On this page
  1. Results at a glance
  2. Overview
  3. Report
    1. Summary
    2. Key Findings
    3. Status Summary
    4. Operator Breakdown
    5. Active Query Diagnostic
    6. Decision
    7. Artifacts
  4. Experiment log
  5. Figures
  6. Data files
  7. Reproduce
  8. Related

Results at a glance 3

Only the full operation list recovers the hidden operations

How to read

Two groups of bars compare a short three-operation list against the full seven-operation list. In each group, one bar shows whether the right operation was even among the candidates, the other whether it was actually picked. Taller is better.

0%25%50%75%100%closed vocab (sum/first/last)closed vocab (sum/first/last)0%0%full inventory (7 operators)full inventory (7 operators)100%92.5%

Takeaway → Both bars sit flat at zero for the short list but leap to full and near-full height for the complete list — the missing operations become recoverable only once they are included.

Data table
operator inventory armtarget in candidatesselected correctly (budget 0)
closed vocab (sum/first/last)0%0%
full inventory (7 operators)100%92.5%

Numbers from reports/qwen35_4b_operator_inventory_search_pilot_report.md status-summary table (also reports/status_summary.csv)

Technical framing

Held-out operator recovery: closed vocabulary vs full inventory — Type-colliding held-out operators are unreachable with a closed vocabulary but fully recoverable once the inventory contains them.

A couple of extra test inputs push accuracy to perfect

How to read

Lines track how often the right operation gets picked as the number of extra probing test inputs rises from none up to three. Two lines use the full seven-operation list; a flat bottom line uses the short list. Higher is better.

0%50%100%150%0123active max-splitoracle eliminationclosed vocab (either policy)closed vocab (eit…

Takeaway → The full-list lines climb from about nine in ten to a perfect score within one or two inputs, while the short-list line never leaves zero.

Data table
active query budgetactive max-splitoracle eliminationclosed vocab (either policy)
092.5%92.5%0%
199.2%100%0%
2100%100%0%
3100%100%0%

Numbers from reports/qwen35_4b_operator_inventory_search_pilot_report.md active-query table (also reports/active_summary.csv)

Technical framing

Active queries close the gap on held-out records (full inventory) — One or two disambiguating queries push full-inventory selection from 92.5% to 100%; no budget rescues the closed vocabulary.

How often each operation gets picked correctly

How to read

One bar per operation shows how often the search picked it correctly using the full seven-operation list, covering both newly added operations and ones already stocked. Taller is better.

0%25%50%75%100%gcd (held-out)gcd (held-out)76.7%max (held-out)max (held-out)100%min (held-out)min (held-out)96.7%prod (held-out)prod (held-out)96.7%first (in-bank)first (in-bank)83.3%last (in-bank)last (in-bank)93.3%sum (in-bank)sum (in-bank)93.3%

Takeaway → Most bars reach near the top; greatest-common-divisor and first-element sit lowest because their outputs most often match another operation on the examples.

Data table
operatorselected correctly
gcd (held-out)76.7%
max (held-out)100%
min (held-out)96.7%
prod (held-out)96.7%
first (in-bank)83.3%
last (in-bank)93.3%
sum (in-bank)93.3%

Numbers from reports/qwen35_4b_operator_inventory_search_pilot_report.md operator-breakdown table (also reports/operator_summary.csv)

Technical framing

Per-operator selection accuracy with the full inventory — Most operators are near-perfect; gcd and first collide most with other candidates and need active disambiguation.

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

This standalone no-training pilot tests the search-side ceiling for type-colliding operator identification. Every aggregate candidate has signature list[int] -> int; the task is to recover the correct operator from execution cases, not from type. Two arms are compared: arm1_closed_vocab: closed operator set sum, first, last. arm0_full_inventory: full operator inventory sum, first, last, max, min, prod, gcd.

Overview

Standalone no-training pilot for open-vocabulary operator identification.

The experiment tests whether type-colliding held-out aggregate operators can be recovered by operator-level inventory search before training an inventory-conditioned Qwen3.5-4B sketcher. Every aggregate candidate has signature list[int] -> int, so type alone cannot identify the operator.

Large artifacts, if any are produced later, belong outside this directory:

/workspace/large_artifacts/qwen35_4b_operator_inventory_search_pilot

Layout

  • configs/: experiment configuration.
  • data/: generated operator-collision task records.
  • logs/: chronological experiment log.
  • reports/: result JSON, CSVs, figures, and final report.
  • run_logs/: captured command output.
  • scripts/: dataset, evaluation, and reporting entry points.
  • src/: standalone executor, task generator, and operator-hole search.

Main Commands

python scripts/build_dataset.py
python scripts/eval_operator_search.py --data data/operator_inventory_eval.jsonl --output reports/operator_search_results.json
python scripts/make_report.py

Report

Rendered from reports/qwen35_4b_operator_inventory_search_pilot_report.md

Summary

This standalone no-training pilot tests the search-side ceiling for type-colliding operator identification. Every aggregate candidate has signature list[int] -> int; the task is to recover the correct operator from execution cases, not from type.

Two arms are compared:

  • arm1_closed_vocab: closed operator set sum, first, last.
  • arm0_full_inventory: full operator inventory sum, first, last, max, min, prod, gcd.

Key Findings

  • Closed vocabulary held-out target coverage was 0.0%; full inventory held-out target coverage was 100.0%.
  • Full inventory recovered the held-out target in visible-consistent candidates for 100.0% of records.
  • Full inventory visible selection solved 92.5% of held-out records at budget 0, versus 0.0% for closed vocabulary.
  • Active max-split on full inventory held-out records improved from 92.5% at budget 0 to 100.0% at budget 2.
  • Oracle-elimination querying reached 100.0% on full inventory held-out records by budget 1.
  • Search cost stayed small in this pilot: full inventory enumerated 56.0 raw candidates per held-out record.

Interpretation: the search/bank side can recover the held-out type-colliding operators in this substrate. The missing piece is not program-level search coverage; it is a deployable way for the model to name or shortlist inventory operators as the library scales.

Status Summary

armoperator_statusrecordstarget_raw_pcttarget_visible_pctoracle_hidden_all_pctselected_hidden_all_pctavg_raw_candidate_countavg_visible_consistent_operator_count
arm0_full_inventoryheld_out120100.0100.0100.092.556.01.20
arm0_full_inventoryin_bank90100.0100.0100.090.056.01.32
arm1_closed_vocabheld_out1200.00.00.00.024.00.09
arm1_closed_vocabin_bank90100.0100.0100.093.324.01.11

Target coverage by status

Selected hidden by status

Search cost

Operator Breakdown

Full inventory by operator:

operatorstatusrecordstarget_raw_pctselected_hidden_all_pctavg_visible_consistent_operator_count
gcdheld_out30100.076.71.37
maxheld_out30100.0100.01.10
minheld_out30100.096.71.30
prodheld_out30100.096.71.03
firstin_bank30100.083.31.50
lastin_bank30100.093.31.27
sumin_bank30100.093.31.20

Full inventory by operator

Active Query Diagnostic

armstatuspolicybudgetrecordsselected_hidden_all_pctavg_operator_candidate_count
arm0_full_inventoryheld_outactive_max_split012092.51.20
arm0_full_inventoryheld_outactive_max_split112099.21.02
arm0_full_inventoryheld_outactive_max_split2120100.01.00
arm0_full_inventoryheld_outactive_max_split3120100.01.00
arm0_full_inventoryheld_outoracle_elimination012092.51.20
arm0_full_inventoryheld_outoracle_elimination1120100.01.00
arm0_full_inventoryheld_outoracle_elimination2120100.01.00
arm0_full_inventoryheld_outoracle_elimination3120100.01.00
arm0_full_inventoryin_bankactive_max_split09090.01.32
arm0_full_inventoryin_bankactive_max_split19094.41.11
arm0_full_inventoryin_bankactive_max_split29097.81.02
arm0_full_inventoryin_bankactive_max_split390100.01.00
arm0_full_inventoryin_bankoracle_elimination09090.01.32
arm0_full_inventoryin_bankoracle_elimination19097.81.02
arm0_full_inventoryin_bankoracle_elimination290100.01.00
arm0_full_inventoryin_bankoracle_elimination390100.01.00
arm1_closed_vocabheld_outactive_max_split01200.00.09
arm1_closed_vocabheld_outactive_max_split11200.00.05
arm1_closed_vocabheld_outactive_max_split21200.00.03
arm1_closed_vocabheld_outactive_max_split31200.00.02
arm1_closed_vocabheld_outoracle_elimination01200.00.09
arm1_closed_vocabheld_outoracle_elimination11200.00.00
arm1_closed_vocabheld_outoracle_elimination21200.00.00
arm1_closed_vocabheld_outoracle_elimination31200.00.00
arm1_closed_vocabin_bankactive_max_split09093.31.11
arm1_closed_vocabin_bankactive_max_split19098.91.02
arm1_closed_vocabin_bankactive_max_split290100.01.00
arm1_closed_vocabin_bankactive_max_split390100.01.00
arm1_closed_vocabin_bankoracle_elimination09093.31.11
arm1_closed_vocabin_bankoracle_elimination190100.01.00
arm1_closed_vocabin_bankoracle_elimination290100.01.00
arm1_closed_vocabin_bankoracle_elimination390100.01.00

Active query lift

Decision

Arm 0 already reaches the coverage ceiling on held-out operators at small search cost. That means the immediate fix lives on the bank/search side for this substrate: grow the operator inventory and apply operator-level active disambiguation. A trained inventory-conditioned sketcher is still useful, but its job should be top-k operator shortlisting for larger libraries, not recovering coverage that search cannot find.

Artifacts

  • Dataset: data/operator_inventory_eval.jsonl
  • Dataset manifest: data/dataset_manifest.json
  • Full result JSON: reports/operator_search_results.json
  • CSVs: reports/status_summary.csv, reports/operator_summary.csv, reports/template_summary.csv, reports/active_summary.csv
  • Large artifacts: /workspace/large_artifacts/qwen35_4b_operator_inventory_search_pilot

Experiment log 4

Show the running log (4 entries, 2026-06-24)

2026-06-24

Initialized a standalone no-training operator inventory search pilot.

Design commitments:

  • Test type-colliding aggregate operators with identical signature list[int] -> int.
  • Run the cheap pilot before any QLoRA training.
  • Compare:

    • arm1_closed_vocab: current closed operator set, sum, first, last.
    • arm0_full_inventory: full in-context operator inventory, sum, first, last, max, min, prod, gcd.
  • Keep downstream verified completion and active query logic unchanged in spirit: enumerate candidates, filter by visible execution, optionally request active query cases, score hidden cases.
  • Track search cost via raw candidate counts and visible-consistent candidate counts.
  • Store any future large model artifacts outside the experiment directory.

Initial implementation:

  • Created standalone experiment package.
  • Added local executor with sum, first, last, max, min, prod, and gcd.
  • Added benchmark generator with three templates:

    • mod_format
    • offset_format
    • threshold_gate
  • Added operator-hole completion and active query evaluator.
  • Added README, config, and large-artifact manifest.

Smoke Validation

Commands:

python -m py_compile scripts/*.py src/*.py
python scripts/build_dataset.py --records-per-family 2 > run_logs/dataset_smoke_console.log 2>&1
python scripts/eval_operator_search.py \
  --data data/operator_inventory_eval.jsonl \
  --output reports/_smoke_operator_search_results.json \
  --max-records 8 \
  > run_logs/eval_smoke_console.log 2>&1

Result:

  • Syntax check passed.
  • Smoke dataset contained 42 records.
  • On the first 8 records, arm0_full_inventory recovered the target for all 5 held-out records; arm1_closed_vocab recovered 0 of 5 held-out records.
  • This matched the intended falsification shape, so I proceeded to the full no-training pilot.

Full No-Training Pilot

Commands:

python scripts/build_dataset.py > run_logs/dataset_build_console.log 2>&1
python scripts/eval_operator_search.py \
  --data data/operator_inventory_eval.jsonl \
  --output reports/operator_search_results.json \
  > run_logs/eval_operator_search_console.log 2>&1
python scripts/make_report.py > run_logs/report_generation_console.log 2>&1

Dataset:

  • 210 total records.
  • 90 in-bank operator records: sum, first, last.
  • 120 held-out operator records: max, min, prod, gcd.
  • All aggregate operators share signature list[int] -> int.
  • Each record has 6 visible cases, 18 hidden cases, and 48 active-query pool cases.
  • Templates: mod_format, offset_format, threshold_gate.

Primary result by operator status:

armstatusrecordstarget rawtarget visibleoracle hidden-allselected hidden-allavg raw candidatesavg visible-consistent operators
arm0_full_inventoryheld-out120100.0%100.0%100.0%92.5%56.01.20
arm0_full_inventoryin-bank90100.0%100.0%100.0%90.0%56.01.32
arm1_closed_vocabheld-out1200.0%0.0%0.0%0.0%24.00.09
arm1_closed_vocabin-bank90100.0%100.0%100.0%93.3%24.01.11

Held-out operator breakdown for arm0_full_inventory:

operatorrecordstarget rawselected hidden-allavg visible-consistent operators
gcd30100.0%76.7%1.37
max30100.0%100.0%1.10
min30100.0%96.7%1.30
prod30100.0%96.7%1.03

Active-query result on held-out operators:

armpolicybudget 0budget 1budget 2budget 3
arm0_full_inventorymax-split92.5%99.2%100.0%100.0%
arm0_full_inventoryoracle-elimination92.5%100.0%100.0%100.0%
arm1_closed_vocabmax-split0.0%0.0%0.0%0.0%
arm1_closed_vocaboracle-elimination0.0%0.0%0.0%0.0%

Interpretation:

  • The held-out operator target is always present once the inventory is allowed into the operator hole.
  • Six visible cases underdetermine a small fraction of records, especially gcd, but operator-level active querying closes that ambiguity.
  • At this scale, this is a bank/search-side fix rather than a training-side fix. A trained inventory-conditioned sketcher should be treated as a later top-k shortlisting mechanism for larger libraries, not as the immediate way to recover missing coverage.

Generated artifacts:

  • Report: reports/qwen35_4b_operator_inventory_search_pilot_report.md
  • Full results: reports/operator_search_results.json
  • CSV summaries: reports/status_summary.csv, reports/operator_summary.csv, reports/template_summary.csv, reports/active_summary.csv
  • Figures: reports/figures/*.png

Final Audit

Commands/checks:

python -m py_compile scripts/*.py src/*.py
find . -type d -name __pycache__ -prune -exec rm -rf {} +
find . -type f -size +50M -print
du -sh . /workspace/large_artifacts/qwen35_4b_operator_inventory_search_pilot

Audit result:

  • Final syntax check passed.
  • No Python cache directories remain.
  • No file larger than 50 MB is present in the experiment directory.
  • Experiment directory size: 4.4 MB.
  • External large-artifact directory size: 0.
  • A dynamic text scan against sibling experiment directory names found no references.
  • No references to external experiment paths were found.
  • PNG figures were opened and verified with PIL.

Figures 5

active query lift
active query lift · reports/figures/
full inventory by operator
full inventory by operator · reports/figures/
search cost by status
search cost by status · reports/figures/
selected hidden by status
selected hidden by status · reports/figures/
target coverage by status
target coverage by status · reports/figures/

Data files 5

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 ↗