Research log Small Model Experimentation
GitHub

Qwen3.5-4B Verified Macro Invention Long-Context Rerun

More thinking room only bought longer loops

The one idea you need

Same model, two jobs on identical coding puzzles. Copy out a blueprint it is handed: quick, done. Or reverse-engineer that blueprint from only a photo of the finished part: it cannot, so it circles the same guess forever. A bigger budget is a longer track, not a finish line.

The question

If a small model keeps rambling and never finishes a hard coding puzzle, can you fix it just by handing it far more room to think?

What we found

No. The model was not short on thinking space, it was stuck repeating itself, and more space only bought longer loops. Handed the blueprint, all 16 tasks finished cleanly. Asked to invent the program from examples alone, every attempt ran off the end of its allowance at every budget, and pure repetition climbed from 9 percent of traces to 83 percent as the room grew.

Why it matters

Calibrate a thinking budget on the exact task you will ship, not a look-alike: copying a plan and inventing one behave nothing alike. When a model loops, add loop detection and hard stops rather than buying more tokens.

Copy-the-plan tasks solved cleanly16 of 16every supplied-plan record finished, above the 12 needed to pass
Invent-from-examples tries that never stoppedabout 9 in 10131 of 144 samples ran off the end at the ~16,000-token budget
Attempts stuck repeating the same tokens9% → 83%as thinking room grew from about 16,000 to 61,000 tokens
Thinking room scaled up16,000 → 61,000 tokensroughly quadrupled, yet every attempt still hit the ceiling
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. Reproduce
  6. Related

Results at a glance 2

How invent-the-program attempts failed as thinking room grew

How to read

The bottom groups three thinking budgets (about 16k, 32k, 49k tokens) on the invent-from-examples task. Within each group: share that never resolved, share stuck in exact repeating loops, share whose answer hit its length cap. Lower is better everywhere.

0%25%50%75%100%fresh base think@16kfresh base think@16k91%9%41.7%fresh base think@32kfresh base think@32k43.8%56.2%25.7%diagnostic base think@49kdiagnostic base think@49k29.2%70.8%27.1%

Takeaway → As the budget grows, the never-resolved share shrinks while the repeating-loop share balloons: the failure just changes shape, and no budget ever lets attempts finish.

Data table
conditionunresolved cap contactsexact periodic loopsanswer-limit contacts
fresh base think@16k91%9%41.7%
fresh base think@32k43.8%56.2%25.7%
diagnostic base think@49k29.2%70.8%27.1%

Numbers from analysis/scientific_smoke_16k_termination_audit.json; analysis/scientific_smoke_32k_termination_audit.json; analysis/scientific_smoke_49k_scheduler_overcommit_audit.json

Technical framing

Longer caps changed the failure mode, not evidence eligibility — Every sample at all three allowances reached the reasoning boundary. The 16k and 32k rungs were rejected before scoring. Amendment 12 made the max-seqs-64 49k probe diagnostic-only before its receipt because worst-case demand exceeded KV capacity; no decoded output or score was inspected.

Handed the plan, the model cleared every task

How to read

One group, the supplied-plan check. The taller bar counts records that produced at least one exactly correct rewrite using the library (16 of 16); the shorter reference bar marks the 12 needed to pass. Higher is better.

05101520think@16k interfacethink@16k interface1612

Takeaway → All 16 records cleared, above the 12 needed: the model and its interface work fine when handed the plan, isolating failure to inventing the program itself.

Data table
conditionrecords with an exact rewriterecords required to pass
think@16k interface1612

Numbers from analysis/interface_gate.json

Technical framing

Long-context reasoning cleared every supplied-plan record — The supplied-plan K=4 gate passed at the record level. This repairs the parent's apparent low-budget interface failure but does not establish fresh induction value.

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

The inference repair has already changed the diagnosis: max-seqs-64 calibration at think@16,384: 3/64 unresolved contacts, 0 answer truncations, productive p99 11,629 tokens; independent plan-given interface: 16/16 records covered, 63/64 strict valid macro-using samples, 0 unresolved contacts, and 0 answer truncations; fresh base smoke at the same allowance: 144/144 raw cap contacts, 13 exact periodic tails, 131/144 unresolved contacts, and 60/144 answer-limit contacts; fresh base smoke at think@32,768: 144/144 forced interventions at the reasoning boundary, 81 exact periodic tails, 63/144 unresolved contacts, 37/144 answer-limit contacts, and no earlier-close answer restarts. … Read the full result →

Overview

plan-given interface passed 16/16 records at think@16,384, overturning the parent's apparent low-budget interface limit. The fresh base-smoke arm then proved that 16,384 was still binding for induction (131/144 unresolved contacts and 60/144 answer truncations), so those rows were excluded and think@32,768 also rejected from content-blind finish/count metadata plus the preregistered token-ID periodicity test: 81/144 exact loops, 63/144 unresolved contacts, and 37/144 answer-limit contacts. The max-seqs-64 K=4 probe at think@49,152 then finished with 34/48 exact loops, 14/48 unresolved contacts, and 13/48 answer-limit contacts, but amendment 12 had already made it diagnostic-only from pre-result cache-capacity evidence. Fresh long-rung selection moved to the capacity-fit follow-up, whose 61k attempt was stopped before a receipt after an audit found that its implicit CUDA-graph list did not cover the active batch width. A separate exact-capture follow-up then rejected fresh 49k and 61k probes even though both live-KV and exact-graph gates passed. Its terminal selector records pass=false and no selected budget, so no K=12 matrix, semantic analysis, or macro claim is authorized.

Research program

Question

With enough context and a nonbinding, explicitly calibrated reasoning allowance, can a verified abstraction library built only from prior solved programs improve visible-only selected accuracy on fresh behaviorally true-depth-5 programs beyond matched-compute sampling over the original primitives?

