Research log Small Model Experimentation
GitHub

Qwen Recursive Task Decomposition

Finished2026-06-27imported · line YBenchmark GeneralizationGitHub ↗
One reusable recipe loses to solving cases fresh

The one idea you need

Shown four worked examples of a text reformat — say turning "12 Jan 2002" into "2002-01-12" — a small model can tackle each new case fresh, or first write one fixed recipe and follow it blindly on every case. This tests whether committing to that recipe helps.

The question

If a small model writes one reusable rule from a few examples and applies it to every new case, does it stay more accurate than solving each case fresh?

What we found

No. Forcing a 4-billion-parameter model to commit to one written recipe lowered accuracy: it got 59% of individual cases right versus 69% when answering each fresh, and 43% of whole tasks perfectly versus 47%. The recipes weren't nonsense — one borrowed from an unrelated task scored even lower — but a single fixed recipe still can't beat the model's case-by-case judgment.

Why it matters

Don't make a small model freeze one rule and apply it mechanically; its per-case reasoning beats any single rule it can articulate. And checking the rule against the practice examples cannot catch this — every failing rule fit the examples perfectly.

Individual cases right: fresh vs one fixed recipe69% → 59%new cases exactly correct when answering each directly vs committing to one written recipe
Whole tasks fully correct: fresh vs one fixed recipe47% → 43%share of tasks where every new case is exact
Recipe borrowed from an unrelated task58%individual cases right — below both real approaches, so the recipes do carry genuine task signal, just not enough
Best-possible step breakdown vs flat formula34% vs 29%top achievable whole-task accuracy from an automatic formula library, but the version actually picked from examples ties the flat one at 23%
On this page
  1. Results at a glance
  2. Overview
  3. Report
    1. Abstract
    2. Method
    3. Run Configuration
    4. Primary Results
    5. Figures
    6. Interpretation
    7. Limitations
    8. Artifacts
  4. Experiment log
  5. Figures
  6. Data files
  7. Reproduce
  8. Related

Results at a glance 7

Committing to one recipe does not beat solving cases one at a time

How to read

Three approaches along the bottom: solve each case fresh, commit to one recipe first, or borrow a recipe from an unrelated task. Two bars each — one counts individual cases right, the other counts tasks where every case is right. Taller is better.

0%20%40%60%80%directdirect46.7%69.4%locked rulelocked rule43.3%59.4%shuffled ruleshuffled rule33.3%58.3%

Takeaway → Solving fresh is tallest on both counts; committing to one recipe drops individual-case accuracy from 69% to 59%, and a borrowed recipe falls slightly lower still.

Data table
Qwen arm (30 tasks)full-task exactrow exact
direct46.7%69.4%
locked rule43.3%59.4%
shuffled rule33.3%58.3%

Numbers from experiments/qwen_recursive_task_decomposition/analysis/qwen_summary.csv

Technical framing

Frozen Qwen: locking in a rule does not beat answering rows directly — Committing to one reusable rule loses 10pp of row accuracy vs direct answering; shuffled rules drop further, so rules carry signal but hurt.

Breaking a formula into steps raises the ceiling, not what you can pick

How to read

Share of tasks a fixed formula library solves perfectly, taller better: a one-shot formula and a step-by-step formula, each shown as its best-possible pick and the pick chosen from the few examples, plus a scrambled-labels control.

0%10%20%30%40%monolithic (examples)monolithic (examples)22.7%monolithic (oracle)monolithic (oracle)29.4%recursive (examples)recursive (examples)22.7%recursive (oracle)recursive (oracle)34.3%recursive (shuffled labels)recursive (shuffled labels)0.3%

Takeaway → Step-by-step lifts the best-possible score from 29% to 34%, but the version actually chosen from examples ties the one-shot at 23%, and the scrambled control collapses near zero.

Data table
static method (309 tasks)full-task exact
monolithic (examples)22.7%
monolithic (oracle)29.4%
recursive (examples)22.7%
recursive (oracle)34.3%
recursive (shuffled labels)0.3%

Numbers from experiments/qwen_recursive_task_decomposition/analysis/static_summary.csv

Technical framing

Static executable decomposition: recursion lifts the oracle, not example selection — Recursive trees raise the held-out oracle from 29.4% to 34.3%, but example-selected recursion ties monolithic at 22.7%; the shuffled control collapses to 0.3%.

Writing three recipe styles and keeping the best still did not recover accuracy

