Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use before implementing, scaffolding, prototyping, or adding a feature when the work should start with the smallest useful code path, avoid speculative architecture, or prevent overbuilding before reduce would be needed.
.claude/skills/escoffier-labs-demi/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 43% | 0% |
A demi-glace starts concentrated. Nothing extra goes in just because the kitchen has it nearby. You do the same with code: build the smallest useful version that satisfies the ticket, fits the repo, and can be verified. Complexity has to earn its way into the pan.
Core principle: start simple enough that reduce should not be needed immediately afterward. Small means understandable and verifiable, not cramped. The shortest version that hides intent is not demi; it is just dense.
Before writing custom code, stop at the first rung that holds:
The ladder is quick. Do not turn it into a research project. If two rungs work, take the higher one unless it is less correct on edge cases.
Run this before editing:
Before adding a new layer, answer these. If any answer is no, keep it local.
Prefer these moves:
Do not build these unless the current task proves they are needed:
demi is not permission to be careless. Never simplify away:
A simple implementation without a check is not finished. Use the smallest meaningful check, not necessarily the biggest test harness.
If the small version has a known ceiling, name it in the plan or final report. Add an inline comment only when future maintainers would otherwise mistake the simplification for ignorance.
Examples:
Global lock is fine for single-user CLI; move to per-account locks if concurrent accounts matter.Linear scan is fine below the current file sizes; index when measured input size makes it hot.Native date input is enough here; custom picker only if design or browser support requirements change.For non-trivial work, write this before editing:
markdown## demi: <task> Actual ask: <one sentence> Smallest useful slice: <what will work when done> Highest rung that holds: existing behavior | repo primitive | stdlib | platform | installed dependency | local change | custom code Existing pattern to follow: <file/helper/test/component> Cut from scope: <what is intentionally not being built> Growth trigger: <what would justify expanding later> Verification: <command/check/user-visible proof>
Keep it short. This is a guardrail, not a design doc.
demi is apply-by-default. After the quick pass, implement the smallest slice unless the task is architectural, public-interface-heavy, security-sensitive, under-specified in a way that changes the outcome, or the user explicitly asks for options first. In those cases, report the demi plan and wait.
For large work, combine with recipe: use demi to keep each recipe task small, vertical, and verifiable.
| Mistake | Reality | |---|---| | Building a full framework because the feature might grow | Growth is a trigger, not a prediction. Ship the slice. | | Adding config before there are real variants | One value can be code. Two may still be code. Three starts a conversation. | | Creating a generic utility from one use | That is not reuse, it is disguise. Keep it local. | | Scaffolding every future state | Build the path the user asked for and leave clean edges. | | Calling fewer files "less complex" | A thousand-line god file is not demi. Small means understandable, not cramped. | | Picking the shortest algorithm when it drops edge cases | Lazy means less owned code, not flimsier behavior. Correctness wins ties. | | Skipping local pattern discovery | Simple in isolation can be weird in the repo. Match the kitchen. | | Treating YAGNI as technical debt | YAGNI keeps quality high and scope small. Skimping leaves a mess for later. |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-21 | pass→pass | 11,700 | 6,696 | -43% | 1 | 1 | 0% | 1,962 | 2,944 | +50% | 0 | 0 | — |
case-05 | pass→pass | 22,018 | 21,247 | -4% | 1 | 1 | 0% | 4,876 | 6,522 | +34% | 0 | 0 | — |
case-04 | pass→pass | 17,408 | 17,259 | -1% | 1 | 1 | 0% | 3,020 | 4,656 | +54% | 0 | 0 | — |
case-01 | fail→pass | 6,470 | 4,628 | -28% | 1 | 1 | 0% | 1,220 | 2,647 | +117% | 0 | 0 | — |
case-02 | fail→fail | 11,934 | 6,496 | -46% | 1 | 1 | 0% | 2,305 | 2,048 | -11% | 0 | 0 | — |
case-03 | fail→fail | 6,986 | 10,481 | +50% | 1 | 1 | 0% | 1,172 | 3,645 | +211% | 0 | 0 | — |
case-06 | fail→pass | 11,451 | 4,012 | -65% | 1 | 1 | 0% | 1,890 | 2,473 | +31% | 0 | 0 | — |
case-07 | pass→pass | 10,180 | 5,136 | -50% | 1 | 1 | 0% | 1,871 | 2,755 | +47% | 0 | 0 | — |
case-08 | pass→pass | 8,715 | 4,739 | -46% | 1 | 1 | 0% | 1,550 | 2,670 | +72% | 0 | 0 | — |
case-09 | fail→pass | 9,532 | 8,035 | -16% | 1 | 1 | 0% | 1,566 | 3,166 | +102% | 0 | 0 | — |
case-10 | pass→pass | 13,745 | 5,929 | -57% | 1 | 1 | 0% | 2,330 | 2,885 | +24% | 0 | 0 | — |
case-20 | pass→pass | 16,110 | 6,464 | -60% | 1 | 1 | 0% | 2,714 | 2,775 | +2% | 0 | 0 | — |
case-11 | pass→pass | 9,326 | 3,773 | -60% | 1 | 1 | 0% | 1,588 | 2,396 | +51% | 0 | 0 | — |
case-12 | pass→pass | 11,969 | 6,195 | -48% | 1 | 1 | 0% | 1,956 | 2,843 | +45% | 0 | 0 | — |
case-13 | pass→pass | 12,264 | 6,959 | -43% | 1 | 1 | 0% | 2,284 | 2,992 | +31% | 0 | 0 | — |
case-14 | fail→pass | 13,356 | 8,661 | -35% | 1 | 1 | 0% | 2,408 | 3,300 | +37% | 0 | 0 | — |
case-15 | pass→pass | 11,060 | 4,535 | -59% | 1 | 1 | 0% | 1,656 | 2,443 | +48% | 0 | 0 | — |
case-16 | pass→pass | 11,355 | 4,697 | -59% | 1 | 1 | 0% | 1,802 | 2,497 | +39% | 0 | 0 | — |
case-17 | fail→pass | 9,641 | 3,460 | -64% | 1 | 1 | 0% | 1,628 | 2,329 | +43% | 0 | 0 | — |
case-18 | pass→pass | 11,583 | 5,895 | -49% | 1 | 1 | 0% | 1,986 | 2,827 | +42% | 0 | 0 | — |
case-19 | pass→pass | 9,535 | 4,481 | -53% | 1 | 1 | 0% | 1,593 | 2,576 | +62% | 0 | 0 | — |
case-22 | pass→pass | 10,662 | 5,589 | -48% | 1 | 1 | 0% | 1,764 | 2,718 | +54% | 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 21 counted toward the lift figure. The other 1 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 +23 percentage points is the difference between those two pass rates over the 21 comparable cases.
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.