Why this rerun exists

The parent did not reach the scientific comparison. Its budgeted plan-given attempt gave every completion only 768 thinking tokens and a 128-token answer: all 16 samples hit the thinking cap and 12/16 hit the answer cap. A later no-thinking transcription probe removed truncation but measured a different low-compute interface. Neither path establishes that verified macros help or fail under a properly provisioned induction protocol.

This follow-up changes the inference envelope, not the hypothesis. It keeps the parent's frozen construction corpus, macro libraries, never-prompted v2 smoke, never-prompted full tasks, scientific arms, K values, analyzer logic, hidden-label boundary, and confirmatory thresholds. It replaces the single 768-token assumption with content-blind termination calibration and whole-matrix escalation.

Setup

  • Only model: Qwen/Qwen3.5-4B at repository-pinned revision 851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a.
  • Only inference backend: the experiment-local src/vllm_runner.py under .venv-vllm; no Transformers inference and no backend mixing.
  • Engine envelope: max_model_len=65536, with exact prompt-plus-generation preflight.
  • Scientific reasoning ladder: budgeted thinking at 16,384, 32,768, 49,152, then 61,440 tokens after amendments 3--5 separated exact loops and extended the setup envelope.
  • Answer allowance: 512 tokens at every rung. Forced-close stage 2 is directly capped; a naturally closed stage-1 answer reaching 512 also rejects the rung under amendment 7.
  • Reasoning-cap accounting: amendment 9 counts a forced intervention or a close in the final stage-1 slot as contact. An earlier natural </think> followed by a stage-1 length finish is an answer-restart diagnostic, not evidence that reasoning exhausted its allowance; the fresh answer still has to clear the unchanged 512-token rule.
  • Largest context guard: the frozen train-only proposal prompt is 3,478 tokens. Its largest-rung total is 65,432, and the CPU regression guard preserves the remaining 104-token headroom.
  • Substrate: the byte-identical contamination-free procedural corpus copied from the parent: 800 construction programs, 12 unseen v2 smoke tasks, and 120 unseen full tasks (80 motif-reuse, 40 primitive-multiset-matched no-reuse).
  • Sampling: macro arms K=12; base K=24 for the matched-token sample-more curve.
  • Primary metric: visible-only selected hidden-all accuracy on the reuse split.
  • Oracle-only metric: whether any sampled candidate passes every hidden case.

The frozen tasks.json SHA-256 is 82fbbd57e26fd392aa8f30ec6f26d370dc08dd78b3279bed6ee2e2174aea5073; the frozen libraries.json SHA-256 is a2ae3663753a3a0d0c9614a5d7c1d250506c74fd7879e11e99b66f5c1e43f865.

Anti-censoring gates

  1. The original train-only calibration ladder used four deterministic plan-given records sampled 16 times each. Amendment 4 selected think@16,384 using finish/count metadata plus the frozen token-ID periodicity test: below-5% unresolved-cap and answer-limit-contact rates, at most 80% p99 productive thinking use, and at most 50% p99 answer use. Generated text and correctness were unavailable to selection.
  2. At that rung, a disjoint train-only plan-given gate ran 16 records with four samples each. It passed 16/16 record coverage; 63/64 samples were strict valid macro-using surfaces, all 12 cap contacts were classified by the frozen exact-token periodic-tail detector, none remained unresolved, and no answer truncated.
  3. Fresh induction has its own workload-conditioned ladder. A completed inadequate arm can reject a lower rung immediately; every remaining arm is recorded as skipped, and all lower rows remain diagnostic and unscored. A rung is selectable only when the complete base/designed matrix is termination-adequate at one shared budget. If either completed K=12 arm rejects the 32,768 matrix, higher rungs first use all 12 base prompts at non-scored K=4 to locate a viable allowance; the selected rung is then rerun from scratch at the original complete K=12 matrix.
  4. Raw stage-1 length, forced intervention, final-slot boundary contact, earlier-close answer restart, and fresh-answer limit contact are reported separately. Runtime selection and offline analysis use the same amendment-9 definition.
  5. Exhausting 61,440 is an inconclusive setup failure, never a capability result. Full generation remains blocked until an uncensored smoke matrix passes the original semantic gates.
  6. Amendment 12 found before the 49k receipt that max-seqs 64 overcommits the measured 995,328-token KV cache at the long rungs. That completed probe is decision-ineligible regardless of its termination result. Fresh 49k/61k probes and any complete matrix move to the separate capacity-fit follow-up at max-seqs 19/15 respectively.

The full decision remains the parent's conjunction: mined must beat base sampling, the non-callable mined_hint, and matched random composite libraries under the registered effect-size, paired-interval, compute, macro-use, and reuse-specificity thresholds. The qwen_ranked verdict remains separate.

Run

All commands use the uv-managed vLLM environment.

CPU preparation and tests:

.venv-vllm/bin/python -m unittest discover -s experiments/qwen35_4b_verified_macro_long_context_rerun/tests -v
.venv-vllm/bin/python experiments/qwen35_4b_verified_macro_long_context_rerun/scripts/run.py --prepare

Before resuming a legacy repository-local scientific-smoke cache, stop the old runner and perform the model-free staged migration. The first command validates a staging copy, writes receipts and a deterministic catalog, atomically installs the external tree, and deliberately preserves the local source for review. The second command revalidates byte identity before removing only the canonical local tier/probe directories. Cleanup is resumable: any remaining local bundles need only be an exact verified subset of an external inventory that may already have advanced:

.venv-vllm/bin/python experiments/qwen35_4b_verified_macro_long_context_rerun/scripts/run.py --migrate-scientific-artifacts
.venv-vllm/bin/python experiments/qwen35_4b_verified_macro_long_context_rerun/scripts/run.py --migrate-scientific-artifacts --remove-local-scientific-artifacts