How to read

Individual-case accuracy for the same three approaches, taller better. Two bars each compare a first attempt using one recipe against a second attempt that writes three recipe styles and keeps the one best matching the examples.

0%20%40%60%80%directdirect69.4%69.4%locked rulelocked rule61.7%59.4%shuffled ruleshuffled rule53.6%58.3%

Takeaway → Even keeping the best-matching recipe, the recipe approach stays below solving cases one at a time, so more recipe attempts did not help.

Data table
Qwen arm (same 30 tasks)v1 single rule (row exact)v2 train-verified (row exact)
direct69.4%69.4%
locked rule61.7%59.4%
shuffled rule53.6%58.3%

Numbers from experiments/qwen_recursive_task_decomposition/analysis/iteration_comparison.csv

Technical framing

Train-verifying rules did not recover the lost row accuracy — Generating three rule styles and picking the one that best fits the training examples still leaves locked-rule row accuracy below direct answering.

Step-by-step formulas only help cleanly separated task types

How to read

For each type of task, two bars show the best-possible perfect-task rate, taller better: a one-shot formula versus a step-by-step formula.

0%25%50%75%100%LogLog0%100%UrlUrl0%100%LanguageLanguage50%100%AddressAddress17%50%PhonePhone50%56%NameName61%64%DateTimeDateTime11%14%NumberNumber19%21%

Takeaway → Step-by-step jumps to 100% on neatly delimited types like logs and web addresses, while dates and numbers barely move.

Data table
Task familyMonolithic oracleRecursive oracle
Log0%100%
Url0%100%
Language50%100%
Address17%50%
Phone50%56%
Name61%64%
DateTime11%14%
Number19%21%

Numbers from report table (Static Coverage By Family), reports/qwen_recursive_task_decomposition_report.md

Technical framing

Where recursive decomposition lifts the static oracle, by task family — Recursion's oracle gain is concentrated in delimiter-structured families (Log, Url, Language, Address); DateTime and Number barely move.

Picking a recipe from a few examples loses most of the step-by-step gain

How to read

For the ten largest task types, two bars: the best step-by-step recipe available versus the one actually chosen from the few examples. Taller is better.

0%25%50%75%100%DateTimeDateTime14%9%NumberNumber21%13%NameName64%43%PhonePhone56%38%ShippingCodeShippingCode80%70%CityCity11%0%UserAgentUserAgent57%43%EmailEmail67%67%AddressAddress50%0%BillingCodeBillingCode100%67%

Takeaway → Example-picking loses the entire gain on addresses and cities and a large share on names and phones, keeping full coverage only on emails.

Data table
Task family (10 largest)Recursive oracleRecursive, selected on train examples
DateTime14%9%
Number21%13%
Name64%43%
Phone56%38%
ShippingCode80%70%
City11%0%
UserAgent57%43%
Email67%67%
Address50%0%
BillingCode100%67%

Numbers from report table (Static Coverage By Family), reports/qwen_recursive_task_decomposition_report.md

Technical framing

Static selection gap: oracle vs train-example-selected recursive programs, by family — Train-example selection loses the whole recursive gain in Address and City and a large share in Name, Phone, and BillingCode; only Email keeps oracle-level coverage.

Locking a recipe rescues two tasks but wrecks several already solved

How to read

For each task where locking a recipe changed the outcome, two bars compare individual-case accuracy: solving fresh versus committing to one recipe. Taller is better.

0%25%50%75%100%DateTime.000076DateTime.00007666.7%100%DateTime.000114DateTime.0001140%16.7%DateTime.000116DateTime.00011650%33.3%Number.000075Number.00007566.7%50%DateTime.000017DateTime.000017100%66.7%DateTime.000051DateTime.00005133.3%0%Number.000077Number.00007733.3%0%City.000011City.00001175%25%Number.000016Number.00001683.3%0%Number.000022Number.000022100%16.7%

Takeaway → Locking rescues two date tasks but collapses number tasks the model had solved outright, dropping some from 100% to 17% or even 0%.

Data table
Task (only tasks where locking changed row accuracy)Direct answeringLocked rule
DateTime.00007666.7%100%
DateTime.0001140%16.7%
DateTime.00011650%33.3%
Number.00007566.7%50%
DateTime.000017100%66.7%
DateTime.00005133.3%0%
Number.00007733.3%0%
City.00001175%25%
Number.00001683.3%0%
Number.000022100%16.7%

