← TinyGPT · docs · devlog · roadmap · speedup
source: docs/DRILLDOWN.md · view on GitHub ↗

Drilldown — the experiments left untried, run to bedrock

Historical Pace planner drill. Keep this as learning/eval evidence, not as the active model-selection plan. Current TinyGPT factory work starts from PROJECT_STATUS.md, docs/NEXT.md, and docs/factory/.

Started 2026-06-11 after the “miner stopping 30 min before the diamond” check. Closed 2026-06-12 with the full table below.

Supersession note (2026-06-19): this remains the canonical unhappy-path drill, where Gemma-3-12B-it won the n=130 matrix. It is no longer the active general-planner decision. The later multi-turn/breadth work in docs/learn/tool-calling-frontier-parity.md plus docs/planner-lock-2026-06-19.md locks the general Pace planner to stock Qwen3-4B-Instruct-2507 bf16 with the plan-then-execute prompt.

What had been mined to bedrock as of session start

  1. 0.6B specialist training (v1–v11). Capacity ceiling — proven.
  2. Best-of-N test-time compute (BoN-8). Sampling more = more wrong w/ diversity.
  3. Prompt engineering for clarify (4 variants). Binary regime — no smooth interior.
  4. Small-corpus SFT on a strong base (clarify-v1, 38 rows on 4B). 47pp regression.

Final results — h2 + h2-ext combined, n=130

All scored with scripts/eval_pace_unhappy.py against grammars/pace-system-prompt-v11.txt, temperature 0, max_tokens 300.

ModelambigoosdestructiveNotes
Qwen3-4B-Instruct (ship floor)0/40 ( 0%)47/60 (78%)20/30 (67%)reference
Qwen3-14B8/40 (20%)43/60 (72%)7/30 (23%)gives back destructive
Apple FM (guided)1/40 ( 2%)57/60 (95%)11/30 (37%)refusal champ, can’t ask
clarify-v1 LoRA (4B + 38 rows)1/40 ( 2%)24/60 (40%)15/30 (50%)47pp interference
Pace v9-LoRA (0.6B)0/40 ( 0%)13/60 (22%)1/30 ( 3%)capacity wall
Pace v11-LoRA (0.6B)0/40 ( 0%)9/60 (15%)5/30 (17%)capacity wall
two-stage shim v10/40 ( 0%)34/60 (57%)21/30 (70%)rules detect but scorer rejects
two-stage shim v2 (topic fix)8/40 (20%)33/60 (55%)20/30 (67%)topic-aware questions, over-triggers a bit
Qwen3-4B-Thinking0/40 ( 0%)6/60 (10%)0/30 ( 0%)think trace consumes 300-tok cap
DeepSeek-R1-Distill-Qwen-7B0/40 ( 0%)2/60 ( 3%)0/30 ( 0%)same — thinking-model token wall
Llama-3.1-8B-Instruct1/40 ( 2%)17/60 (28%)20/30 (67%)over-compliant on OOS
Gemma-3-12B-it (qat-4bit)9/40 (22%)49/60 (82%)23/30 (77%)wins all three dims

Verdicts per diamond

  1. Reasoning-tuned models (Qwen3-4B-Thinking, DeepSeek-R1-7B). Drilled. Empty output at max_tokens=300 — the entire budget goes to the <think> trace. NOT a model-quality verdict; would need max_tokens≥1024 and a stop-on-</think> strategy to give them a fair shot. Parked — re-evaluate only if Gemma fails in production.

  2. Larger non-thinking bases. Drilled.

    • Llama-3.1-8B: worse than 4B on every dim.
    • Qwen3-14B: trades destructive for ambig.
    • Gemma-3-12B-it: wins on every dim. Drilled to bedrock.
  3. Rule-based ambiguity detector wrapper (two-stage v2). Drilled. Got real movement on ambig (0→20%) at small cost to oos (78→55). Rules over-intercept “click” / pronoun cases when the planner could have handled them. With Gemma’s 22% ambig zero-shot, the shim provides no additional lift on ambig and hurts the other dims — so don’t ship the shim on top of Gemma. It’s an option only if we end up shipping 4B-Instruct for footprint reasons.

  4. DPO on contrastive clarify pairs. NOT drilled. 149 pairs built (~/.cache/tinygpt/datasets/clarify-dpo-v1.jsonl), trainer not written. Given Gemma already clears the floor on every dim and DPO would target the 0.6B / 4B paths we now don’t ship, the ROI is gone. Parked unless Gemma proves unworkable in production (UX, latency, memory).

The recommendation

Pace ships on Gemma-3-12B-it (mlx-community/gemma-3-12b-it-qat-4bit, ~8 GB).

Reasons:

Update LocalPlannerModelIdentifier in Pace’s Info.plist from qwen3-4b-instruct-2507 to google/gemma-3-12b (LM Studio identifier).

Rerunning this on the next model that drops

One command (this is the productized form of this whole document):

scripts/eval_planner.sh <lm-studio-model-id>

JIT-loads the model, runs all three suites (n=130), prints the table vs the stored champion (evals/planner-champion.json) with a swap/no-swap verdict. ~30 min for a 12B on M5 Pro.

Challenger round — 2026-06-12 evening (first eval-planner outing)

Same-day test of the post-drill model generation, run via scripts/eval_planner.sh:

Challengerambigoosdestructiveverdict
Gemma-4-12B Unified (qat)blocked: LM Studio MLX engine lacks gemma4_unified (mlx-engine#301); no GGUF published. Weights on disk; re-try each LM Studio update
Qwen3.5-9B (no-think)18%97%63%champion stands, but 97% oos is best-in-matrix (beats Apple FM’s 95%), ~1.8s/turn, 6 GB
Qwen3.5-4B (no-think)15%55%70%loses all dims; ambig 15% vs old floor’s 0% shows gen-3.5 clarify emergence, but oos regressed hard

Qwen3.5 thinking trap (cost ~3 wasted hours): the small Qwen3.5 models think by default under LM Studio’s template with unbounded traces (>1024 tok on “open music”); content arrives empty and a naive eval scores a fake 0%. LM Studio’s REST layer silently drops chat_template_kwargs.enable_thinking (bug #1559). Working fix: assistant-prefill {"role":"assistant","content":"<think></think>\n"} — wired into the scorer as EVAL_NO_THINK=1. 25.5s/turn → 1.0s/turn.

Harness hardening earned along the way: EVAL_MAX_TOKENS env; fail-fast abort after 5 consecutive transport failures (dead endpoint ≠ 0% score); eval_planner clears its run dir and refuses to print a verdict from an aborted run. Operational rule, twice confirmed: never run lms commands while an eval is in flight — one server, one client.

What stays open