cd ~/series/demystifying-ai
SkillOpt - Your Agent's Skills Are Trainable Parameters
EP 05 arXiv Jul 15, 2026 5 min

SkillOpt: Your Agent's Skills Are Trainable Parameters

Microsoft trained agent skills like neural network weights. +23 points on GPT-5.5 without changing a single model parameter.

Share:
// TL;DR

SkillOpt treats a plain-text skill file as the trainable parameter of a frozen agent. A separate optimizer model proposes bounded edits; only improvements survive. 52/52 evaluation cells: best or tied. GPT-5.5: +23.5 points. Deployed artifact: one readable markdown file. pip install skillopt.

# Train Skills Like Weights

NEURAL NETWORK
Forward pass
Run model on batch
Backward pass
Compute gradients
Learning rate
Bounds weight update
Validation
Early stopping on held-out set
Artifact
model.bin (opaque)
SKILLOPT
Rollout
Frozen agent runs tasks with current skill
Reflect
Optimizer reads trajectories, distills patterns
Edit budget
Bounds text edits (add/delete/replace)
Validation gate
Accept ONLY if held-out score strictly improves
Artifact
best_skill.md (~920 tokens, readable)
52/52
Cells Best or Tied
+23.5
GPT-5.5 (no weight changes)
~920
Tokens Median Skill

# The Loop

01
Rollout Frozen model runs 40 tasks with current skill
02
Reflect 16 workers reflect in minibatches of 8
03
Edit add/delete/replace clipped by edit budget (4, cosine decay)
04
Validate Accept only if held-out score strictly improves
Frozen target model

Executes tasks. Never changes. GPT-5.5 down to Qwen3.5-4B.

Separate optimizer model

Reads trajectories. Proposes bounded edits. Maintains rejected-edit buffer + meta skill.

EPOCH-WISE Slow update + meta skill

After each epoch, a slow update consolidates longer-horizon lessons that single batches can't reveal. A meta skill summarizes accepted/rejected patterns into optimizer-only guidance.

// Why each component matters

Removing the rejected-edit buffer lowers scores on all 3 ablation benchmarks. Removing both the meta skill and slow update drops SpreadsheetBench from 77.5 to 55.0.

# The Numbers

6 benchmarks · 7 models · 3 harnesses (direct chat, Codex, Claude Code)

GPT-5.5 Direct
58.8 →
82.3
+23.5
GPT-5.5 Codex
+24.8
points
GPT-5.5 Claude Code
+19.1
points
vs Oracle
+5.4
above best per-cell
SpreadsheetBench +38.9
41.8before
80.7after
OfficeQA +39.0 (1 edit)
33.1before
72.1after
LiveMathBench +29.3
37.6before
66.9after

TIER JUMP Small models + skill > larger models without

GPT-5.4-mini + skill 64.3
>
GPT-5.4 no skill 59.7
Qwen3.5-4B + skill 57.4
>
GPT-5.2 no skill 51.3
TRANSFER Skills work across harnesses

Spreadsheet skill trained in Codex, dropped into Claude Code with zero further optimization:

22.1 81.8
+59.7

Different tool surfaces. The skill captures general workflow logic, not harness-specific recipes.

# Try It

pip install skillopt

# Default hyperparameters
# epochs: 4, batch: 40, reflection minibatch: 8
# 16 analyst workers, textual_lr: 4 (cosine decay)

skillopt train \
  --model "gpt-5.4-mini" \
  --benchmark "your-eval-set" \
  --epochs 4 \
  --textual-lr 4 \
  --lr-schedule cosine

# Output
cat runs/best_skill.md    # ~920 tokens, human-readable
Readable Plain markdown, not opaque weights
1-4 Edits Median accepted edits in final skill
Zero Overhead No extra model calls at inference
// Bottom Line

Training does not have to mean model weights. The skill layer -- a plain markdown file -- is a stable, transferable, auditable adapter between frontier capability and real workloads. If you build agents on Codex or Claude Code, this is the closest thing to fine-tuning without fine-tuning.

NEXT EPISODE
Sat
#06Upcoming

Antidoom: One LoRA to Kill Your Model's Doom Loops

Liquid AI found the exact token that starts a repetition loop. One LoRA adapter, trained in hours, drops Qwen3.5-4B looping from 22.9% to 1%.

Enjoyed this?

New episodes Mon, Wed, Sat.