Numbers from report table (Qwen Task-Level Details), reports/qwen_recursive_task_decomposition_report.md

Technical framing

Per-task effect of locking a rule: helps 2 tasks, damages 8 — Rule locking rescues two DateTime tasks but collapses Number tasks Qwen solved directly (100% to 16.7%, 83.3% to 0%).

Matching the practice examples cannot tell which recipes will fail

How to read

For the ten worst tasks, two bars: how perfectly the recipe matched the practice examples versus how well it then worked on new cases. Taller is better.

0%25%50%75%100%DateTime.000051DateTime.000051100%0%DateTime.000115DateTime.000115100%0%Number.000016Number.000016100%0%Number.000077Number.000077100%0%DateTime.000114DateTime.000114100%16.7%Number.000022Number.000022100%16.7%City.000011City.000011100%25%Number.000049Number.000049100%25%Address.000002Address.000002100%33.3%BillingCode.000007BillingCode.000007100%33.3%

Takeaway → Every recipe matched the practice examples perfectly yet many scored zero on new cases, so fitting the examples cannot flag a recipe that will fail.

Data table
Task (10 lowest locked-rule scores)Rule accuracy on training examplesLocked-rule held-out row exact
DateTime.000051100%0%
DateTime.000115100%0%
Number.000016100%0%
Number.000077100%0%
DateTime.000114100%16.7%
Number.000022100%16.7%
City.000011100%25%
Number.000049100%25%
Address.000002100%33.3%
BillingCode.000007100%33.3%

Numbers from runs/main_v2_train_verified_rules/qwen_rules.csv (train_verify_exact) and analysis/qwen_task_details.csv (locked_row_exact)

Technical framing

Train verification is a blind filter: every rule fits training yet fails held-out rows — All 30 selected rules scored 1.0 on training rows, so train verification cannot distinguish rules that will fail on held-out rows.

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

This standalone experiment tests whether recursive task decomposition improves task-level consistency on public text-transformation tasks. It compares executable recursive decomposition trees with a frozen language-model rule-locking procedure: first infer one reusable rule, then apply that same rule to every held-out row.

Overview

Standalone experiment testing whether recursive task decomposition improves task-level consistency on public text-transformation tasks.

Question

Given a few input-output examples, can a solver decompose the transformation into reusable substeps and then apply the same decomposition consistently across all held-out rows?

Main Arms

  • direct_qwen: frozen Qwen answers each held-out row directly from the examples.
  • locked_rule_qwen: frozen Qwen first writes a reusable rule/decomposition, then answers every held-out row while conditioned on that same rule.
  • shuffled_rule_qwen: same as locked_rule_qwen, but uses a rule from another task.
  • static_mono_examples: shortest monolithic train-fitting expression from a deterministic expression library.
  • static_mono_oracle: held-out oracle over monolithic train-fitting expressions.
  • static_recursive_examples: shortest recursive output-template decomposition that fits train examples.
  • static_recursive_oracle: held-out oracle over recursive train-fitting decompositions.
  • static_recursive_shuffled: recursive decomposition fit on rotated train labels, then evaluated on the real held-out labels.

Layout

  • src/qwen_recursive_task_decomposition.py: experiment runner, analysis, and report generator.
  • runs/: raw per-run outputs.
  • analysis/: consolidated CSVs and figures.
  • reports/: Markdown and HTML reports.

Report

Rendered from reports/qwen_recursive_task_decomposition_report.md

Abstract

This standalone experiment tests whether recursive task decomposition improves task-level consistency on public text-transformation tasks. It compares executable recursive decomposition trees with a frozen language-model rule-locking procedure: first infer one reusable rule, then apply that same rule to every held-out row.

Method

  • Dataset: public Microsoft PROSE Transformation.Text tasks.
  • Split: first 4 examples are training examples; up to 50 held-out examples are scored for static methods.
  • Primary metric: full-task exact. A task is correct only if every held-out row is exact.
  • Static recursive decomposition: derive output templates from delimiters or token/literal structure, synthesize child transformations for each slot, and compose the children into a tree.
  • Qwen locked-rule decomposition: frozen Qwen writes one reusable rule/decomposition from the examples, then answers each held-out row while conditioned on that same rule.
  • Shuffled controls: static recursive synthesis on rotated labels, and Qwen application with a rule from another task.

