cyber-aced 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +18 -0
- package/.plugin/pins.json +1 -0
- package/.plugin/plugin.json +18 -0
- package/agents/aced-case-judge.md +165 -0
- package/agents/aced-impl-judge.md +55 -0
- package/agents/aced-scenario-writer.md +76 -0
- package/agents/aced-spec-validator.md +66 -0
- package/governances/README.md +52 -0
- package/governances/agent-tool-output.md +86 -0
- package/governances/cli-resolution.md +102 -0
- package/governances/skill-design.md +258 -0
- package/governances/skill-repo-structure.md +173 -0
- package/package.json +44 -0
- package/readme.md +124 -0
- package/skills/aced-architect-impl/README.md +9 -0
- package/skills/aced-architect-impl/SKILL.md +73 -0
- package/skills/aced-builder-impl/README.md +14 -0
- package/skills/aced-builder-impl/SKILL.md +46 -0
- package/skills/aced-builder-spec/README.md +15 -0
- package/skills/aced-builder-spec/SKILL.md +130 -0
- package/skills/aced-fit/README.md +21 -0
- package/skills/aced-fit/SKILL.md +105 -0
- package/skills/aced-impl-producer/SKILL.md +75 -0
- package/skills/add-scenario/README.md +25 -0
- package/skills/add-scenario/SKILL.md +75 -0
- package/skills/bench/README.md +64 -0
- package/skills/bench/SKILL.md +199 -0
- package/skills/bench/scripts/bench-claude-code.mts +187 -0
- package/skills/bench/scripts/bench-compare.mts +369 -0
- package/skills/bench/scripts/bench-record.mts +133 -0
- package/skills/bench/scripts/bench.mts +930 -0
- package/skills/check-freshness/README.md +57 -0
- package/skills/check-freshness/SKILL.md +76 -0
- package/skills/check-freshness/scripts/check-freshness.mts +399 -0
- package/skills/compare/README.md +25 -0
- package/skills/compare/SKILL.md +87 -0
- package/skills/contribute-skill/README.md +25 -0
- package/skills/contribute-skill/SKILL.md +241 -0
- package/skills/contribute-skill/scripts/source.mts +188 -0
- package/skills/define-agent/README.md +40 -0
- package/skills/define-agent/SKILL.md +279 -0
- package/skills/define-command/README.md +36 -0
- package/skills/define-command/SKILL.md +174 -0
- package/skills/define-governance/SKILL.md +151 -0
- package/skills/define-skill/README.md +37 -0
- package/skills/define-skill/SKILL.md +200 -0
- package/skills/extract-situation/README.md +32 -0
- package/skills/extract-situation/SKILL.md +54 -0
- package/skills/extract-situation/scripts/extract-situation.mts +287 -0
- package/skills/improve/README.md +25 -0
- package/skills/improve/SKILL.md +100 -0
- package/skills/improve-skill/README.md +38 -0
- package/skills/improve-skill/SKILL.md +169 -0
- package/skills/improve-skill/references/check-definitions.md +215 -0
- package/skills/improve-skill/scripts/validate.mts +1033 -0
- package/skills/init-aced/README.md +5 -0
- package/skills/init-aced/SKILL.md +76 -0
- package/skills/init-aced/scripts/ensure-results-ignored.mts +117 -0
- package/skills/list-skills/README.md +19 -0
- package/skills/list-skills/SKILL.md +55 -0
- package/skills/list-skills/scripts/list-skills.mts +210 -0
- package/skills/manage/README.md +35 -0
- package/skills/manage/SKILL.md +65 -0
- package/skills/manage-model-runners/README.md +25 -0
- package/skills/manage-model-runners/SKILL.md +113 -0
- package/skills/manage-skill-dirs/README.md +17 -0
- package/skills/manage-skill-dirs/SKILL.md +54 -0
- package/skills/manage-skill-dirs/scripts/manage-skill-dirs.mts +328 -0
- package/skills/repair-private-skills/README.md +17 -0
- package/skills/repair-private-skills/SKILL.md +59 -0
- package/skills/repair-private-skills/scripts/repair-private-skills.mts +279 -0
- package/skills/report/README.md +25 -0
- package/skills/report/SKILL.md +74 -0
- package/skills/run/README.md +25 -0
- package/skills/run/SKILL.md +220 -0
- package/skills/skillify/README.md +25 -0
- package/skills/skillify/SKILL.md +141 -0
package/readme.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# ACED — Agent Config Evaluation & Development
|
|
2
|
+
|
|
3
|
+
ACED is an SDD plugin specialized in **agent configuration** — the skills, `AGENTS.md` sections, subagent definitions, and commands that shape how AI agents behave.
|
|
4
|
+
|
|
5
|
+
It applies spec-driven development to the agent configuration layer: author a frozen `.feature` suite (with inline `@rubric` scoring criteria), score agent behavior against it, catch regressions before they ship, and improve configurations until they pass.
|
|
6
|
+
|
|
7
|
+
## What it does
|
|
8
|
+
|
|
9
|
+
Agent configuration has the same failure modes as prompts: silent regressions, trigger mismatch, ambiguous rules, coverage gaps. Unlike code, there is no type-checker, linter, or test runner for it. ACED fills that gap.
|
|
10
|
+
|
|
11
|
+
Evaluation runs in layers:
|
|
12
|
+
|
|
13
|
+
| Layer | What it checks |
|
|
14
|
+
|---|---|
|
|
15
|
+
| **Structural** | Required fields and format (via `improve-skill`'s `validate.mts` engine) |
|
|
16
|
+
| **Trigger** | Does the agent invoke this configuration at the right times? |
|
|
17
|
+
| **Behavior** | When invoked, does the agent follow the steps and rules? |
|
|
18
|
+
| **Quality** | Is the output actually good? |
|
|
19
|
+
|
|
20
|
+
## When ACED fits (and when it doesn't)
|
|
21
|
+
|
|
22
|
+
Not every agent configuration benefits from ACED. **Fit** = which of the four layers above carry
|
|
23
|
+
real signal. ACED classifies each subject **in explore** (before authoring an eval suite) and
|
|
24
|
+
records a `**Fit:**` line in its spec:
|
|
25
|
+
|
|
26
|
+
| Fit | The subject… | ACED does |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| **strong** | makes a genuine activation decision + non-deterministic judgment | full eval — trigger near-misses required |
|
|
29
|
+
| **partial** | mechanically executes a predetermined path (graded behavior, no activation choice) | behavior/quality evals; **no trigger near-miss** required |
|
|
30
|
+
| **wrong-squad** | is a deterministic script/engine (assertable output, not graded) | **recuses** — use an ordinary test harness (`node:test`), not ACED |
|
|
31
|
+
|
|
32
|
+
A second, independent axis — **`measured: worth | not-worth`** — says whether real headless runs
|
|
33
|
+
(the measured layer, `bench`) answer a question simulation cannot. It is opt-in, declared under
|
|
34
|
+
`bench:` in `eval.md`, and dollars never decide it.
|
|
35
|
+
|
|
36
|
+
Only the **Structural** layer signal on a subject means it is **wrong-squad** — `improve-skill`'s
|
|
37
|
+
`validate.mts` engine already covers that. The classifier lives in `skills/aced-fit/` (model: the
|
|
38
|
+
spec's `design/fit.md`).
|
|
39
|
+
|
|
40
|
+
## Skills
|
|
41
|
+
|
|
42
|
+
| Skill | When to use |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `init-aced` | Register ACED as the SDD plugin for agent-configuration domain types |
|
|
45
|
+
| `add-scenario` | Add a new test case from a real failure or edge case |
|
|
46
|
+
| `run` | Score the frozen `.feature` suite against the current agent configuration |
|
|
47
|
+
| `compare` | Diff scores before/after an edit — regression gate |
|
|
48
|
+
| `bench` | Measure a change with real headless runs (the measured layer) — plan, price, and run only on an explicit yes |
|
|
49
|
+
| `improve` | Diagnose failing cases and propose targeted edits |
|
|
50
|
+
| `report` | Project-wide health dashboard across all eval suites |
|
|
51
|
+
|
|
52
|
+
Spec creation is owned by the `sdd` plugin's `start-mission` / `spec-gate`: once ACED is registered, the conductor resolves the ACED production-chain roles automatically. The `run`/`compare`/`add-scenario`/`report` skills are thin reporting over the frozen `.feature` suite.
|
|
53
|
+
|
|
54
|
+
## Agents (production-chain roles)
|
|
55
|
+
|
|
56
|
+
| Agent | Role |
|
|
57
|
+
|---|---|
|
|
58
|
+
| `aced-scenario-writer` | spec-producer — writes the spec.md body and the `.feature` (boolean scenarios, inline `@rubric` for graded behavior, `@trigger` `Scenario Outline` for activation) |
|
|
59
|
+
| `aced-spec-validator` | spec-judge — judges the `.feature` against the agent-scenario criteria (incl. `@rubric` structure) |
|
|
60
|
+
| `aced-impl-judge` | impl-judge — **runs** the frozen `.feature` suite (reading each scenario's inline rubric) over N runs, collapses to a boolean per scenario |
|
|
61
|
+
| `aced-case-judge` | internal scorer for `aced-impl-judge` — scores one scenario on its inline rubric |
|
|
62
|
+
|
|
63
|
+
The impl-producer (building the agent config to pass the frozen suite — the verification is the frozen `.feature` itself, not a separate eval suite) is the `define-agent` / `improve` skills or the SDD-default impl-producer (the conductor running `impl-producer-governance` via a spawned builder); ACED does not bind a solution-producer (SDD default).
|
|
64
|
+
|
|
65
|
+
## Workflow
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
sdd:start-mission → sdd:spec-gate (spec gate) → implement → run/compare → improve
|
|
69
|
+
↑
|
|
70
|
+
add (new cases)
|
|
71
|
+
↑
|
|
72
|
+
report (project-wide)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
1. **`sdd:start-mission`** — the conductor resolves `aced-scenario-writer` to write the `.feature`; `aced-spec-validator` judges it at the spec gate.
|
|
76
|
+
2. **implement** — the impl-producer (`define-agent` / `improve`) builds the agent config to pass the frozen `.feature`; `aced-impl-judge` (impl-judge) **runs** the suite, scoring each scenario via `aced-case-judge` against its inline rubric and writing results to the shared `.agents/aced/results/` directory, keyed by target.
|
|
77
|
+
3. **`compare`** — before committing an edit, diff the before/after scores. Warns on regressions.
|
|
78
|
+
4. **`improve`** — reads failing scenarios, groups by failure pattern, proposes before/after diffs to the agent configuration. Automatically runs `compare` after edits.
|
|
79
|
+
5. **`add-scenario`** — adds scenarios from production failures, edge cases, or gaps. Appends to the frozen `.feature` (additive — self-clears).
|
|
80
|
+
6. **`report`** — scans all eval suites and prints a health dashboard (healthy / degraded / critical / trending-down).
|
|
81
|
+
|
|
82
|
+
## Eval suite structure
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
.agents/specs/aced/<category>/<suite-name>/
|
|
86
|
+
eval.md # measurement policy: subject + eval.{layers, judge, trigger}
|
|
87
|
+
<suite-name>.feature # the frozen suite — the single eval source
|
|
88
|
+
# boolean scenarios, @rubric (inline rubric) for graded behavior,
|
|
89
|
+
# @trigger Scenario Outline (Examples of query/should_trigger)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Run output is **not** colocated with the spec: it is written under the shared
|
|
93
|
+
`.agents/aced/results/` directory (`<ISO8601>.json`, keyed by target). Keeping it out of the spec
|
|
94
|
+
node is what stops non-deterministic judge output from accumulating beside the frozen suite;
|
|
95
|
+
`init-aced` is responsible for git-ignoring that directory.
|
|
96
|
+
|
|
97
|
+
`eval.md` is the **measurement policy** — a two-level shape so other measurement kinds slot in as siblings of `eval:`:
|
|
98
|
+
|
|
99
|
+
```yaml
|
|
100
|
+
subject: plugins/aced/skills/define-skill/SKILL.md
|
|
101
|
+
eval:
|
|
102
|
+
layers: [trigger, behavior]
|
|
103
|
+
judge:
|
|
104
|
+
model: claude-sonnet-4-6
|
|
105
|
+
default_threshold: 4 # fallback; per-scenario threshold is inline in @rubric
|
|
106
|
+
trigger:
|
|
107
|
+
activation_threshold: 0.5
|
|
108
|
+
runs: 3
|
|
109
|
+
bench: # optional: the measured layer (real headless runs)
|
|
110
|
+
measured: worth # worth | not-worth; absent bench: = not-worth
|
|
111
|
+
suite: harbor.nightly # task set at .agents/aced/bench/<suite>/
|
|
112
|
+
why: <one line per fit criterion>
|
|
113
|
+
# future (own CRs): a model matrix over the runner family / telemetry (per-run capture)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Installation
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
npx skills add cyberuni/cyberplace --plugin aced
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Relationship to SDD
|
|
123
|
+
|
|
124
|
+
ACED is itself built with SDD: specs live in `.agents/specs/aced/<category>/<skill>/`. It uses the same `spec.md` + `.feature` format as the `sdd` plugin, with the eval suite (`eval.md` + `<skill>.feature`) colocated in the same node directory.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# aced-architect-impl
|
|
2
|
+
|
|
3
|
+
The ACED **Architect bar at the impl gate** — whether an agent-configuration artifact is well-formed *as configuration a model loads and executes*. It fills the `architect-impl` governance slot in ACED's squad entry in `.agents/universal-plugin.json`, and **unions onto** `sdd:architect-impl-governance` (the generic structural-fit bar still applies; this adds the agent-config-specific criteria).
|
|
4
|
+
|
|
5
|
+
Loaded by name, never triggered by users. Two faces read it: the ACED impl-producer reads it forward to self-align while writing, and `aced-impl-judge` reads it backward to grade.
|
|
6
|
+
|
|
7
|
+
It closes a gap in the production chain. `aced-builder-impl` asks whether the artifact passes its frozen `.feature`; nothing previously asked whether the artifact was usable configuration, so a skill could clear ACED's impl gate while violating every principle in the shipped `skill-design` governance. The criteria here are the gradeable ones: an agent-first body with no mid-workflow links to repository files, no rationale prose, decisions rather than restated best practice, one workflow per artifact with its selection mechanism declared in the `description`, selection kept distinct from the `user-invocable` visibility flag, and no baked-in stack assumptions.
|
|
8
|
+
|
|
9
|
+
It carries the criteria, not the whole contract. Full depth stays in `cyberplace governance show skill-design` — the repo's sanctioned mechanism for on-demand depth — so there is one source of truth and no 225-line duplicate to drift. That contract is skill-specific; for `subagent`, `command`, and `agents-section` this bar is the entire agent-config shape bar, since no separate shipped contract covers them.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aced-architect-impl
|
|
3
|
+
description: "Partial Skill: invoke by name only — the ACED Architect bar at the impl gate — whether an agent-configuration artifact is well-formed as configuration. Loaded by the ACED impl-producer to self-align and by the impl-judge to grade. Not triggered by users directly."
|
|
4
|
+
user-invocable: false
|
|
5
|
+
metadata:
|
|
6
|
+
actor: architect
|
|
7
|
+
gate: impl
|
|
8
|
+
compose: union
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# ACED Architect-Impl Governance — the agent-config shape bar
|
|
12
|
+
|
|
13
|
+
The **Architect** bar at the **impl gate**, specialized for agent-configuration artifact-types
|
|
14
|
+
(`skill`, `subagent`, `command`, `agents-section`). It **unions onto**
|
|
15
|
+
`sdd:architect-impl-governance` — the generic structural-fit bar still applies; this adds what makes
|
|
16
|
+
an artifact well-formed *as configuration a model loads and executes*.
|
|
17
|
+
|
|
18
|
+
The sibling `aced:aced-builder-impl` asks whether the artifact passes its frozen `.feature`. This
|
|
19
|
+
bar asks a question the eval suite cannot: whether the artifact is shaped so a model can act on it.
|
|
20
|
+
An artifact can pass every scenario and still be unusable configuration.
|
|
21
|
+
|
|
22
|
+
## The bar (per artifact)
|
|
23
|
+
|
|
24
|
+
- **Agent-first body.** Dense normative rules the agent executes **without opening a linked file
|
|
25
|
+
first**. A body that defers its own content to a repo path is not self-contained: the model has to
|
|
26
|
+
stop and fetch before it can act. Optional depth belongs in a closing `## References` — a
|
|
27
|
+
`governance show` command, an external HTTPS URL, or a sibling file in the same skill folder.
|
|
28
|
+
**Fail:** a mid-workflow link to another repository file.
|
|
29
|
+
- **No rationale prose.** No `## Why`, `## Rationale`, `## Background`, or `## Context` section, and
|
|
30
|
+
no causal "because…" explanation in the body. A one-line scope at the top ("Apply when…") is
|
|
31
|
+
allowed. Rationale lives in an ADR, which outlives the artifact and is read by people rather than
|
|
32
|
+
loaded into every invocation. **Fail:** a body that argues for its rules instead of stating them.
|
|
33
|
+
- **Decisions over documentation.** The artifact encodes what to decide and how. It does not restate
|
|
34
|
+
generic best practice, API documentation, or anything the model derives without it. **Fail:**
|
|
35
|
+
a section that would be equally true in any repository.
|
|
36
|
+
- **One workflow, one artifact.** A single workflow per artifact, with the selection mechanism
|
|
37
|
+
**declared in the `description`** — matched against a situation, named by a caller, or fired by an
|
|
38
|
+
event. A name-only artifact carries the description `"By name only"` and nothing else, because the
|
|
39
|
+
description is the only surface the model matches on and every added word is another handle for a
|
|
40
|
+
spurious match. **Fail:** a second workflow smuggled in under a heading; identity prose in a
|
|
41
|
+
name-only description.
|
|
42
|
+
- **Selection is not visibility.** `user-invocable` controls whether the artifact appears in the
|
|
43
|
+
user's command list, never how it is selected. **Fail:** a bar, judge, or body that reads
|
|
44
|
+
`user-invocable: false` as "not situationally triggered".
|
|
45
|
+
- **No baked-in opinions.** The artifact detects the user's setup — package manager, monorepo shape,
|
|
46
|
+
editor, OS paths — at runtime rather than assuming one stack. A genuinely stack-specific artifact
|
|
47
|
+
says so in its `description`. **Fail:** a hardcoded assumption presented as universal.
|
|
48
|
+
- **An orthogonal axis.** This bar judges a property the eval suite was not optimizing. A finding
|
|
49
|
+
here is not answerable by adding a scenario.
|
|
50
|
+
|
|
51
|
+
## Scope across the artifact-types
|
|
52
|
+
|
|
53
|
+
The criteria above hold for all four types. Where a type has its own additional shape rules, they
|
|
54
|
+
are **not** restated here:
|
|
55
|
+
|
|
56
|
+
| Artifact-type | Additional contract |
|
|
57
|
+
|---|---|
|
|
58
|
+
| `skill` | `cyberplace governance show skill-design` — frontmatter fields, activation, progressive disclosure, `skill.json`, placement and patterns |
|
|
59
|
+
| `skill` (repo layout) | `cyberplace governance show skill-repo-structure` |
|
|
60
|
+
| `subagent`, `command`, `agents-section` | no separate shipped contract; this bar is the whole agent-config shape bar for them |
|
|
61
|
+
|
|
62
|
+
## Gaps are `CONTENT_GAP`, never guesses
|
|
63
|
+
|
|
64
|
+
An artifact whose intended selection mechanism cannot be determined from its `description` returns a
|
|
65
|
+
`CONTENT_GAP`. Do not infer the mechanism from `user-invocable`, from the folder it sits in, or from
|
|
66
|
+
whether it happens to be reachable — inferring is the exact error the selection-is-not-visibility
|
|
67
|
+
criterion exists to catch.
|
|
68
|
+
|
|
69
|
+
## References
|
|
70
|
+
|
|
71
|
+
- `cyberplace governance show skill-design` — the full skill authoring contract this bar's criteria
|
|
72
|
+
are drawn from; read stdout as authoritative.
|
|
73
|
+
- `cyberplace governance show skill-repo-structure` — repository layout for shipped skills.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# aced-builder-impl
|
|
2
|
+
|
|
3
|
+
Internal ACED governance (`user-invocable: false`). The **Builder** actor bar at the **impl gate**,
|
|
4
|
+
specialized for agent-configuration artifact-types — it **unions onto** `sdd:builder-impl-governance`
|
|
5
|
+
and adds how an agent-config subject (which has no deterministic test runner) reaches a per-scenario
|
|
6
|
+
boolean: one scenario→rubric eval per frozen scenario, an explicit N-run policy (trigger vs
|
|
7
|
+
behavior/quality), and a per-dimension `total ≥ threshold` collapse, with the runner (`aced-case-judge`) kept separate
|
|
8
|
+
from the author.
|
|
9
|
+
|
|
10
|
+
One merged bar loaded by **both** faces — the ACED impl-producer (`define-agent` / `improve`, forward,
|
|
11
|
+
which authors the eval suite) and the cold impl-judge (`aced-impl-judge`, backward, which runs it);
|
|
12
|
+
`producer ≠ judge` holds at the agent level. Bound in `.agents/universal-plugin.json` as the ACED
|
|
13
|
+
squad's `builder-impl` governance; the contract-quality side is the spec gate's `aced-builder-spec`.
|
|
14
|
+
Not triggered by users directly.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aced-builder-impl
|
|
3
|
+
description: "Partial Skill: invoke by name only — the ACED Builder bar at the impl gate — the frozen .feature conformance criteria. Loaded by the ACED impl-producer to self-align and by the impl-judge to verify. Not triggered by users directly."
|
|
4
|
+
user-invocable: false
|
|
5
|
+
metadata:
|
|
6
|
+
actor: builder
|
|
7
|
+
gate: impl
|
|
8
|
+
compose: union
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# ACED Builder-Impl Governance — the eval-suite conformance bar
|
|
12
|
+
|
|
13
|
+
The **Builder** bar at the **impl gate**, specialized for agent-configuration artifact-types. It
|
|
14
|
+
**unions onto** `sdd:builder-impl-governance` — the generic conformance bar still applies (checks
|
|
15
|
+
derived from the frozen `.feature`, no green-by-tampering); this adds how an *agent-config* subject,
|
|
16
|
+
which has no deterministic test runner, reaches a per-scenario boolean through a scored eval read
|
|
17
|
+
**directly from the frozen `.feature`**. One merged bar loaded by **both** faces — the ACED
|
|
18
|
+
impl-producer (`define-agent` / `improve`, forward, which **builds the subject config**) and the cold
|
|
19
|
+
impl-judge (`aced-impl-judge`, backward, which **runs** the suite). `producer ≠ judge` holds at the
|
|
20
|
+
agent level.
|
|
21
|
+
|
|
22
|
+
## The bar
|
|
23
|
+
|
|
24
|
+
- **The eval is the frozen scenario.** The `.feature` is the single eval source: each scenario carries
|
|
25
|
+
its own eval — a `@rubric` scenario's inline rubric docstring, a `@trigger` `Scenario Outline`'s
|
|
26
|
+
`Examples`, or a boolean `Then`. The rubric was authored inline by `aced-scenario-writer` and frozen
|
|
27
|
+
at the spec gate; the impl-judge **runs** it and never free-authors one. A `@rubric` scenario missing
|
|
28
|
+
its inline rubric block is a `BLOCKER`.
|
|
29
|
+
- **Run policy is explicit — from `eval.md`.** Read the `eval:` block: `@trigger` scenarios run
|
|
30
|
+
`eval.trigger.runs` against `eval.trigger.activation_threshold` (accuracy); `@behavior`/`@quality`
|
|
31
|
+
scenarios run N times against the scenario's inline `threshold` (else `eval.judge.default_threshold`),
|
|
32
|
+
scored by `eval.judge.model`. Defaults when omitted: model claude-sonnet-4-6, default_threshold 4,
|
|
33
|
+
trigger activation_threshold 0.5, trigger runs 3.
|
|
34
|
+
- **Collapse to a boolean.** A scenario passes when its aggregate **total across the rubric's named
|
|
35
|
+
dimensions** ≥ `threshold` and no must-not-do was triggered (trigger scenarios: accuracy ≥
|
|
36
|
+
activation_threshold); `IMPLEMENTATION_PASS` is true only when every frozen scenario passes. Each
|
|
37
|
+
dimension is scored against its **own** `max` — there is no scale shared across dimensions, and no
|
|
38
|
+
single collapsed number stands for all of them.
|
|
39
|
+
- **The runner is separate from the author.** Independence comes from the frozen `.feature` anchor and
|
|
40
|
+
from a runner (`aced-case-judge`) that is not the producer — the producer cannot declare its own pass.
|
|
41
|
+
- **An eval-instrument subject → mutation-sweep-first (inherited).** The **cold-instrument doctrine** on
|
|
42
|
+
`sdd:builder-impl-governance` applies here unchanged: when the agent-config subject is **itself a
|
|
43
|
+
measurement or verification instrument** — a rubric, an eval suite, a judge persona, a falsifier — a
|
|
44
|
+
**mutation sweep is the default verification method** and reading it is supplementary. An author's own
|
|
45
|
+
eval silently assumes the property under test, so a self-authored ablation over the instrument is not
|
|
46
|
+
the whole check; sweep it.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# aced-builder-spec
|
|
2
|
+
|
|
3
|
+
Internal ACED governance (`user-invocable: false`). The **Builder** actor bar at the **spec gate**,
|
|
4
|
+
specialized for agent-configuration artifact-types — it **unions onto** `sdd:builder-spec-governance`
|
|
5
|
+
and adds the criteria that make an agent-config `.feature` a complete, simulable contract: concrete
|
|
6
|
+
trigger context per scenario, every rule covered, balanced should-trigger / near-miss cases, ≥3 edge
|
|
7
|
+
guards, pure boolean `Then` steps (no rubric/threshold/score in the suite), and **discrimination** —
|
|
8
|
+
every scenario and every `@rubric` dimension must be able to register a miss against a plausible
|
|
9
|
+
wrong config, with the **config-quoting memorizer** as the default wrong subject and a bar on
|
|
10
|
+
dimensions drawn from the subject's own vocabulary.
|
|
11
|
+
|
|
12
|
+
One merged bar loaded by **both** faces — the ACED spec-producer (`aced-scenario-writer`, forward)
|
|
13
|
+
and the cold spec-judge (`aced-spec-validator`, backward); `producer ≠ judge` holds at the agent
|
|
14
|
+
level. Bound in `.agents/universal-plugin.json` as the ACED squad's `builder-spec` governance; the
|
|
15
|
+
conformance side is the impl gate's `aced-builder-impl`. Not triggered by users directly.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aced-builder-spec
|
|
3
|
+
description: "Partial Skill: invoke by name only — the ACED Builder bar at the spec gate — the agent-configuration contract criteria. Loaded by the ACED spec-producer to self-align and by the spec-judge to grade. Not triggered by users directly."
|
|
4
|
+
user-invocable: false
|
|
5
|
+
metadata:
|
|
6
|
+
actor: builder
|
|
7
|
+
gate: spec
|
|
8
|
+
compose: union
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# ACED Builder-Spec Governance — the agent-config contract bar
|
|
12
|
+
|
|
13
|
+
The **Builder** bar at the **spec gate**, specialized for agent-configuration artifact-types
|
|
14
|
+
(`skill`, `subagent`, `command`, `agents-section`). It **unions onto** `sdd:builder-spec-governance`
|
|
15
|
+
— the generic testability/coverage bar still applies; this adds what makes an *agent-config*
|
|
16
|
+
`.feature` a complete, simulable contract. One merged bar loaded by **both** faces — the ACED
|
|
17
|
+
spec-producer (`aced-scenario-writer`) reads it forward, the cold spec-judge (`aced-spec-validator`)
|
|
18
|
+
reads it backward. `producer ≠ judge` holds at the agent level.
|
|
19
|
+
|
|
20
|
+
## Fit gate — load first
|
|
21
|
+
|
|
22
|
+
Load **`aced:aced-fit`** and read the subject's declared `**Fit:**` tier **before** applying the
|
|
23
|
+
bar. Two criteria below are **conditional on tier**; a **missing** `**Fit:**` declaration is a
|
|
24
|
+
`CONTENT_GAP` (never default to `strong`); a **wrong-squad** subject is **recused**, not graded
|
|
25
|
+
(`aced:aced-fit`).
|
|
26
|
+
|
|
27
|
+
## The bar (per scenario, against the `.feature`)
|
|
28
|
+
|
|
29
|
+
- **Trigger context** *(scenarios that assert firing).* Every firing scenario carries a concrete
|
|
30
|
+
trigger situation — who the user is, what they said, the state of the tree/files. A firing
|
|
31
|
+
scenario that uses a vague stand-in ("a file", "some input", "a skill") where the value matters for
|
|
32
|
+
simulation fails. A `partial`-fit subject has no firing scenarios, so this does not bind.
|
|
33
|
+
- **Rule coverage** *(all tiers).* Every major rule/step in the subject has at least one behavior
|
|
34
|
+
scenario. A rule with zero scenarios fails.
|
|
35
|
+
- **Validate-section coverage** *(all tiers; when the subject states binding rules on its
|
|
36
|
+
consumer).* A subject whose body states rules the consuming agent must, must not, always, or
|
|
37
|
+
never do (a governance's constraint set/checklist/decision table, or a workflow skill's Standard
|
|
38
|
+
pattern) must carry its own `## Validate` section — one checkable, artifact-state assertion per
|
|
39
|
+
binding rule, per `improve-skill` Q19 / `define-governance` G9. The suite must include a boolean
|
|
40
|
+
scenario asserting that section's presence, and — for every assertion mechanical enough to run —
|
|
41
|
+
that it actually passes against the built artifact. A subject with binding rules and no such
|
|
42
|
+
scenario fails this bullet; this is not deferred to a lint pass, because a `## Validate` section
|
|
43
|
+
with no frozen scenario checking it has nothing forcing it to stay accurate as the subject
|
|
44
|
+
changes. A subject with no binding rules on its consumer (plain ordered steps, or a pure Rubric
|
|
45
|
+
governance whose scored dimensions already serve this role) is **N/A** — its absence is not a
|
|
46
|
+
failure.
|
|
47
|
+
- **Trigger balance** *(strong only).* For a **`strong`**-fit subject, both should-trigger scenarios
|
|
48
|
+
**and near-miss should-not-trigger** scenarios are present (same domain keywords, different intent)
|
|
49
|
+
— not only obviously-irrelevant negatives; a strong suite with no near-miss fails. For a
|
|
50
|
+
**`partial`**-fit subject (a mechanical procedure with no activation decision), near-miss is
|
|
51
|
+
**N/A** — its absence is **not** a failure.
|
|
52
|
+
- **Edge coverage** *(all tiers).* At least three edge-case or must-not-do guard scenarios. A
|
|
53
|
+
must-not-do guard is a boolean `Then` asserting the agent *does not* do the prohibited action.
|
|
54
|
+
- **Boolean form** *(untagged scenarios).* Every `Then` in an **untagged** scenario is a boolean
|
|
55
|
+
assertion; a rubric, threshold, or score leaked into an untagged `Then` fails.
|
|
56
|
+
- **Rubric-structure** *(`@rubric` scenarios).* Graded behavior is authored as a `@rubric` scenario
|
|
57
|
+
with the rubric **inline** (named dimensions + per-dimension `max` + one `threshold` + a collapsing
|
|
58
|
+
`Then`), per `sdd:suite-format-governance`. A malformed `@rubric` fails before scoring; a well-formed
|
|
59
|
+
one passes **rubric-structure** (its rubric lingo is the sanctioned form). Structure passing is
|
|
60
|
+
**not acceptance** — the scenario is still checked for discrimination below. The rubric is
|
|
61
|
+
spec-owned and frozen with the scenario — the impl-judge *runs* it, it does not author it.
|
|
62
|
+
- **Selection** *(all tiers; every `@rubric` dimension — checked before discrimination).* A `@rubric`
|
|
63
|
+
is a **compensatory** model: strength on one dimension pays for weakness on another, so a criterion
|
|
64
|
+
belongs in the sum only if it is **substitutable** — you must accept that trade (per
|
|
65
|
+
`sdd:suite-format-governance`'s substitutability test). A criterion nobody would trade belongs in a
|
|
66
|
+
boolean `Then`, not the sum. Agent-config binds **two** further grounds on which a criterion is
|
|
67
|
+
untradeable **by construction** rather than by trade judgment. They are **disjoint entry points** —
|
|
68
|
+
a dimension fails selection on either, and neither is a precondition for the other.
|
|
69
|
+
- **Ground 1 — whole-output span. A dimension whose criterion spans the whole of what the subject
|
|
70
|
+
produces fails selection, with no boolean twin required.** There is no *rest of the output* left to
|
|
71
|
+
pay for weakness here, so the compensatory sum has nothing to trade against. The remedy is to author
|
|
72
|
+
the criterion as **one boolean `@quality` scenario** — never to go hunting for a boolean twin the
|
|
73
|
+
suite does not have. `@quality` names the **result axis** and `@rubric` is the orthogonal, optional
|
|
74
|
+
**assertion form** (`sdd:suite-format-governance`, *The tag set*), so a boolean `@quality` scenario
|
|
75
|
+
is ordinary Form 1 and coins nothing. This is what makes the boolean strictly **stronger** than the
|
|
76
|
+
dimension: the gate requires every scenario to pass, so a property authored as a boolean cannot be
|
|
77
|
+
zeroed and bought back on unrelated points, while a dimension can.
|
|
78
|
+
- **The test is monadic.** Read the **single** criterion against the output: *can you name an
|
|
79
|
+
attribute of the output this criterion does not touch?* If you can, it is per-attribute and stays
|
|
80
|
+
a dimension. Sibling dimensions are evidence of how the **output decomposes** — never the object
|
|
81
|
+
of the comparison. Comparing one candidate dimension against another is the twin-scan #280
|
|
82
|
+
rejected, on this ground exactly as much as on Ground 2.
|
|
83
|
+
- **Span is checked before substitutability.** A whole-output criterion never reaches the trade
|
|
84
|
+
question. So when one is authored **alongside** per-attribute siblings — the shape the
|
|
85
|
+
persona-voice recurrence actually took — the span ruling governs the spanning criterion and the
|
|
86
|
+
siblings stay dimensions; the mixed case is not ambiguous, it is ordered.
|
|
87
|
+
- **A whole-output-*sounding* name is not the test.** `coherence`, `clarity`, `overall_quality`
|
|
88
|
+
fail only when they genuinely leave no attribute untouched. Apply the naming question to what the
|
|
89
|
+
dimension **scores**, not to how broadly it is worded.
|
|
90
|
+
- **Ground 2 — same-object smuggle. A `@rubric` dimension re-grading a property a boolean scenario in
|
|
91
|
+
the same suite already decides fails selection** — that boolean is an untradeable rule; scoring it
|
|
92
|
+
as a dimension smuggles it into the compensatory sum. This is the **boolean-smuggling tell**
|
|
93
|
+
(`design/test-levels.md`, `design/decisions/0002-boundary-vs-surface-more.md`): if ACED rubrics
|
|
94
|
+
begin restating booleans, the boundary was set too high. The `scenario-writer` keeps such a property
|
|
95
|
+
**out** of the rubric (authors it as the boolean only, never both); the `spec-validator` fails the
|
|
96
|
+
dimension.
|
|
97
|
+
- **On Ground 2 the discriminator is same-object, never same-criterion.** Fail a dimension **on this
|
|
98
|
+
ground** only when a boolean scenario in the **same suite decides that exact property** — the
|
|
99
|
+
`only` bounds Ground 2's own test, not selection as a whole, so it never licenses passing a
|
|
100
|
+
criterion that fails Ground 1. Two `@rubric` dimensions that merely
|
|
101
|
+
**share a criterion**, with no boolean twin deciding either, do **not** fail selection for sharing
|
|
102
|
+
it — comparing two dimensions to each other is the twin-scan SDD issue #280 rejected (reconciled in
|
|
103
|
+
`design/decisions/0002-boundary-vs-surface-more.md`); #280's discrimination verdict (noise, not a
|
|
104
|
+
hole) and this Selection verdict (a smuggled boolean, out of the sum) are orthogonal reads of one
|
|
105
|
+
dimension.
|
|
106
|
+
- **Discrimination** *(all tiers; every scenario and every `@rubric` dimension).* Each must be able
|
|
107
|
+
to **register a miss** — a plausible wrong config must fail it, or score below the dimension's
|
|
108
|
+
`max` — per the miss test in `sdd:suite-format-governance`, whose **presence / restatement /
|
|
109
|
+
procedural** anti-patterns and under-threshold floor arithmetic apply unchanged. An agent-config
|
|
110
|
+
binds it tighter on two counts:
|
|
111
|
+
- **The memorizer is the default wrong subject.** The subject is a *document the case-judge also
|
|
112
|
+
reads*, so restatement is the dominant failure mode. Name what a **config-quoting memorizer**
|
|
113
|
+
scores on each dimension before accepting the rubric.
|
|
114
|
+
- **Rubric vocabulary is not the subject's vocabulary.** A dimension whose terms are lifted from
|
|
115
|
+
the config's own prose grades recall of that prose — the memorizer scores it max. Draw the
|
|
116
|
+
dimension's terms from the behavior under test, not from the artifact that describes it.
|
|
117
|
+
- **Pairwise consistency** *(all tiers; the suite, not a scenario).* No two scenarios sharing a
|
|
118
|
+
`When` demand opposite verdicts on one constructible snapshot, per `sdd:suite-format-governance`.
|
|
119
|
+
|
|
120
|
+
## References
|
|
121
|
+
|
|
122
|
+
- `aced:aced-fit` — the fit classifier this bar loads to make trigger-context / trigger-balance
|
|
123
|
+
conditional.
|
|
124
|
+
- `aced:improve-skill` (check Q19) / `aced:define-governance` (check G9) — the structural definition
|
|
125
|
+
of a well-formed `## Validate` section (artifact-state assertions, not restated rules) that
|
|
126
|
+
Validate-section coverage requires a scenario for.
|
|
127
|
+
- `sdd:suite-format-governance` — the miss test, the wrong-subject table, the three anti-patterns,
|
|
128
|
+
the substitutability test, and the pairwise-consistency rule this bar specializes.
|
|
129
|
+
- `design/decisions/0002-boundary-vs-surface-more.md`, `design/test-levels.md` — the boolean-smuggling
|
|
130
|
+
tell and the SDD #280 reconciliation (same-object, not same-criterion) the Selection bullet encodes.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# aced-fit
|
|
2
|
+
|
|
3
|
+
Internal ACED governance (`user-invocable: false`). The **fit classifier** — `strong | partial |
|
|
4
|
+
wrong-squad`, defined as **which of ACED's four eval layers (Structural / Trigger / Behavior /
|
|
5
|
+
Quality) carry real signal** for a subject.
|
|
6
|
+
|
|
7
|
+
Fit is decided **early** — in explore, by `aced-scenario-writer`, before any scenario is authored —
|
|
8
|
+
and only **enforced** at the gate by `aced-spec-validator`, which reads the declared tier and never
|
|
9
|
+
re-decides it. It makes the spec bar's trigger-context / trigger-balance criteria **conditional on
|
|
10
|
+
tier** (required for `strong`, N/A for `partial`), and **recuses** a `wrong-squad` deterministic
|
|
11
|
+
engine to the SDD-default builder + a script harness instead of forcing the agent-behavior lens onto
|
|
12
|
+
it.
|
|
13
|
+
|
|
14
|
+
A second, orthogonal axis, **`measured: worth | not-worth`**, says whether real headless runs (the
|
|
15
|
+
measured layer, `eval-run/bench/`) answer a question simulation cannot. It is declared under `bench:`
|
|
16
|
+
in `eval.md` and is opt-in: an absent `bench:` means not-worth and is not a content gap. Dollars
|
|
17
|
+
never decide it.
|
|
18
|
+
|
|
19
|
+
Loaded by the ACED spec-producer and spec-judge, and by the `bench` skill to re-ask the measured
|
|
20
|
+
criteria for the change in hand. The normative model is `design/fit.md` (ADR 0001 for the tier,
|
|
21
|
+
ADR 0003 for the measured axis). Not triggered by users directly.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aced-fit
|
|
3
|
+
description: "Partial Skill: invoke by name only — the ACED fit classifier — which of ACED's eval layers carry real signal for a subject. Loaded by the ACED spec-producer and the spec-judge. Not triggered by users directly."
|
|
4
|
+
user-invocable: false
|
|
5
|
+
metadata:
|
|
6
|
+
type: governance
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# ACED Fit Governance — does this config benefit from ACED?
|
|
10
|
+
|
|
11
|
+
Not every agent configuration benefits from ACED. **Fit** is ACED's self-assessment of a subject,
|
|
12
|
+
**decided early** — in explore by `aced-scenario-writer`, before any scenario is authored — and only
|
|
13
|
+
**enforced** at the gate by `aced-spec-validator` (which reads the declared tier, never re-decides
|
|
14
|
+
it). Fit is a **judgment**, so it lives here as a governance, not a `.mts` engine.
|
|
15
|
+
|
|
16
|
+
## The diagnostic
|
|
17
|
+
|
|
18
|
+
**FIT = which of ACED's four eval layers carry real signal for this subject.** The layers:
|
|
19
|
+
**Structural** (fields/format — already covered by `improve-skill`'s `validate.mts` engine), **Trigger** (fires at the
|
|
20
|
+
right times), **Behavior** (follows the steps/rules when invoked), **Quality** (output is good). A
|
|
21
|
+
subject with signal **only** at Structural is not an ACED subject.
|
|
22
|
+
|
|
23
|
+
## The three tiers
|
|
24
|
+
|
|
25
|
+
| Tier | The subject… | Layers with signal | ACED applies |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| **strong** | makes a genuine **activation decision** (fuzzy/confusable trigger) **and** has non-deterministic judgment branches | all four | the **full bar** — trigger-context **and** trigger-balance (near-misses) **required** |
|
|
28
|
+
| **partial** | is a real config but **mechanically executes** a predetermined path — no activation choice, behavior still LLM-run/graded | Structural + Behavior (+ Quality) | rule-coverage + edge-coverage + boolean-form; **trigger-balance / near-miss is N/A** (absence is **not** a failure); trigger-context only on scenarios that assert firing |
|
|
29
|
+
| **wrong-squad** | is a **deterministic** script / engine whose output is **assertable, not graded** | Structural only | **recuse** — author **no `.feature`**; the conductor falls back to the SDD-default builder + a script / `node:test` harness (the `sdd:` recuse→fallback seam) |
|
|
30
|
+
|
|
31
|
+
The `partial ↔ wrong-squad` boundary is **graded-vs-assertable output** (does judging it need an LLM,
|
|
32
|
+
or does a `node:test` assert it), not merely "has a trigger." A subject reached only by name (a
|
|
33
|
+
name-only description) makes no activation decision, so it is never `strong`.
|
|
34
|
+
|
|
35
|
+
## How each role uses it
|
|
36
|
+
|
|
37
|
+
- **`aced-scenario-writer` (producer, explore) — decides.** Classify fit **first**; declare it as a
|
|
38
|
+
`**Fit:** strong | partial` line in the subject's node spec (its `README.md`) `## Use Cases`. Then author to the tier:
|
|
39
|
+
`strong` → author should-trigger + same-keyword near-miss; `partial` → author behavior/edge/rule,
|
|
40
|
+
**no fabricated near-miss**; `wrong-squad` → **recuse**, produce nothing, recommend the SDD default.
|
|
41
|
+
- **`aced-spec-validator` (judge, gate) — enforces.** Read the declared tier; apply trigger-context /
|
|
42
|
+
trigger-balance **only where the tier carries signal**; a **missing** `**Fit:**` declaration is a
|
|
43
|
+
`CONTENT_GAP` (never default to `strong`); a subject determined wrong-squad is **recused**, not
|
|
44
|
+
graded.
|
|
45
|
+
|
|
46
|
+
## The measured axis — a second, orthogonal question
|
|
47
|
+
|
|
48
|
+
The tier says which **simulated** layers carry signal. A separate axis says whether the **measured**
|
|
49
|
+
layer (real headless runs graded by a shell `check`, `eval-run/bench/`) is worth paying for:
|
|
50
|
+
**`measured: worth | not-worth`**. Never derive one axis from the other — a `strong` skill whose
|
|
51
|
+
change only rewords its trigger is `not-worth`; a `partial` procedure driving multi-step work can be
|
|
52
|
+
`worth`.
|
|
53
|
+
|
|
54
|
+
`worth` only when **all four** hold:
|
|
55
|
+
|
|
56
|
+
1. **Work, not words** — the change moves how real work turns out (pass rate, turns, tokens); a
|
|
57
|
+
trigger-only or wording-only change is `not-worth`.
|
|
58
|
+
2. **Shell-checkable** — a deterministic `check` decides pass/fail; rubric-only outcomes stay
|
|
59
|
+
simulated.
|
|
60
|
+
3. **A decision hinges on the delta** — merge/revert, calibrate a weight, gate a release.
|
|
61
|
+
4. **Detectable at a run count someone will approve.** Under 4 runs per arm no single task's test
|
|
62
|
+
can reach p < 0.05; real effects usually need about 10. If the question needs more runs than
|
|
63
|
+
anyone will approve, it is `not-worth`. The plan's "too few to call" warning reports on this
|
|
64
|
+
criterion; it does not satisfy it.
|
|
65
|
+
|
|
66
|
+
**Dollars never decide a result** — cost is recorded and compared, never a gate input; willingness
|
|
67
|
+
to pay bounds only criterion 4.
|
|
68
|
+
|
|
69
|
+
**Declared** in the subject's `eval.md` under `bench:` (beside `eval:`): `measured`, plus `suite` and
|
|
70
|
+
a `why` of one line per criterion when `worth`. **Absent `bench:` = `not-worth`** — the axis is opt-in, so its absence
|
|
71
|
+
is **not** a `CONTENT_GAP` (unlike the tier's).
|
|
72
|
+
|
|
73
|
+
- **`aced-scenario-writer` — decides**, in explore, after the tier: declare `bench:` when the
|
|
74
|
+
subject is `worth`; an explicit `measured: not-worth` is legal to record a considered no; it needs
|
|
75
|
+
no `suite`, and a `why` is optional; never put the task set in `eval.md`.
|
|
76
|
+
- **`aced-spec-validator` — enforces**: a `bench:` declaring `worth` with no `suite` or no `why` is a
|
|
77
|
+
`CONTENT_GAP`; it reads `worth`, never re-decides it.
|
|
78
|
+
- **The `bench` skill — re-asks** criteria 1–2 for the change in hand before any plan; the engine's
|
|
79
|
+
plan checks criterion 4's floor. A `worth` subject can still meet a change that is not.
|
|
80
|
+
|
|
81
|
+
## Validate
|
|
82
|
+
|
|
83
|
+
Assertions about **the subject being classified**, run by the producer before handoff and re-run by
|
|
84
|
+
the cold judge against the artifact — never against the producer's account of what it did:
|
|
85
|
+
|
|
86
|
+
1. The subject's node spec (`README.md`) carries exactly one `**Fit:** strong` or `**Fit:** partial`
|
|
87
|
+
line; a subject recused as wrong-squad has neither a `**Fit:**` line nor an ACED
|
|
88
|
+
`eval.md` (its node, if any, was written by the SDD-default chain). *(mechanical)*
|
|
89
|
+
2. A subject declared `strong` does not have a name-only description (one beginning `By name only`
|
|
90
|
+
or `Partial Skill: invoke by name only`): a subject reached only by name makes no activation
|
|
91
|
+
decision. *(mechanical)*
|
|
92
|
+
3. If the subject's `eval.md` has a `bench:` key, `bench.measured` is `worth` or `not-worth`.
|
|
93
|
+
*(mechanical)*
|
|
94
|
+
4. A `bench:` declaring `worth` has a non-empty `bench.suite` and a non-empty `bench.why`.
|
|
95
|
+
*(mechanical)*
|
|
96
|
+
5. `bench:` holds only `measured`, `suite`, and `why` — never the suite's tasks — and the node
|
|
97
|
+
spec's frontmatter carries no `bench` or `measured` key. *(mechanical)*
|
|
98
|
+
|
|
99
|
+
## References
|
|
100
|
+
|
|
101
|
+
- `design/fit.md` (`.agents/specs/aced/design/fit.md`) — the normative model + ADR 0001 (tier) and
|
|
102
|
+
ADR 0003 (measured axis).
|
|
103
|
+
- `aced:aced-builder-spec` — the spec bar whose trigger-context / trigger-balance criteria this
|
|
104
|
+
governance makes conditional.
|
|
105
|
+
- `aced:aced-builder-impl` — the impl bar (which eval layers get evals follows the tier).
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aced-impl-producer
|
|
3
|
+
description: "Partial Skill: invoke by name only — the ACED impl-producer's diagnose-and-refine loop — loaded by define-agent, define-skill, and define-governance, and by the public improve skill for ACED-tracked targets, not user-triggered."
|
|
4
|
+
user-invocable: false
|
|
5
|
+
metadata:
|
|
6
|
+
actor: producer
|
|
7
|
+
gate: impl
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# ACED Impl-Producer — diagnose and refine
|
|
11
|
+
|
|
12
|
+
Diagnose failing eval cases and propose targeted edits to the target agent configuration.
|
|
13
|
+
|
|
14
|
+
## Role: the ACED impl-producer
|
|
15
|
+
|
|
16
|
+
When the conductor dispatches `define-agent`, `define-skill`, or `define-governance` as a generic builder (`produced-by sdd:automaton`) for the **impl-producer** role (implement mode, against a frozen `.feature`), it builds the **agent configuration** to pass the frozen suite. The **verification is the frozen `.feature` itself** — its inline `@rubric` scenarios and `@trigger` `Examples`, authored by `aced-scenario-writer` at explore and frozen at the spec gate — so the impl-producer does **not** author a separate eval suite. As impl-producer it self-aligns to `sdd:ownership-governance` plus the resolved **builder-impl + architect-impl** bars (the ACED builder-impl is `aced:aced-builder-impl`). When the **impl-judge** (`aced-impl-judge`) reports scenario failures, load this skill to run the diagnose-and-refine loop below. Independence holds because the evals are anchored to the frozen `.feature` and executed by a separate runner (`aced-case-judge`), which is not the producer.
|
|
17
|
+
|
|
18
|
+
## Load context
|
|
19
|
+
|
|
20
|
+
Find the target's node in the project spec — `.agents/specs/<project>/…/<node>/` (discovered through
|
|
21
|
+
the SDD spec tree; the node's `eval.md` names the subject) — which holds the frozen `<node>.feature`
|
|
22
|
+
and its colocated `eval.md` (subject + run policy):
|
|
23
|
+
- Read `eval.md` for the `subject` agent configuration path and the `eval:` run policy
|
|
24
|
+
- Read the `subject` agent configuration in full
|
|
25
|
+
- Read the frozen `<node>.feature` (the eval source)
|
|
26
|
+
- Read the most recent result file from `results/` (sort by filename descending, take first)
|
|
27
|
+
|
|
28
|
+
If no results exist, run `run` first.
|
|
29
|
+
|
|
30
|
+
## Identify failing scenarios
|
|
31
|
+
|
|
32
|
+
From the latest results, collect all scenarios where `pass: false`. Read each failing scenario from the frozen `.feature` (its steps and inline `@rubric`).
|
|
33
|
+
|
|
34
|
+
## Group failures by pattern
|
|
35
|
+
|
|
36
|
+
Classify each failure into one or more of these patterns:
|
|
37
|
+
|
|
38
|
+
| Pattern | Signs |
|
|
39
|
+
|---|---|
|
|
40
|
+
| **Trigger false-positive** | Trigger layer case where agent fires when it shouldn't |
|
|
41
|
+
| **Trigger false-negative** | Trigger layer case where agent doesn't fire when it should |
|
|
42
|
+
| **Missing step** | Behavior case where a specific step was skipped |
|
|
43
|
+
| **Ambiguous rule** | Multiple behavior cases fail on the same rule — inconsistent execution |
|
|
44
|
+
| **Conflicting instruction** | Agent followed one rule but violated another in the same agent configuration |
|
|
45
|
+
| **Scope creep** | Agent did more than the agent configuration specifies |
|
|
46
|
+
| **Description mismatch** | Trigger failures suggest the `description:` field doesn't match the body |
|
|
47
|
+
|
|
48
|
+
Report the pattern groupings before proposing fixes.
|
|
49
|
+
|
|
50
|
+
## Propose specific edits
|
|
51
|
+
|
|
52
|
+
For each pattern, propose a concrete change to the agent configuration. Show exact before/after diffs — do not describe changes in prose.
|
|
53
|
+
|
|
54
|
+
Examples of edit types:
|
|
55
|
+
|
|
56
|
+
- **Trigger false-positive/negative** → rewrite the `description:` field; add explicit "when NOT to use" section
|
|
57
|
+
- **Missing step** → make the step more prominent; add a concrete example; break it into sub-steps
|
|
58
|
+
- **Ambiguous rule** → replace vague language ("prefer X") with decision rule ("use X when Y, use Z when W")
|
|
59
|
+
- **Conflicting instruction** → add explicit precedence rule or split into separate instructions
|
|
60
|
+
- **Description mismatch** → align `description:` to match what the body actually instructs
|
|
61
|
+
|
|
62
|
+
## Confirm before applying
|
|
63
|
+
|
|
64
|
+
Show all proposed edits to the user. Ask for approval before writing any changes.
|
|
65
|
+
|
|
66
|
+
After user approval, apply edits to the agent configuration. Then automatically run `compare` (before = previous git revision, after = current working tree) to verify the changes improved scores without introducing regressions.
|
|
67
|
+
|
|
68
|
+
## If no clear fix exists
|
|
69
|
+
|
|
70
|
+
If failures are caused by inherent non-determinism (high score variance across similar scenarios), recommend:
|
|
71
|
+
1. Adding more specific examples to the agent configuration
|
|
72
|
+
2. Lowering the bar — but a per-scenario `threshold` is **inline in the frozen `.feature`**, so lowering it is a narrowing edit that needs a **re-open + Clearance** at the spec gate, not a casual `eval.md` change (only `eval.judge.default_threshold`, the fallback, lives in `eval.md`)
|
|
73
|
+
3. Splitting the agent configuration into two narrower ones
|
|
74
|
+
|
|
75
|
+
Do not propose removing scenarios to fix failing evals — that defeats the purpose.
|