#devchallenge #hf26challenge Slow & Steady

LazyDecider

How an open-weight agent fine-tuned a decision model for me β€” proposing configs, pruning the losers, keeping only winners β€” while I slept.

πŸ¦₯ Gemma 4 E4B proposes β†’ βœ‚οΈ ASHA prunes β†’ βœ… keep / β†©οΈŽ revert β†’ πŸ”¬ Tinker confirms

Local Β· open weights Β· sealed test Β· ~$0 on a laptop

The ten-minute job I refused to do again

Hyperparameter babysitting:

  • change the learning rate β†’ kick off a run β†’ stare at the loss curve
  • change the LoRA rank β†’ repeat β†’ fall asleep at the desk

So I automated it. The search runs overnight, for free, on my own laptop. I wake up and read a report.

The task β€” typed decisions

A model reads a case and makes a calibrated accounts-payable style call across 4 domains, scored against a teacher consensus (gold).

DomainCasesWhat the model decides
invoice_processing100approve / review an invoice vs its PO
customer_service100route / escalate a ticket
security_incidents100triage severity & response
agent_trace_observability100flag anomalous agent traces

Metric that matters: KL from gold (distribution match), not just top-1 accuracy.

The model we fine-tune

  • Base: Qwen3.5-0.8B (open weights)
  • + Clef joint-decision head β€” emits a probability over all decisions
  • Trained with Unsloth, LoRA on an 18 GB Mac (MLX)
  • Two knobs the agent plays with:
  • head-only vs unfreeze backbone (LoRA)
  • LoRA rank/alpha, LR, label smoothing, weight decay, dropout, epochs

The overnight loop

πŸ¦₯
Gemma 4 E4B
reads the log, proposes
1 config + 1-line reason
β†’
βœ‚οΈ
ASHA pruner
trains it, kills it early
if it's losing
β†’
βš–οΈ
keep / revert
kept only if it beats
best on frozen split
β†’
πŸ”¬
Tinker
bigger model, same
sealed test = referee

Gemma only ever sees fit / select / calib β€” never the sealed test.

Why ASHA β€” don't waste the night on losers

Asynchronous Successive Halving: evaluate at rungs, prune the bottom performers early, let the promising runs train longer.

Rung (step)What happens
20first checkpoint β€” obvious failures killed here
60bottom percentile pruned
140survivors continue
240full run β€” only the best reach here

A bad config costs minutes, not the whole night.

What Gemma actually tried β€” verbatim from the log

#backboneLRLoRA r/Ξ±smoothwdepselect lossselect acc
1frozen1e-416/320.000.0121.0410.523βœ… keep
2unfrozen2e-416/320.000.0120.8400.782βœ… keep
3unfrozen1.5e-416/320.060.0520.8420.787β†©οΈŽ revert
4unfrozen1e-416/320.080.0510.8840.767β†©οΈŽ revert
5unfrozen8e-58/160.030.0820.8570.767β†©οΈŽ revert

These are select-split scores measured during the search (what Gemma optimizes). Run 3 had marginally higher accuracy but higher select loss than run 2 β†’ not kept. The headline 0.770 on later slides is the winner’s accuracy on the sealed test β€” a different, unseen split.

Run 2 β€” the night's one big move

β€œEnable LoRA fine-tuning on the backbone to see if adapted encoder representations improve beyond the head-only baseline.”— Gemma, run 2 (kept)
1.04 β†’ 0.84
select loss drop
+0.26
accuracy jump (0.52 β†’ 0.78)

Unfreezing the backbone with LoRA was the single biggest gain β€” and the agent found it on its own, then spent runs 3–5 chasing calibration and reverting each one.

ASHA select-loss, per config

ASHA select-loss curves per Gemma-proposed config

Run 2 (unfrozen LoRA) separates from the pack by rung 140 and holds the lead.

The β€œcan’t cheat” part

Early on, the loop found a β€œwinner” suspiciously fast β€” a too-small validation subsample let a lucky run look great. The agent wasn’t cheating; it was optimizing the number I gave it.

  • πŸ”’ Sealed test β€” only its SHA-256 is committed; the worker can’t read the cases
  • πŸ“ Scorer copies the dataset’s grading arithmetic verbatim
  • πŸ’Έ Worker strips TINKER_* from env β€” the free local loop can’t spend a cent
  • 🧊 Every finalist’s config is committed to git before its one-shot sealed read

Sealed-test results

ModelRoleAcc ↑KL ↓Brier ↓ECE ↓
Prior / Uniformreference0.470β€”β€”β€”
Zero-shot baseno training0.483β€”β€”β€”
Tinker 4Bcloud referee0.6010.6420.1720.094
LazyDecider 0.8Bthe winner0.7700.0940.0510.145

A 0.8B model, found autonomously, lands KL 0.094 β€” the metric this benchmark optimizes β€” for ~$0 on an 18 GB Mac.

Per-domain β€” strongest on invoices

DomainAcc ↑KL ↓Brier ↓ECE ↓
invoice_processing0.8400.0930.0450.114
customer_service0.7960.1150.0590.162
security_incidents0.7380.0740.0430.163
agent_trace_observability0.7060.0940.0560.156
Overall (400)0.7700.0940.0510.145

Best accuracy on invoices (0.840); best-calibrated on security incidents (KL 0.074).

Tinker β€” the independent referee

A different model (Qwen3.5-4B LoRA), different hardware (cloud), same sealed test β€” does the recipe transfer?

0.601
Tinker 4B accuracy
0.483
zero-shot baseline
$2 / $10
hard-capped spend

A clear lift over zero-shot on the same ruler = the pipeline isn’t fooling itself.

Why open innovation matters here

  • πŸ¦₯ Agent + model are both open weights β†’ hundreds of reasoning calls a night cost $0
  • πŸ”“ The model is yours β†’ run it offline, push the adapter to HF, fork the recipe
  • πŸ” Guardrails are auditable β†’ β€œcan’t cheat” is only credible when anyone can read the sealing logic

A closed API couldn’t give me all three: free overnight reasoning, full ownership, and verifiable integrity.

The lazy payoff

I wake up, open REPORT.md, read what Gemma tried and why, run one command to retrain the winner β€” and Tinker confirms it. I never babysit a sweep again.

Open agent Β· open model Β· sealed test Β· built on a laptop, while asleep.