Run Configuration

  • Suite: main_v2_train_verified_rules.
  • Static tasks: 309.
  • Qwen tasks: 30.
  • Qwen model: Qwen/Qwen3-4B.
  • Static max candidates: 12000.
  • Recursive depth: 2; child limit: 5.
  • Qwen held-out cap: 6 rows per task.

Primary Results

Static Executable Decomposition

methodtasksfull_exactrow_exact
static_mono_examples30922.7%27.2%
static_mono_oracle30929.4%n/a
static_recursive_examples30922.7%27.2%
static_recursive_oracle30934.3%n/a
static_recursive_shuffled3090.3%0.4%

Frozen Qwen Decomposition

methodtasksfull_exactrow_exact
direct_qwen3046.7%69.4%
locked_rule_qwen3043.3%59.4%
shuffled_rule_qwen3033.3%58.3%

Qwen Iteration Comparison

The first Qwen iteration used one generated decomposition rule per task. The second iteration generated three rule styles and selected the rule that best reproduced the training examples before held-out application. Both iterations used the same 30-task sample.

iterationmethodtasksfull_exactrow_exact
v1_single_ruledirect_qwen3046.7%69.4%
v1_single_rulelocked_rule_qwen3046.7%61.7%
v1_single_ruleshuffled_rule_qwen3036.7%53.6%
v2_train_verifieddirect_qwen3046.7%69.4%
v2_train_verifiedlocked_rule_qwen3043.3%59.4%
v2_train_verifiedshuffled_rule_qwen3033.3%58.3%

Static Coverage By Family

familytasksmono_oraclerecursive_oraclemono_examplesrecursive_examples
Column20.000.000.000.00
Product20.000.000.000.00
Author10.000.000.000.00
FilePath10.000.000.000.00
Meteorite10.000.000.000.00
City90.110.110.000.00
DateTime1060.110.140.090.09
Number840.190.210.130.13
Gender30.330.330.330.33
Address60.170.500.000.00
EmergencyCall20.500.500.000.00
Rating20.500.500.500.50
Phone160.500.560.380.38
UserAgent70.570.570.430.43
Name280.610.640.430.43
Email60.670.670.670.67
ShippingCode100.800.800.700.70
BillingCode61.001.000.670.67
Log40.001.000.000.00
Currency31.001.001.001.00
Language20.501.000.500.50
Abbreviation11.001.001.001.00
Airline11.001.001.001.00
Noise11.001.001.001.00
Song11.001.001.001.00
State11.001.001.001.00
Team11.001.001.001.00
Url10.001.000.000.00
ZipCode11.001.001.001.00

Qwen Task-Level Details

task_idfamilyheldout_rowsdirect_row_exactlocked_row_exactshuffled_row_exactdirect_full_exactlocked_full_exactshuffled_full_exactlocked_minus_direct_rows
DateTime.000076DateTime666.7%100.0%66.7%FalseTrueFalse0.33
City.000010City3100.0%100.0%100.0%TrueTrueTrue0.00
Column.000001Column6100.0%100.0%100.0%TrueTrueTrue0.00
DateTime.000004DateTime6100.0%100.0%100.0%TrueTrueTrue0.00
DateTime.000007DateTime6100.0%100.0%100.0%TrueTrueTrue0.00
DateTime.000025DateTime6100.0%100.0%66.7%TrueTrueFalse0.00
DateTime.000094DateTime4100.0%100.0%50.0%TrueTrueFalse0.00
DateTime.000104DateTime6100.0%100.0%100.0%TrueTrueTrue0.00
DateTime.000108DateTime6100.0%100.0%83.3%TrueTrueFalse0.00
FilePath.000001FilePath6100.0%100.0%100.0%TrueTrueTrue0.00
Language.000002Language6100.0%100.0%100.0%TrueTrueTrue0.00
Phone.000011Phone3100.0%100.0%100.0%TrueTrueTrue0.00
UserAgent.000003UserAgent6100.0%100.0%100.0%TrueTrueTrue0.00
DateTime.000114DateTime60.0%16.7%0.0%FalseFalseFalse0.17
Address.000002Address333.3%33.3%33.3%FalseFalseFalse0.00
BillingCode.000007BillingCode333.3%33.3%33.3%FalseFalseFalse0.00
DateTime.000081DateTime650.0%50.0%33.3%FalseFalseFalse0.00
DateTime.000115DateTime60.0%0.0%0.0%FalseFalseFalse0.00
Gender.000001Gender366.7%66.7%66.7%FalseFalseFalse0.00
Number.000008Number633.3%33.3%33.3%FalseFalseFalse0.00
Number.000049Number425.0%25.0%25.0%FalseFalseFalse0.00
ShippingCode.000008ShippingCode333.3%33.3%0.0%FalseFalseFalse0.00
DateTime.000116DateTime650.0%33.3%33.3%FalseFalseFalse-0.17
Number.000075Number666.7%50.0%50.0%FalseFalseFalse-0.17
DateTime.000017DateTime6100.0%66.7%50.0%TrueFalseFalse-0.33
DateTime.000051DateTime333.3%0.0%33.3%FalseFalseFalse-0.33
Number.000077Number333.3%0.0%100.0%FalseFalseTrue-0.33
City.000011City475.0%25.0%25.0%FalseFalseFalse-0.50
Number.000016Number683.3%0.0%33.3%FalseFalseFalse-0.83
Number.000022Number6100.0%16.7%33.3%TrueFalseFalse-0.83

