diff --git a/CHANGELOG.md b/CHANGELOG.md index 69c6615..e960840 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## [0.14.6] — 2026-09-25 + +The fixes for the trial findings shipped in aep 0.59.3 and ess 0.32.0; the skills now describe that +behaviour instead of the workarounds. Each change was checked against the released binaries. + +**`ess`** + +- `ess:retrofitting`: `ess infra import openapi` reads OpenAPI 3.0 as well as 3.1. A nullable field + imports as a coverage gap, carried into the draft as an `UNMAPPED:` marker; an object schema must + be closed with `additionalProperties: false`, and that refusal is reported, not worked around. +- Syntax reference: two fields are compared through one struct (`window.ends_at > + window.starts_at`); a right-hand side without a dot is a literal, so the flat form is refused. The + stored-value case links ESS's design note for guards over stored fields. +- `ess:specifying`: the note that the CLI help calls the `system.yaml` layout "legacy" is gone; the + help no longer says so. + +**`aep`** + +- `aep:planning`: the store's refusal of an empty findings fence now says to write `[]`; the skill + points at it instead of quoting the old message. + ## [0.14.5] — 2026-09-25 From the round-4 trials on 0.14.4 (an ESS retrofit of a stock-reservation service and worktree diff --git a/Cargo.lock b/Cargo.lock index 13eb26d..b34b05f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "agentplugins-check" -version = "0.14.5" +version = "0.14.6" dependencies = [ "clap", "serde", @@ -76,7 +76,7 @@ dependencies = [ [[package]] name = "b10x" -version = "0.14.5" +version = "0.14.6" dependencies = [ "clap", "serde", diff --git a/Cargo.toml b/Cargo.toml index 7fb7640..014497a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["crates/agentplugins-check", "crates/b10x"] [workspace.package] -version = "0.14.5" +version = "0.14.6" edition = "2021" rust-version = "1.85" license = "Apache-2.0" diff --git a/plugins/aep/.claude-plugin/plugin.json b/plugins/aep/.claude-plugin/plugin.json index 8fa7a2f..d7ab82b 100644 --- a/plugins/aep/.claude-plugin/plugin.json +++ b/plugins/aep/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "aep", "displayName": "AEP", "description": "Plan governed work in the AEP artifact store and deliver it in reviewed waves: decomposition, plan critique, reverse engineering, story scoping, implementation and adversarial review.", - "version": "0.14.5", + "version": "0.14.6", "author": { "name": "Beyond10x" }, diff --git a/plugins/aep/.codex-plugin/plugin.json b/plugins/aep/.codex-plugin/plugin.json index d121b98..448835c 100644 --- a/plugins/aep/.codex-plugin/plugin.json +++ b/plugins/aep/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "aep", - "version": "0.14.5", + "version": "0.14.6", "description": "Plan governed work in the AEP artifact store and deliver it in reviewed waves.", "author": { "name": "Beyond10x" diff --git a/plugins/aep/skills/planning/SKILL.md b/plugins/aep/skills/planning/SKILL.md index 44a39fb..e909d89 100644 --- a/plugins/aep/skills/planning/SKILL.md +++ b/plugins/aep/skills/planning/SKILL.md @@ -475,10 +475,9 @@ created review-result:acceptance-round-1 (active) at .engineering/planning/revie you have recorded your reading of the review rather than the review. That includes the fenced ` ```findings ` block the rubric has each critic close with: it is the half a program reads, and a record whose findings were flattened into prose is one `aep plan artifact findings` cannot compare - against the next round. On `approve` the rubric's block is `[]`, which the store accepts. The one - edit allowed: a critic that closed with an empty fence (no `[]` inside) is recorded with `[]` in - it, because the store refuses the empty fence ("a review with nothing to report writes no block - at all"). Say in the report that you made that edit. + against the next round. On `approve` the rubric's block is `[]`. The one edit allowed: a critic + that closed with an empty fence is recorded with `[]` in it, as the store's refusal says; say in + the report that you made that edit. * Repeat `--relate` once per artifact the critic judged. Read the edge name from `aep plan artifact relations` before you rely on it, the way you would any other vocabulary. * Write them one at a time. Four critics return at once; the store takes one writer. diff --git a/plugins/b10x/.claude-plugin/plugin.json b/plugins/b10x/.claude-plugin/plugin.json index e092d87..ecb16ee 100644 --- a/plugins/b10x/.claude-plugin/plugin.json +++ b/plugins/b10x/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "b10x", "displayName": "Beyond10x", "description": "Set up, upgrade and check the Beyond10x plugins and binaries, route work to them, and create portable plugins.", - "version": "0.14.5", + "version": "0.14.6", "author": { "name": "Beyond10x" }, diff --git a/plugins/b10x/.codex-plugin/plugin.json b/plugins/b10x/.codex-plugin/plugin.json index 47428f8..331d0a3 100644 --- a/plugins/b10x/.codex-plugin/plugin.json +++ b/plugins/b10x/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "b10x", - "version": "0.14.5", + "version": "0.14.6", "description": "Set up, upgrade and check the Beyond10x plugins and binaries, route work to them, and create portable plugins.", "author": { "name": "Beyond10x" diff --git a/plugins/connectors/.claude-plugin/plugin.json b/plugins/connectors/.claude-plugin/plugin.json index 17bd38c..7e8e17d 100644 --- a/plugins/connectors/.claude-plugin/plugin.json +++ b/plugins/connectors/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "connectors", - "version": "0.14.5", + "version": "0.14.6", "description": "Set up, inspect, and invoke governed integrations through the connectors CLI.", "author": { "name": "Beyond10x" }, "license": "Apache-2.0", diff --git a/plugins/connectors/.codex-plugin/plugin.json b/plugins/connectors/.codex-plugin/plugin.json index f18966b..7818bab 100644 --- a/plugins/connectors/.codex-plugin/plugin.json +++ b/plugins/connectors/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "connectors", - "version": "0.14.5", + "version": "0.14.6", "description": "Set up, inspect, and invoke governed integrations through the connectors CLI.", "author": { "name": "Beyond10x" }, "license": "Apache-2.0", diff --git a/plugins/ess/.claude-plugin/plugin.json b/plugins/ess/.claude-plugin/plugin.json index 9902ba6..11bfb4c 100644 --- a/plugins/ess/.claude-plugin/plugin.json +++ b/plugins/ess/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "ess", "displayName": "ESS", "description": "Write, retrofit, validate and project Executable System Specifications, and hold implementations to them with conformance suites.", - "version": "0.14.5", + "version": "0.14.6", "author": { "name": "Beyond10x" }, diff --git a/plugins/ess/.codex-plugin/plugin.json b/plugins/ess/.codex-plugin/plugin.json index 9102278..dfb974e 100644 --- a/plugins/ess/.codex-plugin/plugin.json +++ b/plugins/ess/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ess", - "version": "0.14.5", + "version": "0.14.6", "description": "Write, retrofit, validate and project Executable System Specifications, and hold implementations to them with conformance suites.", "author": { "name": "Beyond10x" diff --git a/plugins/ess/skills/retrofitting/SKILL.md b/plugins/ess/skills/retrofitting/SKILL.md index cb948bb..c62d0f6 100644 --- a/plugins/ess/skills/retrofitting/SKILL.md +++ b/plugins/ess/skills/retrofitting/SKILL.md @@ -22,9 +22,11 @@ cites it. What you cannot read is an `UNMAPPED:` marker, never a plausible value Use every source that exists. Where two disagree, the draft records both and marks the field `UNMAPPED:`; the disagreement is a finding, not something to resolve by choosing. -`ess infra import openapi` reads OpenAPI 3.1 only. A 3.0 document exits 1 with the refusal -`only OpenAPI 3.1 is supported, found 3.0.x`; `aep plan reverse openapi` accepts it. Do not -rewrite the contract's version line to get past the refusal. +`ess infra import openapi` reads OpenAPI 3.0 and 3.1. A nullable field (`nullable: true`, or a 3.1 +`type: [T, "null"]`) imports as a coverage gap at its pointer, because the interface has no null: +carry each gap into the draft as an `UNMAPPED:` marker. An object schema must be closed with +`additionalProperties: false`, or the import refuses it; that refusal is a finding about the +contract, so report it rather than editing the contract to pass. `aep` is optional. Without it, write the domain by hand from the schemas, in the shape the `ess:specifying` skill shows. diff --git a/plugins/ess/skills/specifying/SKILL.md b/plugins/ess/skills/specifying/SKILL.md index 911378c..e05979e 100644 --- a/plugins/ess/skills/specifying/SKILL.md +++ b/plugins/ess/skills/specifying/SKILL.md @@ -134,7 +134,7 @@ scenarios: [] `specification` lists every authored file, relative to this file, and each must exist. `scenarios` lists authored scenario files, `[]` when there are none. `--path ` then reads exactly -that list. The CLI help calls the list-less `system.yaml` layout "legacy"; it still validates. +that list. A directory with only `system.yaml` still validates, read whole. **A draft is a proposal, never a silent completion.** Every relation you could not read from code, an OpenAPI document or an existing artifact is written with an `UNMAPPED:` marker beside the place diff --git a/plugins/ess/skills/specifying/references/syntax.md b/plugins/ess/skills/specifying/references/syntax.md index 8501c5b..8567e9e 100644 --- a/plugins/ess/skills/specifying/references/syntax.md +++ b/plugins/ess/skills/specifying/references/syntax.md @@ -325,11 +325,12 @@ Two cases trials hit: | rule | how to write it | |---|---| -| a value stored on the entity decides the outcome ("express parcels over 20 kg are refused at dispatch", with the weight given at create) | not expressible: a `when` sees only the dispatch input. Mark it `UNMAPPED:` at the outcome, citing the source line | +| a value stored on the entity decides the outcome ("express parcels over 20 kg are refused at dispatch", with the weight given at create) | not expressible: a `when` sees only the dispatch input. Mark it `UNMAPPED:` at the outcome, citing the source line. A guard over stored fields is proposed in ESS's [design note](https://github.com/beyond10x/ess/blob/main/docs/design/cross-record-and-stored-field-guards.md) | | two records must not overlap ("a room cannot be booked twice for one hour") | make the contested unit an entity with its own lifecycle (a `Slot` that is `Free` or `Booked`); a second booking is then `wrong_state` on that slot. Overlap between arbitrary time ranges is not expressible; mark it `UNMAPPED:` | -**Order a time range by its length, not by comparing two `Timestamp`s.** `ends_at > starts_at` -validates, but `ess verify conform synthesize` refuses it (`no declared scale contains both -values`). `Duration` does not work either: it is text, and `validate` refuses `length > 0`. Take -`starts_at: Timestamp` and an `Integer` in a named unit (`duration_minutes`) and guard on -`duration_minutes > 0`. +**Compare two fields through one struct.** A right-hand side without a dot is a literal, so +`ends_at > starts_at` compares `ends_at` with the text `"starts_at"` and `validate` refuses it. +Declare the two fields in one struct (`Window` with `starts_at` and `ends_at`, both `Timestamp`), +take it as input, and guard on `window.ends_at > window.starts_at`; `synthesize` orders the two +instants. `Duration` does not compare with a number (it is text), so a length is an `Integer` in a +named unit (`duration_minutes > 0`). diff --git a/plugins/worktree/.claude-plugin/plugin.json b/plugins/worktree/.claude-plugin/plugin.json index e51a4e8..9c50e10 100644 --- a/plugins/worktree/.claude-plugin/plugin.json +++ b/plugins/worktree/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "worktree", "displayName": "Worktree", "description": "Create, lease, finish, audit and safely clean isolated Git worktrees through the worktree CLI.", - "version": "0.14.5", + "version": "0.14.6", "author": { "name": "Beyond10x" }, diff --git a/plugins/worktree/.codex-plugin/plugin.json b/plugins/worktree/.codex-plugin/plugin.json index 68ada72..815821d 100644 --- a/plugins/worktree/.codex-plugin/plugin.json +++ b/plugins/worktree/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "worktree", - "version": "0.14.5", + "version": "0.14.6", "description": "Create, lease, finish, audit and safely clean isolated Git worktrees through the worktree CLI.", "author": { "name": "Beyond10x"