Install any skill in seconds. Free to start, no credit card required.
Get Started Free →The compile-readiness gate for prompt auto-optimization. Decide whether you have earned the right to run an optimizer (DSPy MIPROv2 / GEPA / BootstrapFewShot) before spending compute. Two preconditions only — a real metric, and enough examples for the optimizer you picked. Garbage metric in, garbage prompt out. Pick the optimizer by data scale; GEPA inverts the scale assumption (~10 examples + textual feedback).
.claude/skills/agentsope-agentsop-prompt-compilation/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 96% | 47 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 170% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 782% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 262% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 251% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 773% | 0% |
> "It's unproductive to launch optimization runs using a poorly designed program or a bad metric." > — DSPy core team dspy.ai/learn/optimization/overview/]
> "Compile when you can measure. The optimizer maximizes your metric — garbage metric in, garbage prompt out." > — this skill's operating principle (synthesized from the line above + DSPy Case C)
This is an enhancement-overlay decision skill. It answers exactly one question the broad [[dspy]] library skill buries under API surface: have you earned the right to run an optimizer yet, and which one? It produces a go / no-go gate plus an optimizer pick. It defers every implementation detail — Signature syntax, module choice, compile() calls, save/deploy — to [[dspy]] and the full workflow in [[agentsop-dspy]]. It defers metric construction to [[agentsop-metric-design]]; this skill only checks the metric exists and is validated, then uses it as the gate.
The trap it removes: people reach for MIPROv2(auto="heavy") because the API is right there, before they have a metric worth maximizing or enough data to avoid memorization. Compilation is a hyperparameter search costing hundreds-to-thousands of LM calls ($2–$40+, minutes-to-hours) dspy.ai/faqs/]. Spending that on an un-validated metric or 8 examples is pure waste.
Activate when all three of these are plausibly true (the gate then confirms them):
of obvious returns. Symptom from [[agentsop-dspy]] §1: "the team manually tunes few-shot examples; a metric exists but isn't being used to drive prompt design."
metric(example, pred) -> bool|float — or one can be writtenand human-validated. Without this, do not activate; the optimizer has nothing to maximize.
Concrete triggers in intent or codebase:
| Trigger | Signal | |---|---| | Spend intent | "auto-tune this prompt", "should I run MIPRO?", "is it worth compiling?", "GEPA vs MIPROv2", "optimize prompts for our metric" | | API reach | MIPROv2(, BootstrapFewShot(, dspy.GEPA(, teleprompter, optimizer.compile( about to be called | | Symptom | hand-tuned prompt stuck; few-shot examples curated by hand; metric written but only used for reporting, not optimization |
Do NOT activate when:
dspy.ai/learn/optimization/overview/]; otherwise you pay compile cost for prompts you'll throw away.
[[agentsop-metric-design]] first; if the user refuses any success criterion, the gate stays closed.
[[agentsop-dspy]] Stage 1 andthe signature-design overlay. Promoting prose to a typed Signature and compiling it are two different gates.
An optimizer (MIPROv2, GEPA, BootstrapFewShot) is a black-box search over prompt instructions + few-shot demos that maximizes metric(pred, example). It has no taste. It will faithfully chase whatever the metric rewards, biases and all. From [[agentsop-dspy]] Case C: "DSPy will optimize toward whatever the metric rewards. A bad metric becomes a bad program at scale." Two corollaries make this a gate, not a step:
(b) agree with human judgment on ≥20 spot-checks. An un-validated metric means the expensive search optimizes the metric's blind spot. This is non-negotiable dspy.ai/learn/evaluation/metrics/; Case C]. Construction is [[agentsop-metric-design]]'s job; this skill only checks the receipt.
are memorizing. The DSPy 20/80 train/val split exists because "prompt-based optimizers often overfit to small training sets" dspy.ai/learn/optimization/overview/]. The floor differs per optimizer (§4.2).
┌──────────────────────────────────────────────┐
Gate 1 │ METRIC: exists? AND human-validated ≥20? │ ── No ─► STOP. Build/validate metric ([[agentsop-metric-design]]).
(measure) └──────────────────────────────────────────────┘
│ Yes
▼
┌──────────────────────────────────────────────┐
Gate 2 │ EXAMPLES: ≥ floor for the optimizer I want? │ ── No ─► Pick a lower-floor optimizer, collect data,
(data) └──────────────────────────────────────────────┘ or STOP (use LabeledFewShot as a floor).
│ Yes
▼
COMPILE (cheap probe first: auto="light")Compilation runs hundreds-to-thousands of LM calls. Reference run: ~3.2k API calls, $2–$3, 6–20 min for auto="light"; auto="heavy" on 1000+ examples can hit tens of dollars and hours dspy.ai/faqs/]. Cost scales with num_trials × |trainset| × |program LM calls|. The gate's entire job is to stop you spending that on a metric or dataset that cannot pay it back.
0. Confirm activation (§1): plateaued hand-tuning + metric + examples.
1. GATE 1 — metric exists AND validated ≥20 human spot-checks? [hard]
2. GATE 2 — example count ≥ floor for the chosen optimizer? [hard]
3. PICK — choose optimizer by data scale + feedback signal. (§4.2)
4. BUDGET — estimate cost; cap it; choose a cheap optimizer LM.
5. PROBE — run auto="light" (or smallest config) as a signal.
6. DECIDE — gain ≥ threshold → escalate; else go back, don't escalate.metric(example, pred, trace=None) -> bool|float? If not → STOP, route to [[agentsop-metric-design]].STOP and validate first. "Never compile against a metric you haven't human-validated on ≥20 spot-checks" [[agentsop-dspy]] Case C; dspy.ai/learn/evaluation/metrics/].
optimizer will chase those biases — decompose it ([[agentsop-metric-design]]) before compiling arxiv.org/pdf/2506.02592].
Exit: a validated metric callable + a calibration receipt. Otherwise the gate is closed; do not proceed.
Count labeled examples. The DSPy-documented thresholds: ≥30 = minimum useful, ~300 = recommended, 200+ required for MIPROv2 to avoid overfitting dspy.ai/learn/optimization/overview/]. The floor is per optimizer:
< 10 → only LabeledFewShot(k=8) (no search, weakest) — usually means STOP, collect data.~10+ with textual feedback → GEPA is legal and sample-efficient (this inverts the usual "more data" rule).~30–50 → BootstrapFewShot / BootstrapFewShotWithRandomSearch.200+ → MIPROv2.Exit: the example count clears the floor of the optimizer you intend to run. If not, either drop to a lower-floor optimizer or stop.
Use the table in §4.2. The single most important branch: do you have textual error feedback (test diffs, schema violations, judge rationales like "answer was verbose")? If yes, GEPA needs only ~10 examples and converges faster because it reflects on the text of the feedback, not just a scalar dspy.ai/tutorials/gepa_ai_program/; arxiv.org/abs/2507.19457]. If no, fall back to the data-scale ladder.
Estimate before launching (§4.4). Cap spend. Use a cheap optimizer LM (e.g. gpt-4o-mini) even when the task LM is expensive — community-reported parity at a fraction of cost github.com/stanfordnlp/dspy/issues/1596]. Set dspy.configure(track_usage=True) to log actual spend.
Run auto="light" (MIPROv2) or the smallest config first. Docs: "start with moderate values, observe behavior, and scale up only if you see clear gains" github.com/stanfordnlp/dspy/issues/1596]. Never start at auto="heavy".
light gives <2% lift → do not escalate. The bottleneck is the program/metric, not the optimizer. Loopback to [[agentsop-dspy]] Stage 1 (signature ambiguous? wrong decomposition?) dspy.ai/learn/optimization/overview/].
light gives 2–10% lift → escalate to medium; go to heavy only if data ≥300 and you have a held-outtest set distinct from val.
compile().compile-ready | not-ready + the failing gate.[[agentsop-dspy]] Case C, §3 three-stage gate.metric(example, pred, trace=None) -> bool|float exists. If absent → route to [[agentsop-metric-design]], gate stays closed.validated flag + receipt reference.[[agentsop-dspy]] Case C step 4; dspy.ai/learn/evaluation/metrics/]; arxiv.org/pdf/2506.02592].cleared | below-floor + the legal optimizer set.num_trials × |trainset| × calls; cap spend; set a cheap optimizer LM; enable track_usage=True.auto="light" (or smallest config) first. Never start at heavy.[[agentsop-dspy]] Case A.medium. heavy only if data ≥300 + held-out test set. Confirm gain on held-out test.[[agentsop-dspy]] Case A; dspy.ai/learn/optimization/overview/].| Examples | Feedback signal | Optimizer | Why / floor | |---|---|---|---| | <10 | any | LabeledFewShot(k=8) | No search; weakest. Usually means STOP and collect data. dspy.ai/cheatsheet/] | | ~10+ | textual (diffs, schema violations, judge rationales) | dspy.GEPA(metric=m_with_feedback) | Inverts the data-scale rule — reflection on text feedback is sample-efficient. arxiv.org/abs/2507.19457] | | ~30–50 | scalar | BootstrapFewShot / …WithRandomSearch | Self-bootstrapped demos; minimum useful regime. dspy.ai/learn/optimization/optimizers/] | | 200+ | scalar | MIPROv2(metric=m, auto="light") then escalate | Joint instruction + demo Bayesian search; 200 is the documented floor. dspy.ai/api/optimizers/MIPROv2/] | | any (post-MIPRO, ship smaller model) | — | chain BootstrapFinetune(student=small, teacher=optimized) | Distills prompts into weights. dspy.ai/api/optimizers/BootstrapFinetune/] |
GATE 1 — MEASURE
[ ] metric(example, pred, trace=None) -> bool|float exists
[ ] validated vs human: >=20 spot-checks (>=30 open-ended), >=80% agreement
[ ] receipt saved {n_spot_checks, agreement, judge_model, task_model, date}
[ ] NOT a lone holistic LLM-judge (else decompose via [[agentsop-metric-design]] first)
GATE 2 — DATA
[ ] labeled examples counted: N = ____
[ ] N clears the floor of the optimizer chosen below
[ ] (prompt-based optimizers) 20/80 train/val split planned; GEPA uses standard split
PICK + BUDGET
[ ] optimizer chosen by §4.2 (GEPA if textual feedback)
[ ] cost ceiling set; cheap optimizer LM chosen; track_usage=True
[ ] plan: probe auto="light" first, escalate only on >=2% lift, confirm on held-out test| Config | Rough cost | Use when | |---|---|---| | LabeledFewShot / BootstrapFewShot | cents–~$1 | Floor; ≤50 examples | | MIPROv2(auto="light") | ~$2–3, 6–20 min, ~3.2k calls | First probe, always | | MIPROv2(auto="medium") | single–low-tens of $ | Light showed ≥2% lift | | MIPROv2(auto="heavy") | tens of $, hours | Only if data ≥300 + held-out test + budget | | GEPA (~10+ examples) | low, sample-efficient | Textual feedback available |
Source: dspy.ai/faqs/]; github.com/stanfordnlp/dspy/issues/1596]; arxiv.org/abs/2507.19457].
困境: A 3-stage RAG pipeline already hits 72% on dev after manual prompt tuning. MIPROv2(auto="heavy") would cost ~$40 and 4 hours. Worth it? (Adapted from [[agentsop-dspy]] Case A.)
约束:
决策步骤:
auto="light" (~$2) often yields large lifts over hand-tuned baselines (paper reports 25%/65% over standard few-shot) arxiv.org/abs/2310.03714] — the metric was never actually driving design.
light (~$2), never heavy (OP-7). It is a cheap signal for whether more compute helps.heavy. Return to program/metric: signature ambiguous? is 3-stage the rightdecomposition? (OP-8) github.com/stanfordnlp/dspy/issues/1596].
medium; heavy only if data ≥300 + a held-out test set distinct from val.结果: The $40 heavy run is almost never the right first move. The $2 probe tells you whether to spend more or to go fix the program. Often the answer is "fix the program/metric first."
可提取的操作: OP-1, OP-6 CostBudgetGuard, OP-7 CheapProbeFirst, OP-8 EscalateOrReturn. Lesson: never open at heavy. Probe light with a cheap optimizer LM, and treat <2% as a signal to fix the program, not to add compute.
困境: A code-fix agent has just 12 labeled examples, but each failing run produces rich textual feedback: the failing test diff, a schema-violation message, a linter error. The data-scale ladder says 12 < 30 → "STOP, collect data, you can't optimize." Is that right?
约束:
决策步骤:
feedback string. Validate it (the test isground truth; spot-check the feedback strings are accurate). Pass.
legal. GEPA needs only ~10 examples because it reflects on the content of the feedback, not a scalar gradient dspy.ai/tutorials/gepa_ai_program/; arxiv.org/abs/2507.19457]. 12 ≥ ~10 → GEPA is legal.
dspy.Prediction(score=..., feedback="failing assert: expected X got Y") from themetric; this is GEPA's superpower dspy.ai/api/optimizers/GEPA/overview/].
结果: A dataset that is far too small for MIPROv2/Bootstrap is sufficient for GEPA. The "you need 200 examples" intuition is specific to scalar-feedback optimizers; textual feedback buys an order-of-magnitude in sample efficiency. GEPA reported beating MIPROv2 by 10–13% on benchmarks while being more sample-efficient arxiv.org/abs/2507.19457].
可提取的操作: OP-4 ExampleFloorCheck, OP-5 OptimizerByDataScale. Lesson: the example floor is per-optimizer. If you can express why an output failed as text, GEPA inverts the data-scale assumption — ~10 examples suffice. Do not reflexively gate out small datasets that carry rich feedback.
| # | Anti-pattern | Why it's wrong | Fix | |---|---|---|---| | AP-1 | Compiling without a metric | The optimizer has nothing to maximize; DSPy degenerates to verbose prompting | Refuse the compile; build a metric (OP-2, [[agentsop-metric-design]]) | | AP-2 | Compiling against an un-validated single LLM-judge | The search faithfully chases the judge's length / self-preference / position bias arxiv.org/pdf/2506.02592] | Validate ≥20 spot-checks; decompose the judge (OP-3) | | AP-3 | Compiling on <10 examples (scalar feedback) | Below the floor you memorize, not train; "prompt-based optimizers overfit small sets" dspy.ai/learn/optimization/overview/] | Collect data, or use LabeledFewShot as a floor — or GEPA if textual feedback (OP-4) | | AP-4 | Starting at auto="heavy" | Tens of $ / hours before you know if compute even helps | Probe auto="light" first (OP-7) | | AP-5 | Escalating after a <2% probe lift | The bottleneck is the program/metric; more compute won't fix it | Return to [[agentsop-dspy]] Stage 1 (OP-8) | | AP-6 | Using the expensive task LM as the optimizer LM | Multiplies trial-scale cost for no documented gain | Cheap optimizer LM (gpt-4o-mini) (OP-6) | | AP-7 | Applying the scalar data-floor to a feedback-rich task | Wrongly gates out GEPA-legal small datasets | Check for textual feedback before counting examples (OP-5) | | AP-8 | Reporting the gain on the val set used in optimization | Overfit signal; not a real held-out improvement | Confirm on a held-out test set distinct from val (OP-8) | | AP-9 | Compiling while the Signature/I-O contract is still churning | You pay compile cost for prompts you'll throw away | Stabilize the contract first (signature-design / [[agentsop-dspy]] §1) |
definition first ([[agentsop-metric-design]], then scientific-critical-thinking).
promote gate (`signature-design` / `[[agentsop-dspy]]` Stage 1), a different decision from compile.
compile() args, save/deploy: that is [[dspy]] and[[agentsop-dspy]], not this overlay.
[[agentsop-metric-design]].This skill only checks the receipt exists.
readiness logic (metric + data floor) still applies but the operators differ (§7).
The readiness gate (metric + data floor) is framework-agnostic; the operators differ.
| Concept | DSPy optimizers | Manual few-shot tuning | OpenAI fine-tuning | |---|---|---|---| | What is optimized | prompt instructions + demos (and optionally weights via BootstrapFinetune) | the prompt string, by hand | model weights | | Metric required? | Yes — metric(ex, pred) -> bool\|float drives the search | implicit / eyeballed (the failure mode) | a held-out eval set + loss; eval suite recommended | | Example floor | ~10 (GEPA+feedback) / ~30 (Bootstrap) / 200+ (MIPROv2) | none, but no guarantees | OpenAI guidance: ~50–100+ examples minimum, more is better | | Cost shape | num_trials × |trainset| × calls ($2–$40+) dspy.ai/faqs/] | human time | GPU/training-token cost + per-token inference savings | | Readiness gate (this skill) | both gates apply directly | Gate 1 is exactly what's missing — you're "tuning" with no validated metric | both gates apply; "metric validated" = your eval set is trustworthy | | When to prefer | metric + ≥10 examples + want a portable, recompilable artifact | one-shot, unstable contract, or audit-mandated verbatim prompts | task is stable, latency/cost matters at high volume, prompt optimization plateaued |
Decision summary: If you have a validated metric and examples clearing a floor, compile (DSPy). If you have a metric but it's never been validated, you are doing manual tuning dressed up — close Gate 1 first. If prompt optimization has plateaued and you have hundreds of stable examples and volume justifies it, consider fine-tuning (or BootstrapFinetune to distill an already-compiled program into a smaller model).
Combination patterns:
[[agentsop-metric-design]]: this skill's Gate 1 is satisfied by a [[agentsop-metric-design]]calibration receipt. No receipt → gate closed.
[[agentsop-dspy]]: this overlay is the sharpened version of [[agentsop-dspy]] §3 Stage 2→3transition (the "are you allowed to compile yet?" boundary). After the gate opens, hand off to [[agentsop-dspy]] for the full compile/save/deploy workflow.
[[dspy]]: [[dspy]] provides the optimizer APIs; this skill decides whether andwhich.
references/R1-source-evidence.md — every claim traced to the local dspy-sop skill and the upstream DSPy docs it cites; overlap check vs [[dspy]] and [[agentsop-metric-design]].intermediate/operation_candidates.json — the 8 operations + tables in machine-readable form.Citations: dspy.ai/learn/optimization/overview/], dspy.ai/learn/optimization/optimizers/], dspy.ai/api/optimizers/MIPROv2/], dspy.ai/api/optimizers/GEPA/overview/], dspy.ai/api/optimizers/BootstrapFinetune/], dspy.ai/learn/evaluation/metrics/], dspy.ai/faqs/], dspy.ai/cheatsheet/], dspy.ai/tutorials/gepa_ai_program/], arxiv.org/abs/2310.03714], arxiv.org/abs/2507.19457], arxiv.org/pdf/2506.02592], github.com/stanfordnlp/dspy/issues/1596]. Primary source: /Users/5imp1ex/Desktop/Skill-Workplace/output/dspy-sop-skill/SKILL.md.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 22,385 | 16,116 | -28% | 1 | 1 | 0% | 3,699 | 9,983 | +170% | 0 | 0 | — |
case-02 | fail→pass | 28,993 | 13,247 | -54% | 1 | 1 | 0% | 1,054 | 9,292 | +782% | 0 | 0 | — |
case-03 | pass→fail | 18,897 | 19,783 | +5% | 1 | 1 | 0% | 2,979 | 10,623 | +257% | 0 | 0 | — |
case-04 | fail→pass | 15,307 | 13,422 | -12% | 1 | 1 | 0% | 2,645 | 9,583 | +262% | 0 | 0 | — |
case-05 | pass→pass | 13,180 | 5,766 | -56% | 1 | 1 | 0% | 2,331 | 8,165 | +250% | 0 | 0 | — |
case-06 | pass→pass | 13,948 | 9,303 | -33% | 1 | 1 | 0% | 2,045 | 8,775 | +329% | 0 | 0 | — |
case-07 | pass→pass | 13,352 | 13,089 | -2% | 1 | 1 | 0% | 2,120 | 9,421 | +344% | 0 | 0 | — |
case-08 | fail→pass | 16,711 | 11,248 | -33% | 1 | 1 | 0% | 2,606 | 9,143 | +251% | 0 | 0 | — |
case-09 | fail→pass | 22,391 | 9,517 | -57% | 1 | 1 | 0% | 1,016 | 8,871 | +773% | 0 | 0 | — |
case-10 | fail→pass | 15,421 | 8,468 | -45% | 1 | 1 | 0% | 2,482 | 8,666 | +249% | 0 | 0 | — |
case-11 | pass→pass | 13,930 | 12,140 | -13% | 1 | 1 | 0% | 2,103 | 9,156 | +335% | 0 | 0 | — |
case-12 | pass→pass | 14,829 | 7,741 | -48% | 1 | 1 | 0% | 2,244 | 8,392 | +274% | 0 | 0 | — |
case-13 | fail→pass | 11,130 | 9,789 | -12% | 1 | 1 | 0% | 1,814 | 8,786 | +384% | 0 | 0 | — |
case-14 | pass→pass | 13,764 | 10,605 | -23% | 1 | 1 | 0% | 2,148 | 8,964 | +317% | 0 | 0 | — |
case-15 | pass→pass | 11,811 | 8,345 | -29% | 1 | 1 | 0% | 1,741 | 8,592 | +394% | 0 | 0 | — |
case-16 | pass→pass | 15,166 | 13,058 | -14% | 1 | 1 | 0% | 2,463 | 9,404 | +282% | 0 | 0 | — |
case-17 | fail→pass | 15,309 | 6,620 | -57% | 1 | 1 | 0% | 2,416 | 8,297 | +243% | 0 | 0 | — |
case-18 | fail→pass | 8,382 | 3,124 | -63% | 1 | 1 | 0% | 1,465 | 7,745 | +429% | 0 | 0 | — |
case-19 | pass→pass | 13,458 | 6,528 | -51% | 1 | 1 | 0% | 2,104 | 8,322 | +296% | 0 | 0 | — |
case-20 | fail→pass | 16,226 | 9,583 | -41% | 1 | 1 | 0% | 2,688 | 8,877 | +230% | 0 | 0 | — |
case-21 | pass→pass | 15,749 | 10,690 | -32% | 1 | 1 | 0% | 2,466 | 8,967 | +264% | 0 | 0 | — |
case-22 | fail→pass | 16,233 | 9,241 | -43% | 1 | 1 | 0% | 2,874 | 8,798 | +206% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 20 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.