Example Locked Rules

task_idfamilyrule_charsrule
Address.000002Address245Take the input and split it into parts using commas as delimiters. The first part contains the name and a number followed by a place and direction. Extract the number and place portion, then take the first part of the split result as the output.
BillingCode.000007BillingCode116Keep the input as is.

Substep 1: Extract the input string. Substep 2: Return the extracted string as the output.| |City.000010|City|88|Replace any input that is "None" with "0". For all other inputs, return the input as is.| |City.000011|City|123|If the input is "New York City", "n.y.c.", or "New York City ", output "New York City". Otherwise, output the input as is.| |Column.000001|Column|218|If the input starts with "Coln", remove the "n" and keep the rest as is. If the input is "ID", output "Col1". If the input is "Coln" followed by a number, output "Col" followed by that number. Otherwise, output "Col1".| |DateTime.000004|DateTime|107|Take the value from col0 and col1, format col0 as "HH:MM:SS", and concatenate the formatted col0 with col1.| |DateTime.000007|DateTime|88|Take the input date time string, extract the year and month, and format as "Month Year".| |DateTime.000017|DateTime|166|Split the input into parts based on separators (space, hyphen, slash), then reformat each part into day/month/year format, combining them in the order day/month/year.| |DateTime.000025|DateTime|529|Rule: Extract and reformat date components

  1. Split the input into components: Separate the date into month, day, and year (or equivalent parts).
  2. Map the month abbreviation to its full name: Convert abbreviations like "Mar" to "March" (though examples use abbreviations, this step is for consistency).
  3. Reformat the day: Convert the day into a two-digit format if necessary (e.g., "1" → "01", "30" → "30").
  4. Reformat the year: Extract the last two digits of the year (e.g., "2002" → "02", "1953" → "53|

|DateTime.000051|DateTime|365|If the input is a time in HH:MM:SS format: If the hour is 11, then format as "11:00AM-11:30AM"; If the hour is 8, then format as "8:00AM-8:30AM"; If the hour is 12, then format as "12:00PM-12:30PM"; If the hour is 0, then format as "12:00AM-12:30AM"; If the input is empty or null, then return "N/A"; If the input is an abbreviation like "11:00AM", then| |DateTime.000076|DateTime|235|Take the input time in the format HH:MM. Extract the hour part (HH). If the hour is between 00 and 19, output "0:00-19:00". If the hour is between 20 and 39, output "20:00-39:00". If the hour is between 40 and 59, output "40:00-59:00".| |DateTime.000081|DateTime|434|Rule: Given a time in HH:MMAM/PM format, decompose into:

  1. Extract hour and minute.
  2. If minute < 15, subtract (minute - 0) from hour, add 15 minutes, and set the new start time.
  3. If minute >= 15 and < 45, set start time to hour:15 and end time to hour:45.
  4. If minute >= 45, add (60 - minute) to hour, set start time to (hour + 1):15 and end time to (hour + 1):45.
  5. Combine start and end times into "start-time|

|DateTime.000094|DateTime|281|Parse the input date into components (year, month, day). If the date is in the format "DD.MM.YYYY" or "DD. MMM YYYY", extract the day, month, and year. If the date is in the format "MMM DD YYYY" or "DD MMM YYYY", extract the day, month, and year. Format the output as "YYYY-MM-DD".| |DateTime.000104|DateTime|241|Extract the third character from the date portion of the input string. The date portion is in the format "DD-Mon-YYYY", so the third character is the first letter of the month (e.g., "Jan", "Feb", "Mar"). Return that character as the output.| |DateTime.000108|DateTime|243|Parse the input date and time string. Extract the day and month from the date part. Format the output as MM/DD/YYYY, where MM is the month abbreviation (Jan=1, Feb=2, ..., Dec=12), DD is the day, and YYYY is the year. The time part is ignored.| |DateTime.000114|DateTime|149|Take the day of the month from the input date. If the day is less than or equal to 15, output "15-30". If the day is greater than 15, output "30-45".|

Figures

method_full_task_scores.png

qwen_row_vs_full.png

static_recursive_gain.png

qwen_family_locked_effect.png

iteration_comparison.png

Interpretation

Executable recursion changes the static oracle from 29.4% to 34.3%. The examples-selected recursive tree reaches 22.7%, compared with 22.7% for monolithic expressions and 0.3% for the shuffled-label control. For frozen Qwen, direct answering reaches 69.4% row exact and 46.7% full-task exact. The locked-rule decomposition reaches 59.4% row exact and 43.3% full-task exact. The shuffled-rule control reaches 58.3% row exact and 33.3% full-task exact. The locked-rule full-task delta over direct answering is -3.3%. Positive values mean decomposition improved consistency; negative values mean rule commitment damaged useful row-level inference. The iteration comparison is negative for this form of recursive decomposition. A single generated rule tied direct Qwen on full-task exact but reduced row exact. Train-verifying three rule styles did not recover the lost row competence and lowered full-task exact by one task. The shuffled-rule controls are lower than the real-rule arms, so the generated rules carry task signal; the problem is that the signal is not reliably better than Qwen's direct row-level inference.

Limitations

The Qwen arm is capped for runtime and uses deterministic decoding. The static recursive tree only explores delimiter and token-template decompositions, not arbitrary semantic subgoals. Full-task exact is intentionally strict and can be much lower than row exact when a method is inconsistent across rows.

Artifacts

  • Static details: analysis/static_details.csv
  • Qwen rules: analysis/qwen_rules.csv
  • Qwen task summary: analysis/qwen_task_details.csv
  • Qwen row details: analysis/qwen_row_details.csv
  • Iteration comparison: analysis/iteration_comparison.csv
  • Figures: analysis/figures/
  • Benchmark mirror: /workspace/large_artifacts/qwen_recursive_task_decomposition/prose-benchmarks

Experiment log 6

Show the running log (6 entries)

Setup

  • Created a fresh standalone experiment directory.
  • Target benchmark: public Microsoft PROSE Transformation.Text tasks mirrored under /workspace/large_artifacts/qwen_recursive_task_decomposition/prose-benchmarks.
  • Primary metric: full-task exact on held-out rows. A task counts only if every held-out row is exact.
  • Secondary metric: row exact, used only to diagnose task-level consistency.

Run smoke_static

  • Time UTC: 2026-06-27T05:12:36.848797+00:00
  • Static tasks: 12; Qwen tasks: 0
  • Config: {"answer_max_new_tokens": 64, "child_limit": 4, "heldout_cap": 8, "max_candidates": 8000, "qwen_heldout_cap": 6, "qwen_min_heldout": 3, "qwen_task_limit": 12, "recursive_depth": 2, "rule_max_new_tokens": 180, "run_qwen": false, "sample_seed": 20260627, "suite": "smoke_static", "task_limit": 12, "train_n": 4}
  • Static summary:

    • static_mono_examples full-task exact: 33.3%
    • static_mono_oracle full-task exact: 50.0%
    • static_recursive_examples full-task exact: 33.3%
    • static_recursive_oracle full-task exact: 50.0%
    • static_recursive_shuffled full-task exact: 0.0%

Run smoke_qwen

  • Time UTC: 2026-06-27T05:13:59.780118+00:00
  • Static tasks: 20; Qwen tasks: 4
  • Config: {"answer_max_new_tokens": 48, "child_limit": 3, "heldout_cap": 6, "max_candidates": 5000, "qwen_heldout_cap": 3, "qwen_min_heldout": 3, "qwen_task_limit": 4, "recursive_depth": 1, "rule_max_new_tokens": 120, "run_qwen": true, "sample_seed": 20260627, "suite": "smoke_qwen", "task_limit": 20, "train_n": 4}
  • Static summary:

    • static_mono_examples full-task exact: 30.0%
    • static_mono_oracle full-task exact: 50.0%
    • static_recursive_examples full-task exact: 30.0%
    • static_recursive_oracle full-task exact: 50.0%
    • static_recursive_shuffled full-task exact: 0.0%
  • Qwen summary:

    • direct_qwen row exact: 75.0%; full-task exact: 50.0%
    • locked_rule_qwen row exact: 58.3%; full-task exact: 50.0%
    • shuffled_rule_qwen row exact: 58.3%; full-task exact: 25.0%

Run main_v1

  • Time UTC: 2026-06-27T05:35:27.915748+00:00
  • Static tasks: 309; Qwen tasks: 30
  • Config: {"answer_max_new_tokens": 56, "child_limit": 5, "heldout_cap": 50, "max_candidates": 12000, "qwen_heldout_cap": 6, "qwen_min_heldout": 3, "qwen_task_limit": 30, "recursive_depth": 2, "rule_max_new_tokens": 160, "run_qwen": true, "sample_seed": 20260627, "suite": "main_v1", "task_limit": 0, "train_n": 4}
  • Static summary:

    • static_mono_examples full-task exact: 22.7%
    • static_mono_oracle full-task exact: 29.4%
    • static_recursive_examples full-task exact: 22.7%
    • static_recursive_oracle full-task exact: 34.3%
    • static_recursive_shuffled full-task exact: 0.3%
  • Qwen summary:

    • direct_qwen row exact: 69.4%; full-task exact: 46.7%
    • locked_rule_qwen row exact: 61.7%; full-task exact: 46.7%
    • shuffled_rule_qwen row exact: 53.6%; full-task exact: 36.7%

Run syntax_check

  • Time UTC: 2026-06-27T05:36:58.054670+00:00
  • Static tasks: 3; Qwen tasks: 0
  • Config: {"answer_max_new_tokens": 64, "child_limit": 2, "heldout_cap": 3, "max_candidates": 1000, "qwen_heldout_cap": 6, "qwen_min_heldout": 3, "qwen_task_limit": 12, "recursive_depth": 1, "rule_max_new_tokens": 180, "rule_styles": "decompose", "run_qwen": false, "sample_seed": 20260627, "suite": "syntax_check", "task_limit": 3, "train_n": 4, "train_verify_rules": false}
  • Static summary:

    • static_mono_examples full-task exact: 33.3%
    • static_mono_oracle full-task exact: 33.3%
    • static_recursive_examples full-task exact: 33.3%
    • static_recursive_oracle full-task exact: 33.3%
    • static_recursive_shuffled full-task exact: 0.0%

Run main_v2_train_verified_rules

  • Time UTC: 2026-06-27T05:49:25.174356+00:00
  • Static tasks: 309; Qwen tasks: 30
  • Config: {"answer_max_new_tokens": 56, "child_limit": 5, "heldout_cap": 50, "max_candidates": 12000, "qwen_heldout_cap": 6, "qwen_min_heldout": 3, "qwen_task_limit": 30, "recursive_depth": 2, "reuse_static_from": "main_v1", "rule_max_new_tokens": 150, "rule_styles": "decompose,terse,conditional", "run_qwen": true, "sample_seed": 20260627, "suite": "main_v2_train_verified_rules", "task_limit": 0, "train_n": 4, "train_verify_rules": true}
  • Static summary:

    • static_mono_examples full-task exact: 22.7%
    • static_mono_oracle full-task exact: 29.4%
    • static_recursive_examples full-task exact: 22.7%
    • static_recursive_oracle full-task exact: 34.3%
    • static_recursive_shuffled full-task exact: 0.3%
  • Qwen summary:

    • direct_qwen row exact: 69.4%; full-task exact: 46.7%
    • locked_rule_qwen row exact: 59.4%; full-task exact: 43.3%
    • shuffled_rule_qwen row exact: 58.3%; full-task exact: 33.3%

Figures 5

iteration comparison
iteration comparison · analysis/figures/
method full task scores
method full task scores · analysis/figures/
qwen family locked effect
qwen family locked effect · analysis/figures/
qwen row vs full
qwen row vs full · analysis/figures/
static recursive gain
static recursive gain · analysis/figures/

Data files 12

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

Reproduce

This entry is source code or analysis only — there is no separate run to reproduce.

Browse the experiment folder on GitHub ↗