From 0408bbb7dc31b37dffc0708daed01e3138ca8c3c Mon Sep 17 00:00:00 2001 From: Yavor Panayotov Date: Wed, 22 Jul 2026 13:08:33 +0300 Subject: [PATCH] Bump vendored allium to v3.8.0 Re-vendors plugins/allium at the v3.8.0 tag: the propagate skill gains an obligation reconciliation step (guarded auto-cover mini-loop after test generation), and the homepage moves to allium-lang.org. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01D6FTVnDrei6nNse624pG3w --- plugins/allium/.claude-plugin/plugin.json | 4 ++-- plugins/allium/.codex-plugin/plugin.json | 6 ++--- plugins/allium/README.md | 12 +++++----- plugins/allium/skills/propagate/SKILL.md | 27 ++++++++++++++++++++++- scripts/allium-ref.txt | 2 +- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/plugins/allium/.claude-plugin/plugin.json b/plugins/allium/.claude-plugin/plugin.json index 9d4eb98..6f962c8 100644 --- a/plugins/allium/.claude-plugin/plugin.json +++ b/plugins/allium/.claude-plugin/plugin.json @@ -1,12 +1,12 @@ { "name": "allium", - "version": "3.7.0", + "version": "3.8.0", "description": "Velocity through clarity.", "author": { "name": "JUXT", "url": "https://juxt.pro" }, - "homepage": "https://juxt.github.io/allium/", + "homepage": "https://allium-lang.org/", "repository": "https://github.com/juxt/allium", "license": "MIT", "keywords": ["specification", "behaviour", "behavior", "domain-modelling", "BDD", "property-based-testing", "generative-tests"], diff --git a/plugins/allium/.codex-plugin/plugin.json b/plugins/allium/.codex-plugin/plugin.json index fab6067..8938bab 100644 --- a/plugins/allium/.codex-plugin/plugin.json +++ b/plugins/allium/.codex-plugin/plugin.json @@ -1,12 +1,12 @@ { "name": "allium", - "version": "3.7.0", + "version": "3.8.0", "description": "Velocity through clarity.", "author": { "name": "JUXT", "url": "https://juxt.pro" }, - "homepage": "https://juxt.github.io/allium/", + "homepage": "https://allium-lang.org/", "repository": "https://github.com/juxt/allium", "license": "MIT", "keywords": [ @@ -30,7 +30,7 @@ "Write", "Interactive" ], - "websiteURL": "https://juxt.github.io/allium/", + "websiteURL": "https://allium-lang.org/", "defaultPrompt": [ "Draft an Allium spec for this feature.", "Review this .allium spec for gaps.", diff --git a/plugins/allium/README.md b/plugins/allium/README.md index ea29144..08296cd 100644 --- a/plugins/allium/README.md +++ b/plugins/allium/README.md @@ -4,7 +4,7 @@ --- -Feed your AI something healthier than Markdown. [juxt.github.io/allium](https://juxt.github.io/allium/) +Feed your AI something healthier than Markdown. [allium-lang.org](https://allium-lang.org/) ## What this is @@ -17,8 +17,8 @@ You keep a `.allium` file alongside your code describing what the system should Two forces feed the spec, and one loop keeps it honest against the code: ``` - intent ──/elicit──► ┌──────────────┐ ◄──/distill── existing code - (forward) │ .allium spec │ (backward) + intent ──/elicit──► ┌───────────────┐ ◄──/distill── existing code + (forward) │ .allium spec │ (backward) └──────┬───┬────┘ /tend │ │ /weed (edit spec) │ │ (reconcile with code) @@ -312,9 +312,9 @@ Like its namesake, working with Allium may produce tears during the peeling, but - - - Star History Chart + + + Star History Chart diff --git a/plugins/allium/skills/propagate/SKILL.md b/plugins/allium/skills/propagate/SKILL.md index 44ca8ee..17b4ea5 100644 --- a/plugins/allium/skills/propagate/SKILL.md +++ b/plugins/allium/skills/propagate/SKILL.md @@ -155,7 +155,7 @@ Cross-module tests are integration tests by nature. They verify that the spec's When exploring the codebase, note which spec obligations are already covered by existing tests. An existing integration test that exercises the happy path from event submission through to acknowledged output already covers multiple `rule_success` obligations and the end-to-end scenario. -When an existing test covers a spec obligation, reference it rather than generating a duplicate. The propagate skill's value at the integration level is verifying that coverage is complete against the spec's obligation list, identifying gaps, and generating tests to fill them. Replacing working hand-written tests with generated equivalents adds no value. +When an existing test covers a spec obligation, reference it rather than generating a duplicate. The propagate skill's value at the integration level is verifying that coverage is complete against the spec's obligation list, identifying gaps, and generating tests to fill them — the reconciliation step in the process below makes this check explicit. Replacing working hand-written tests with generated equivalents adds no value. ### For deferred specs @@ -175,6 +175,7 @@ Deferred specifications are fully specified in separate files. When the target c 5. **Map constructs to code** — correlate spec entities/rules/surfaces with implementation classes/functions/endpoints 6. **Generate tests** — produce test files following the project's conventions 7. **Verify tests compile/run** — ensure generated tests are syntactically valid +8. **Reconcile obligations** — confirm every obligation maps to a covering test, and auto-cover any gaps (see [Obligation reconciliation](#obligation-reconciliation)) ### Discovery checklist @@ -201,6 +202,30 @@ When generator specs are available, use them to produce valid test data: - For invariants, generate states that exercise boundary conditions - For config parameters, use declared defaults unless testing overrides +### Obligation reconciliation + +After generating tests, walk the full obligation list — from `allium plan` output or the manual derivation — and map each obligation to the test that covers it, whether generated this run or pre-existing. Reconciliation is silent: obligations are internal working data, so do not narrate the mapping, print the obligation list or present a coverage report while everything is on track. + +For each obligation with no covering test, attempt to cover it: + +1. Generate the missing test, or extend an existing test that partially covers it +2. Verify the new test compiles and runs +3. Re-check the obligation against the result + +This is a mini-loop, and it needs the same guards as the outer Allium loop (see [driving the loop](../allium/references/driving-the-loop.md)): + +- **Attempt cap** — at most 2 attempts per obligation. If the second attempt does not produce a compiling test that covers it, park the obligation. +- **No-progress cap** — if a full pass over the remaining gaps covers nothing new, stop; further passes will thrash. + +Obligations still uncovered when a guard trips are the only part of reconciliation the user sees. Report each with a classification and a one-line reason: + +- **Infrastructure gap** — the test needs a seam the code does not provide: no injectable clock for a temporal obligation, no integration fixture for a cross-module chain +- **Unmappable construct** — in a code-first flow, no implementation code correlates with the spec construct; the implementation bridge could not be built + +Missing implementation is not a residue category. In a spec-first flow no code exists yet by design: write the test against the intended interface and let it fail — a failing test covers its obligation, and the loop's implement phase turns it green. An obligation is uncovered only when no test for it could be written at all. + +Close with a single summary line: `N obligations, M covered, K uncovered`. When everything is covered that one line is the entire user-facing output of reconciliation. Silence about an individual obligation means it is covered; anything itemised needs a human decision. When propagate runs inside the Allium loop, this line feeds the loop's consolidated summary, and the loop must not treat the spec as converged while obligations remain uncovered without a reported reason. + ## Interaction with other tools - **distill** produces specs from code. Those specs feed propagate. diff --git a/scripts/allium-ref.txt b/scripts/allium-ref.txt index d1e9cf3..40c06cc 100644 --- a/scripts/allium-ref.txt +++ b/scripts/allium-ref.txt @@ -1 +1 @@ -v3.7.0 +v3.8.0