cyber-aced 0.4.0 → 0.4.2

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 (37) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/.plugin/plugin.json +1 -1
  4. package/agents/aced-impl-judge.md +3 -3
  5. package/agents/aced-scenario-writer.md +2 -2
  6. package/agents/aced-spec-validator.md +1 -1
  7. package/governances/README.md +1 -1
  8. package/governances/skill-design.md +5 -3
  9. package/package.json +2 -2
  10. package/skills/aced-architect-impl/SKILL.md +1 -1
  11. package/skills/aced-builder-impl/SKILL.md +2 -2
  12. package/skills/aced-builder-spec/SKILL.md +7 -8
  13. package/skills/aced-fit/SKILL.md +4 -5
  14. package/skills/aced-impl-producer/SKILL.md +4 -4
  15. package/skills/check-freshness/SKILL.md +4 -5
  16. package/skills/define-agent/SKILL.md +2 -2
  17. package/skills/define-command/SKILL.md +3 -3
  18. package/skills/define-governance/SKILL.md +2 -2
  19. package/skills/define-skill/README.md +1 -1
  20. package/skills/define-skill/SKILL.md +21 -18
  21. package/skills/define-skill/references/governances/agent-tool-output.md +86 -0
  22. package/skills/define-skill/references/governances/skill-design.md +260 -0
  23. package/skills/extract-situation/SKILL.md +1 -1
  24. package/skills/improve/SKILL.md +2 -2
  25. package/skills/improve-skill/SKILL.md +6 -12
  26. package/skills/improve-skill/references/check-definitions.md +3 -3
  27. package/skills/improve-skill/references/governances/agent-tool-output.md +86 -0
  28. package/skills/improve-skill/references/governances/skill-design.md +260 -0
  29. package/skills/improve-skill/scripts/validate.mts +2 -2
  30. package/skills/init-aced/SKILL.md +2 -2
  31. package/skills/list-skills/SKILL.md +1 -1
  32. package/skills/manage-model-runners/SKILL.md +1 -1
  33. package/skills/manage-skill-dirs/SKILL.md +1 -1
  34. package/skills/repair-private-skills/SKILL.md +1 -1
  35. package/skills/report/SKILL.md +2 -2
  36. package/skills/run/SKILL.md +1 -1
  37. package/skills/skillify/SKILL.md +3 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "aced",
4
- "version": "0.4.0",
4
+ "version": "0.4.2",
5
5
  "description": "Agent Config Evaluation & Development. Spec, evaluate, and improve agent configurations: skills, AGENTS.md sections, subagent definitions, and commands.",