Scientific matrix and termination-probe bundles then live under /workspace/large_artifacts/qwen35_4b_verified_macro_long_context_rerun/scientific_smoke_v1/. QWEN35_MACRO_SCIENTIFIC_ARTIFACT_ROOT may select a byte-identical absolute copy on another host. Do not hand-copy individual JSONL files: each bundle is valid only as a preflight alone or as the exact preflight/rows/metadata triplet plus its last-written receipt. Unknown files, symlinks, partials, or catalog drift fail closed before model allocation or row interpretation. A narrow crash window is self-healing under the shared stage lock: when unchanged protocol bytes and exact-valid external bundles prove that a cataloged preflight merely gained its last-written receipt, the catalog is reconciled before model allocation. Source drift, unknown bundles, and rows/metadata partials are never reconciled.

Calibrate the rung, run the heldout interface gate, and run the fresh smoke:

.venv-vllm/bin/python experiments/qwen35_4b_verified_macro_long_context_rerun/scripts/run.py --smoke

Run the full matrix only after all gates pass:

.venv-vllm/bin/python experiments/qwen35_4b_verified_macro_long_context_rerun/scripts/run.py --full

Full generation follows preregistration amendments 8 and 11 and does not create runs/full/*.jsonl. Canonical raw artifacts live at /workspace/large_artifacts/qwen35_4b_verified_macro_long_context_rerun/full/think_<budget>/<arm>/shard_<index>/. Base uses 20 six-task shards at K=24; every macro arm uses 10 twelve-task shards at K=12. Each shard therefore contains exactly 144 completions and preserves the frozen 2:1 reuse mix. A final shard is reusable only when its directory contains exactly preflight.json, rows.jsonl, runner.meta.json, and the last-written receipt.json, and every ordered prompt, identity, byte size, and SHA-256 validates. Re-running --full first scans and exact-validates every existing final in the active rung, including downstream arms, and only then resumes missing work. .tmp-* directories from interruptions are inventoried but never salvaged.

A persistent sibling .full.lock serializes scientific migration, smoke, and full processes. It uses nonblocking flock and is acquired before frozen-data checks, smoke replay, proposal work, model construction, or external-root/catalog mutation. Before vLLM loads, the runner also rejects repository-local full raw rows, symlinks, unknown budgets/arms/shards, malformed finals, partial Qwen ensembles, and stale protocol/data/catalog bindings. A malformed final shard_<index> fails closed and is never overwritten. Inspect it, move the whole directory to an explicitly named quarantine location outside the canonical arm directory, then rerun the entire shard. Do not copy individual rows or samples back. At a successful selected rung, analysis/full_artifact_catalog.json is the tracked logical pointer; no raw promotion copy is made. Its schema-2 inventory is checkpointed from startup onward, including diagnostic receipts, nonreusable temporary directories, rejected rungs, and a selected-null setup-inconclusive finish. It binds the exact config, hidden-label-bearing tasks, post-proposal libraries, smoke gates, selection, source files, plan, receipts, and protocol identities. Offline analysis revalidates that binding and recomputes selected-arm termination adequacy before scoring any completion.

Analyze an existing full run without loading the model:

.venv-vllm/bin/python experiments/qwen35_4b_verified_macro_long_context_rerun/scripts/analyze.py --run full

Results

The inference repair has already changed the diagnosis:

  • max-seqs-64 calibration at think@16,384: 3/64 unresolved contacts, 0 answer truncations, productive p99 11,629 tokens;
  • independent plan-given interface: 16/16 records covered, 63/64 strict valid macro-using samples, 0 unresolved contacts, and 0 answer truncations;
  • fresh base smoke at the same allowance: 144/144 raw cap contacts, 13 exact periodic tails, 131/144 unresolved contacts, and 60/144 answer-limit contacts;
  • fresh base smoke at think@32,768: 144/144 forced interventions at the reasoning boundary, 81 exact periodic tails, 63/144 unresolved contacts, 37/144 answer-limit contacts, and no earlier-close answer restarts.

The max-seqs-64 K=4 diagnostic at 49,152 also forced all 48 reasoning traces closed: 34 were exact loops, 14 remained unresolved, and 13 answers hit 512 tokens. It sampled 2,366,620 tokens in 4,035.356 seconds (586.47 tokens/s). Amendment 12 had made it selection-ineligible before its receipt existed because 48 admitted long sequences required 2,433,024 cache tokens against the 995,328-token engine cache with prefix caching off.

These are workload/scheduler-calibration failures, not macro results. The 16k arm consumed 2,391,698 sampled tokens in 2,138.606 seconds (1,118.34 tokens/s); 32k consumed 4,739,527 in 5,971.182 seconds (793.73 tokens/s). All three diagnostics were excluded before parsing or correctness inspection. The capacity-fit follow-up then rejected a fresh 49k probe but exposed a second scheduler defect: its requested capture maximums 19/15 resolved only through widths 16/8. Its 61k attempt was stopped before a receipt, with no reusable rows. The separate exact-capture follow-up covered width 19 exactly at 49k while fitting 963,072 cache tokens into 996,864 live tokens, but still rejected the probe content-blind: 38/48 exact loops, 10/48 unresolved contacts, and 6/48 answer-limit contacts. It sampled 2,363,163 tokens in 4,809.081 seconds (491.396 tokens/s). At 61k, vLLM resolved [1, 2, 4, 8, 15] exactly in FULL mode and fit 950,400 required cache tokens into 997,888 live tokens with 47,488 of headroom. The fresh probe nevertheless failed all three thresholds: 40/48 exact loops, 8/48 unresolved contacts, and 4/48 answer-limit contacts, at 397.688 sampled tokens/s. The terminal selection is pass=false with no selected budget. No decoded or scored content informed either decision, and no K=12 matrix or macro comparison was authorized. The next registered follow-up should stop increasing context and test a symmetric loop-control protocol in a separate experiment while preserving the unresolved-contact and answer-limit gates.

Artifacts

  • data/: byte-identical frozen parent inputs plus explicit source provenance.
  • configs/: the registered ladder, context envelope, sampling, gates, and scientific constants.
  • runs/: train-only calibration and interface vLLM rows with exact runner metadata. Scientific smoke/probe rows use the canonical external root above; full rows use the external shard root.
  • analysis/: machine-readable gates/verdicts, budget selections, and deterministic external checksum catalogs. Smoke and full per-task output is compact: hashes, aggregate counts/tokens, and the selected program/grades only; reasoning text and raw token arrays stay external.
  • reports/: preregistration, design review, final report, and artifact manifest.
  • src/vllm_runner.py: the single-file, pinned vLLM inference wrapper used by every arm.

Report

Rendered from reports/report.md

Summary

This follow-up has repaired the parent's apparent interface failure but has not yet produced an eligible scientific comparison. Under the uv-managed vLLM stack, the disjoint plan-given interface passed 16/16 records at think@16,384. The fresh induction base arm at that same allowance then hit a different termination regime: 131/144 samples remained unresolved after exact-loop exclusions and 60/144 answer stages truncated. Those rows were rejected before parser or correctness inspection. At think@32,768, all 144 samples still required forced closure: 81 exact loops, 63 unresolved contacts, and 37 answer-limit contacts. That rung was also excluded. The max-seqs-64 K=4 probe at think@49,152 finished with 34/48 loops, 14/48 unresolved contacts, and 13/48 answer-limit contacts, but pre-result KV-capacity evidence had already made it diagnostic-only. Fresh selection is running through separate scheduler follow-ups. The capacity-fit 61k attempt stopped before a receipt when its implicit CUDA-graph list proved not to cover the active width. Fresh exact-capture 49k and 61k probes then failed termination despite passing both live-KV and exact-graph gates. The terminal selector is pass=false with no selected budget, so no K=12 matrix or semantic analysis was authorized. No capped row is a negative macro result.

Research Program Fit

Primary program: operator_and_skill_inventories. The experiment also supplies direct evidence to test_time_reasoning_budget: a budget calibrated on supplied-plan transcription did not transfer to fresh program induction in the same procedural substrate. Structured execution and benchmark generalization become relevant only after an uncensored mined/base/hint/random comparison exists.

Method

The only model is Qwen/Qwen3.5-4B at revision 851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a. Every model-facing request uses the experiment-local single-file vLLM runner; Transformers inference and backend mixing are forbidden. Inputs are copied byte-for-byte from parent commit 1c8c5bbb81d2a67618891597205ceb2f40f498d8: 800 train-only construction programs, 12 fresh v2 smoke tasks, and 120 never-prompted full tasks with exact execution and behaviorally verified depth five.

The original calibration and independent interface gate used supplied train-only plans. Scientific smoke uses fresh I/O-only induction tasks and compares base primitives with the generator-known designed macro ceiling at matched K=12. Amendments 1--12 record scheduler diagnostics, the Ada batch-invariance boundary, exact periodic-loop handling, concurrency optimization, the extended scientific ladder [16384, 32768, 49152, 61440], exact cap accounting, external scientific/full durability, and fail-early full-run audit hardening. If either completed K=12 arm rejects the 32,768 matrix, the two higher rungs first use non-scored K=4 base workload probes to locate a viable allowance. Lower rungs and probes can be rejected from content-blind finish/count metadata plus the preregistered token-ID periodicity test, but a rung is scored only when both arms are complete at K=12 and adequate at the same budget. Amendment 12 additionally freezes max-seqs 19 at 49k and 15 at 61k in a separate protocol because the measured cache cannot hold the former max-seqs-64 scheduling wave without recomputation.

Results

Corrected setup and interface

Stage / allowanceSamplesUnresolved cap contactsAnswer-limit contactsGate result
train-only calibration / 16,384643 (4.69%)0pass
disjoint plan-given interface / 16,3846400pass, 16/16 records covered
fresh base induction smoke / 16,384144131 (90.97%)60 (41.67%)censored; excluded
fresh base induction smoke / 32,76814463 (43.75%)37 (25.69%)censored; excluded
overcommitted base K=4 probe / 49,1524814 (29.17%)13 (27.08%)diagnostic-only; excluded

The interface produced 63/64 strict valid macro-using samples; every one of its 16 records had at least one exact optimal rewrite. Its 12 raw cap contacts were all classified by the frozen exact-token periodic-tail detector, so none remained unresolved.

The fresh base arm sampled 2,391,698 tokens in 2,138.606 seconds (1,118.34 tokens/s). All 144 samples reached 16,384; 13 tails passed the periodic-loop detector and 131 did not. Because base alone irreversibly rejected the rung, the automatically started designed arm was interrupted before it returned rows. No decoded output, parser status, visible score, hidden grade, or oracle result informed the amendment or escalation.

At 32,768, the amendment-9 replay found no earlier-close answer restarts: every sample reached the reasoning boundary and required intervention. Eighty-one tails were exact periodic loops, while 63 remained unresolved; 37 fresh answers hit 512 tokens. The arm sampled 4,739,527 tokens in 5,971.182 seconds (793.73 tokens/s). Base alone again rejected the rung without a designed-arm call, so the precommitted branch advanced to the non-scored K=4 base probe at 49,152. This decision also used no decoded output, parser result, visible score, hidden grade, or oracle result.

Before that probe returned, amendment 12 proved from engine capacity and installed scheduler source that max-seqs 64 could not hold its long active contexts without eviction/recomputation. The probe therefore became irrevocably decision-ineligible. It later confirmed 48/48 forced interventions, 34 exact periodic loops, 14 unresolved contacts, and 13 answers at 512 tokens. Sampling 2,366,620 tokens took 4,035.356 seconds (586.47 tokens/s). The receipt-bound diagnostic was classified from finish/count metadata and token IDs only; no decoded or scored content was inspected. Fresh budget selection moved to qwen35_4b_verified_macro_capacity_fit_rerun at max-seqs 19/15.

That capacity-fit follow-up completed its fresh 49k K=4 probe within live KV capacity, but all 48 samples still contacted the reasoning boundary: 37 were exact loops, 11 remained unresolved, and 9 answers reached their limit. It generated 2,364,643 sampled tokens in 5,012.451 seconds (471.754 tokens/s). A source/runtime audit then found that the implicit CUDA-graph configuration resolved only through widths 16 and 8 for requested maxima 19 and 15. The 61k capacity-fit attempt was therefore stopped before a receipt; it produced no reusable rows and no decoded or scored content was inspected.

The separate qwen35_4b_verified_macro_exact_cudagraph_rerun froze explicit graph lists and fresh artifacts. At 49k, vLLM resolved [1, 2, 4, 8, 16, 19] exactly and the live audit fit 963,072 required cache tokens into 996,864, leaving 33,792. The fresh probe nevertheless failed all three termination thresholds: 38/48 exact loops, 10/48 unresolved contacts, and 6/48 answer-limit contacts. It generated 2,363,163 sampled tokens in 4,809.081 seconds (491.396 tokens/s), a descriptive 4.16% improvement over the closest implicit-capture probe. This is not a causal throughput benchmark because scheduling can alter sampled trajectories.

The terminal 61k probe also passed its runtime envelope: vLLM resolved FULL decode graphs at [1, 2, 4, 8, 15], covering max-seqs 15 exactly, and fit 950,400 required cache tokens into 997,888 with 47,488 of headroom. All 48 samples still reached the reasoning boundary: 40 were exact loops, 8 remained unresolved, and 4 answers reached 512 tokens. It generated 2,951,995 sampled tokens in 7,422.886 seconds (397.688 tokens/s). The terminal selection therefore records pass=false and selected_thinking_budget=null; no K=12 arm, semantic analysis, or macro result is authorized. Neither probe decision used decoded or scored content.

Scientific smoke and full comparison

Pending an uncensored complete rung. Full generation remains blocked by the unchanged smoke gate.

Controls

  • Byte-level frozen-data verification and zero forbidden train/evaluation overlap.
  • Only one model, revision, backend, prompt family, and shared rung per comparison matrix.
  • Content-blind finish/count and preregistered token-ID periodicity decisions; no decoded semantics or scores enter budget selection, and lower rungs are never pooled or scored.
  • Exact periodic-tail classification reported separately from unresolved cap contact.
  • Stage-independent 512-token answer-limit contact; natural answers cannot bypass the stage-2 cap.
  • Amendment-9 reasoning-cap accounting separates forced intervention and final-slot close from an earlier natural close whose partial answer was merely restarted after the raw stage-1 length cap.
  • A model-free proposal-record/hash guard freezes the 3,478-token proposal bound, 65,432-token largest-rung total, and at least 104 tokens of context headroom; exact runtime preflight remains mandatory.
  • Strict one-line parser, visible-only selection, and hidden-only final grading remain unchanged.
  • Base/design smoke precedes all mined, hint, random, Qwen-ranked, and full-task generation.

Oracle Versus Deployable Evidence

Not yet eligible. Oracle and selected correctness are deliberately unavailable until the complete smoke matrix passes termination. If it does, full results will report hidden oracle coverage separately from the visible-only selected line and from the matched-token sample-more base prefix.

Interpretation

The parent's 768-token result was not a durable alias-interface limit: adequate reasoning cleared the broader K=4 record-level gate. The new roadblock is workload-conditioned provisioning. Supplied-plan transcription and I/O-only induction share the same syntax and model but have radically different trace-length distributions. The operational lesson is to calibrate on the actual workload class, retain exact termination evidence, and treat a generation ceiling as missing evidence rather than task failure.

This still says nothing about whether mined macros improve induction. That claim requires the unchanged full conjunction against base sampling, non-callable hints, matched random libraries, macro mediation, and the no-reuse control.

Next Experiments

Stop increasing the context allowance: the exact-capture ladder has reached its registered terminal rung without selecting a budget. The next attempt should be a separate, preregistered symmetric loop-control experiment that applies the same intervention to every compared arm while preserving the unresolved-boundary and answer-limit gates. Do not reuse censored rows, decode them to tune the intervention, or claim a macro effect without a fresh termination-adequate K=12 matrix.

Artifact Manifest

Raw superseded scheduler/context diagnostics are preserved under the standard external artifact root with a deterministic tree checksum. Current compact audits, config, preregistration amendments, metadata, and reasonably sized calibration/interface rows are listed in artifact_manifest.yaml. Raw scientific smoke and full rows live only in their canonical external roots and are bound by tracked deterministic catalogs and per-file receipt hashes; repository-local promotion copies are forbidden.

Experiment log 10

Show the running log (10 entries)

Scaffold and branch decision

  • Created as a new experiment after review of the stopped, result-bearing qwen35_4b_verified_macro_invention; the parent's outputs and historical numbers are not rewritten. After the corrected interface result, additive forward links were added to its README/report so readers do not mistake the old setup stop for a durable model limit.
  • Attached to operator_and_skill_inventories, with secondary connections to structured execution, generalization, and test-time reasoning budgets.
  • Related-work search named the parent as the closest near-duplicate. The operator-program backlog's exactly-one-macro slot sweep is a separate future interface redesign; this follow-up first tests the narrower claim that the parent's inference envelope was binding.
  • Reclassified the parent's budgeted interface observation as setup censoring rather than a negative macro result: 16/16 samples hit think@768 and 12/16 hit the 128-token answer cap. The fresh v2 smoke and full tasks were never prompted, so the scientific hypothesis remains open.

Frozen inheritance

  • Copied the data and harness from parent commit 1c8c5bbb81d2a67618891597205ceb2f40f498d8 into this self-contained directory.
  • Verified byte identity for all seven active data files and all seven historical smoke_v1_frozen/ files against that commit. The archived v1 inputs remain part of the CPU contamination gate even though their seen smoke rows are excluded from scoring.
  • Recorded all 14 parent paths and per-file hashes in data/source_provenance.json; --prepare independently checks both frozen sets against constants in the runner. The two headline active file hashes are tasks.json = 82fbbd57e26fd392aa8f30ec6f26d370dc08dd78b3279bed6ee2e2174aea5073 and libraries.json = a2ae3663753a3a0d0c9614a5d7c1d250506c74fd7879e11e99b66f5c1e43f865.
  • Did not copy parent model outputs into the new result. The historical v1 smoke remains seen and excluded; the copied v2 smoke and full splits retain their never-prompted status.

Design freeze, before follow-up GPU generation

  • Kept exactly one model, Qwen/Qwen3.5-4B at the repository-pinned revision, and exactly one inference backend: the experiment-local vLLM wrapper under the uv-managed .venv-vllm.
  • Raised the engine envelope to max_model_len=65536 and required prompt-plus-reserve token preflight. Concurrency may adapt to GPU memory; scientific token allowances may not.
  • Froze the budgeted-thinking ladder at 2,048, 4,096, 8,192, 16,384, and 32,768 tokens, with a 512-token answer allowance at every rung.
  • Froze metadata-only calibration to four deterministic train-only plan-given records at n=16. The smallest rung must have cap and truncation each below 5%, p99 thinking use at most 75% of B, and p99 answer use at most 50% of A. Output text and correctness are unavailable to selection.
  • Froze a separate heldout train-only interface gate of 16 records at n=4. At least 12 records need one strict macro-using optimal surface whose literal expansion exactly equals the supplied plan; cap and truncation must each remain below 5%.
  • Froze whole-stage escalation: any censoring violation reruns the complete gate, proposal batch, smoke matrix, or full matrix at the next rung. Lower rungs are diagnostic only and are never pooled. Exhausting the ladder is setup-inconclusive.
  • Preserved the parent's scientific arms, K=12/K=24 sampling, fresh v2 smoke, full tasks, visible- only selection, analyzer, hidden-label boundary, and confirmatory effect/interval thresholds.
  • Saved idea_intake.md, reports/preregistration.md, and reports/design_review.md before the first follow-up model call.

GPU runs

Auto-async calibration excluded before science

The first train-only calibration produced complete tiers at 2,048, 4,096, and 8,192 tokens. The first two tiers were fully cap-bound (64/64 each). The 8,192 tier reduced cap contacts to 12/64, but the registered prefix audit found 32/64 mismatches against think@4,096, all in the two records scheduled after the first 32 logical sequences. Engine logs confirmed that vLLM 0.24 had auto-enabled asynchronous scheduling.

Stopped before heldout interface or fresh induction smoke. Archived the auto-async rows and exact runner, added async_scheduling=False to the experiment-local and template wrappers, bumped the runner schema, and froze reports/preregistration_amendment_1.md before restarting calibration.

The non-async 2,048→4,096 rerun then reproduced 32/64 prefix mismatches on the same second scheduling wave. This refuted the async-specific attribution: the Ada GPU cannot enable vLLM's Hopper-only batch-invariant mode, so cross-budget common random numbers are unavailable. Frozen reports/preregistration_amendment_2.md before continuing. Prefix audits remain recorded but no longer gate the metadata-only budget selector; valid non-async tiers are retained.

The complete ladder then found 64/64, 61/64, 18/64, 9/64, and 9/64 raw cap contacts at budgets 2,048 through 32,768. At 32,768, the 55 naturally closing samples all finished by 12,564 tokens; the other nine had exact periodic tails over the final 8,192 tokens (periods 5–318), and no answer truncated. Because the registered calibration was setup-inconclusive, inspected only these train-only loop tails, froze the token-only detector and thresholds in reports/preregistration_amendment_3.md, and kept every scientific prompt untouched.

The 32k heldout interface then passed 16/16 records with all 64 samples valid and macro-using, confirming the parent's apparent interface failure was setup-induced. The first fresh base-smoke call ran for about 22 minutes at full utilization but returned no rows before manual interruption; no content or correctness was inspected. Calibration showed think@16,384 already covers every non-loop trace (natural p99 12,564) with 3,820 tokens of headroom. Froze amendment 4: 80% natural headroom, loop handling from 16k, max-num-seqs 64, targeted recalibration, and complete interface / smoke reruns under the faster protocol.

The targeted max-seqs-64 calibration selected think@16,384, and the independent heldout interface again passed 16/16 records. The complete fresh base-smoke arm then showed that the scientific workload has a different termination distribution: all 144 samples contacted the thinking cap, 13 were exact periodic loops, 131 remained unresolved (90.97%), and 60 answers truncated at 512 tokens (41.67%). vLLM sampled 2,391,698 tokens in 2,138.606 seconds (1,118.34 sampled tokens/second). No generated text, parser output, correctness, oracle result, or task score was inspected. The automatically started designed-ceiling arm was interrupted before it returned any row.

Froze reports/preregistration_amendment_5.md before another GPU call. Base alone makes the 16k rung ineligible, so failed lower rungs are diagnostic only and may short-circuit after a completed arm proves the full rung cannot pass termination gates. Extended the ladder to 16,384, 32,768, 49,152, and 61,440 with the answer allowance and 65,536-token engine context unchanged. At the largest rung, the observed 990-token maximum prompt plus 61,440 thinking tokens, the two-token injected close, and 512 answer tokens total 62,944. The next complete termination-adequate matrix, not any lower censored row, is eligible for smoke scoring.

Preflight arithmetic correction, found while think@32,768 was still running: 990 is the maximum base prompt, while the frozen designed preflight reaches 1,060. The true matrix-wide largest-rung bound is 63,014 tokens, leaving 2,522 below the unchanged 65,536 context. No protocol changed.

The same CPU-only tokenizer audit found that the frozen train-only proposal prompt is the overall maximum at 3,478 tokens. Its largest-rung prompt plus reserves totals 65,432, leaving 104 tokens. The registered ladder fits, but any later extension must raise max_model_len rather than consume the guard band.

Before complete base@32,768 returned, froze reports/preregistration_amendment_6.md. If either completed K=12 arm rejects the 32k matrix, remaining higher rungs use all 12 base-smoke prompts at K=4 as termination-only workload probes. Only the first probe-adequate rung receives a fresh complete K=12 base/designed matrix; probe rows never enter scoring. If both 32k arms are adequate, this conditional branch is unused.

The active Python process had loaded the pre-amendment code before that branch was frozen. Added a temporary non-model-facing sentinel at the 49,152 K=12 preflight path: if the 32k matrix rejects, the old process fails closed on frozen-artifact mismatch before it can generate a 49k row. Remove the sentinel before any amendment-6 restart; if the 32k matrix passes, it is never consulted.

Before base@32,768 returned, a runner-code audit found that naturally closed stage-1 answers were not directly capped at 512 even though forced-close stage-2 answers were. Froze reports/preregistration_amendment_7.md: any n_answer_tokens >= 512 is now an answer-limit contact, regardless of stage or finish reason. Existing rows are reclassified from metadata; a post-process cache rerun is mandatory before accepting the active process's result.

While smoke was still unresolved and before any full/proposal prompt, froze reports/preregistration_amendment_8.md. If smoke passes, full uses fixed balanced 144-completion shards with atomic receipts, exact ordered cache binding, canonical external raw storage, logical (non-copying) promotion, compact derived results, and only irreversible-count failed-rung short circuits. Tasks, arms, K, and scientific thresholds are unchanged.

An independent code audit before base@32,768 returned then found that the legacy contact rule conflated a raw stage-1 length finish with exhausted reasoning even when </think> had occurred earlier and the runner regenerated the discarded partial answer under the fresh 512-token allowance. Froze reports/preregistration_amendment_9.md: reasoning contact is now forced intervention or n_thinking_tokens + 1 >= B; raw stage-1 length, forced intervention, final-slot boundary contact, and earlier-close answer restart are separate diagnostics in runtime selection and analysis. The same audit froze a CPU proposal-envelope regression: record hash df4735015e69149acba33eab02156ed56252ddb512a7bc669efc99b3a1c51e7d, 3,478 prompt tokens, 65,432 tokens at the largest rung, and 104 tokens of headroom. No model output informed either repair, and exact-valid cached rows must be replayed through the amended classifiers.

Implemented that full-only durability path without launching inference. The runner now freezes the 40 canonical no/reuse/reuse triplets, nests 20 base shards inside 10 macro-arm shards, commits only last-receip-valid external directories, and refuses to overwrite malformed finals. The analyzer verifies the plan, selection hash, root containment, every expected receipt/payload hash, and exact sampling/engine/runner identity before reading selected rows. Model-free tests cover task balance, atomic commit shape, corruption/path-escape failures, exact irreversible thresholds, rung short-circuiting, catalog completeness, multi-shard accounting, and compact derived output.

External scientific-smoke durability implementation

After base@32,768 returned atomically but before amendment-9 classification or any output-content inspection, froze reports/preregistration_amendment_10.md. Scientific matrix and termination-probe bundles now use one external root with a preflight-only resumable state and a receipt-last complete state. Each receipt binds all three runner files, ordered prompt/input identities, task order, K, arm, role, budget, model/revision, experiment-local runner hash, sampling, and engine identity.

The tracked deterministic catalog binds every external file plus the exact tasks, demonstrations, config, base/designed library payloads, analyzer, domain, harness, runner orchestration, and storage implementation. Logical selection points directly at complete matrix receipts; probes cannot be selected and no runs/smoke/ promotion copy is created. The analyzer verifies the catalog and all selected receipts before reading a row, and derived smoke output now omits completion prose and token arrays just like the full path.

Added a model-free --migrate-scientific-artifacts path that stages and exactly validates legacy local caches before atomic installation. It preserves local sources by default; the explicit --remove-local-scientific-artifacts follow-up revalidates the installed tree before deleting only canonical local tier/probe/promotion directories. Model-free tests cover idempotence, delayed local removal, guard rejection, protocol mutation, analyzer verification-before-parse, logical promotion, and fresh-clone preparation. No migration or inference was performed as part of this implementation.

Fail-early full-run audit hardening

Before any train-only Qwen proposal, full prompt, or full artifact existed, froze and implemented reports/preregistration_amendment_11.md. Scientific migration, smoke, and full now share one persistent nonblocking sibling .full.lock before frozen-data verification, smoke replay, proposal work, model construction, or artifact-root/catalog mutation. Its model-free preflight rejects local full JSONL, symlinks, unknown tree entries, malformed finals, partial Qwen ensembles, and stale exact bindings. The only valid full arm boundaries are the nine registered non-Qwen arms or all fifteen arms after the exactly eight-entry Qwen-ranked library and five matched Qwen controls exist.

Full resume is now two-pass: it validates every existing final in the active rung, including downstream arms, before generating any missing shard. Every cache hit and generation is checked against the current inference-critical protocol identity; Git commit/dirty remain audit provenance but package/lock, GPU/CUDA/Python/vLLM environment, model, runner, adapter, sampling, engine, termination-token, and RNG fields remain strict. Operational failures propagate without silently escalating the reasoning budget.

The schema-2 full catalog is inventory-first and exists before selection. It checkpoints startup reconciliation, each committed rename, selection updates, rejected rungs, and final selected or selected-null setup-inconclusive states. It binds exact bytes for config, complete hidden/probe tasks, post-proposal libraries, demonstrations, manifest/provenance, passed interface and smoke evidence, and all construction/scoring sources. Offline analysis verifies this graph and the registered contiguous-prefix selection proof before reading raw rows, then recomputes every selected arm's termination evidence before task scoring. Added adversarial model-free coverage for hidden-label mutation, selection-order/bound failures, duplicate invocation, stale/unknown/symlink state, two-pass zero-generation failure, operational-error non-escalation, and exact 9/15-arm geometry. No inference or scientific artifact was created or modified during this implementation.

The final orchestration audit also made local cleanup subset-safe and catalog recovery monotonic. An interrupted cleanup may resume when every remaining local bundle is byte-identical to a subset of the external inventory, including a preflight that has since completed externally. Under the shared lock, a stale catalog may reconcile only an existing preflight-only entry advancing to an exact receipt-valid completion with unchanged protocol/source and preflight bytes. New bundles, modified files, partial rows/metadata, source drift, or selection-semantic drift still fail closed.

Scientific cache migration and amendment replay

After the old process exited, removed one byte-identical notebook checkpoint and migrated the complete base@16k/base@32k bundles plus the genuine designed@16k preflight-only state through the model-free two-pass path. The canonical external tree initially contained 9 files and 92,301,251 bytes with tree SHA-256 fdba92ffc046c7710e72bb6a772f253c7c5a059027a4110f49018e00a189b38d. Both row hashes matched their source audits (f4d243db... at 16k and 6f3c6036... at 32k), both receipts reverified, and the second pass removed the entire local runs/smoke_tiers/ namespace.

The amendment-7/9 replay then rejected complete base@32,768 from content-blind finish/count metadata plus the preregistered token-ID periodicity test. All 144 samples used the full reasoning allowance and required forced intervention; there were no earlier-close answer restarts. Eighty-one tails were exact periodic loops, 63 contacts remained unresolved (43.75%), and 37 fresh answers hit the 512-token limit (25.69%). The arm sampled 4,739,527 tokens in 5,971.182 seconds (793.73 tokens/s). Base alone irreversibly rejected the rung, so designed@32k was never generated or inspected. No decoded output, parser result, task score, hidden grade, or oracle field informed the decision.

The frozen amendment-6 branch therefore started the all-12-record, non-scored K=4 base probe at think@49,152 through vLLM. Probe rows are receipt-bound outside the matrix namespace and are ineligible for selection, scoring, promotion, or prefix pooling. Its termination result remains in progress; a probe pass would authorize a fresh K=12 base/designed matrix at 49,152, while a probe failure would advance only the same termination-only probe to 61,440.

Pre-result capacity-fit scheduler branch

While the max-seqs-64 K=4 base probe at think@49,152 was still inside vLLM and before its receipt or termination result existed, froze reports/preregistration_amendment_12.md. Engine-start evidence had already measured 995,328 KV-cache tokens, and the installed vLLM scheduler source confirms that decode-time cache exhaustion preempts a request by freeing its blocks and resetting its computed prefix to zero when prefix caching is disabled. The registered long-rung sequence envelopes admit only 19 concurrent sequences at 49k and 15 at 61k; max-seqs 64 therefore permits avoidable full recomputation.

Armed a receipt watcher that stops the current process group only after the 49k probe commits its last-written receipt. The completed max-seqs-64 probe will remain verbatim but is now irrevocably a non-scored, non-selectable scheduler_overcommitted diagnostic. It cannot authorize a matrix or a 61k call. Fresh capacity-fit selection moves to the independent qwen35_4b_verified_macro_capacity_fit_rerun, with max-seqs 19 at 49k and 15 at 61k, a new external namespace, and fresh K=4 rows before any same-protocol K=12 base/designed matrix. No active probe token, decoded output, parser result, or score informed this branch.

Scheduler-overcommitted 49k diagnostic completion

The receipt watcher stopped the old process group immediately after the max-seqs-64 K=4 probe at think@49,152 committed its last-written receipt, before it could validate/advance into another model call. Model-free catalog reconciliation verified the complete 13-file external tree at 123,389,281 bytes and SHA-256 add7cc9ef14f1a47b9cd23fd645cfbf65cbe1347c3e5dd2130d82c9a70d79612.

Content-blind replay found 48/48 stage-1 length finishes, forced interventions, and reasoning-boundary contacts; 34 were exact periodic loops, 14 remained unresolved, and 13 stage-2 answers reached 512 tokens. The call sampled 2,366,620 tokens in 4,035.356 seconds (586.47 tokens/s), continuing the throughput decline from 1,118 tok/s at 16k and 794 tok/s at 32k. It failed all three termination gates, but its eligibility had already been revoked before the receipt: with block size 528, 48 admitted worst-case contexts require 2,433,024 cache tokens against the measured 995,328-token cache, and vLLM recomputes evicted prefixes when prefix caching is off.

No decoded output, parser status, visible/hidden score, or candidate correctness was inspected. The reconciled receipt remains external and the compact audit is analysis/scientific_smoke_49k_scheduler_overcommit_audit.json. After verification, the stopped old engine was terminated and released the GPU; no 61k/max-seqs-64 call or K=12 matrix began.

Reproduce

Smoke test

.venv-vllm/bin/python experiments/qwen35_4b_verified_macro_long_context_rerun/scripts/run.py --smoke

Full run

.venv-vllm/bin/python experiments/qwen35_4b_verified_macro_long_context_rerun/scripts/run.py --full

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

Browse the experiment folder on GitHub ↗