When an AI agent performs multi-step tasks (searching the web, using tools, filling spreadsheets), it follows a set of written instructions that guide its behavior. These instructions are called skills.
There are three common approaches:
| Method | Description | Problem |
|---|---|---|
| Human-written | Experts manually craft instructions | Slow, subjective, no feedback loop |
| One-shot LLM generation | A frontier model writes the skill once | No validation, no iteration |
| Loose self-revision | The agent rewrites its own skill after tasks | Uncontrolled, can quietly get worse |
They share the same fundamental flaw — they don't behave like a learning system. Specifically, they lack:
🔑 Key Insight: Skills tend to grow longer and drift with each rewrite. A revision that seems reasonable can quietly degrade real performance.
SkillOpt asks a fundamentally different question:
❌ Old question: "How do we write a better prompt?" ✅ New question: "How do we train the skill?"
In deep learning, a parameter is something the optimizer adjusts to improve performance (like neural network weights). SkillOpt borrows this idea but applies it to text instead of numbers.
Traditional deep learning:
Model weights → frozen or updated during training
SkillOpt:
Model weights → FROZEN (never touched)
Skill file → treated as the trainable parameter
🔑 Key Insight: You don't need to change the model to improve the agent. You optimize what sits outside the model — the skill layer.
SkillOpt mirrors the classic deep learning training loop, but everything happens in natural language.
Current Skill → Frozen Target Model → Executes batch of tasks → Trajectories (successes + failures)
Trajectories → Optimizer Model → Identifies patterns to KEEP and patterns to FIX
📌 Note: Two separate models are used — one to do the task, one to learn from it. This separation is intentional and important.
Optimizer → Proposes small edits (add / delete / replace) → Merges, deduplicates, ranks, clips
The optimizer proposes bounded text edits — small, specific changes:
| Edit Type | Meaning |
|---|---|
| Add | Insert a new instruction |
| Delete | Remove an unhelpful instruction |
| Replace | Swap one instruction for a better one |
A textual learning rate (edit budget) limits how much can change per step — analogous to a learning rate in gradient descent.
🔑 Key Insight: Small, controlled edits prevent the skill from drifting wildly — the same way a small learning rate prevents unstable training in neural networks.
After edits are proposed, they must pass a strict validation gate:
Candidate skill → Tested on held-out validation split
↓
Scores HIGHER than current skill?
↙ YES ↘ NO
Adopted ✅ Rejected ❌
This is equivalent to early stopping or model selection in traditional machine learning — you only keep a version if it's provably better.
They are not thrown away. They enter a rejected-edit buffer — a memory of what didn't work. This buffer is fed back to the optimizer as negative feedback in later calls during the same epoch.
Rejected edit → Rejected-edit buffer → "Don't try this again" signal to optimizer
🔑 Key Insight: Learning from failures is just as important as learning from successes. The rejected-edit buffer is SkillOpt's equivalent of negative gradient signal.
SkillOpt operates on two timescales, similar to fast and slow learning in cognitive science:
| Update Type | Frequency | Purpose |
|---|---|---|
| Fast update | Every batch | Captures immediate, local lessons |
| Slow/meta update | Every epoch | Consolidates longer-horizon patterns |
Some lessons only become visible after many batches. A single batch might not reveal a systematic weakness. The epoch-wise meta update looks at the big picture — patterns that span the entire training epoch.
Batch 1 → fast update
Batch 2 → fast update
Batch 3 → fast update
...
End of Epoch → slow/meta update (consolidates what batches couldn't see)
🔑 Key Insight: This two-speed system mirrors how humans learn — quick adjustments in the moment, deeper reflection over time.
The output is a file called best_skill.md — a plain Markdown file.
Key properties:
| Property | Detail |
|---|---|
| Size | ~920 tokens median (compact, not bloated) |
| Accepted edits | Only 1–4 edits make it into the final file |
| Readability | Reads like advice from a seasoned practitioner |
| Reversibility | Can be versioned, audited, or rolled back |
OfficeQA benchmark: +39.0 point improvement from a single accepted edit
This shows that the validation gate is doing real work — most proposals are rejected, and only genuinely useful changes survive.
If a skill only works for the exact model and environment it was trained on, it's not very useful. SkillOpt skills are designed to capture general workflow logic, not benchmark-specific tricks.
1. Cross-model scale:
Skill trained on GPT-5.4 → applied to GPT-5.4-mini → still improves performance
2. Cross-harness:
Skill trained in Codex → dropped into Claude Code → +59.7 point improvement
(vs. +58.3 from training directly in Claude Code)
3. Cross-task:
Skill trained on one math benchmark → transferred to a related math benchmark
SkillOpt narrows the gap between small and large models:
GPT-5.4-mini + optimized skill (64.3) > GPT-5.4 with no skill (59.7)
Qwen3.5-4B + optimized skill > GPT-5.2 with no skill
🔑 Key Insight: An optimized skill file can substitute for a larger model — without any additional inference cost.
Here is the complete SkillOpt picture:
┌─────────────────────────────────────────────────────┐
│ SKILLOPT LOOP │
│ │
│ Current Skill │
│ ↓ │
│ [FORWARD] Frozen model runs tasks → trajectories │
│ ↓ │
│ [BACKWARD] Optimizer reflects on successes/fails │
│ ↓ │
│ [UPDATE] Propose bounded edits (add/delete/replace)│
│ ↓ │
│ [GATE] Validate on held-out split │
│ ↙ pass ↘ fail │
│ Accept edit ✅ Rejected-edit buffer ❌ │
│ ↓ │
│ [SLOW UPDATE] Epoch-wise meta consolidation │
│ ↓ │
│ best_skill.md → compact, readable, transferable │
└─────────────────────────────────────────────────────┘
| Deep Learning Concept | SkillOpt Equivalent |
|---|---|
| Model weights | Skill file (text) |
| Learning rate | Textual edit budget |
| Validation split | Held-out task set |
| Negative gradient signal | Rejected-edit buffer |
| Learning rate schedule | Fast + slow update cadence |
🎯 The Big Takeaway: Training doesn't have to mean updating model weights. Procedural knowledge outside the model — written as natural language — can also be systematically optimized, validated, and transferred.