@event4u/agent-config 8.8.0 → 8.10.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 (215) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +139 -263
  3. package/README.md +5 -5
  4. package/dist/agent-src/commands/agent-handoff.md +39 -2
  5. package/dist/agent-src/commands/cost/report.md +13 -3
  6. package/dist/agent-src/commands/research/deep.md +8 -0
  7. package/dist/agent-src/commands/research/report.md +7 -0
  8. package/dist/agent-src/commands/roadmap/create.md +12 -0
  9. package/dist/agent-src/commands/roadmap/process-full.md +31 -5
  10. package/dist/agent-src/commands/tests/create.md +28 -6
  11. package/dist/agent-src/commands/work.md +33 -0
  12. package/dist/agent-src/commands/worktree/cleanup.md +78 -0
  13. package/dist/agent-src/commands/worktree/create.md +62 -0
  14. package/dist/agent-src/commands/worktree/status.md +63 -0
  15. package/dist/agent-src/commands/worktree/verify.md +70 -0
  16. package/dist/agent-src/commands/worktree.md +85 -0
  17. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +30 -1
  18. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +60 -31
  19. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +37 -0
  20. package/dist/agent-src/contexts/execution/subagent-topologies.md +34 -0
  21. package/dist/agent-src/contexts/execution/verification-mechanics.md +9 -9
  22. package/dist/agent-src/rules/agent-authority.md +1 -1
  23. package/dist/agent-src/rules/communication-through-line.md +1 -1
  24. package/dist/agent-src/rules/delegation-policy.md +5 -0
  25. package/dist/agent-src/rules/design-fidelity.md +40 -0
  26. package/dist/agent-src/rules/direct-answers.md +1 -1
  27. package/dist/agent-src/rules/downstream-changes.md +1 -0
  28. package/dist/agent-src/rules/external-code-graph-interop.md +65 -0
  29. package/dist/agent-src/rules/git-history-discipline.md +18 -0
  30. package/dist/agent-src/rules/lethal-trifecta-guard.md +6 -1
  31. package/dist/agent-src/rules/minimal-safe-diff.md +58 -10
  32. package/dist/agent-src/rules/non-destructive-by-default.md +3 -0
  33. package/dist/agent-src/rules/question-not-instruction.md +76 -0
  34. package/dist/agent-src/rules/senior-engineering-discipline.md +1 -1
  35. package/dist/agent-src/rules/spreadsheet-source-quality.md +61 -0
  36. package/dist/agent-src/rules/think-before-action.md +1 -0
  37. package/dist/agent-src/rules/tool-safety.md +8 -0
  38. package/dist/agent-src/rules/untrusted-input-defense.md +87 -22
  39. package/dist/agent-src/scripts/update_roadmap_progress.ts +2 -1
  40. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +19 -0
  41. package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +15 -0
  42. package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +10 -3
  43. package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +13 -0
  44. package/dist/agent-src/skills/api-testing/SKILL.md +15 -1
  45. package/dist/agent-src/skills/character-consistency/evals/evals.json +16 -0
  46. package/dist/agent-src/skills/code-review/SKILL.md +2 -0
  47. package/dist/agent-src/skills/command-routing/evals/evals.json +14 -0
  48. package/dist/agent-src/skills/command-writing/SKILL.md +53 -40
  49. package/dist/agent-src/skills/dashboard-design/evals/evals.json +16 -0
  50. package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +29 -0
  51. package/dist/agent-src/skills/dcf-modeling/evals/evals.json +20 -0
  52. package/dist/agent-src/skills/decision-record/evals/evals.json +20 -0
  53. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +1 -0
  54. package/dist/agent-src/skills/design-intelligence/SKILL.md +49 -12
  55. package/dist/agent-src/skills/design-intelligence/evals/evals.json +14 -0
  56. package/dist/agent-src/skills/design-review/SKILL.md +35 -15
  57. package/dist/agent-src/skills/design-system-capture/SKILL.md +84 -24
  58. package/dist/agent-src/skills/design-system-capture/evals/evals.json +15 -0
  59. package/dist/agent-src/skills/developer-like-execution/evals/evals.json +16 -0
  60. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +27 -0
  61. package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +16 -0
  62. package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +16 -0
  63. package/dist/agent-src/skills/editorial-calendar/evals/evals.json +16 -0
  64. package/dist/agent-src/skills/estimate-ticket/evals/evals.json +16 -0
  65. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +30 -0
  66. package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +47 -0
  67. package/dist/agent-src/skills/fe-design/SKILL.md +36 -5
  68. package/dist/agent-src/skills/fe-design/evals/triggers.json +47 -0
  69. package/dist/agent-src/skills/forecasting/evals/domain-truth.json +29 -0
  70. package/dist/agent-src/skills/forecasting/evals/evals.json +20 -0
  71. package/dist/agent-src/skills/frontend-render-security/SKILL.md +2 -2
  72. package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +16 -0
  73. package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +16 -0
  74. package/dist/agent-src/skills/html-deck/SKILL.md +27 -0
  75. package/dist/agent-src/skills/iconography/SKILL.md +24 -0
  76. package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +16 -0
  77. package/dist/agent-src/skills/incident-commander/evals/evals.json +20 -0
  78. package/dist/agent-src/skills/launch-readiness/evals/evals.json +21 -0
  79. package/dist/agent-src/skills/logging-monitoring/evals/evals.json +16 -0
  80. package/dist/agent-src/skills/markitdown/SKILL.md +1 -0
  81. package/dist/agent-src/skills/mcp/SKILL.md +24 -0
  82. package/dist/agent-src/skills/mcp-builder/SKILL.md +9 -1
  83. package/dist/agent-src/skills/memory-consolidation/SKILL.md +55 -4
  84. package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +16 -0
  85. package/dist/agent-src/skills/messaging-architecture/evals/evals.json +16 -0
  86. package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +16 -0
  87. package/dist/agent-src/skills/pest-testing/SKILL.md +1 -1
  88. package/dist/agent-src/skills/playwright-testing/SKILL.md +16 -0
  89. package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +16 -0
  90. package/dist/agent-src/skills/refine-prompt/evals/evals.json +16 -0
  91. package/dist/agent-src/skills/refine-ticket/evals/evals.json +16 -0
  92. package/dist/agent-src/skills/release-comms/evals/evals.json +16 -0
  93. package/dist/agent-src/skills/rice-prioritization/evals/evals.json +20 -0
  94. package/dist/agent-src/skills/roadmap-writing/SKILL.md +39 -5
  95. package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +29 -0
  96. package/dist/agent-src/skills/runway-cognition/evals/evals.json +20 -0
  97. package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +29 -0
  98. package/dist/agent-src/skills/scenario-modeling/evals/evals.json +20 -0
  99. package/dist/agent-src/skills/secrets-management/SKILL.md +7 -0
  100. package/dist/agent-src/skills/skill-writing/SKILL.md +12 -3
  101. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +98 -0
  102. package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +47 -0
  103. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +27 -33
  104. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +12 -0
  105. package/dist/agent-src/skills/systematic-debugging/evals/evals.json +20 -0
  106. package/dist/agent-src/skills/test-case-discovery/SKILL.md +118 -0
  107. package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +52 -0
  108. package/dist/agent-src/skills/test-driven-development/SKILL.md +32 -6
  109. package/dist/agent-src/skills/test-driven-development/evals/evals.json +16 -0
  110. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +34 -4
  111. package/dist/agent-src/skills/threat-modeling/evals/evals.json +21 -0
  112. package/dist/agent-src/skills/typography-system/evals/evals.json +14 -0
  113. package/dist/agent-src/skills/ui-component-architect/SKILL.md +9 -0
  114. package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +40 -0
  115. package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +24 -0
  116. package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +16 -0
  117. package/dist/agent-src/skills/vision-articulation/evals/evals.json +16 -0
  118. package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +16 -0
  119. package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +180 -0
  120. package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +52 -0
  121. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  122. package/dist/agent-src/templates/roadmaps.md +36 -0
  123. package/dist/cli/registry.js +3 -0
  124. package/dist/cli/registry.js.map +1 -1
  125. package/dist/discovery/deprecation-report.md +1 -1
  126. package/dist/discovery/discovery-manifest.json +326 -67
  127. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  128. package/dist/discovery/discovery-manifest.summary.md +6 -6
  129. package/dist/discovery/orphan-report.md +1 -1
  130. package/dist/discovery/packs.json +25 -14
  131. package/dist/discovery/trust-report.md +4 -4
  132. package/dist/discovery/workspaces.json +25 -12
  133. package/dist/install/install.mjs +136 -1
  134. package/dist/mcp/registry-manifest.json +3 -3
  135. package/dist/router.json +1 -1
  136. package/dist/scripts/_lib/claude_builtin_names.js +145 -0
  137. package/dist/scripts/_lib/claude_builtin_names.js.map +1 -0
  138. package/dist/scripts/condense.js +14 -0
  139. package/dist/scripts/condense.js.map +1 -1
  140. package/docs/CLAIMS.md +36 -8
  141. package/docs/architecture.md +4 -4
  142. package/docs/archive/CHANGELOG-pre-8.9.0.md +306 -0
  143. package/docs/benchmark.md +113 -0
  144. package/docs/catalog.md +32 -8
  145. package/docs/command-flows.md +6 -1
  146. package/docs/contracts/CHANGELOG-conventions.md +6 -0
  147. package/docs/contracts/command-clusters.md +18 -0
  148. package/docs/contracts/design-artifact-lifecycle.md +93 -0
  149. package/docs/contracts/design-artifact-verification.md +153 -0
  150. package/docs/contracts/injected-block-authenticity-model.md +66 -0
  151. package/docs/contracts/mcp-tool-inventory.md +28 -28
  152. package/docs/contracts/release-pr-gating.md +26 -0
  153. package/docs/contracts/release-sizing.md +85 -0
  154. package/docs/contracts/surface-agent-contracts.md +153 -0
  155. package/docs/decisions/ADR-061-corpus-grounding-layer.md +13 -0
  156. package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +1 -1
  157. package/docs/decisions/ADR-116-memory-tripwire-activation-path.md +9 -0
  158. package/docs/distribution/consumer-matrix.md +96 -0
  159. package/docs/featured-skills.md +2 -2
  160. package/docs/getting-started-by-role.md +1 -1
  161. package/docs/getting-started.md +2 -2
  162. package/docs/governance-advantage.md +1 -1
  163. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +27 -0
  164. package/docs/guidelines/agent-infra/emphasis-budget.md +45 -0
  165. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +151 -0
  166. package/docs/guidelines/agent-infra/tool-description-as-policy.md +35 -0
  167. package/docs/guidelines/design-canon.md +1 -0
  168. package/docs/proof.md +38 -23
  169. package/docs/release-runbook.md +3 -0
  170. package/docs/second-brain-scope.md +69 -26
  171. package/docs/self-review-gate.md +51 -0
  172. package/package.json +1 -1
  173. package/src/agent-src/scripts/update_roadmap_progress.ts +2 -1
  174. package/src/scripts/_dispatch.bash +27 -0
  175. package/src/scripts/_lib/claude_builtin_names.ts +148 -0
  176. package/src/scripts/_lib/file_slicer.ts +117 -0
  177. package/src/scripts/_lib/lexical_index.ts +155 -0
  178. package/src/scripts/_lib/orchestration_record.ts +183 -0
  179. package/src/scripts/_lib/orchestration_savings.ts +114 -9
  180. package/src/scripts/_lib/retrieval_sanitize.ts +71 -0
  181. package/src/scripts/_lib/security_lint.ts +1 -0
  182. package/src/scripts/_lib/stat_index.ts +98 -0
  183. package/src/scripts/benchmark.ts +122 -0
  184. package/src/scripts/build_proof.ts +30 -17
  185. package/src/scripts/check_memory.ts +2 -0
  186. package/src/scripts/check_quality_regression.ts +51 -0
  187. package/src/scripts/check_release_adjacent_health.ts +121 -0
  188. package/src/scripts/check_roadmap_trackable.ts +3 -2
  189. package/src/scripts/check_rule_invariants.ts +275 -0
  190. package/src/scripts/condense.ts +14 -0
  191. package/src/scripts/consumer_matrix.ts +353 -0
  192. package/src/scripts/discovery_graph.ts +0 -0
  193. package/src/scripts/external_sources_denylist.json +4 -1
  194. package/src/scripts/generate_index.ts +6 -2
  195. package/src/scripts/install-hooks.sh +25 -0
  196. package/src/scripts/install.ts +35 -2
  197. package/src/scripts/learning_sidecar.ts +0 -0
  198. package/src/scripts/lint_agent_skill_names.ts +29 -0
  199. package/src/scripts/lint_changelog_rollback.ts +293 -0
  200. package/src/scripts/lint_knowledge_scale.ts +4 -3
  201. package/src/scripts/lint_roadmap_complexity.ts +124 -0
  202. package/src/scripts/lint_versioned_cache.ts +195 -0
  203. package/src/scripts/mcp_server/consumer_tool_catalog.json +2 -1
  204. package/src/scripts/mcp_server/tools.ts +24 -1
  205. package/src/scripts/measure_lexical_ranking.ts +173 -0
  206. package/src/scripts/memory_lookup.ts +0 -0
  207. package/src/scripts/orchestration_record.ts +156 -0
  208. package/src/scripts/orchestration_savings_report.ts +65 -8
  209. package/src/scripts/schemas/skill.schema.json +4 -0
  210. package/src/scripts/score_domain_truth.ts +192 -0
  211. package/src/scripts/second_brain_retrieval.ts +320 -0
  212. package/src/scripts/second_brain_run.ts +341 -0
  213. package/src/scripts/self_review_gate.test.ts +65 -0
  214. package/src/scripts/self_review_gate.ts +272 -0
  215. package/src/scripts/trigger_eval_grandfather.json +223 -224
