Concluding a dif experiment
SkillFiles & storageConcluding a dif.sh experiment, writing a Decision that becomes a useful Learning, archiving the file, and running dif conclude. Use when the user wants to conclude, finish, ship, wrap up, or document the outcome of an experiment, or mentions writing a decision, recording a learning, or the command dif conclude.
Use Concluding a dif experiment in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add Concluding a dif experiment and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the Concluding a dif experiment skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; Ahel provides instructions and does not run this skill.
No other account needed.
Add Ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
What this skill tells your AI
The instructions your AI receives, as published by dif-sh/dif in skills/dif-conclude-experiment/SKILL.md and read by Ahel’s review.
Use this skill when an experiment has run its course and you (or the user) have decided what to do with it — ship, kill, iterate. The verb is dif conclude. It's atomic; if any step fails, every file change rolls back.
Before you run dif conclude
This is the load-bearing part. The Decision you write becomes the next line in the surface's ## Learnings log, and the next dif new on this surface embeds the last three Learnings into the new draft as an HTML comment. Future experiments read what you write here. Don't conclude until you can answer:
- Is there an analysis? Not a hunch, not "looks good" — an actual reading of the primary metric over the running period.
- Was the hypothesis answered? Did the experiment run long enough on enough users on the right surface to answer the question it was set up to answer? If the hypothesis was about mobile and the experiment ran 80% desktop traffic, the answer is no.
- Can you write the Decision as one signed-and-dated outcome line? If you can't compress the outcome to one sentence with a metric direction and a magnitude, you haven't finished the analysis.
- Did you check the guardrails? A primary-metric win that regresses a guardrail isn't a ship.
If any of those are no, don't conclude yet. The fix is more analysis, not a vaguer Decision.
The happy path
dif conclude <id> --decision "Shipped variant_a. +2.1% checkout conversion, p<0.01 over 14d."
What this does (atomically — all four steps succeed or every change reverts):
- Renames
dif/experiments/active/<id>.mdtodif/experiments/concluded/<YYYY-MM>-<id>.md. - Sets
status: concludedandconcluded: <today>in the frontmatter. - Fills the
## Decisionblock in the file body with the supplied text (replacing the<!-- drafted by \dif conclude` -->` placeholder). - Appends one line under
## Learningsindif/surfaces/<surface>.md, dated today, summarizing the decision.
After this, dif validate and dif build must still pass. Run them as a sanity check.
If you omit --decision, dif conclude opens $EDITOR for you to type one. The editor invocation is the right path when the Decision needs care; the inline flag is for cases where the Decision is short and obvious.
Writing a Decision
A useful Decision is one line, signed-and-dated by the outcome. It answers: did the hypothesis hold, by how much, over what period, and what's the next move (ship / kill / iterate)?
Good examples:
- "Shipped variant_a. +2.1% checkout conversion, p<0.01 over 14d. Guardrails clean."
- "Killed. No effect on primary metric (CI -0.3% to +0.4%); variant_b regressed latency_p95 by 3.4%."
- "Iterating. Variant_a directionally positive (+0.8%, CI crossed zero) over 21d; reframing as a copy test with
--from checkout-cta-v2." - "Inconclusive after 30d; surface traffic too low to power. Re-run on a higher-traffic surface or abandon."
Anti-patterns:
- "Inconclusive." — what's the next move? What did you learn? Future drafts read this line; "inconclusive" gives them nothing.
- "Looked good, shipping it." — no metric, no magnitude, no period. The future-you who reads this in six months won't remember what "looked good" meant.
- "See Notion doc XYZ." — the surface's Learnings log is the source of truth for future drafts on this surface. Notion docs rot, get re-orged, lose permissions. Write the answer inline.
- "Will conclude properly later." — don't. Either you have an answer (write it) or you don't (don't conclude).
After concluding
git add dif/ && git commit— the file moved fromactive/toconcluded/<YYYY-MM>-<id>.md, and the surface gained a line.- Run
dif buildto regeneratedif/generated/client.tswithout this experiment's typed export. Commitdif/context.jsonso the next agent sees the updated active set. - If the Decision was "Shipped variant_a", remove the
dif("<id>", ...)call site (it'll trip W001 otherwise) and bake the winning variant's behavior into the code directly. dif's job ends at the verdict; shipping is yours.
Flags
--decision "<text>"— supply the Decision inline. Without it,dif concludeopens$EDITOR.--skip-learning— concludes the experiment but skips the surface Learnings append. Rarely the right call; use only when the experiment was malformed and shouldn't influence future drafts (e.g. ran with broken instrumentation, so the result is meaningless).
Signals
- GitHub stars
- 27
- Last commit
- Oct 2026
Advanced
- Item type
- skill
- Key
dif-conclude-experiment- Source
- github.com/dif-sh/dif
Related picks
Skill · mattpocock
The pick for TypeScripttypescript-pro
Skill · jeffallan
The pick for TypeScriptnotion-meeting-intelligence
Skill · openai
The pick for Notionnotion-spec-to-implementation
Skill · davila7
The pick for Notionnotion-databases
Skill · devin-axis
The pick for Notionnotion
Skill · aaronnat23
The pick for Notion