6
6
  "author": {
7
7
  "name": "unional"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/cyberuni/marketplace/main/schema/claude/plugin.json",
3
3
  "name": "aced",
4
- "version": "0.4.0",
4
+ "version": "0.4.2",
5
5
  "description": "Agent Config Evaluation & Development. Spec, evaluate, and improve agent configurations: skills, AGENTS.md sections, subagent definitions, and commands.",
6
6
  "author": {
7
7
  "name": "unional"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/cyberuni/marketplace/main/schema/claude/plugin.json",
3
3
  "name": "aced",
4
- "version": "0.4.0",
4
+ "version": "0.4.2",
5
5
  "description": "Agent Config Evaluation & Development. Spec, evaluate, and improve agent configurations: skills, AGENTS.md sections, subagent definitions, and commands.",
6
6
  "author": {
7
7
  "name": "unional"
@@ -19,7 +19,7 @@ The **impl-judge** for agent-configuration domain types — it grades the **buil
19
19
  ## Input
20
20
 
21
21
  ```
22
- DOMAIN, DOMAIN_PATH, SPEC_PATH, FEATURE_PATH
22
+ DOMAIN, DOMAIN_PATH, SPEC_PATH, FEATURE_PATH: the domain under work, its spec folder, its spec.md, and its .feature
23
23
  IMPLEMENTATION_PATHS: the agent configuration under evaluation (the SUBJECT)
24
24
  VERIFICATION_PATHS: the frozen .feature (the eval source) + eval.md (run policy only)
25
25
  ```
@@ -28,9 +28,9 @@ VERIFICATION_PATHS: the frozen .feature (the eval source) + eval.md (run poli
28
28
 
29
29
  1. **Read the frozen `.feature` as the eval source.** Enumerate its scenarios in file order. Each scenario carries its own eval: a `@rubric` scenario's inline rubric docstring (named dimensions + `max` + `threshold`), a `@trigger` `Scenario Outline`'s `Examples` rows, or a deterministic boolean `Then`. You **run** it, you do not author it. A `@rubric` scenario whose inline rubric block is **absent** is a `BLOCKER` — you do not free-author the missing rubric.
30
30
 
31
- 2. **Set the run policy from `eval.md`.** Read the run policy under the `eval:` block: `eval.trigger.{runs, activation_threshold}` for `@trigger` scenarios; `eval.judge.model` and `eval.judge.default_threshold` for `@behavior`/`@quality` scenarios (an inline `threshold` in a `@rubric` docstring overrides the default). Defaults when `eval.md` omits them: judge model `claude-sonnet-4-6`, default_threshold 4, trigger activation_threshold 0.5, trigger runs 3.
31
+ 2. **Set the run policy from `eval.md`.** Read the run policy under the `eval:` block: `eval.trigger.{runs, activation_threshold}` for `@trigger` scenarios; `eval.judge.model` and `eval.judge.default_threshold` for `@behavior`/`@quality` scenarios (an inline `threshold` in a `@rubric` docstring overrides the default). Defaults when `eval.md` omits them: judge model the session's current model, default_threshold 4, trigger activation_threshold 0.5, trigger runs 3.
32
32
 
33
- 3. **Run the evals.** For each scenario, invoke `aced-case-judge` with the SUBJECT, the **`.feature` path and the scenario name**, and its threshold, over its run count — for a `@trigger` `Scenario Outline`, **once per `Examples` row**, passing its zero-based `ROW` (one row is one case; the judge reports one invoke decision, and aggregating accuracy across rows is yours). **Never pass the scenario's steps, its `Then`, or its rubric** — the judge blinds its own simulating context (composing that context's brief with the `extract-situation` engine) and scores the returned transcript in a separate one; handing it the scenario body would put the answer key back in the context that has to reach the answer. One invocation covers both passes; never sequence them here. It returns a score per named dimension against that dimension's own `max`, plus a total. Aggregate the totals across runs.
33
+ 3. **Run the evals.** For each scenario, invoke `aced-case-judge` with the SUBJECT, the **`.feature` path and the scenario name**, and its threshold, over its run count — for a `@trigger` `Scenario Outline`, **once per `Examples` row**, passing its zero-based `ROW` (one row is one case; the judge reports one invoke decision, and aggregating accuracy across rows is yours). **Never pass the scenario's steps, its `Then`, or its rubric** — the judge blinds its own simulating context (composing that context's brief with the `extract-situation` engine) and scores the returned transcript in a separate one; handing it the scenario body would put the answer key back in the context that has to reach the answer. One invocation covers both passes; never sequence them here. It returns a score per named dimension against that dimension's own `max`, plus a total. Aggregate the totals across runs. <!-- field-mandate-ignore: ROW is aced-case-judge's input, which this judge constructs -->
34
34
 
35
35
  **Wait for each case judge, and bank only its last word.** Dispatching a case judge is asynchronous, and the case judge is itself waiting on its own blind simulator — so a judge can report before its measurement exists and correct itself afterwards. Two rules follow. **Only the final notification per agent id is trustworthy**: when an agent reports more than once, the later report supersedes the earlier one entirely — never bank the first and never merge them. And **a verdict is a result only when the agent has finished**: do not collapse to boolean or roll up `IMPLEMENTATION_PASS` while any dispatched case judge is still live. If a run ends with cases still outstanding, that is `STATUS: needs-input` with those scenarios named — not a pass and not a fail.
36
36
 
@@ -30,7 +30,7 @@ Before writing anything, classify the subject's fit tier (`aced:aced-fit`) and *
30
30
  ## Input
31
31
 
32
32
  ```
33
- DOMAIN, DOMAIN_PATH, SPEC_PATH
33
+ DOMAIN, DOMAIN_PATH, SPEC_PATH: the domain under work, its spec folder, and its spec.md
34
34
  SUBJECT: <full text of the agent configuration under spec, or null for a new one>
35
35
  COMMAND_SURFACE: <the configuration's trigger surface / interface — or null>
36
36
  DESIGN_DECISIONS: <known choices — or null>
@@ -56,7 +56,7 @@ USER_ANSWERS: <answers to previously returned QUESTIONS — or null>
56
56
  - **Select the form before you grade it — the substitutability test.** A `@rubric` is a **compensatory** model (strength on one dimension pays for weakness on another), so a criterion belongs in one **only if** it is **substitutable**: only if you accept that trade — *"great scope makes up for shipping an npx dependency"* is a trade nobody accepts, so `no_npx_dependency` is a boolean `Then`, not a dimension. A rule graded as a dimension becomes **tradeable**, which is the one thing a rule must never be, and no threshold repairs it. Split a **double-barreled** dimension (`harness_agnostic_and_mcp_free`) before selecting — its halves routinely land in different forms. **Write the trade down** for each dimension you author or revise, in the same record that carries the cut's reason, naming it and **what pays for it** — a trade nobody wrote is one nobody can disagree with. The duty is **yours alone**: no judge reports a missing record, so nothing catches you skipping it. **Keep a property a boolean scenario in the suite already decides out of the rubric** — author it as the boolean only, never both; scoring it as a dimension too smuggles an untradeable rule into the compensatory sum (the boolean-smuggling tell: if your rubrics begin restating booleans, the boundary was set too high). This is a **same-object** check, not same-criterion: two dimensions may share a criterion with no boolean twin deciding either without either being a smuggled boolean.
57
57
  - **Ask the span question before the trade question — a whole-output criterion is untradeable by construction.** When a graded criterion covers **the whole of what the subject produces** (a persona's voice, the fitness of the artifact as a whole), there is no *rest of the output* left to pay for weakness in it, so the compensatory sum has nothing to trade against. Author it as **one boolean `@quality` scenario**, never as a dimension — and never go hunting for a boolean twin the suite does not have; the same-object check above requires one, this does not. `@quality` names the **result axis** while `@rubric` is the orthogonal, optional **assertion form**, so a boolean `@quality` scenario is ordinary boolean Gherkin, not a new form. The boolean is strictly **stronger**: the gate requires every scenario to pass, so the property cannot be zeroed and bought back on unrelated points the way a dimension can. Do not let *"but it is graded, so it must be a `@rubric` dimension"* route you past this — that inference is exactly what failed. **The test is monadic:** read the single criterion against the output and ask *can I name an attribute of the output this criterion does not touch?* If you can, it is per-attribute and stays a dimension. Sibling dimensions tell you how the **output decomposes**; they are never what you compare the criterion against. Because span is asked **first**, a whole-output criterion authored alongside per-attribute siblings does not make the case ambiguous — the spanning one becomes the boolean and the siblings stay dimensions. A whole-output-*sounding* name (`coherence`, `clarity`, `overall_quality`) is not the test: judge what the dimension **scores**, not how broadly it is worded.
58
58
  - **Read your scenarios against each other before returning.** No two sharing a `When` may demand opposite verdicts on one constructible snapshot; narrow one `Given` to exclude the overlap. Overlap whose `Then`s agree, and scenarios whose `When`s name different operations, are not contradictions.
59
- - **On a backfill, re-derive the scenario set from the CFG's edges** — one per `(path class, edge)` pair, every guard paired with a positive companion — rather than reading the standing `.feature` and patching the gaps a diff notices. Any pre-existing suite or retired golden set is **reference only**: a claim to verify against the current configuration, never the baseline to patch (`sdd:suite-format-governance`, ADR-0029).
59
+ - **On a backfill, re-derive the scenario set from the CFG's edges** — one per `(path class, edge)` pair, every guard paired with a positive companion — rather than reading the standing `.feature` and patching the gaps a diff notices. Any pre-existing suite or retired golden set is **reference only**: a claim to verify against the current configuration, never the baseline to patch (`sdd:suite-format-governance`).
60
60
 
61
61
  4. **Pre-flight before you freeze.** Before returning the `spec.md` + `.feature`, run the produce-time pre-flight — the cheap check that stops a wrong assumption from being frozen into an already-shipped suite:
62
62
  - **Ground every asserted harness/tool behavior in the harness's own primary docs.** When a `Then` (or the `spec.md`) asserts *how a harness or tool behaves* — a flag's effect, what a field controls, when a mechanism fires — confirm it against the harness's own primary documentation before freezing. Never assert harness behavior from memory; a wrong assumption frozen into a scenario forces a re-open of a shipped suite.
@@ -24,7 +24,7 @@ The per-scenario **Checks** below are the `aced:aced-builder-spec` bar (its cano
24
24
  ## Input
25
25
 
26
26
  ```
27
- DOMAIN, DOMAIN_PATH, FEATURE_PATH, SPEC_PATH
27
+ DOMAIN, DOMAIN_PATH, FEATURE_PATH, SPEC_PATH: the domain under work, its spec folder, its .feature, and its spec.md
28
28
  SUBJECT: <full text of the agent configuration under spec, or null>
29
29
  ```
30
30
 
@@ -48,5 +48,5 @@ rationale belong in ADRs and research dossiers.
48
48
  Owned elsewhere and referenced from these documents: `plugin-design`, `slash-invocation`, and
49
49
  `universal-plugin` ship from the `universal-plugin` package.
50
50
 
51
- See [ADR-0035](../../../docs/adr/0035-authored-governances-ship-as-package-files.md) for why these
51
+ See [ADR-0035](https://github.com/cyberuni/cyber-sdd/blob/main/docs/adr/0035-authored-governances-ship-as-package-files.md) for why these
52
52
  ship as package files rather than as governance skills.
@@ -123,8 +123,10 @@ When a skill includes `scripts/` or documents CLI commands agents run, load **ag
123
123
  ### Frontmatter
124
124
 
125
125
  - `name` must match the parent directory name exactly.
126
- - `description` must contain `"Use this skill when"` or `"When to use"` trigger language — **unless the skill is name-only**, whose `description` is exactly `"By name only"` and carries no trigger language at all.
127
- - Keep `description` ≤120 characters — long descriptions are truncated in the agent context window.
126
+ - `description` of a situationally triggered skill states what the skill does, then when it applies — the situations, requests, and implicit phrasings that should select it. Lead with the capability, in third person.
127
+ - Do not open the `description` with a fixed lead-in such as `"Use this skill when"` or `"When to use"`. A trigger clause after the capability (`"… Use when …"`) is fine; no particular phrase is required.
128
+ - A **name-only** skill's `description` is exactly `"By name only"` and carries no capability or trigger text at all.
129
+ - Keep `description` ≤1024 characters — the agentskills.io hard limit. Put the capability and the main triggers first; listings may truncate the tail.
128
130
  - `compatibility` — optional; declare environment constraints (required tools, network access, OS, runtime version). Include only when the skill has requirements the agent cannot assume.
129
131
 
130
132
  #### Runtime fields
@@ -180,7 +182,7 @@ The `activation` field belongs in **SKILL.md frontmatter** as a **top-level fiel
180
182
  ---
181
183
  name: my-skill
182
184
  activation: per-situation
183
- description: "Use this skill when..."
185
+ description: "<what it does>. Use when <situations>."
184
186
  ---
185
187
  ```
186
188
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cyber-aced",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Agent Config Evaluation & Development. Spec, evaluate, and improve agent configurations: skills, AGENTS.md sections, subagent definitions, and commands.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,7 +24,7 @@
24
24
  "!skills/**/*.test.mts"
25
25
  ],
26
26
  "dependencies": {
27
- "@cyberuni/agent-harness": "0.5.0"
27
+ "@cyberuni/agent-harness": "0.6.0"
28
28
  },
29
29
  "publishConfig": {
30
30
  "access": "public"
@@ -1,6 +1,6 @@
1
1
  ---
2
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."
3
+ description: "By name only"
4
4
  user-invocable: false
5
5
  metadata:
6
6
  actor: architect
@@ -1,6 +1,6 @@
1
1
  ---
2
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."
3
+ description: "By name only"
4
4
  user-invocable: false
5
5
  metadata:
6
6
  actor: builder
@@ -29,7 +29,7 @@ agent level.
29
29
  - **Run policy is explicit — from `eval.md`.** Read the `eval:` block: `@trigger` scenarios run
30
30
  `eval.trigger.runs` against `eval.trigger.activation_threshold` (accuracy); `@behavior`/`@quality`
31
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,
32
+ scored by `eval.judge.model`. Defaults when omitted: model the session's current model, default_threshold 4,
33
33
  trigger activation_threshold 0.5, trigger runs 3.
34
34
  - **Collapse to a boolean.** A scenario passes when its aggregate **total across the rubric's named
35
35
  dimensions** ≥ `threshold` and no must-not-do was triggered (trigger scenarios: accuracy ≥
@@ -1,6 +1,6 @@
1
1
  ---
2
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."
3
+ description: "By name only"
4
4
  user-invocable: false
5
5
  metadata:
6
6
  actor: builder
@@ -78,8 +78,8 @@ bar. Two criteria below are **conditional on tier**; a **missing** `**Fit:**` de
78
78
  - **The test is monadic.** Read the **single** criterion against the output: *can you name an
79
79
  attribute of the output this criterion does not touch?* If you can, it is per-attribute and stays
80
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.
81
+ of the comparison. Comparing one candidate dimension against another is the twin-scan the
82
+ suite format rejects, on this ground exactly as much as on Ground 2.
83
83
  - **Span is checked before substitutability.** A whole-output criterion never reaches the trade
84
84
  question. So when one is authored **alongside** per-attribute siblings — the shape the
85
85
  persona-voice recurrence actually took — the span ruling governs the spanning criterion and the
@@ -99,9 +99,8 @@ bar. Two criteria below are **conditional on tier**; a **missing** `**Fit:**` de
99
99
  `only` bounds Ground 2's own test, not selection as a whole, so it never licenses passing a
100
100
  criterion that fails Ground 1. Two `@rubric` dimensions that merely
101
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
102
+ it — comparing two dimensions to each other is the twin-scan the suite format rejects; the
103
+ discrimination verdict (noise, not a hole) and this Selection verdict (a smuggled boolean, out of the sum) are orthogonal reads of one
105
104
  dimension.
106
105
  - **Discrimination** *(all tiers; every scenario and every `@rubric` dimension).* Each must be able
107
106
  to **register a miss** — a plausible wrong config must fail it, or score below the dimension's
@@ -126,5 +125,5 @@ bar. Two criteria below are **conditional on tier**; a **missing** `**Fit:**` de
126
125
  Validate-section coverage requires a scenario for.
127
126
  - `sdd:suite-format-governance` — the miss test, the wrong-subject table, the three anti-patterns,
128
127
  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.
128
+ - `design/test-levels.md` — the boolean-smuggling tell and the same-object, not same-criterion,
129
+ reconciliation the Selection bullet encodes.
@@ -1,6 +1,6 @@
1
1
  ---
2
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."
3
+ description: "By name only"
4
4
  user-invocable: false
5
5
  metadata:
6
6
  type: governance
@@ -35,7 +35,7 @@ name-only description) makes no activation decision, so it is never `strong`.
35
35
  ## How each role uses it
36
36
 
37
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:
38
+ `**Fit:** strong | partial` line in the subject's node spec (its `spec.md`) `## Use Cases`. Then author to the tier:
39
39
  `strong` → author should-trigger + same-keyword near-miss; `partial` → author behavior/edge/rule,
40
40
  **no fabricated near-miss**; `wrong-squad` → **recuse**, produce nothing, recommend the SDD default.
41
41
  - **`aced-spec-validator` (judge, gate) — enforces.** Read the declared tier; apply trigger-context /
@@ -83,7 +83,7 @@ is **not** a `CONTENT_GAP` (unlike the tier's).
83
83
  Assertions about **the subject being classified**, run by the producer before handoff and re-run by
84
84
  the cold judge against the artifact — never against the producer's account of what it did:
85
85
 
86
- 1. The subject's node spec (`README.md`) carries exactly one `**Fit:** strong` or `**Fit:** partial`
86
+ 1. The subject's node spec (`spec.md`) carries exactly one `**Fit:** strong` or `**Fit:** partial`
87
87
  line; a subject recused as wrong-squad has neither a `**Fit:**` line nor an ACED
88
88
  `eval.md` (its node, if any, was written by the SDD-default chain). *(mechanical)*
89
89
  2. A subject declared `strong` does not have a name-only description (one beginning `By name only`
@@ -98,8 +98,7 @@ the cold judge against the artifact — never against the producer's account of
98
98
 
99
99
  ## References
100
100
 
101
- - `design/fit.md` (`.agents/specs/aced/design/fit.md`) — the normative model + ADR 0001 (tier) and
102
- ADR 0003 (measured axis).
101
+ - `design/fit.md` (`.agents/specs/aced/design/fit.md`) — the normative model (tier and measured axis).
103
102
  - `aced:aced-builder-spec` — the spec bar whose trigger-context / trigger-balance criteria this
104
103
  governance makes conditional.
105
104
  - `aced:aced-builder-impl` — the impl bar (which eval layers get evals follows the tier).
@@ -1,6 +1,6 @@
1
1
  ---
2
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."
3
+ description: "By name only"
4
4
  user-invocable: false
5
5
  metadata:
6
6
  actor: producer
@@ -13,7 +13,7 @@ Diagnose failing eval cases and propose targeted edits to the target agent confi
13
13
 
14
14
  ## Role: the ACED impl-producer
15
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.
16
+ When the conductor dispatches `define-agent`, `define-skill`, or `define-governance` as a generic builder (`produced-by sdd: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
17
 
18
18
  ## Load context
19
19
 
@@ -23,7 +23,7 @@ and its colocated `eval.md` (subject + run policy):
23
23
  - Read `eval.md` for the `subject` agent configuration path and the `eval:` run policy
24
24
  - Read the `subject` agent configuration in full
25
25
  - Read the frozen `<node>.feature` (the eval source)
26
- - Read the most recent result file from `results/` (sort by filename descending, take first)
26
+ - Read the most recent result file from `.agents/aced/results/<target-slug>/` (sort by filename descending, take first)
27
27
 
28
28
  If no results exist, run `run` first.
29
29
 
@@ -54,7 +54,7 @@ For each pattern, propose a concrete change to the agent configuration. Show exa
54
54
  Examples of edit types:
55
55
 
56
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
57
+ - **Missing step** → state the step and why it matters; break it into sub-steps if it is compound
58
58
  - **Ambiguous rule** → replace vague language ("prefer X") with decision rule ("use X when Y, use Z when W")
59
59
  - **Conflicting instruction** → add explicit precedence rule or split into separate instructions
60
60
  - **Description mismatch** → align `description:` to match what the body actually instructs
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: check-freshness
3
- description: "Partial Skill: invoke by name only — the ACED eval-result freshness check — decides whether a recorded result still describes the configuration on disk, not user-triggered."
3
+ description: "By name only"
4
4
  user-invocable: false
5
5
  metadata:
6
6
  internal: true
@@ -70,7 +70,7 @@ about what it measured.
70
70
 
71
71
  **Trust boundary.** `evaluated` is what the run **reports** consuming, not a verified trace. An
72
72
  under-reporting run records a shorter set whose entries all match, and this answers `current` with
73
- full confidence — a silent failure pointing the unsafe way (`#475`). What is checkable is
73
+ full confidence — a silent failure pointing the unsafe way. What is checkable is
74
74
  **coherence**: a set omitting the `.feature` whose scenarios the record scores, or the configuration
75
75
  its own `target` names, contradicts the record it accompanies and reads `absent`. That catches only
76
76
  an *inconsistent* under-reporter; a uniform one escapes.
@@ -81,8 +81,7 @@ it should have" is not, and this engine never claims the second.
81
81
  ## Boundaries
82
82
 
83
83
  Scores nothing (`run`), compares no two versions (`compare`), rolls nothing up (`report`), and does
84
- not judge whether a recorded *pass* was well-founded (a judge-protocol question, `#477`). It decides
85
- a verdict and reports it; **what a caller does with that verdict is the caller's** — wiring `run` and
86
- `improve` to consult it is `#476`.
84
+ not judge whether a recorded *pass* was well-founded (a judge-protocol question). It decides
85
+ a verdict and reports it; **what a caller does with that verdict is the caller's**.
87
86
 
88
87
  Spec: `.agents/specs/aced/eval-run/check-freshness/`.
@@ -7,7 +7,7 @@ description: 'Use this skill when the user wants to create or improve an agent d
7
7
 
8
8
  Create or improve an agent definition — a named role encoded in a single file.
9
9
 
10
- When the conductor dispatches this skill as a generic builder (`produced-by sdd:automaton`) for the ACED **impl-producer** role (implement mode, against a frozen `.feature`), it builds the **agent definition** 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 — so no separate eval suite is authored here; `eval.md` carries only the `subject` binding and run policy. 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`). (Invoked standalone — no frozen `.feature` — only the agent definition is produced.) If the impl-judge reports scenario failures, load `aced-impl-producer` to run the diagnose-and-refine loop rather than re-deriving it here.
10
+ When the conductor dispatches this skill as a generic builder (`produced-by sdd:sdd-automaton`) for the ACED **impl-producer** role (implement mode, against a frozen `.feature`), it builds the **agent definition** 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 — so no separate eval suite is authored here; `eval.md` carries only the `subject` binding and run policy. 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`). (Invoked standalone — no frozen `.feature` — only the agent definition is produced.) If the impl-judge reports scenario failures, load `aced-impl-producer` to run the diagnose-and-refine loop rather than re-deriving it here.
11
11
 
12
12
  ## First: confirm an agent definition is the right artifact
13
13
 
@@ -103,7 +103,7 @@ The canonical file lives at the canonical path. All runtime locations are symlin
103
103
 
104
104
  Ask the user:
105
105
 
106
- 1. **Name** — kebab-case slug (e.g. `conductor`, `code-reviewer`). If the agent's role is to **score or verify a specific gate or case**, name it by that gate/scope, not a bare action verb: `<domain>-<gate>-judge` for a gate scorer (e.g. `sdd-impl-judge`, `aced-impl-judge`), `<domain>-case-judge` for a case scorer (e.g. `aces-case-judge`). Flag any gate/case scorer whose name is not in that form — bare verdict verbs (`implementer`, `judge`, `validator`, `reviewer`, `checker`) and non-verdict action names (`eval-runner`, `grader`) alike. A producer/worker agent (e.g. `scenario-writer`, `doc-writer`) keeps its action-oriented name — this convention only applies to gate/case scorers.
106
+ 1. **Name** — kebab-case slug (e.g. `conductor`, `code-reviewer`). If the agent's role is to **score or verify a specific gate or case**, name it by that gate/scope, not a bare action verb: `<domain>-<gate>-judge` for a gate scorer (e.g. `sdd-impl-judge`, `aced-impl-judge`), `<domain>-case-judge` for a case scorer (e.g. `aced-case-judge`). Flag any gate/case scorer whose name is not in that form — bare verdict verbs (`implementer`, `judge`, `validator`, `reviewer`, `checker`) and non-verdict action names (`eval-runner`, `grader`) alike. A producer/worker agent (e.g. `scenario-writer`, `doc-writer`) keeps its action-oriented name — this convention only applies to gate/case scorers.
107
107
  2. **Role** — one sentence: "You are a [seniority] [role] focused on [bounded concern]."
108
108
  3. **Responsibilities** — what does this agent do? (3–6 bounded concerns)
109
109
  4. **Output format** — what does it produce? (file, report, JSON, confirmation, etc.)
@@ -8,7 +8,7 @@ description: 'Use this skill when the user wants to create or improve a command
8
8
  Create or improve a **command** — a workflow the user invokes explicitly via `/name`, never
9
9
  triggered automatically by the model.
10
10
 
11
- When the conductor dispatches this skill as a generic builder (`produced-by sdd:automaton`) for the
11
+ When the conductor dispatches this skill as a generic builder (`produced-by sdd:sdd-automaton`) for the
12
12
  ACED **impl-producer** role (implement mode, against a frozen `.feature`), it builds the **command
13
13
  file** to pass the frozen suite. The **verification is the frozen `.feature` itself** — its inline
14
14
  `@rubric` scenarios and `@trigger` `Examples`, authored by `aced-scenario-writer` at explore — so no
@@ -51,7 +51,7 @@ harnesses to target if not stated):
51
51
  | Mechanism | File | Portability | When to pick it |
52
52
  |---|---|---|---|
53
53
  | **`commands/` folder** (legacy) | A standalone markdown file, not a `SKILL.md` | Widest support — Claude Code, and GitHub Copilot CLI (reads `.claude/commands/`); the only option for cross-harness plugin commands targeting Cursor too | Default choice; use for anything shipped in a plugin or targeting more than Claude Code |
54
- | **`disable-model-invocation: true`** (modern) | A `SKILL.md` with the frontmatter flag | Claude Code, Windsurf; **not** Copilot CLI, Codex CLI, or Gemini CLI; has a known Cursor bug hiding plugin-delivered skills from the `/` menu (Mar 2026) | Only when targeting Claude Code / Windsurf exclusively and the command benefits from full `SKILL.md` progressive disclosure (a `references/` or `scripts/` dir) |
54
+ | **`disable-model-invocation: true`** (modern) | A `SKILL.md` with the frontmatter flag | Claude Code, Windsurf; **not** Copilot CLI, Codex CLI, or Gemini CLI; may not surface plugin-delivered skills in Cursor's `/` menu — verify before relying on it | Only when targeting Claude Code / Windsurf exclusively and the command benefits from full `SKILL.md` progressive disclosure (a `references/` or `scripts/` dir) |
55
55
 
56
56
  If improving an existing file, read it first and keep its current mechanism unless the user asks to
57
57
  migrate.
@@ -135,7 +135,7 @@ For the `disable-model-invocation` mechanism, run the structural audit and fix a
135
135
  finding before presenting the skill:
136
136
 
137
137
  ```bash
138
- npx cyberplace@0.2.4 audit validate --path <placement-dir>/<name> # resolve <version> via: npm view cyberplace version — never @latest
138
+ npx cyberplace@<version> audit validate --path <placement-dir>/<name> # resolve <version> via: npm view cyberplace version — never @latest
139
139
  ```
140
140
 
141
141
  The `commands/` folder mechanism is not a `SKILL.md` — the audit tool does not apply; check by hand
@@ -59,7 +59,7 @@ Write the file at the canonical path using this structure:
59
59
  ```markdown
60
60
  ---
61
61
  name: <name>
62
- description: "Partial Skill: invoke by name only — <one sentence: what domain this governs and who loads it>"
62
+ description: "By name only"
63
63
  user-invocable: false
64
64
  metadata:
65
65
  type: governance
@@ -90,7 +90,7 @@ dimensions already are the verification.>
90
90
 
91
91
  Rules for the body:
92
92
  - Set `user-invocable: false` — the classifier for a partial skill (a governance is loaded by name, never user-triggered)
93
- - Lead `description` with the `"Partial Skill:"` prefix (recommended form `"Partial Skill: invoke by name only — …"`) — a self-declaration for the reader; keep it minimal and non-trigger-shaped so the harness (which still sees the description) does not auto-match it
93
+ - Set `description` to exactly `"By name only"` — the harness still sees the description, so anything added is another handle for a spurious match; put identity and caller in the body
94
94
  - Do not include `## Why`, `## Rationale`, or causal prose — put that in ADRs
95
95
  - Encode decisions and criteria, not facts the model already knows
96
96
  - For a **Constraint set**, **Checklist**, or **Decision table** governance, write a `## Validate`
@@ -24,7 +24,7 @@ The skill walks you through the shape before writing anything:
24
24
  3. **Pattern** — process, tool-based, or standard (personas go to `define-agent`)
25
25
  4. **Placement** — user-global, project-private, or project-public, plus which runtime symlinks to create
26
26
 
27
- It then drafts the SKILL.md (kebab-case name, a 150–400 char trigger-bearing description, a step body under the size bar), adds a README for a public skill, runs the structural audit and fixes CRITICAL/HIGH findings, and points you at the ACED eval loop (`start-mission` / `add-scenario` / `run`) to spec and score it.
27
+ It then drafts the SKILL.md (kebab-case name, a description that leads with the capability and then says when it applies, ≤1024 chars, a step body under the size bar), adds a README for a public skill, runs the structural audit and fixes CRITICAL/HIGH findings, and points you at the ACED eval loop (`start-mission` / `add-scenario` / `run`) to spec and score it.
28
28
 
29
29
  ## Enhanced from create-skill
30
30
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: define-skill
3
- description: 'Use this skill when the user wants to create, scaffold, or formalize a workflow skill — a process, tool-based, or standard SKILL.md — from scratch or from an existing ad-hoc workflow. Trigger on "create a skill", "write a skill for X", "I want a skill that…", "turn this workflow into a skill", or "help me build this skill", even if they do not say "skill" explicitly. Not for agent definitions or personas (define-agent), reference-only rule sets (define-governance), or extracting the current session (skillify).'
3
+ description: 'Creates, scaffolds, or formalizes a workflow skill — a process, tool-based, or standard SKILL.md — from scratch or from an existing ad-hoc workflow. Use when the user asks for one — "create a skill", "write a skill for X", "I want a skill that…", "turn this workflow into a skill", "help me build this skill" — even if they do not say "skill" explicitly. Not for agent definitions or personas (define-agent), reference-only rule sets (define-governance), or extracting the current session (skillify).'
4
4
  ---
5
5
 
6
6
  # Define Skill
@@ -8,7 +8,7 @@ description: 'Use this skill when the user wants to create, scaffold, or formali
8
8
  Create or improve a **workflow skill** — a process, tool-based, or standard SKILL.md — then hand it
9
9
  to the ACED eval loop to spec and score.
10
10
 
11
- When the conductor dispatches this skill as a generic builder (`produced-by sdd:automaton`) for the
11
+ When the conductor dispatches this skill as a generic builder (`produced-by sdd:sdd-automaton`) for the
12
12
  ACED **impl-producer** role (implement mode, against a frozen `.feature`), it builds the **SKILL.md**
13
13
  to pass the frozen suite. The **verification is the frozen `.feature` itself** — its inline `@rubric`
14
14
  scenarios and `@trigger` `Examples`, authored by `aced-scenario-writer` at explore — so no separate
@@ -45,16 +45,16 @@ skill here.
45
45
 
46
46
  ## Load the governance
47
47
 
48
- Before writing content, load the **skill-design** governance and read stdout as the authoritative
49
- rules for principles, progressive disclosure, description structure, and when to extract deterministic
50
- logic to a script:
48
+ Before writing content, load the **skill-design** governance as the authoritative rules for
49
+ principles, progressive disclosure, description structure, and when to extract deterministic logic to
50
+ a script. Read the first that exists:
51
51
 
52
- ```bash
53
- npx cyberplace@0.2.4 governance show skill-design # resolve <version> via: npm view cyberplace version — never @latest
54
- ```
52
+ 1. `.agents/governances/skill-design.md` — a project override
53
+ 2. `references/governances/skill-design.md` in this skill — the default copy
55
54
 
56
55
  If the skill will ship a `scripts/` directory or document CLI commands agents run, also load
57
- **agent-tool-output** for stdout / JSON / non-interactive / stderr rules.
56
+ **agent-tool-output** the same way (`references/governances/agent-tool-output.md`) for stdout / JSON /
57
+ non-interactive / stderr rules.
58
58
 
59
59
  ## Settle the shape — five questions
60
60
 
@@ -129,12 +129,13 @@ description: <capability> + "Use when <trigger>" + an implicit-phrasing example
129
129
  2. <step>
130
130
  ```
131
131
 
132
- - **Description** — the only field loaded at startup; it carries the whole triggering burden. Target
133
- 150–400 characters (≤1024 hard limit): capability + "Use when…" + an implicit phrasing. For a
134
- **partial skill** (a reusable part other skills call by name, not user-triggered), set
135
- `user-invocable: false` and lead the description with the `"Partial Skill:"` prefix (recommended
136
- form `"Partial Skill: invoke by name only — <identity>. <caller>."`), kept minimal and
137
- non-trigger-shaped so it does not self-activate.
132
+ - **Description** — the only field loaded at startup; it carries the whole triggering burden. Lead
133
+ with the capability, then a "Use when…" trigger clause, then an implicit phrasing. Never open with a
134
+ fixed lead-in such as "Use this skill when" or "When to use". Keep it ≤1024 characters, the
135
+ capability and main triggers first. For a
136
+ **name-only skill** (a reusable part other skills call by name, never matched to a situation), set
137
+ `user-invocable: false` and the description to exactly `"By name only"` and nothing else; identity
138
+ and caller go in the body.
138
139
  - **Body** — step-by-step, under 500 lines. Keep the *when* here; move any **deterministic,
139
140
  fixed-output** step to a `scripts/` file or an existing CLI and have the body only say when to run
140
141
  it.
@@ -162,11 +163,11 @@ is `improve`.
162
163
  For a subagent this skill scaffolds (realized as a partial skill, e.g. loaded via the ACED
163
164
  impl-producer/impl-judge pattern): if its role is to **score or verify a specific gate or case**,
164
165
  name it by that gate/scope, not a bare action verb — `<domain>-<gate>-judge` for a gate scorer (e.g.
165
- `aced-impl-judge`), `<domain>-case-judge` for a case scorer (e.g. `aces-case-judge`). Reject
166
+ `aced-impl-judge`), `<domain>-case-judge` for a case scorer (e.g. `aced-case-judge`). Reject
166
167
  `implementer`, `judge`, `validator`, `reviewer`, `checker` alone. A producer subagent (e.g.
167
168
  `scenario-writer`, `doc-writer`) keeps its action-oriented name — this check does not fire for it.
168
169
 
169
- Evaluate this **in-skill quality check** — separate from the mechanical `audit validate` below — before
170
+ Evaluate this **in-skill quality check** — separate from the mechanical structural audit below — before
170
171
  handing the skill back: a drafted gate/case scorer named with a bare action verb is a **HIGH** severity
171
172
  finding; fix it (rename to the gate-and-scope form) before presenting the skill.
172
173
 
@@ -175,9 +176,11 @@ finding; fix it (rename to the gate-and-scope form) before presenting the skill.
175
176
  Run the structural audit and fix any CRITICAL or HIGH finding **before** presenting the skill:
176
177
 
177
178
  ```bash
178
- npx cyberplace@0.2.4 audit validate --path <placement-dir>/<name>
179
+ node "<improve-skill>/scripts/validate.mts" --path <placement-dir>/<name>
179
180
  ```
180
181
 
182
+ Replace `<improve-skill>` with the directory of the `improve-skill` skill installed beside this one.
183
+
181
184
  For a fuller pass, invoke the `improve-skill` skill. Do not present a skill with an
182
185
  open CRITICAL finding.
183
186
 
@@ -0,0 +1,86 @@
1
+ # Agent Tool Output
2
+
3
+ Rules for scripts, hooks, and CLIs that AI agents invoke. Apply when authoring skill `scripts/` or documenting CLI commands in SKILL.md.
4
+
5
+ ## Agent-native tools
6
+
7
+ Use for skill `scripts/`, hook runtime commands, and any tool where the primary consumer is always an agent.
8
+
9
+ ### Stdout is the machine contract
10
+
11
+ - Emit **one JSON value** per run, or silence on success with no payload.
12
+ - Use `process.stdout.write(JSON.stringify(result) + '\n')` — never `console.log` for contract output.
13
+ - No prose, tables, progress bars, or ANSI decoration on stdout in default mode.
14
+
15
+ ### Stderr is human/diagnostic
16
+
17
+ - Use `console.warn`, `console.error`, or `process.stderr.write` for diagnostics.
18
+ - Gate tables, progress, and verbose human output behind a `--verbose` flag.
19
+
20
+ ### Files hold durable state
21
+
22
+ - Write artifacts to disk; stdout JSON names paths or fields only.
23
+ - Agents read artifact files by path (from stdout JSON or SKILL.md), not by scraping stdout prose.
24
+
25
+ ### Skills present; tools record
26
+
27
+ - SKILL.md tells the agent which file or JSON field to read.
28
+ - The agent summarizes results for the user — the tool does not format user-facing prose on stdout.
29
+
30
+ ### Autonomous runs
31
+
32
+ - Document `--yes` or an equivalent non-interactive flag when the tool can prompt.
33
+ - Never put interactive prompts on stdout.
34
+ - Agents must be able to run the tool without human input.
35
+
36
+ ### Exit codes
37
+
38
+ - `0` = success.
39
+ - Non-zero = failure; include a concise error on stderr.
40
+
41
+ ## Dual-audience CLI
42
+
43
+ Use for command-line tools used by both humans and agents.
44
+
45
+ ### Default stdout = human-readable
46
+
47
+ - Tables, aligned fields, and prose summaries are fine for interactive terminal use.
48
+
49
+ ### `--format agent` = agent contract
50
+
51
+ - Agents **must** pass `--format agent` when they need output optimized for LLM reasoning.
52
+ - `--format agent` stdout is terse, structured text — lower token cost and better reasoning than JSON.
53
+ - `--format json` is for non-LLM machine consumers (scripts, pipelines, database inserts).
54
+ - SKILL.md must instruct agents to use `--format agent`, not to parse default prose or tables.
55
+ - `--json` is a deprecated alias for `--format json`, accepted for backward compatibility but not shown in `--help`.
56
+
57
+ ### Default-stdout exception
58
+
59
+ - When a tool documents **default stdout** as the machine contract (not `--json`), SKILL.md must say so explicitly.
60
+ - Do not assume default stdout is parseable for arbitrary CLIs.
61
+
62
+ ### Stderr and verbosity
63
+
64
+ - Errors and validation failures go to stderr.
65
+ - Optional human status (dry-run summaries, registration tables) goes to stderr when `--verbose` is set.
66
+
67
+ ### Same non-interactive and exit-code rules
68
+
69
+ - Document `--yes` / non-interactive paths where prompts exist.
70
+ - Exit `0` on success; non-zero on failure.
71
+
72
+ ## SKILL.md authoring
73
+
74
+ When a skill documents commands agents run:
75
+
76
+ - Tell agents which flag to use: `--format agent` for LLM consumption, `--format json` for non-LLM machine consumers.
77
+ - Do **not** instruct agents to parse default stdout prose, summary tables, or generic "script output" as data.
78
+ - Prefer: "read `<artifact-path>`" or "run with `--format agent`" or "run with `--format json` and parse the array."
79
+
80
+ ## References
81
+
82
+ Related governances (load on demand; read stdout as authoritative):
83
+
84
+ ```bash
85
+ npx cyberplace@<version> governance show skill-design
86
+ ```