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.
Files changed (77) hide show
  1. package/.claude-plugin/plugin.json +18 -0
  2. package/.plugin/pins.json +1 -0
  3. package/.plugin/plugin.json +18 -0
  4. package/agents/aced-case-judge.md +165 -0
  5. package/agents/aced-impl-judge.md +55 -0
  6. package/agents/aced-scenario-writer.md +76 -0
  7. package/agents/aced-spec-validator.md +66 -0
  8. package/governances/README.md +52 -0
  9. package/governances/agent-tool-output.md +86 -0
  10. package/governances/cli-resolution.md +102 -0
  11. package/governances/skill-design.md +258 -0
  12. package/governances/skill-repo-structure.md +173 -0
  13. package/package.json +44 -0
  14. package/readme.md +124 -0
  15. package/skills/aced-architect-impl/README.md +9 -0
  16. package/skills/aced-architect-impl/SKILL.md +73 -0
  17. package/skills/aced-builder-impl/README.md +14 -0
  18. package/skills/aced-builder-impl/SKILL.md +46 -0
  19. package/skills/aced-builder-spec/README.md +15 -0
  20. package/skills/aced-builder-spec/SKILL.md +130 -0
  21. package/skills/aced-fit/README.md +21 -0
  22. package/skills/aced-fit/SKILL.md +105 -0
  23. package/skills/aced-impl-producer/SKILL.md +75 -0
  24. package/skills/add-scenario/README.md +25 -0
  25. package/skills/add-scenario/SKILL.md +75 -0
  26. package/skills/bench/README.md +64 -0
  27. package/skills/bench/SKILL.md +199 -0
  28. package/skills/bench/scripts/bench-claude-code.mts +187 -0
  29. package/skills/bench/scripts/bench-compare.mts +369 -0
  30. package/skills/bench/scripts/bench-record.mts +133 -0
  31. package/skills/bench/scripts/bench.mts +930 -0
  32. package/skills/check-freshness/README.md +57 -0
  33. package/skills/check-freshness/SKILL.md +76 -0
  34. package/skills/check-freshness/scripts/check-freshness.mts +399 -0
  35. package/skills/compare/README.md +25 -0
  36. package/skills/compare/SKILL.md +87 -0
  37. package/skills/contribute-skill/README.md +25 -0
  38. package/skills/contribute-skill/SKILL.md +241 -0
  39. package/skills/contribute-skill/scripts/source.mts +188 -0
  40. package/skills/define-agent/README.md +40 -0
  41. package/skills/define-agent/SKILL.md +279 -0
  42. package/skills/define-command/README.md +36 -0
  43. package/skills/define-command/SKILL.md +174 -0
  44. package/skills/define-governance/SKILL.md +151 -0
  45. package/skills/define-skill/README.md +37 -0
  46. package/skills/define-skill/SKILL.md +200 -0
  47. package/skills/extract-situation/README.md +32 -0
  48. package/skills/extract-situation/SKILL.md +54 -0
  49. package/skills/extract-situation/scripts/extract-situation.mts +287 -0
  50. package/skills/improve/README.md +25 -0
  51. package/skills/improve/SKILL.md +100 -0
  52. package/skills/improve-skill/README.md +38 -0
  53. package/skills/improve-skill/SKILL.md +169 -0
  54. package/skills/improve-skill/references/check-definitions.md +215 -0
  55. package/skills/improve-skill/scripts/validate.mts +1033 -0
  56. package/skills/init-aced/README.md +5 -0
  57. package/skills/init-aced/SKILL.md +76 -0
  58. package/skills/init-aced/scripts/ensure-results-ignored.mts +117 -0
  59. package/skills/list-skills/README.md +19 -0
  60. package/skills/list-skills/SKILL.md +55 -0
  61. package/skills/list-skills/scripts/list-skills.mts +210 -0
  62. package/skills/manage/README.md +35 -0
  63. package/skills/manage/SKILL.md +65 -0
  64. package/skills/manage-model-runners/README.md +25 -0
  65. package/skills/manage-model-runners/SKILL.md +113 -0
  66. package/skills/manage-skill-dirs/README.md +17 -0
  67. package/skills/manage-skill-dirs/SKILL.md +54 -0
  68. package/skills/manage-skill-dirs/scripts/manage-skill-dirs.mts +328 -0
  69. package/skills/repair-private-skills/README.md +17 -0
  70. package/skills/repair-private-skills/SKILL.md +59 -0
  71. package/skills/repair-private-skills/scripts/repair-private-skills.mts +279 -0
  72. package/skills/report/README.md +25 -0
  73. package/skills/report/SKILL.md +74 -0
  74. package/skills/run/README.md +25 -0
  75. package/skills/run/SKILL.md +220 -0
  76. package/skills/skillify/README.md +25 -0
  77. 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.