distill
Extract an Allium specification from an existing codebase. Use when the user has existing…
Give your AI agents something more useful than a prompt. Velocity through clarity.
$ npx -y skills add juxt/allium --skill allium --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/alliumContext preview
The summary Claude sees to decide when to auto-load this skill.
Give your AI agents something more useful than a prompt. Velocity through clarity.
name: allium description: Give your AI agents something more useful than a prompt. Velocity through clarity. version: 3 auto_trigger: - file_patterns: ["**/*.allium"] - keywords: ["allium", "allium spec", "allium specification", ".allium file"]
Allium is a formal language for capturing software behaviour at the domain level. It sits between informal feature descriptions and implementation, providing a precise way to specify what software does without prescribing how it's built.
The name comes from the botanical family containing onions and shallots, continuing a tradition in behaviour specification tooling established by Cucumber and Gherkin.
Key principles:
Allium does NOT specify programming language or framework choices, database schemas or storage mechanisms, API designs or UI layouts, or internal algorithms (unless they are domain-level concerns).
| Task | Tool | When | |------|------|------| | Writing or reading `.allium` files | this skill | You need language syntax and structure | | Building a spec through conversation | `elicit` skill | User describes a feature or behaviour they want to build | | Extracting a spec from existing code | `distill` skill | User has implementation code and wants a spec from it | | Modifying an existing spec | `tend` skill | User wants targeted changes to `.allium` files | | Checking spec-to-code alignment | `weed` skill | User wants to find or fix divergences between spec and implementation | | Generating tests from a spec | `propagate` skill | User wants to generate tests, PBT properties or state machine tests from a specification | | Attesting a loop's convergence | `witness` skill | User wants to independently confirm a run's convergence claim from ground truth — tests really pass, no generated test was weakened, no blocking question was silently parked | | Driving the whole loop to convergence | this skill (see [driving the loop](./references/driving-the-loop.md)) | User wants to build or reconcile a feature end to end — `/allium <goal>` runs the gather→act→verify→repeat loop autonomously until spec, tests and code agree |
`/allium` is the entry point. Bias toward the autonomous path — the whole-loop value is exactly what occasional single-skill use misses:
> Tell me a goal and I'll drive the whole loop — spec → tests → code, until they agree. Or run one step yourself: `elicit` (spec from intent), `distill` (spec from existing code), `propagate` (tests from a spec), `tend` (edit a spec), `weed` (fix spec↔code drift). You have code but no `.allium` yet, so I'd start by distilling — or just give me the goal and I'll take it end to end.
Lead with the loop; keep the individual skills one step away for users who want manual control. And once a single skill finishes, proactively suggest the next phase rather than waiting to be asked.
The skills are not one-shot commands; they compose into an autonomous-style loop — **gather context → take action → verify → repeat** — that drives three artefacts to agreement: the **spec** (intent), the **tests** (contract), and the **code** (implementation). Gather context with `/elicit` or `/distill` (the spec is durable context); take action with `/propagate` then implementation (in spec-first work, confirm the new tests fail first — a test already green before you implement is already-covered or vacuous); verify by running the tests, then `/weed`, then CLI structural checks; repeat until converged. Verification is the phase that matters most, and the spec-plus-tests-plus-weed signal is what makes the loop trustworthy. After invoking one skill, proactively suggest the next step rather than waiting to be asked. To run the whole loop to convergence in one go, just give `/allium` a goal — it drives the loop for you, following [driving the loop](./references/driving-the-loop.md).
Two entry points, one convergence loop:
The work is "done" when tests pass, `/weed` reports no divergence, no open questions remain (plus, for code-first, a fresh `/distill` finds nothing new), and an independent `/witness` pass attests that claim against ground truth. Two standing rules while looping: never weaken a generated test to make it pass (fix the spec and re-propagate instead), and escalate genuine ambiguity to the human rather than guessing — both are enforced by the witness at the convergence gate, not left to trust.
Implementation itself is ordinary coding — Allium produces the spec and tests, not the application code. See the [recommended loops](./references/recommended-loops.md) reference for the full walkthrough, diagr
Extract an Allium specification from an existing codebase. Use when the user has existing…
Run a structured discovery session to build an Allium specification through conversation. Use…
Generate tests from Allium specifications. Use when the user wants to propagate tests,…
Tend the Allium garden. Use when the user wants to write, edit, update, add to, improve,…
Weed the Allium garden. Find where Allium specifications and implementation code have…
Independently witness that an Allium loop's convergence claim is true and was reached…