@@ -37,53 +37,57 @@ A command is **user-invoked** and carries `disable-model-invocation: true`.
37
37
  A skill is model-invoked via description routing. If both audiences apply,
38
38
  author as a skill and add a thin command that delegates to it.
39
39
 
40
- **A command must EARN a top-level slot** — only three justifications:
41
- **flow-entry**, **state-query**, **product-surface**. Else it's a skill.
42
- Check first: [`command-clusters` § Command justification](../../../docs/contracts/command-clusters.md#command-justification--a-command-must-earn-a-top-level-slot)
40
+ **A command must EARN a top-level slot.** Only three justifications qualify:
41
+ **flow-entry**, **state-query**, or **product-surface** — everything else is a
42
+ skill. Check before authoring: [`command-clusters` § Command justification](../../../docs/contracts/command-clusters.md#command-justification--a-command-must-earn-a-top-level-slot)
43
43
  ([ADR-048](../../../docs/decisions/ADR-048-command-justification-rule.md)).
44
44
 
45
- **Categorize at creation (checklist).** New top-level command → declare
46
- `category:` (schema enum `flow-entry | state-query | product-surface`):
45
+ **Categorize at creation (checklist).** When you author a NEW top-level command,
46
+ declare its justification as a `category:` in the frontmatter — the schema enum
47
+ is `flow-entry | state-query | product-surface`:
47
48
 
48
- - [ ] **flow-entry** — daily work start (`work`, `git-commit`, `review-changes`).
49
- - [ ] **state-query** — read-only check (`agent-status`, `project-health`, `profile`).
50
- - [ ] **product-surface** — deliberately-started feature (`council`, `research`, `roadmap`).
51
- - [ ] **fits none → it's a skill.** Don't add the command.
52
- - [ ] **ambiguous?** Omit `category:` + note why — OPTIONAL (validate-when-present);
53
- deferring is intentional.
49
+ - [ ] **flow-entry** — a daily work starting point the user TYPES to begin
50
+ (`work`, `git-commit`, `review-changes`).
51
+ - [ ] **state-query** — a read-only check (`agent-status`, `project-health`, `profile`).
52
+ - [ ] **product-surface** — a feature started deliberately (`council`, `research`, `roadmap`).
53
+ - [ ] **fits none → it is a skill.** Don't add the command; author a skill.
54
+ - [ ] **genuinely ambiguous?** Omit `category:` and note why — `category:` is
55
+ OPTIONAL (validate-when-present); deferring is intentional, not forgotten.
54
56
 
55
- Sub-commands inherit the parent cluster's category — leave `category:` off them.
56
- Why optional + not yet blocking, + the upgrade trigger:
57
- [`command-category-governance`](../../../docs/contracts/command-category-governance.md).
57
+ Sub-commands (`council:debate`) inherit the parent cluster's category — leave
58
+ `category:` off them. Why optional + not yet a blocking lint, and what triggers
59
+ the upgrade: [`command-category-governance`](../../../docs/contracts/command-category-governance.md).
58
60
 
59
61
  ## Commands ARE Claude skills (projection reality)
60
62
 
61
- Every `src/agent-src/commands/{name}.md` projects to
62
- `.claude/skills/{slug}/SKILL.md` via `scripts/condense.ts`
63
+ Every command in `src/agent-src/commands/{name}.md` is projected
64
+ into `.claude/skills/{slug}/SKILL.md` by `scripts/condense.ts`
63
65
  (`generate_claude_commands`). Nested commands flatten with `-`
64
- (`council/default.md` → `council-default`). Skills + commands share the
66
+ (`council/default.md` → `council-default`). Skills and commands share the
65
67
  **same `.claude/skills/` namespace** — Claude does not distinguish them.
66
68
 
67
- Authoring consequences:
68
-
69
- * Frontmatter `description` is Claude's **routing surface**. Generic
70
- phrasing → undertriggering even with `disable-model-invocation: true`,
71
- because the in-host suggester, fuzzy search, and any tooling that
72
- scans `.claude/skills/` ranks by description match.
73
- * `disable-model-invocation: true` blocks **automatic** invocation only.
74
- It does NOT remove the command from discovery surfaces. Weak
75
- description = invisible to the suggester even when intent matches.
76
- * Trigger phrasing follows the same Iron Law as skill descriptions:
69
+ Consequences for authoring:
70
+
71
+ * The frontmatter `description` is the **routing surface** Claude reads.
72
+ Polite or generic phrasing causes undertriggering even with
73
+ `disable-model-invocation: true` set, because the in-host command
74
+ suggester, fuzzy search, and any tooling that scans `.claude/skills/`
75
+ rank by description match.
76
+ * `disable-model-invocation: true` blocks **automatic** invocation. It
77
+ does NOT remove the command from discovery surfaces. A weak description
78
+ means the command is invisible to the suggester even when the user's
79
+ intent matches.
80
+ * Trigger phrasing must follow the same Iron Law as skill descriptions:
77
81
  name 2+ trigger classes (domains, symptoms, user phrasing), end with
78
82
  the `... even when the user just says ...` tail, ≤ 200 chars. See
79
83
  `skill-writing` § 1b for the canonical before/after.
80
- * `suggestion.trigger_description` / `suggestion.trigger_context` are
81
- **separate** from frontmatter `description` — they drive the in-host
82
- suggester (`command-suggestion-policy`), not Claude's skill router.
83
- Both matter, both must be precise.
84
+ * The `suggestion.trigger_description` and `suggestion.trigger_context`
85
+ blocks are **separate** from the frontmatter `description` — they
86
+ drive the in-host suggester (`command-suggestion-policy`), not Claude's
87
+ skill router. Both matter, both must be precise.
84
88
 
85
- Bottom line: write the command's `description` as if a skill router
86
- will read it — because one will.
89
+ Bottom line: write the command's `description` as if a skill router will
90
+ read it — because one will.
87
91
 
88
92
  ## Procedure
89
93
 
@@ -205,9 +209,9 @@ multi-paragraph explanation, extract it into a skill and call it.
205
209
  ### 6. Governance baseline (when introducing a new linter check)
206
210
 
207
211
  **Advisory, reviewer-checked — no CI gate.** When the same PR adds a
208
- new check to `scripts/skill_linter.ts` (or strengthens an existing one)
209
- such that previously-clean commands now warn, the PR body MUST record
210
- the pre-existing violations on `main` in a Markdown table:
212
+ new check to `scripts/skill_linter.ts` (or strengthens an existing
213
+ one) such that previously-clean commands now warn, the PR body MUST
214
+ record the pre-existing violations on `main` in a Markdown table:
211
215
 
212
216
  ```markdown
213
217
  ### Pre-existing baseline (informational)
@@ -217,10 +221,11 @@ the pre-existing violations on `main` in a Markdown table:
217
221
  | {new_code} | N | (a) genuine fix · (b) accept · (c) check too aggressive |
218
222
  ```
219
223
 
220
- Forward-only: the new check applies to **the file under review** and to
221
- **future** edits. The baseline table is informational so reviewers can
222
- spot intent (fix-now vs. backlog) without diffing the full lint output.
223
- See `agents/evidence/analysis/lint-warning-triage.md` for the 3-bucket reference.
224
+ Forward-only: the new check applies to **the file under review** and
225
+ to **future** edits. The baseline table is informational so reviewers
226
+ can spot intent (fix-now vs. backlog) without diffing the full lint
227
+ output. See `agents/evidence/analysis/lint-warning-triage.md` for the
228
+ 3-bucket reference.
224
229
 
225
230
  ## Output format
226
231
 
@@ -299,3 +304,11 @@ Good description (trigger-shaped, outcome-focused):
299
304
  Bad description (vague, no outcome):
300
305
 
301
306
  > "PR command"
307
+
308
+ ## Encode usage policy in the description
309
+
310
+ Workflow sequencing, preconditions, ID/output provenance ("copy ids verbatim,
311
+ never from memory"), a mandatory "why" intent field, and turn-end contracts
312
+ belong INSIDE this artifact's description/frontmatter — where they fire at the
313
+ decision point — not in always-on prose. See
314
+ [`tool-description-as-policy`](../../../docs/guidelines/agent-infra/tool-description-as-policy.md).
@@ -0,0 +1,16 @@
1
+ {
2
+ "skill": "dashboard-design",
3
+ "_calibration": "Behavioural fixture (road-to-skill-eval-coverage Phase 2, default-surface). Deterministic assertions on a real output property where reliable; rubric pins the qualitative core as a known-limit (pass ratified in PR review, not a hidden judge). finding_floor n is a conservative floor, not a calibrated per-host number.",
4
+ "scenarios": [
5
+ {
6
+ "id": "design-metrics-dashboard",
7
+ "prompt": "Design a metrics dashboard for our SaaS ops team.",
8
+ "assertions": [
9
+ {
10
+ "kind": "rubric",
11
+ "criterion": "Leads with the decisions the viewer must make, groups metrics by that, uses the right chart per data shape, and avoids vanity metrics."
12
+ }
13
+ ]
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "skill": "dcf-modeling",
3
+ "domain": "finance",
4
+ "_note": "Deterministic domain-truth keys computed independently from cited standard DCF formulas (NOT the skill's own output). Authored as maintainer-ratification candidates per road-to-domain-soundness Phase 2 (blocker: domain-competence-for-answer-keys); the Phase-3 run + --write-floor ratchet-pin remain the maintainer's gate.",
5
+ "cases": [
6
+ {
7
+ "id": "gordon-terminal-value",
8
+ "scenario": "Year-6 free cash flow to the firm (FCFF) = $108M, WACC = 10%, terminal growth g = 2%. Compute the terminal value at the end of year 5 using the Gordon-growth model TV = FCFF_6 / (WACC - g). State the single figure in $M.",
9
+ "source": "Gordon-growth terminal value: TV = FCFF_{n+1} / (WACC - g) (standard DCF; e.g. Damodaran, 'Investment Valuation').",
10
+ "check": {
11
+ "kind": "deterministic",
12
+ "expected": 1350,
13
+ "tolerance": 0.5,
14
+ "rationale": "108 / (0.10 - 0.02) = 108 / 0.08 = 1,350 ($M). Step 1/Step 2 Gordon-growth terminal value."
15
+ }
16
+ },
17
+ {
18
+ "id": "pv-discount-factor",
19
+ "scenario": "An FCFF of $200M is received in year 3. WACC = 12%. Compute its present value = 200 / (1.12)^3. State the single figure in $M to two decimals.",
20
+ "source": "DCF discounting: PV = CF_t / (1 + WACC)^t (standard DCF; Damodaran, 'Investment Valuation').",
21
+ "check": {
22
+ "kind": "deterministic",
23
+ "expected": 142.36,
24
+ "tolerance": 0.1,
25
+ "rationale": "1.12^3 = 1.404928; 200 / 1.404928 = 142.36 ($M). Step 2 discounts each FCFF year by 1 / (1 + WACC)^t."
26
+ }
27
+ }
28
+ ]
29
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "skill": "dcf-modeling",
3
+ "_calibration": "Behavioural fixture (road-to-skill-eval-coverage Phase 2, default-surface). Deterministic assertions on a real output property where reliable; rubric pins the qualitative core as a known-limit (pass ratified in PR review, not a hidden judge). finding_floor n is a conservative floor, not a calibrated per-host number.",
4
+ "scenarios": [
5
+ {
6
+ "id": "dcf-terminal-value-and-sensitivity",
7
+ "prompt": "DCF this target: year-6 FCFF $108M, WACC 10%, terminal growth 2%, net debt $200M. Give enterprise + equity value and the discount-rate sensitivity.",
8
+ "assertions": [
9
+ {
10
+ "kind": "contains",
11
+ "value": "WACC"
12
+ },
13
+ {
14
+ "kind": "rubric",
15
+ "criterion": "Computes Gordon terminal value = FCFF_{n+1}/(WACC−g) = 108/0.08 = 1350, bridges EV→equity via net debt, and includes a WACC/terminal-growth sensitivity grid — never a single point estimate."
16
+ }
17
+ ]
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "skill": "decision-record",
3
+ "_calibration": "Behavioural fixture (road-to-skill-eval-coverage Phase 2, default-surface). Deterministic assertions on a real output property where reliable; rubric pins the qualitative core as a known-limit (pass ratified in PR review, not a hidden judge). finding_floor n is a conservative floor, not a calibrated per-host number.",
4
+ "scenarios": [
5
+ {
6
+ "id": "record-adr",
7
+ "prompt": "Record our decision to adopt Postgres over MySQL as an ADR.",
8
+ "assertions": [
9
+ {
10
+ "kind": "contains",
11
+ "value": "Consequences"
12
+ },
13
+ {
14
+ "kind": "rubric",
15
+ "criterion": "Uses the ADR shape — Status / Context / Decision / Consequences / Alternatives — and states the trade-off given up, not only the choice."
16
+ }
17
+ ]
18
+ }
19
+ ]
20
+ }
@@ -114,6 +114,7 @@ Load only the frameworks the user's depth bought. Each framework follows the sam
114
114
  **L4 addition:**
115
115
 
116
116
  - **Cross-source comparison** ([`comparison-matrix`](../../../docs/guidelines/agent-infra/comparison-matrix.md)) — web-search 2–3 related sources, compare SCQA across sources, identify consensus vs divergence, synthesize integrated perspective.
117
+ - **Disconfirmation + per-part grounding (pre-synthesis gate)** — run at least one search that tries to *falsify* the leading takeaway (rule alternatives in/out, not only confirm), and ground each part of the reading goal in a retrieved source before writing it. Distinct from [`verify-before-complete`](../../../src/rules/verify-before-complete.md) (completion evidence).
117
118
 
118
119
  ### Step 4: Synthesize by Goal
119
120
 
@@ -81,6 +81,14 @@ and accessibility. The register changes which corpus selections are appropriate
81
81
  (distinctive palette/typography in brand mode; predictable, semantic in product
82
82
  mode). State the register in the Design Read line below.
83
83
 
84
+ **Embedded vs standalone (a third discriminator).** UI **embedded inside a host
85
+ surface** — a widget in a slide, a card in a chat, a panel in someone else's
86
+ app — follows a **flatter charter** than a greenfield standalone page:
87
+ restrained weights, hairline borders, no atmospherics/gradients/shadows that
88
+ would fight the host. Select the register per surface (embedded → flat;
89
+ standalone → the brand/product register above) — it is a selector, not a fixed
90
+ token set (no values vendored; the host's tokens win).
91
+
84
92
  ## Design Read — articulate intent before generating
85
93
 
86
94
  Before producing any design brief or making any style selection, emit one
@@ -103,7 +111,8 @@ If `DESIGN.md` declares `## Taste Dials`, use those values. Otherwise infer
103
111
  three 1–10 dials from the brief and append them to the Design Read line
104
112
  (`… · dials V/M/D = 6/3/4`) so the user can correct them; on confirmation,
105
113
  suggest persisting to `DESIGN.md` (via `design-system-capture`). Dials are a
106
- config, not a vibe — never re-infer when `DESIGN.md` already sets them.
114
+ config, not a vibe — never re-infer when `DESIGN.md` already sets them
115
+ (no drift across sessions).
107
116
 
108
117
  **Dial Inference Table** (brief signal → Variance / Motion / Density, 1–10):
109
118
 
@@ -115,15 +124,15 @@ config, not a vibe — never re-infer when `DESIGN.md` already sets them.
115
124
  | data-dense / dashboard / admin / cockpit | 4–6 | 2–3 | 7–9 |
116
125
  | bold / playful / expressive / awards / Dribbble | 8–10 | 7–10 | 3–5 |
117
126
 
118
- **Dial → downstream levers:**
127
+ **Dial → downstream levers** (how a dial value changes generation):
119
128
 
120
129
  | Dial | Low (1–3) | High (8–10) |
121
130
  |---|---|---|
122
131
  | Variance | symmetric grids, one layout family | asymmetry, varied layout families, off-grid accents |
123
- | Motion | static / reduced-motion-first, opacity-only | choreographed scroll/stagger (GPU-only, reduced-motion alt) |
124
- | Density | generous whitespace, large spacing scale | tight spacing scale, more info per viewport |
132
+ | Motion | static / `prefers-reduced-motion`-first, opacity-only | choreographed scroll/stagger (still GPU-only, still reduced-motion alt) |
133
+ | Density | generous whitespace, large spacing scale, few items/viewport | tight spacing scale, more information per viewport |
125
134
 
126
- Dials persist in `DESIGN.md`; stack executors (`tailwind-engineer`,
135
+ Dials persist in `DESIGN.md`; the stack executors (`tailwind-engineer`,
127
136
  `react-shadcn-ui`, `blade-ui`, `flux`) read `DESIGN.md` and honour them.
128
137
 
129
138
  **Anti-Default Discipline — first-impulse check:** Before committing to any design direction, verify you are NOT defaulting to:
@@ -140,12 +149,13 @@ If any of these was the first impulse, name a different direction or explicitly
140
149
  When the brief maps to an official design system (Material Design, Fluent,
141
150
  Carbon, Polaris, GOV.UK, shadcn, Tailwind UI, Radix, etc.):
142
151
 
143
- 0. **Canon grounding first.** Brief names a system OR `components.json`/deps
144
- signal one (`@mui/material`, `antd`, `@fluentui/*`, `@carbon/*`,
145
- `@atlaskit/*`) → pull
152
+ 0. **Canon grounding first.** If the brief names a system OR
153
+ `components.json`/deps signal one (`@mui/material`, `antd`, `@fluentui/*`,
154
+ `@carbon/*`, `@atlaskit/*`), pull
146
155
  [`docs/guidelines/design-canon.md`](../../../docs/guidelines/design-canon.md),
147
- surface the matching one-liner, **offer to fetch the live spec** before
148
- committing to the system's conventions. Thin + lazy: skip for a generic brief.
156
+ surface the matching one-line summary, and **offer to fetch the live spec**
157
+ before committing to the system's conventions — rather than improvising.
158
+ The canon index is thin + lazy: do not load it for a generic, unnamed brief.
149
159
  1. **Install the real package** — do not hand-recreate its CSS or components.
150
160
  Surface the install command for the project's package manager (the
151
161
  system's official package, e.g. the shadcn CLI or the `@mui/material`
@@ -158,8 +168,8 @@ Carbon, Polaris, GOV.UK, shadcn, Tailwind UI, Radix, etc.):
158
168
  (see Design Read above); never fall back to an unnamed generic aesthetic
159
169
  (per `source-discovery-gate`: real source before guessing).
160
170
 
161
- **Grounding precedence** (per `brand-source-of-truth`): consumer brand tokens >
162
- confirmed session decisions > named canon
171
+ **Grounding precedence** (consistent with `brand-source-of-truth`): consumer
172
+ brand tokens > confirmed session decisions > named canon
163
173
  ([`design-canon.md`](../../../docs/guidelines/design-canon.md)) > generated
164
174
  corpus. Canon is a gap-filler, never an override of a registered brand value.
165
175
 
@@ -267,6 +277,33 @@ guidance + docs URLs from here instead of memory.
267
277
  already covers — audit findings outrank corpus suggestions.
268
278
  - Do NOT hide low confidence — the user signs off on the gaps too.
269
279
 
280
+ ## Diagram-type routing — route on the verb
281
+
282
+ Choose a visualization by the *intent verb*, not the noun. Count the nouns
283
+ before you draw (input-complexity triage): 1–2 → inline prose or a single
284
+ shape; 3–7 → one diagram; 8+ → split or summarize, never one dense picture.
285
+
286
+ | The user asks… | Intent | Draw |
287
+ |---|---|---|
288
+ | "how does X **work** / flow" | illustrative (intuition) | flowchart / sequence — illustrative default |
289
+ | "what is X's **architecture** / structure" | reference (structural) | structural diagram (boxes + typed edges) |
290
+ | a **cycle** / loop / lifecycle | — | a **stepper widget**, never a hand-drawn ring |
291
+ | a **DB schema / ERD** / entity relations | — | **mermaid**, never hand-placed SVG |
292
+
293
+ ### Geometric pre-checks (run BEFORE finalizing an SVG/diagram)
294
+
295
+ Ranked by failure rate — procedures, not constants:
296
+
297
+ 1. **viewBox safety** — compute the lowest + rightmost element (plus a buffer)
298
+ and set the viewBox from that; never assume the default fits.
299
+ 2. **arrow-through-box trace** — trace every arrow's path and confirm it does
300
+ not cross through an unrelated box before drawing it.
301
+ 3. **box-width-from-longest-label** — size each box from its longest label
302
+ before placing it, so text never overflows.
303
+
304
+ (Reference-only: any color/easing/frame values come from the consumer's tokens
305
+ or a maintained upstream — this skill vendors no drawn-asset corpus.)
306
+
270
307
  ## Interplay (who owns what)
271
308
 
272
309
  | Concern | Owner |
@@ -0,0 +1,14 @@
1
+ {
2
+ "skill": "design-intelligence",
3
+ "_calibration": "Behavioural fixtures (road-to-skill-eval-coverage Phase 2, rich set). Deterministic `contains` asserts the WCAG-checked-token property the skill promises; the rubric (pinned-judge known-limit) checks the corpus-grounding — a grounded brief names a concrete style/palette/type decision, not arbitrary taste.",
4
+ "scenarios": [
5
+ {
6
+ "id": "grounded-brief-fintech-dashboard",
7
+ "prompt": "Give me a grounded design brief (style, color tokens, typography, layout pattern) for a serious fintech analytics dashboard. Justify the palette's contrast.",
8
+ "assertions": [
9
+ { "kind": "contains", "value": "WCAG" },
10
+ { "kind": "rubric", "criterion": "Selects a concrete named style/archetype + a specific palette and type pairing grounded in the design corpus (not arbitrary), and states at least one anti-pattern to avoid." }
11
+ ]
12
+ }
13
+ ]
14
+ }
@@ -13,6 +13,12 @@ packs:
13
13
 
14
14
  ## When to use
15
15
 
16
+ > **Render-verification gate.** A UI verdict is gated on the
17
+ > [design-artifact verification checklist](../../../docs/contracts/design-artifact-verification.md#verification-checklist):
18
+ > where render capability exists, do not pass a design task without render
19
+ > evidence (checklist steps 1–5); where it is absent, scope the verdict to what
20
+ > was statically checked and say so — never "looks good" without evidence.
21
+
16
22
  Use this skill when:
17
23
  - Reviewing pull requests with UI changes
18
24
  - Auditing frontend components for design quality
@@ -279,6 +285,18 @@ This is especially useful when the user provides a screenshot or Figma export as
279
285
  - WCAG
280
286
  - responsive
281
287
 
288
+ ## Async-verifier pattern (keep the main context clean)
289
+
290
+ For a review that needs browser probing, use an **async background verifier**
291
+ rather than self-screenshotting inline: fork a verifier subagent with its own
292
+ view — it takes the screenshots, probes viewports, and checks states, then
293
+ **stays silent on pass and surfaces only real, actionable problems** (never
294
+ nitpicks). The main agent does not self-screenshot, so its context stays clean
295
+ for the actual review reasoning. This is an orchestration pattern —
296
+ dispatch it via [`subagent-orchestration`](../subagent-orchestration/SKILL.md)
297
+ and position it against [`verify-repair-loop`](../verify-repair-loop/SKILL.md)
298
+ (the existing verify skill); it complements them, it does not duplicate them.
299
+
282
300
  ## Gotcha
283
301
 
284
302
  - Don't review design without understanding the user's constraints (time, resources, scope).
@@ -289,27 +307,29 @@ This is especially useful when the user provides a screenshot or Figma export as
289
307
 
290
308
  Hybrid: a deterministic detector does the mechanical pattern-matching (zero
291
309
  token cost, no catalog reload); you do the judgment it cannot. After the
292
- structured phases, add an **Anti-Slop Check** section:
310
+ structured review phases, add an explicit **Anti-Slop Check** section:
293
311
 
294
- 1. **Run the detector first** — catches pattern-detectable tells so you don't
295
- eyeball or re-derive:
312
+ 1. **Run the deterministic detector first** — it catches the pattern-detectable
313
+ tells so you don't eyeball or re-derive them:
296
314
  ```
297
315
  npx tsx src/scripts/lint_design_slop.ts --dir <consumer-ui-path> --json
298
316
  ```
299
- Each finding: `rule` (`slop-v1-side-stripe`), `catalogId` (`V1`), `severity`
300
- (`P0`–`P3`), `file:line`, `message`. **Cite verbatim** — don't re-describe
301
- from the catalog. Findings are *rebuttable presumptions*: a `DESIGN.md`-gated
302
- finding is already filtered; a remaining one means intent not declared.
303
- `lint_design_slop` is **flags, never a block** (default exit 0; CI opts in via
304
- `--fail-on`).
317
+ Each finding carries `rule` (e.g. `slop-v1-side-stripe`), `catalogId`
318
+ (`V1`), `severity` (`P0`–`P3`), `file:line`, and a `message`. **Cite these
319
+ verbatim** (rule-id + catalogId + file:line) — do not re-describe them from
320
+ the prose catalog. Findings are *rebuttable presumptions*: a finding the
321
+ consumer's `DESIGN.md` gate suppresses is already filtered out; a remaining
322
+ finding means the project has not declared the pattern as intentional.
323
+ `lint_design_slop` is **flags, never a block** (default exit 0; CI opts into
324
+ failure via `--fail-on`).
305
325
  2. **Judge what the detector cannot** — load
306
326
  [`docs/guidelines/design-antipatterns.md`](../../../docs/guidelines/design-antipatterns.md)
307
- for tells needing structural/aesthetic judgment (T3 icon-tile stack, L2
308
- three-identical-card grid, V2 glassmorphism intent). List any, cite by entry
309
- ID, check the override.
310
- 3. Run the AI-slop originality self-test on the overall direction. Report
311
- pass / flag / fail + one sentence of evidence — the judgment the detector
312
- does not make.
327
+ for the tells that need structural/aesthetic judgment (e.g. T3 icon-tile
328
+ stack, L2 three-identical-card grid, V2 glassmorphism intent). List any that
329
+ appear, cite by entry ID, and check the override condition.
330
+ 3. Run the AI-slop originality self-test on the overall aesthetic direction.
331
+ Report the result (pass / flag / fail) with one sentence of evidence — this
332
+ is the human judgment the detector deliberately does not make.
313
333
 
314
334
  For the **objective quality floors** (WCAG contrast, font-size, line-length,
315
335
  reduced-motion, heading hierarchy, focus indicator), do NOT eyeball them —
@@ -194,30 +194,37 @@ Example: "Dashboard = control panel for power users, not an exploration space."
194
194
 
195
195
  ## Importing an extracted design system
196
196
 
197
- A consumer reverse-engineers an existing site/repo with any external static tool
198
- and hands the result here as a `design-system.json`. We own the **import
199
- contract**, not the crawler — the package never ships the Playwright runtime, a
200
- font-bundler, or a `.skill` auto-installer (out of scope). Full schema lazy from
201
- [`reference/design-system-json.md`](reference/design-system-json.md); read only
202
- on import.
203
-
204
- Import procedure:
205
-
206
- 1. Read `design-system.json`; reject if `source` (kind + ref + captured_at) is
207
- missing — no provenance, no import.
208
- 2. Diff every field vs the current `DESIGN.md`.
209
- 3. **Per-field confirm/merge proposal** — observed, not authoritative (mirrors
210
- `source-discovery`); never write silently.
211
- 4. Conflict with a registered brand value (confirmed `.tokens.json` / brand
212
- token) → **flag, never auto-apply** (`brand-source-of-truth`). Precedence:
213
- brand tokens > confirmed `DESIGN.md` > imported observation.
214
- 5. On accept, persist chosen fields; hand mapped DTCG fields to
215
- [`brand-to-tokens`](../brand-to-tokens/SKILL.md) / `design-tokens` for
216
- `.tokens.json` — no parallel token format.
217
-
218
- Two sources, one shape: external target → external tool emits the artifact;
219
- current repo → prefer [`existing-ui-audit`](../existing-ui-audit/SKILL.md), which
220
- emits the same shape.
197
+ A consumer can reverse-engineer an existing site/repo's look-and-feel with any
198
+ external static-extraction tool and hand the result to this skill as a
199
+ `design-system.json` artifact. We own the **import contract**, not the crawler:
200
+ the package never ships the Playwright runtime, a font-bundler, or a `.skill`
201
+ auto-installer (out of scope). Full schema is lazy-loaded from
202
+ [`reference/design-system-json.md`](reference/design-system-json.md) — read it
203
+ only when an import is requested.
204
+
205
+ **Import procedure:**
206
+
207
+ 1. Read `design-system.json`; reject it if `source` (kind + ref + captured_at)
208
+ is missing — no provenance, no import.
209
+ 2. Diff every field against the current `DESIGN.md`.
210
+ 3. Surface a **per-field confirm/merge proposal** — the artifact is *observed,
211
+ not authoritative* (mirrors `source-discovery`). Never write silently.
212
+ 4. **Conflict with a registered brand value** (a confirmed `.tokens.json` /
213
+ brand token) → **flag, never auto-apply** (`brand-source-of-truth`:
214
+ consumer brand wins). Precedence: brand tokens > confirmed `DESIGN.md` >
215
+ imported observation.
216
+ 5. On the human's accept, persist the chosen fields into `DESIGN.md`. Where the
217
+ consumer wants a token source of truth, hand the mapped DTCG fields to
218
+ [`brand-to-tokens`](../brand-to-tokens/SKILL.md) / `design-tokens` to
219
+ materialise `.tokens.json` — do not invent a parallel token format.
220
+
221
+ **Two sources, one shape:**
222
+
223
+ - **External target** (a site/repo you don't own) → an external tool emits the
224
+ artifact; import it here.
225
+ - **Current repo** → prefer [`existing-ui-audit`](../existing-ui-audit/SKILL.md);
226
+ it already inventories the codebase and can emit the same `design-system.json`
227
+ shape, so the import path is identical either way.
221
228
 
222
229
  ## How the design skills consume these documents
223
230
 
@@ -237,6 +244,59 @@ The boundary from `brand-to-tokens`:
237
244
  not 4px or 12px)
238
245
  Both are consumed together; DESIGN.md takes precedence for usage questions.
239
246
 
247
+ ## Design→dev handoff README (template)
248
+
249
+ When handing a design to implementation, emit a README a developer can build
250
+ from **without the mockup open**. Template only — no vendored values (tokens
251
+ come from the consumer's `.tokens.json` / DESIGN.md):
252
+
253
+ ```markdown
254
+ # <Feature> — implementation handoff
255
+
256
+ Fidelity: <hi-fi = pixel-recreate the mockup | lo-fi = apply the codebase's
257
+ existing design system, mockup is directional only>
258
+
259
+ ## Screens
260
+ - <screen>: components used + each component's states (default/hover/active/
261
+ disabled/empty/error/loading)
262
+
263
+ ## Interactions
264
+ - <interaction>: trigger → result, duration + easing (name the token, not a ms
265
+ literal)
266
+
267
+ ## Tokens
268
+ - Color / type / spacing / radius: reference DESIGN.md / .tokens.json — do not
269
+ inline hex or px
270
+
271
+ ## Done means
272
+ - Implementable from this README alone; every state and interaction named.
273
+ ```
274
+
275
+ Fidelity declaration is load-bearing: hi-fi vs lo-fi tells the dev whether to
276
+ recreate the mockup pixel-for-pixel or apply the existing system — the single
277
+ most common handoff ambiguity.
278
+
279
+ ## Design-system extraction floor
280
+
281
+ When the goal is to extract this repo's design system as a **reusable package
282
+ artifact** (not just DESIGN.md prose), the extraction meets this floor — the
283
+ handoff shape emitted alongside `design-system.json`
284
+ ([import contract](reference/design-system-json.md)).
285
+
286
+ - **Contract contents.** A complete extraction carries: a root guide / manifest;
287
+ token CSS (or the stack's equivalent); the typography / colour / spacing /
288
+ iconography foundations; component specimens; an asset inventory (logos, icons,
289
+ fonts); UI-kit screens; and starting-point templates where appropriate.
290
+ - **Specimen granularity.** Many small foundation cards beat one dense dump —
291
+ each specimen demonstrates ONE reusable sub-concept (a single button state,
292
+ one spacing step, one elevation level), so a consumer lifts concepts
293
+ individually rather than parsing a monolith.
294
+ - **Developer handoff bundle** (extends § Design→dev handoff README): a
295
+ high-fidelity reference, behaviour notes, the assets list, the component
296
+ mapping (design name → code component), responsive states, known caveats, and
297
+ — when the artifact is a mock — an explicit "prototype, not production code"
298
+ warning so a consumer never ships the reference verbatim.
299
+
240
300
  ## Gotcha
241
301
 
242
302
  - **Over-writing instead of diff-updating** — the most common failure.
@@ -0,0 +1,15 @@
1
+ {
2
+ "skill": "design-system-capture",
3
+ "_calibration": "Behavioural fixtures (road-to-skill-eval-coverage Phase 2, rich set). Deterministic `contains` asserts the two artifacts the skill's contract maintains (DESIGN.md + PRODUCT.md); the rubric checks it captures decisions rather than re-describing generic guidance.",
4
+ "scenarios": [
5
+ {
6
+ "id": "capture-from-repo",
7
+ "prompt": "Capture this project's design system so future sessions stay consistent: it uses a 4px spacing grid, 8px radius, a spring motion strategy, and a blue primary. Where do these decisions go?",
8
+ "assertions": [
9
+ { "kind": "contains", "value": "DESIGN.md" },
10
+ { "kind": "contains", "value": "PRODUCT.md" },
11
+ { "kind": "rubric", "criterion": "Routes the visual decisions (spacing/radius/motion/color) into DESIGN.md and interaction patterns into PRODUCT.md, and flags any TBD rather than inventing values." }
12
+ ]
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "skill": "developer-like-execution",
3
+ "_calibration": "Behavioural fixture (road-to-skill-eval-coverage Phase 2, default-surface). Deterministic assertions on a real output property where reliable; rubric pins the qualitative core as a known-limit (pass ratified in PR review, not a hidden judge). finding_floor n is a conservative floor, not a calibrated per-host number.",
4
+ "scenarios": [
5
+ {
6
+ "id": "execute-like-dev",
7
+ "prompt": "Implement this small change end-to-end the way a senior would.",
8
+ "assertions": [
9
+ {
10
+ "kind": "rubric",
11
+ "criterion": "Reads before editing, keeps the diff minimal + scoped, updates downstream callers/tests, and verifies with a real run before claiming done."
12
+ }
13
+ ]
14
+ }
15
+ ]
16
+ }
@@ -13,6 +13,12 @@ packs:
13
13
 
14
14
  ## When to use
15
15
 
16
+ > **Cross-surface handoff.** When this document consumes upstream work (research
17
+ > → document, spreadsheet → report), read the handoff envelope from
18
+ > [`surface-agent-contracts`](../../../docs/contracts/surface-agent-contracts.md#cross-surface-handoff-envelope):
19
+ > trust `verification_already_done`, honour source restrictions, and don't
20
+ > re-fetch what the source already grounded.
21
+
16
22
  Use this skill when:
17
23
 
18
24
  * User starts a substantial writing task — PRD, RFC, design doc, decision doc, technical spec, proposal
@@ -40,6 +46,27 @@ Move from a fuzzy ask to a complete document the user owns, by:
40
46
  * `save-file` and `str-replace-editor` available
41
47
  * Target path and filename agreed up front
42
48
 
49
+ ## Document format & export floor
50
+
51
+ The document surface's floor (per
52
+ [`surface-agent-contracts`](../../../docs/contracts/surface-agent-contracts.md)):
53
+
54
+ - **Choose the format by intent.** Markdown vs `.docx` vs PDF follows what the
55
+ user will DO with it — when a named format is requested, produce THAT format
56
+ via the document tooling; never silently substitute markdown for a `.docx`
57
+ request. (fixture: `ssac-docx-requested-markdown-only`.)
58
+ - **Preserve edit scope.** On an edit, change only what was asked and preserve
59
+ the rest of the document (mirrors
60
+ [`minimal-safe-diff`](../../rules/minimal-safe-diff.md)).
61
+ - **Print/PDF preserves selectable text.** Never rasterize a text-heavy document
62
+ to an image-only PDF when browser print or native export keeps the text
63
+ selectable. (fixture: `ssac-pdf-screenshot-rasterized`.)
64
+ - **Verify the output opens/exports.** Confirm the generated file opens /
65
+ round-trips
66
+ ([`design-artifact-verification`](../../../docs/contracts/design-artifact-verification.md));
67
+ where the format's tooling is absent, ship the source + say what could not be
68
+ verified rather than claiming a produced file.
69
+
43
70
  ## Procedure
44
71
 
45
72
  ### 0. Inspect existing material