@hegemonart/get-design-done 1.57.1 → 1.57.3

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 (237) hide show
  1. package/.claude-plugin/marketplace.json +26 -41
  2. package/.claude-plugin/plugin.json +23 -48
  3. package/CHANGELOG.md +139 -0
  4. package/README.md +166 -511
  5. package/SKILL.md +4 -6
  6. package/agents/README.md +33 -36
  7. package/agents/a11y-mapper.md +3 -3
  8. package/agents/component-benchmark-harvester.md +6 -6
  9. package/agents/component-benchmark-synthesizer.md +3 -3
  10. package/agents/compose-executor.md +3 -3
  11. package/agents/cost-forecaster.md +2 -2
  12. package/agents/design-auditor.md +7 -7
  13. package/agents/design-authority-watcher.md +15 -15
  14. package/agents/design-context-builder.md +4 -4
  15. package/agents/design-context-checker-gate.md +1 -1
  16. package/agents/design-discussant.md +2 -2
  17. package/agents/design-doc-writer.md +1 -1
  18. package/agents/design-executor.md +2 -2
  19. package/agents/design-figma-writer.md +2 -2
  20. package/agents/design-fixer.md +7 -7
  21. package/agents/design-integration-checker-gate.md +1 -1
  22. package/agents/design-integration-checker.md +1 -1
  23. package/agents/design-paper-writer.md +3 -3
  24. package/agents/design-pencil-writer.md +1 -1
  25. package/agents/design-planner.md +21 -0
  26. package/agents/design-reflector.md +39 -39
  27. package/agents/design-research-synthesizer.md +1 -0
  28. package/agents/design-start-writer.md +1 -1
  29. package/agents/design-update-checker.md +5 -5
  30. package/agents/design-verifier-gate.md +1 -1
  31. package/agents/design-verifier.md +52 -48
  32. package/agents/ds-generator.md +2 -2
  33. package/agents/ds-migration-planner.md +4 -4
  34. package/agents/email-executor.md +9 -9
  35. package/agents/experiment-result-ingester.md +3 -3
  36. package/agents/flutter-executor.md +5 -5
  37. package/agents/gdd-graph-refresh.md +3 -3
  38. package/agents/gdd-intel-updater.md +2 -2
  39. package/agents/motion-mapper.md +2 -2
  40. package/agents/motion-verifier.md +4 -4
  41. package/agents/pdf-executor.md +8 -8
  42. package/agents/perf-analyzer.md +17 -17
  43. package/agents/pr-commenter.md +9 -9
  44. package/agents/prototype-gate.md +2 -2
  45. package/agents/quality-gate-runner.md +1 -1
  46. package/agents/rollout-coordinator.md +3 -3
  47. package/agents/swift-executor.md +4 -4
  48. package/agents/ticket-sync-agent.md +6 -6
  49. package/agents/user-research-synthesizer.md +2 -2
  50. package/connections/connections.md +44 -45
  51. package/connections/cursor.md +72 -0
  52. package/connections/preview.md +3 -3
  53. package/hooks/first-run-nudge.cjs +171 -0
  54. package/hooks/gdd-intel-trigger.js +243 -0
  55. package/hooks/gdd-mcp-circuit-breaker.js +62 -7
  56. package/hooks/gdd-precompact-snapshot.js +50 -29
  57. package/hooks/gdd-protected-paths.js +150 -18
  58. package/hooks/gdd-risk-gate.js +93 -1
  59. package/hooks/gdd-sessionstart-recap.js +59 -24
  60. package/hooks/hooks.json +13 -4
  61. package/hooks/inject-using-gdd.cjs +188 -0
  62. package/hooks/update-check.cjs +511 -0
  63. package/package.json +9 -3
  64. package/reference/STATE-TEMPLATE.md +10 -13
  65. package/reference/audit-scoring.md +1 -1
  66. package/reference/cache-tier-doctrine.md +46 -0
  67. package/reference/config-schema.md +9 -9
  68. package/reference/i18n.md +1 -1
  69. package/reference/intel-schema.md +37 -2
  70. package/reference/meta-rules.md +4 -4
  71. package/reference/model-tiers.md +2 -2
  72. package/reference/registry.json +101 -94
  73. package/reference/runtime-models.md +11 -1
  74. package/reference/shared-preamble.md +13 -14
  75. package/reference/skill-graph.md +22 -3
  76. package/scripts/bootstrap.cjs +373 -0
  77. package/scripts/injection-patterns.cjs +58 -0
  78. package/scripts/lib/apply-reflections/incubator-proposals.cjs +57 -26
  79. package/scripts/lib/install/converters/codex-plugin.cjs +5 -2
  80. package/scripts/lib/install/converters/cursor.cjs +20 -0
  81. package/scripts/lib/issue-reporter/report-flow.cjs +1 -1
  82. package/scripts/lib/manifest/skills.json +75 -28
  83. package/scripts/lib/state/query-surface.cjs +67 -9
  84. package/scripts/lib/state/state-store.cjs +68 -26
  85. package/scripts/lib/worktree-resolve.cjs +4 -16
  86. package/sdk/cli/commands/stage.ts +17 -0
  87. package/sdk/cli/index.js +14 -0
  88. package/skills/README.md +46 -0
  89. package/skills/bootstrap-ds/SKILL.md +1 -1
  90. package/skills/cache-manager/SKILL.md +3 -3
  91. package/skills/cache-manager/cache-policy.md +1 -1
  92. package/skills/compare/SKILL.md +1 -1
  93. package/skills/design/SKILL.md +19 -0
  94. package/skills/explore/SKILL.md +11 -0
  95. package/skills/figma-write/SKILL.md +13 -2
  96. package/skills/new-cycle/SKILL.md +1 -1
  97. package/skills/paper-write/SKILL.md +54 -0
  98. package/skills/peer-cli-customize/SKILL.md +0 -1
  99. package/skills/peers/SKILL.md +1 -1
  100. package/skills/pencil-write/SKILL.md +54 -0
  101. package/skills/reflect/procedures/capability-gap-scan.md +0 -1
  102. package/skills/report-issue/SKILL.md +2 -2
  103. package/skills/report-issue/report-issue-procedure.md +0 -1
  104. package/skills/router/SKILL.md +2 -2
  105. package/skills/synthesize/SKILL.md +1 -1
  106. package/skills/turn-closeout/SKILL.md +1 -1
  107. package/skills/verify/verify-procedure.md +10 -11
  108. package/skills/warm-cache/SKILL.md +1 -1
  109. package/dist/claude-code/.claude/skills/add-backlog/SKILL.md +0 -48
  110. package/dist/claude-code/.claude/skills/analyze-dependencies/SKILL.md +0 -95
  111. package/dist/claude-code/.claude/skills/apply-reflections/SKILL.md +0 -109
  112. package/dist/claude-code/.claude/skills/apply-reflections/apply-reflections-procedure.md +0 -170
  113. package/dist/claude-code/.claude/skills/audit/SKILL.md +0 -79
  114. package/dist/claude-code/.claude/skills/bandit-status/SKILL.md +0 -94
  115. package/dist/claude-code/.claude/skills/benchmark/SKILL.md +0 -65
  116. package/dist/claude-code/.claude/skills/bootstrap-ds/SKILL.md +0 -43
  117. package/dist/claude-code/.claude/skills/brief/SKILL.md +0 -145
  118. package/dist/claude-code/.claude/skills/budget/SKILL.md +0 -45
  119. package/dist/claude-code/.claude/skills/cache-manager/SKILL.md +0 -66
  120. package/dist/claude-code/.claude/skills/cache-manager/cache-policy.md +0 -126
  121. package/dist/claude-code/.claude/skills/check-update/SKILL.md +0 -98
  122. package/dist/claude-code/.claude/skills/compare/SKILL.md +0 -82
  123. package/dist/claude-code/.claude/skills/compare/compare-rubric.md +0 -171
  124. package/dist/claude-code/.claude/skills/complete-cycle/SKILL.md +0 -81
  125. package/dist/claude-code/.claude/skills/connections/SKILL.md +0 -71
  126. package/dist/claude-code/.claude/skills/connections/connections-onboarding.md +0 -608
  127. package/dist/claude-code/.claude/skills/context/SKILL.md +0 -137
  128. package/dist/claude-code/.claude/skills/continue/SKILL.md +0 -24
  129. package/dist/claude-code/.claude/skills/darkmode/SKILL.md +0 -76
  130. package/dist/claude-code/.claude/skills/darkmode/darkmode-audit-procedure.md +0 -258
  131. package/dist/claude-code/.claude/skills/debug/SKILL.md +0 -41
  132. package/dist/claude-code/.claude/skills/debug/debug-feedback-loops.md +0 -119
  133. package/dist/claude-code/.claude/skills/design/SKILL.md +0 -99
  134. package/dist/claude-code/.claude/skills/design/design-procedure.md +0 -304
  135. package/dist/claude-code/.claude/skills/discover/SKILL.md +0 -78
  136. package/dist/claude-code/.claude/skills/discover/discover-procedure.md +0 -222
  137. package/dist/claude-code/.claude/skills/discuss/SKILL.md +0 -96
  138. package/dist/claude-code/.claude/skills/do/SKILL.md +0 -45
  139. package/dist/claude-code/.claude/skills/explore/SKILL.md +0 -107
  140. package/dist/claude-code/.claude/skills/explore/explore-procedure.md +0 -267
  141. package/dist/claude-code/.claude/skills/export/SKILL.md +0 -30
  142. package/dist/claude-code/.claude/skills/extract-learnings/SKILL.md +0 -114
  143. package/dist/claude-code/.claude/skills/fast/SKILL.md +0 -91
  144. package/dist/claude-code/.claude/skills/figma-extract/SKILL.md +0 -64
  145. package/dist/claude-code/.claude/skills/figma-write/SKILL.md +0 -39
  146. package/dist/claude-code/.claude/skills/graphify/SKILL.md +0 -49
  147. package/dist/claude-code/.claude/skills/health/SKILL.md +0 -99
  148. package/dist/claude-code/.claude/skills/health/health-mcp-detection.md +0 -44
  149. package/dist/claude-code/.claude/skills/health/health-skill-length-report.md +0 -69
  150. package/dist/claude-code/.claude/skills/help/SKILL.md +0 -87
  151. package/dist/claude-code/.claude/skills/instinct/SKILL.md +0 -111
  152. package/dist/claude-code/.claude/skills/list-assumptions/SKILL.md +0 -61
  153. package/dist/claude-code/.claude/skills/list-pins/SKILL.md +0 -27
  154. package/dist/claude-code/.claude/skills/live/SKILL.md +0 -98
  155. package/dist/claude-code/.claude/skills/locale/SKILL.md +0 -51
  156. package/dist/claude-code/.claude/skills/map/SKILL.md +0 -89
  157. package/dist/claude-code/.claude/skills/migrate/SKILL.md +0 -70
  158. package/dist/claude-code/.claude/skills/migrate-context/SKILL.md +0 -123
  159. package/dist/claude-code/.claude/skills/new-addendum/SKILL.md +0 -81
  160. package/dist/claude-code/.claude/skills/new-cycle/SKILL.md +0 -37
  161. package/dist/claude-code/.claude/skills/new-cycle/milestone-completeness-rubric.md +0 -87
  162. package/dist/claude-code/.claude/skills/new-project/SKILL.md +0 -53
  163. package/dist/claude-code/.claude/skills/new-skill/SKILL.md +0 -90
  164. package/dist/claude-code/.claude/skills/next/SKILL.md +0 -68
  165. package/dist/claude-code/.claude/skills/note/SKILL.md +0 -48
  166. package/dist/claude-code/.claude/skills/openrouter-status/SKILL.md +0 -86
  167. package/dist/claude-code/.claude/skills/optimize/SKILL.md +0 -97
  168. package/dist/claude-code/.claude/skills/override/SKILL.md +0 -86
  169. package/dist/claude-code/.claude/skills/pause/SKILL.md +0 -77
  170. package/dist/claude-code/.claude/skills/peer-cli-add/SKILL.md +0 -88
  171. package/dist/claude-code/.claude/skills/peer-cli-add/peer-cli-protocol.md +0 -161
  172. package/dist/claude-code/.claude/skills/peer-cli-customize/SKILL.md +0 -90
  173. package/dist/claude-code/.claude/skills/peers/SKILL.md +0 -96
  174. package/dist/claude-code/.claude/skills/pin/SKILL.md +0 -37
  175. package/dist/claude-code/.claude/skills/plan/SKILL.md +0 -105
  176. package/dist/claude-code/.claude/skills/plan/plan-procedure.md +0 -278
  177. package/dist/claude-code/.claude/skills/plant-seed/SKILL.md +0 -48
  178. package/dist/claude-code/.claude/skills/pr-branch/SKILL.md +0 -32
  179. package/dist/claude-code/.claude/skills/progress/SKILL.md +0 -107
  180. package/dist/claude-code/.claude/skills/quality-gate/SKILL.md +0 -90
  181. package/dist/claude-code/.claude/skills/quality-gate/threat-modeling.md +0 -101
  182. package/dist/claude-code/.claude/skills/quick/SKILL.md +0 -44
  183. package/dist/claude-code/.claude/skills/reapply-patches/SKILL.md +0 -32
  184. package/dist/claude-code/.claude/skills/recall/SKILL.md +0 -75
  185. package/dist/claude-code/.claude/skills/reflect/SKILL.md +0 -85
  186. package/dist/claude-code/.claude/skills/reflect/procedures/capability-gap-scan.md +0 -120
  187. package/dist/claude-code/.claude/skills/report-issue/SKILL.md +0 -53
  188. package/dist/claude-code/.claude/skills/report-issue/report-issue-procedure.md +0 -120
  189. package/dist/claude-code/.claude/skills/resume/SKILL.md +0 -93
  190. package/dist/claude-code/.claude/skills/review-backlog/SKILL.md +0 -46
  191. package/dist/claude-code/.claude/skills/review-decisions/SKILL.md +0 -42
  192. package/dist/claude-code/.claude/skills/roi/SKILL.md +0 -54
  193. package/dist/claude-code/.claude/skills/rollout-status/SKILL.md +0 -35
  194. package/dist/claude-code/.claude/skills/router/SKILL.md +0 -89
  195. package/dist/claude-code/.claude/skills/router/capability-gap-emitter.md +0 -65
  196. package/dist/claude-code/.claude/skills/router/router-pick-emitter.md +0 -78
  197. package/dist/claude-code/.claude/skills/router/router-rules.md +0 -84
  198. package/dist/claude-code/.claude/skills/scan/SKILL.md +0 -92
  199. package/dist/claude-code/.claude/skills/scan/scan-procedure.md +0 -732
  200. package/dist/claude-code/.claude/skills/settings/SKILL.md +0 -87
  201. package/dist/claude-code/.claude/skills/ship/SKILL.md +0 -48
  202. package/dist/claude-code/.claude/skills/sketch/SKILL.md +0 -78
  203. package/dist/claude-code/.claude/skills/sketch-wrap-up/SKILL.md +0 -92
  204. package/dist/claude-code/.claude/skills/skill-manifest/SKILL.md +0 -79
  205. package/dist/claude-code/.claude/skills/spike/SKILL.md +0 -67
  206. package/dist/claude-code/.claude/skills/spike-wrap-up/SKILL.md +0 -86
  207. package/dist/claude-code/.claude/skills/start/SKILL.md +0 -67
  208. package/dist/claude-code/.claude/skills/start/start-procedure.md +0 -115
  209. package/dist/claude-code/.claude/skills/state/SKILL.md +0 -106
  210. package/dist/claude-code/.claude/skills/stats/SKILL.md +0 -51
  211. package/dist/claude-code/.claude/skills/style/SKILL.md +0 -71
  212. package/dist/claude-code/.claude/skills/style/style-doc-procedure.md +0 -150
  213. package/dist/claude-code/.claude/skills/synthesize/SKILL.md +0 -94
  214. package/dist/claude-code/.claude/skills/timeline/SKILL.md +0 -66
  215. package/dist/claude-code/.claude/skills/todo/SKILL.md +0 -64
  216. package/dist/claude-code/.claude/skills/turn-closeout/SKILL.md +0 -95
  217. package/dist/claude-code/.claude/skills/undo/SKILL.md +0 -31
  218. package/dist/claude-code/.claude/skills/unlock-decision/SKILL.md +0 -54
  219. package/dist/claude-code/.claude/skills/unpin/SKILL.md +0 -31
  220. package/dist/claude-code/.claude/skills/update/SKILL.md +0 -56
  221. package/dist/claude-code/.claude/skills/using-gdd/SKILL.md +0 -78
  222. package/dist/claude-code/.claude/skills/verify/SKILL.md +0 -113
  223. package/dist/claude-code/.claude/skills/verify/verify-procedure.md +0 -512
  224. package/dist/claude-code/.claude/skills/warm-cache/SKILL.md +0 -81
  225. package/dist/claude-code/.claude/skills/watch-authorities/SKILL.md +0 -82
  226. package/dist/claude-code/.claude/skills/zoom-out/SKILL.md +0 -26
  227. package/hooks/first-run-nudge.sh +0 -82
  228. package/hooks/inject-using-gdd.sh +0 -72
  229. package/hooks/run-hook.cmd +0 -35
  230. package/hooks/update-check.sh +0 -251
  231. package/scripts/lib/audit-aggregator/index.cjs +0 -219
  232. package/scripts/lib/hedge-ensemble.cjs +0 -217
  233. package/skills/discover/SKILL.md +0 -78
  234. package/skills/discover/discover-procedure.md +0 -222
  235. package/skills/new-cycle/milestone-completeness-rubric.md +0 -87
  236. package/skills/scan/SKILL.md +0 -92
  237. package/skills/scan/scan-procedure.md +0 -732
@@ -1,94 +0,0 @@
1
- ---
2
- name: gdd-bandit-status
3
- description: "Surface read-only per-(agent, bin, delegate) bandit posterior snapshot - alpha/beta/mean/stddev/count/last-used per arm. Phase 27.5 (v1.27.5) diagnostic. Use when investigating 'why did the bandit pick tier X for agent Y?' or when verifying posterior convergence after enabling adaptive_mode: full."
4
- argument-hint: ""
5
- tools: Read, Bash
6
- ---
7
-
8
- # gdd-bandit-status
9
-
10
- ## Role
11
-
12
- You are a deterministic, read-only diagnostic skill. You do not spawn agents and do not modify the posterior. You read `.design/telemetry/posterior.json` (path declared by `scripts/lib/bandit-router.cjs`'s `DEFAULT_POSTERIOR_PATH`), aggregate per-`(agent, bin, delegate, tier)` arm state, and emit a single Markdown table. Read-only per Phase 27.5 D-11 - to reset, use `/gdd:bandit-reset` (Phase 23.5). See `./reference/bandit-integration.md` for setup, interpretation, and convergence guidance.
13
-
14
- ## Invocation Contract
15
-
16
- - **Input**: none.
17
- - **Output**: a Markdown bandit-status table to stdout. The table is the entire output.
18
-
19
- ## Procedure
20
-
21
- ### 1. Locate the posterior file
22
-
23
- Read `.design/telemetry/posterior.json`. Missing → emit empty-state message:
24
-
25
- ```
26
- ## Bandit Posterior Snapshot
27
-
28
- No posterior data yet — run a few pipeline cycles with `adaptive_mode: full` first.
29
-
30
- No posterior data found at `.design/telemetry/posterior.json`.
31
-
32
- Possible reasons:
33
- - `adaptive_mode` is `static` or `hedge` (bandit silent — see `.design/budget.json`).
34
- - No spawns have fired since Phase 27.5 wiring landed.
35
- - Posterior was cleared via `/gdd:bandit-reset`.
36
-
37
- See `reference/bandit-integration.md` for setup guidance.
38
- ```
39
-
40
- Skip to Section 4 (Record). Parse failure (truncated/corrupted) → emit `Posterior file exists but is unparseable. Run /gdd:bandit-reset to start fresh, or restore from a backup.`
41
-
42
- ### 2. Parse the posterior
43
-
44
- Schema:
45
-
46
- ```json
47
- {
48
- "schema_version": "1.0.0",
49
- "generated_at": "<ISO>",
50
- "arms": [{ "agent": "...", "bin": "...", "tier": "...", "delegate": "...", "alpha": N, "beta": N, "last_used": "...", "count": N }]
51
- }
52
- ```
53
-
54
- The `delegate` field is optional - absent = Phase 23.5 legacy slice (rendered as `-` in the table).
55
-
56
- ### 3. Render the table
57
-
58
- Compute per arm: `mean = alpha / (alpha + beta)` (3 decimals), `stddev = sqrt(alpha*beta / ((alpha+beta)^2 * (alpha+beta+1)))` (3 decimals).
59
-
60
- Sort by `(agent ASC, bin ASC, delegate ASC where '-' first, tier ASC opus<sonnet<haiku, last_used DESC)`. Group by agent for readability.
61
-
62
- Emit:
63
-
64
- ```
65
- ## Bandit Posterior Snapshot
66
-
67
- Per-(agent, bin, delegate, tier) posterior state. Read-only — to reset use `/gdd:bandit-reset` (Phase 23.5).
68
-
69
- Posterior file: `.design/telemetry/posterior.json` (last updated: <generated_at>)
70
- Total arms: <count>
71
-
72
- | Agent | Bin | Delegate | Tier | Alpha | Beta | Mean | Stddev | Count | Last Used |
73
- |-------|-----|----------|------|-------|------|------|--------|-------|-----------|
74
- | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
75
-
76
- > Mean = alpha / (alpha + beta). Stddev = sqrt(alpha*beta / ((alpha+beta)^2 * (alpha+beta+1))).
77
- > Delegate '-' = Phase 23.5 legacy slice (equivalent to 'none').
78
- > See `reference/bandit-integration.md` for interpretation.
79
- > Read-only — use `/gdd:bandit-reset` to clear posterior state.
80
- ```
81
-
82
- Precision: alpha/beta 2 decimals; mean/stddev 3 decimals; count integer; `last_used` truncated to minute (`YYYY-MM-DDTHH:MM`); null `last_used` renders `-`.
83
-
84
- After the table, surface a per-`(agent, bin)` best-arm summary: for each unique pair, identify highest-mean arm (tie-broken by `count` DESC) - answers "why did the bandit pick tier X?" at a glance.
85
-
86
- ### 4. Record
87
-
88
- Append one JSONL line to `.design/skill-records.jsonl`: `{"skill":"gdd-bandit-status","ts":"<ISO>","arms_seen":<count>,"posterior_present":<bool>}`. Skill writes ONLY to skill-records.jsonl (telemetry); never touches the posterior.
89
-
90
- ## Cross-references
91
-
92
- - `./reference/bandit-integration.md` - operator guide; interpretation patterns.
93
- - `scripts/lib/bandit-router.cjs` (Phase 23.5) - posterior shape, `DEFAULT_POSTERIOR_PATH`, `loadPosterior()`.
94
- - `scripts/lib/bandit-router/integration.cjs` (27.5-01), `hooks/budget-enforcer.ts` (27.5-02), `scripts/lib/session-runner/index.ts` (27.5-03), `scripts/lib/bandit-arbitrage.cjs` (27.5-04), `/gdd:bandit-reset` (Phase 23.5) - only surface that mutates the posterior.
@@ -1,65 +0,0 @@
1
- ---
2
- name: gdd-benchmark
3
- description: "Harvest and synthesize per-component design benchmarks from 18 design systems and produce canonical component specs at `reference/components/<name>.md`. Use when adding a new component spec, running a benchmark wave, listing corpus coverage, or refreshing a spec after a design-system version bump."
4
- argument-hint: "<component> | --wave <N> | --list | --refresh <component>"
5
- tools: Read, Write, Bash, Grep, Glob, Task, WebFetch
6
- ---
7
-
8
- # /gdd:benchmark
9
-
10
- Harvest per-component design knowledge from 18 design systems and synthesize canonical
11
- specs at `reference/components/<name>.md`. The 18-source corpus + fallback chain lives in
12
- `../../connections/design-corpora.md`. Per-skill output discipline + completion-marker
13
- conventions are at `../../reference/shared-preamble.md#output-contract-reminders`.
14
-
15
- ## Invocation Modes
16
-
17
- | Invocation | Action |
18
- |------------|--------|
19
- | `/gdd:benchmark <component>` | Harvest + synthesize a single component |
20
- | `/gdd:benchmark --wave <N>` | Run a full wave (1 = Inputs, 2 = Containers, etc.) |
21
- | `/gdd:benchmark --list` | Show corpus coverage - which specs exist, which are pending |
22
- | `/gdd:benchmark --refresh <component>` | Re-harvest a spec (for design-system version bumps) |
23
-
24
- ## Single-Component Flow (`/gdd:benchmark <component>`)
25
-
26
- 1. **Check if spec exists** - `Glob("reference/components/<component>.md")`. If found and `--refresh` was not passed, confirm before overwriting.
27
-
28
- 2. **Harvest** - spawn `component-benchmark-harvester` with required-reading `@connections/design-corpora.md`, target component, raw-output path `.planning/benchmarks/raw/<component>.md`, and a salvage hint to `.planning/research/impeccable-salvage/`. Acceptance: raw harvest exists with ≥4 source sections.
29
-
30
- 3. **Synthesize** - spawn `component-benchmark-synthesizer` with required-reading `@.planning/benchmarks/raw/<component>.md`, `@reference/components/TEMPLATE.md`, `@reference/anti-patterns.md`. Output: `reference/components/<component>.md`. Also update `reference/components/README.md` (add entry in correct category). Acceptance: spec ≤350 lines, cites ≥4 systems, follows `TEMPLATE.md` sections, has a WAI-ARIA keyboard contract + a failing-example block.
31
-
32
- 4. **Report** - print spec path, line count, systems cited.
33
-
34
- ## Wave Mode (`/gdd:benchmark --wave <N>`)
35
-
36
- Read the wave definition from `reference/components/README.md` and run each component sequentially (not parallel - each harvest is network-bound and the raw files are large).
37
-
38
- | Wave | Components |
39
- |------|-----------|
40
- | 1 | button, input, select-combobox, checkbox, radio, switch, link, label |
41
- | 2 | card, modal-dialog, drawer, popover, tooltip, accordion, tabs |
42
-
43
- Print progress per component: `[N/total] harvesting <component>…`
44
-
45
- ## List Mode (`/gdd:benchmark --list`)
46
-
47
- Read `reference/components/README.md` and diff against `reference/components/*.md` files. Print a table with columns: Component, Status, Wave, Lines.
48
-
49
- ## Refresh Mode (`/gdd:benchmark --refresh <component>`)
50
-
51
- Same as single-component flow but skips the "already exists" guard. Use when a design system ships a breaking update to a component's spec.
52
-
53
- ## Source List
54
-
55
- `../../connections/design-corpora.md` - 18 design systems with canonical URLs, licensing, and fallback chain (canonical → archive.org → Refero MCP → Pinterest MCP).
56
-
57
- ## Output Artifacts
58
-
59
- | Artifact | Purpose |
60
- |----------|---------|
61
- | `.planning/benchmarks/raw/<component>.md` | Raw multi-source harvest (input only) |
62
- | `reference/components/<component>.md` | Canonical spec (distributed with plugin) |
63
- | `reference/components/README.md` | Corpus index (updated by synthesizer) |
64
-
65
- ## BENCHMARK COMPLETE
@@ -1,43 +0,0 @@
1
- ---
2
- name: gdd-bootstrap-ds
3
- description: "Bootstraps a design system for a GREENFIELD project that has none - no Figma, no tokens, no component library. Takes a brand input (primary color + optional secondary + tone tags + target framework) and emits a coherent OKLCH token system (color tints, modular type scale, 4pt/8pt spacing, radius + motion defaults) in 3 variants to pick from, then scaffolds proof components (button/input/card). Use at the start of a brand-new project, or when /gdd:discover finds no existing design system. Never invents a brand; never overwrites an existing DS."
4
- argument-hint: "[--primary <color>] [--secondary <color>] [--tone <tags>] [--framework web|native-ios|native-android|flutter]"
5
- user-invocable: true
6
- tools: Read, Write, Bash, Glob, Grep, AskUserQuestion, Task
7
- ---
8
-
9
- # /gdd:bootstrap-ds
10
-
11
- Greenfield design-system bootstrap. Closes the gap that GDD's `design-context-builder` assumes a design system already exists (in code or Figma) - a brand-new project has none. This skill is the **front door**: it collects a brand input and hands it to `agents/ds-generator.md`, which emits the token system + proof components per `reference/ds-bootstrap-rubric.md` (deterministic math in `scripts/lib/ds/token-scale.cjs`).
12
-
13
- ## When to use
14
-
15
- - At the start of a brand-new project (no `tailwind.config`, no token file, no DS).
16
- - When `/gdd:discover` / `design-context-builder` reports **no existing design system** and the user opts to bootstrap one.
17
-
18
- If a design system **already exists**, do NOT run this - defer to `design-context-builder` (it maps the existing one). State that and stop.
19
-
20
- ## Steps
21
-
22
- 1. **Collect the brand input.** From flags, or via `AskUserQuestion` for anything missing:
23
- - **primary** (required) - the brand color (hex / rgb / `oklch()`).
24
- - **secondary** (optional) - a second brand color (emitted only if supplied - the rubric's ≤2-brand-colors rule).
25
- - **tone tags** (optional) - `calm` / `corporate` / `editorial` / `playful` / `bold` (maps to the type ratio + chroma treatment).
26
- - **target framework** (optional) - `web` (default) / `native-ios` / `native-android` / `flutter`. Detect from the project if absent (Phase 34 routing).
27
- 2. **Delegate to `ds-generator`** (via `Task`): it resolves the primary to OKLCH, runs `token-scale.cjs` for **3 variants** (conservative / balanced / bold), and presents them.
28
- 3. **Pick a variant.** Surface the 3 variants (primary `500`, type ratio, spacing baseline, radius, feel); the user picks ONE.
29
- 4. **Emit + scaffold (proposal → confirm).** `ds-generator` emits the chosen token set (role-named CSS custom properties + the framework mapping) and scaffolds **button / input / card** as a coherence proof. Nothing is written to `src/` without confirmation.
30
-
31
- ## Do Not
32
-
33
- - Do not invent a brand (no logomark, no typeface choice, no third brand color) - emit a token *system*, not an identity.
34
- - Do not overwrite an existing design system - defer to `design-context-builder`.
35
- - Do not add a color-conversion dependency - `token-scale.cjs` emits native CSS `oklch()`.
36
-
37
- ## Output
38
-
39
- End with:
40
-
41
- ```
42
- ## BOOTSTRAP-DS COMPLETE
43
- ```
@@ -1,145 +0,0 @@
1
- ---
2
- name: gdd-brief
3
- description: "Stage 1 of 5 design intake that captures problem statement, audience, constraints, success metrics, and scope into .design/BRIEF.md, and bootstraps .design/STATE.md if missing. Use when starting a new design cycle and before /gdd:explore. Activates for requests involving capturing a problem statement, defining audience and constraints, or starting a new design brief."
4
- argument-hint: "[--re-brief to redo intake on existing project]"
5
- tools: Read, Write, AskUserQuestion, mcp__gdd_state__frontmatter_update, mcp__gdd_state__set_status, mcp__gdd_state__update_progress, mcp__gdd_state__get
6
- ---
7
-
8
- # Get Design Done - Brief
9
-
10
- **Role:** You are the Brief stage. Stage 1 of 5 in the get-design-done pipeline.
11
-
12
- **Purpose:** Capture the design problem before any scanning or exploration. Produces `.design/BRIEF.md`.
13
-
14
- ---
15
-
16
- ## Step 1 - Check for existing BRIEF.md
17
-
18
- 1. Read `.design/BRIEF.md` if it exists.
19
- 2. Parse it into sections: Problem, Audience, Constraints, Success Metrics, Scope.
20
- 3. Note which sections are already answered (non-empty).
21
- 4. If `--re-brief` flag is passed, ignore existing answers and ask all five questions.
22
- 5. Otherwise, only ask questions for unanswered sections.
23
-
24
- ## Step 2 - Interview
25
-
26
- Ask the following one at a time using `AskUserQuestion`, only for unanswered sections:
27
-
28
- 1. **Problem** - "What design problem are we solving? (user-facing outcome)"
29
- 2. **Audience** - "Who is the primary audience? (role, device, context)"
30
- 3. **Constraints** - "What constraints apply? (tech stack, brand, time, a11y requirements)"
31
- 4. **Success Metrics** - "How will we measure success? (specific metrics or outcomes)"
32
- 5. **Scope** - "What is in/out of scope for this cycle?"
33
-
34
- Do not proceed to the next question until the current one is answered.
35
-
36
- ## Step 3 - Write .design/BRIEF.md
37
-
38
- Write the brief with these sections, preserving any pre-existing answers:
39
-
40
- ```markdown
41
- # Design Brief — <project name>
42
-
43
- ## Problem
44
- <answer>
45
-
46
- ## Audience
47
- <answer>
48
-
49
- ## Constraints
50
- <answer>
51
-
52
- ## Success Metrics
53
- <answer>
54
-
55
- ## Scope
56
- <answer>
57
-
58
- <prior-research>
59
- <!-- Phase 38: populated by agents/user-research-synthesizer.md from UserTesting/Maze/Hotjar
60
- (pseudonymized) — ranked findings {finding · frequency · severity}. Empty on a fresh brief;
61
- the verify stage cross-checks each finding (addressed or explicitly deferred). -->
62
- </prior-research>
63
- ```
64
-
65
- Leave the `<prior-research>` block empty on a greenfield brief - it is filled by `/gdd:research-sync` (the `user-research-synthesizer`) when a research source is connected, and re-checked at verify. See `reference/design-variants.md` for the outcome loop.
66
-
67
- ## Step 4 - Bootstrap STATE.md (if missing)
68
-
69
- <!-- BOOTSTRAP EXCEPTION: STATE.md does not exist yet — MCP tools require it to exist. Direct Write is intentional. All subsequent mutations use MCP. -->
70
-
71
- If `.design/STATE.md` does not exist, copy the template block from `reference/STATE-TEMPLATE.md` (between `==== BEGIN TEMPLATE ====` and `==== END TEMPLATE ====`) to `.design/STATE.md` via `Write`. Leave the `<ISO 8601 timestamp>` placeholders in-place - Step 5 stamps them via MCP. If STATE.md already exists, skip to Step 5.
72
-
73
- ## Step 5 - Commit STATE.md initialization
74
-
75
- With `.design/STATE.md` seeded from the template:
76
-
77
- 1. Stamp timestamps + cycle id: call `mcp__gdd_state__frontmatter_update` with `patch: { started_at: <ISO>, last_checkpoint: <ISO>, cycle: <cycle-id> }`.
78
- 2. Mark brief progress: call `mcp__gdd_state__update_progress` with `task_progress: "5/5"`, `status: "brief_complete"`.
79
- 3. Set handoff status: call `mcp__gdd_state__set_status` with `status: "brief_complete"`.
80
-
81
- Do NOT call `mcp__gdd_state__transition_stage` from brief - explore calls it on entry, keeping the transition atomic with the stage that owns the new state.
82
-
83
- ## Step 6 - Inline glossary (CONTEXT.md) + ADR pointer
84
-
85
- When a fuzzy phrase is resolved or a new domain concept is named during the briefing
86
- interview: write to `./CONTEXT.md` IMMEDIATELY per `./../../reference/context-md-format.md`
87
- (H2 heading + body; lazy-create on first term; no batching). Glossary entries compound
88
- across cycles - token savings + naming consistency.
89
-
90
- Project-shaping decisions surfaced in briefing can be promoted to an ADR - see
91
- `./../../reference/adr-format.md` for the 3-criteria gate (hard-to-reverse AND
92
- surprising-without-context AND real-tradeoff). Routine choices stay in STATE.md.
93
-
94
- ## After Writing
95
-
96
- ```
97
- ━━━ Brief complete ━━━
98
- Saved: .design/BRIEF.md
99
- Next: @get-design-done explore
100
- ━━━━━━━━━━━━━━━━━━━━━━━
101
- ```
102
-
103
- ## Spec self-review (before transition)
104
-
105
- Run this final spec-quality pass over `.design/BRIEF.md` before the brief→explore transition:
106
- - Placeholder scan: no TBD / TODO / `<placeholder>` / lorem left in the artifact.
107
- - Internal consistency: sections don't contradict each other.
108
- - Scope check: nothing in the artifact exceeds (or silently drops) the agreed scope.
109
- - Ambiguity check: every requirement/decision is specific enough to act on without a follow-up question.
110
-
111
- ## Optional brief audit (non-blocking)
112
-
113
- Before the gate, you MAY spawn `agents/brief-auditor.md` via `Task` to grade the brief against the five
114
- brief anti-patterns (vague verbs, missing audience, immeasurable success criteria, scope creep, missing
115
- anti-goals). The auditor reads `.design/BRIEF.md` plus `reference/brief-quality-rubric.md` and writes
116
- advisory findings to `.design/BRIEF-AUDIT.md`. This step is advisory and MUST NOT block the brief to
117
- explore transition.
118
-
119
- If the auditor reports one or more fired anti-patterns, surface a single-line pointer to the user:
120
-
121
- ```
122
- Brief audit flagged N issue(s) - run /gdd:discuss brief to refine, or proceed to explore.
123
- ```
124
-
125
- The user decides. Proceeding to explore with a flagged brief is allowed; the pointer is a nudge, not a gate.
126
- If the auditor reports no fired anti-patterns, or you skip the audit, continue to the gate unchanged.
127
-
128
- <HARD-GATE>
129
- Do NOT transition to explore (or invoke `/gdd:explore`) until the brief artifact (default `.design/BRIEF.md`) is committed AND the user has approved it. If this project uses a custom `.design` location, read the artifact path from `.design/STATE.md` rather than assuming the default.
130
- </HARD-GATE>
131
-
132
- ## Rationalizations - Thought to Reality
133
-
134
- The excuses an agent invents to skip or shortcut the brief, and what each one actually costs the cycle:
135
-
136
- | Thought | Reality |
137
- |---------|---------|
138
- | "This brief is too simple to need a problem statement." | Skip the brief = guess at requirements, then redesign mid-design when the real problem surfaces. |
139
- | "The user told me what to build, I can skip the interview." | Unasked constraints (a11y, brand, stack) become rework - the five questions exist because each one has blown a past cycle. |
140
- | "I'll capture success metrics later in verify." | Verify has nothing to check against; an un-metricked brief produces an un-verifiable cycle. |
141
- | "Scope is obvious, I don't need an in/out line." | Undeclared scope is scope creep waiting to happen - the explore scan widens to fill the vacuum. |
142
- | "I can answer all five questions for the user from context." | AskUserQuestion one-at-a-time exists because batched/assumed answers smuggle in wrong premises that compound downstream. |
143
- | "STATE.md bootstrap can wait." | Every later MCP mutation requires STATE.md to exist; skipping the bootstrap hard-blocks explore on entry. |
144
-
145
- ## BRIEF COMPLETE
@@ -1,45 +0,0 @@
1
- ---
2
- name: gdd-budget
3
- description: "Forecasts GDD design-cycle spend before the bill arrives. Reads .design/telemetry/costs.jsonl (cost per cycle) + .design/budget.json (the project_cap), runs the pure cost-forecast model via agents/cost-forecaster.md, and projects the next N cycles - surfacing 'at the current rate you'll hit your $X project cap in Y cycles.' Supports --scenario best|typical|worst and --cycles N. Read-only - it forecasts and warns; it never spends, edits budget.json, or halts (the budget-enforcer hook halts). Use to sanity-check spend trajectory before a long run."
4
- argument-hint: "[--cycles N] [--scenario best|typical|worst]"
5
- user-invocable: true
6
- tools: Read, Bash, Grep, Glob, ToolSearch, Task
7
- ---
8
-
9
- # /gdd:budget
10
-
11
- Closes the long-horizon cost gap: Phase 10.1 per-task caps + Phase 26 per-runtime telemetry track
12
- *cost*, but nothing **forecasts** it. This skill projects the next N cycles of spend and tells you how
13
- many cycles you have before you hit your `project_cap`. **Read-only** - it forecasts and warns; it
14
- never spends, never edits `budget.json`, and never halts (the Phase 25 budget-enforcer hook is the
15
- only thing that blocks a spawn). Contract: `../../reference/cost-governance.md`.
16
-
17
- ## Invocation
18
-
19
- | Command | Behavior |
20
- |---|---|
21
- | `/gdd:budget` | Typical-scenario forecast over the next 5 cycles + cycles-to-cap. |
22
- | `/gdd:budget --cycles N` | Forecast over the next N cycles. |
23
- | `/gdd:budget --scenario best\|typical\|worst` | Pick the projection rate (best / steady / worst). |
24
-
25
- ## Steps
26
-
27
- 1. **Check telemetry exists.** No `.design/telemetry/costs.jsonl` (or zero rows) → print
28
- `budget: no cost telemetry yet — run a cycle first.` and exit.
29
- 2. **Delegate to `cost-forecaster`** (via `Task`): it groups `est_cost_usd` by `cycle`, runs the pure
30
- `scripts/lib/budget/cost-forecast.cjs` model for the requested `--scenario`/`--cycles`, reads
31
- `project_cap_usd` from `.design/budget.json`, and computes cycles-to-cap.
32
- 3. **Render.** Show: the scenario + its per-cycle rate, the best↔worst band, the projected total over
33
- N cycles, and - when `project_cap_usd > 0` - **"at the `<scenario>` rate (~$X/cycle) you'll reach
34
- your $`<cap>` project cap in `<Y>` cycles"** (or "not at this rate" when the trend is flat/down).
35
- When no cap is set, show the trajectory and note that `project_cap_usd` is unset (so the hook won't
36
- halt).
37
- 4. **Do not act.** Never raise/lower the cap, never spend - GDD forecasts; the human sets the budget.
38
-
39
- ## Output
40
-
41
- End with:
42
-
43
- ```
44
- ## BUDGET COMPLETE
45
- ```
@@ -1,66 +0,0 @@
1
- ---
2
- name: gdd-cache-manager
3
- description: "Maintains .design/cache-manifest.json for Layer B explicit cache per D-08. Computes deterministic SHA-256 input-hash from (agent-path + sorted-input-file-paths + input-content-hashes). On spawn: lookup key → return cached blob if within TTL, else miss. On completion: write result + TTL. Consulted by hooks/budget-enforcer.js before every Agent spawn."
4
- user-invocable: false
5
- tools: Read, Bash, Write
6
- disable-model-invocation: true
7
- ---
8
-
9
- # gdd-cache-manager
10
-
11
- ## Role
12
-
13
- You are the deterministic cache-key computer and cache-manifest writer for the optimization layer. You do not spawn agents, and you do not make model calls. You read agent paths, input file paths, and input file contents; you compute a stable SHA-256 key; you look that key up in `.design/cache-manifest.json`; you return a hit (cached result + `cache_hit: true`) or a miss. On spawn completion, the orchestrator calls you again to persist the result. You are Layer B of the two-layer cache (D-08). Layer A - Anthropic's 5-min prompt cache - is not owned by you; it's owned by the shared-preamble ordering convention in `agents/README.md`.
14
-
15
- ## Invocation Contract
16
-
17
- ### Phase 1: compute-key
18
-
19
- - **Input**: `{agent_path: string, input_file_paths: string[]}` - `agent_path` is the absolute or repo-relative path to the `agents/<name>.md` file; `input_file_paths` is the sorted-unique list of files the agent will read.
20
- - **Output**: `{input_hash: string}` - 64-character lowercase SHA-256 hex.
21
- - **Algorithm**: canonicalize inputs, concat with newline separators, SHA-256 (see Deterministic Input-Hash Algorithm below).
22
-
23
- ### Phase 2: lookup
24
-
25
- - **Input**: `{input_hash: string}`
26
- - **Output**: `{hit: true, result: string, expires_at: string} | {hit: false}`
27
- - Reads `.design/cache-manifest.json`. If key absent → miss. If present and `Date.now() >= entry.expires_at` → miss (lazy cleanup: caller may evict but is not required to). Else → hit with `entry.result`.
28
-
29
- ### Phase 3: short-circuit-or-miss
30
-
31
- - On hit: orchestrator short-circuits the spawn. Budget-enforcer hook (Plan 10.1-01) emits `SkippedCached` telemetry with `tokens_in: 0, tokens_out: 0, cache_hit: true, est_cost_usd: 0` (writer lands in Plan 10.1-05). Returns cached `result` as the tool output.
32
- - On miss: orchestrator proceeds with real spawn. Cache-manager is not involved until Phase 4.
33
-
34
- ### Phase 4: write-result-on-completion
35
-
36
- - **Input**: `{input_hash: string, agent: string, result: string, ttl_seconds: number}` - `ttl_seconds` defaults to `.design/budget.json.cache_ttl_seconds` (3600 if budget.json absent).
37
- - **Behavior**: open `.design/cache-manifest.json` (create if missing), set key `input_hash` → `{agent, result, written_at, ttl_seconds, expires_at}`, write file. `written_at` is `new Date().toISOString()`. `expires_at` is `written_at + ttl_seconds` as ISO.
38
-
39
- ## Deterministic Input-Hash Algorithm
40
-
41
- The canonical reference implementation (single source of truth; `hooks/budget-enforcer.js` imports the same primitive via a shared helper) lives in `./cache-policy.md#deterministic-input-hash-algorithm-layer-b` - it documents the JS implementation, the maintainer notes (sorted-unique paths, MISSING-file sentinel, agent-path bust behavior), the manifest shape, and TTL semantics in one place. Conform to the algorithm exactly so the hook and any orchestrator agree byte-for-byte.
42
-
43
- ## Integration Points
44
-
45
- - **`hooks/budget-enforcer.js`** (Plan 10.1-01) reads the manifest on every Agent spawn. The hook already calls `cacheLookup(agent, inputHash)` against `.design/cache-manifest.json`. This skill is the authority on how `inputHash` is computed so the hook and any orchestrator agree byte-for-byte.
46
- - **Orchestrators** (e.g., `skills/map/`, `skills/discover/`, `skills/plan/`) invoke Phase 1 (compute-key) + Phase 4 (write-result-on-completion) around each Agent spawn they launch. Phase 2 + Phase 3 are executed by the hook.
47
- - **Warm-cache command** (`skills/warm-cache/SKILL.md`, Task 02) does not touch Layer B - it only primes Anthropic's 5-min prompt cache (Layer A). Do not confuse the two.
48
-
49
- ## Failure Modes
50
-
51
- - `.design/cache-manifest.json` missing or malformed → treat every lookup as miss; orchestrator proceeds with full spawn. Do not throw.
52
- - File system write fails on Phase 4 → log to stderr, do not throw (the spawn already completed successfully; losing a cache write is a performance regression, not a correctness bug).
53
- - `agent_path` file missing → compute hash anyway using the provided string; cache entries for a deleted agent simply never hit again.
54
-
55
- ## Non-Goals
56
-
57
- Per D-09:
58
-
59
- - No semantic / graph-based lookup. Manifest is a dumb KV store keyed by content hash.
60
- - No cross-project cache sharing. Manifest lives at `.design/cache-manifest.json`, scoped per repo.
61
- - No eviction beyond lazy expiry on read. A `/gdd:cache-prune` command is a Phase 11 reflector candidate, not 10.1 scope.
62
- - No hash-algorithm tuning. SHA-256 is fixed; if a future phase wants BLAKE3, bump the manifest schema version (not relevant in v1).
63
-
64
- ## TTL Semantics
65
-
66
- Default `ttl_seconds` = `.design/budget.json.cache_ttl_seconds` = 3600s (1 hour) per D-10. `expires_at` is computed at write time and stored; readers do not recompute. Stale entries are lazily cleaned on read (no eager reaper in v1). Full TTL discussion: `./cache-policy.md#ttl-semantics-layer-b`.
@@ -1,126 +0,0 @@
1
- ---
2
- name: cache-policy
3
- type: heuristic
4
- version: 1.0.0
5
- phase: 28.5
6
- tags: [cache, layer-a, layer-b, sha-256, ttl, warm-cache, cache-manager, anthropic-prompt-cache]
7
- last_updated: 2026-05-18
8
- ---
9
-
10
- # Cache Policy (Layer A + Layer B)
11
-
12
- Extracted from `skills/cache-manager/SKILL.md` and `skills/warm-cache/SKILL.md` per Phase 28.5
13
- D-10 (extract-then-link, never delete content). The two skills keep their orchestration
14
- contracts and step-by-step flows; the deeper algorithmic and operational detail moves here
15
- so the SKILLs stay under the 100-line cap.
16
-
17
- The two layers (D-08):
18
-
19
- - **Layer A** - Anthropic's 5-min prompt cache (owned by `warm-cache`). Keyed on shared-preamble-first prompt prefix. No project-local state.
20
- - **Layer B** - explicit `.design/cache-manifest.json` (owned by `gdd-cache-manager`). Keyed on deterministic SHA-256 of `(agent-path, sorted-input-file-paths, input-content-hashes)`. Per-repo state.
21
-
22
- ## Deterministic Input-Hash Algorithm (Layer B)
23
-
24
- The canonical reference implementation (the single source of truth; `hooks/budget-enforcer.js` imports the same primitive via a shared helper):
25
-
26
- ```js
27
- // Deterministic cache-key primitive (reference implementation)
28
- // hash = SHA-256(
29
- // agent_path + "\n" +
30
- // sorted(input_file_paths).join("\n") + "\n" +
31
- // sorted(input_file_paths)
32
- // .map(p => sha256(readFileSync(p, "utf8")))
33
- // .join("\n")
34
- // )
35
- const crypto = require('crypto');
36
- const fs = require('fs');
37
-
38
- function sha256Hex(s) {
39
- return crypto.createHash('sha256').update(s, 'utf8').digest('hex');
40
- }
41
-
42
- function computeInputHash(agentPath, inputFilePaths) {
43
- const sortedPaths = [...inputFilePaths].sort();
44
- const contentHashes = sortedPaths.map(p => {
45
- try { return sha256Hex(fs.readFileSync(p, 'utf8')); }
46
- catch { return 'MISSING'; }
47
- });
48
- const canonical = [
49
- agentPath,
50
- sortedPaths.join('\n'),
51
- contentHashes.join('\n')
52
- ].join('\n');
53
- return sha256Hex(canonical);
54
- }
55
- ```
56
-
57
- Notes for maintainers:
58
-
59
- - **Sorted-unique paths** - ordering must be stable; caller is expected to de-duplicate. If the same path appears twice the hash still matches as long as caller pre-dedupes before invoking.
60
- - **Missing file** - the string `MISSING` is used in place of the content hash so a missing dependency doesn't silently collide with an empty file (empty file's SHA-256 is `e3b0c44...`). Missing-file hashes naturally miss on the next read because the real file has a different content hash.
61
- - **Agent-path** - agents changing their own body (role, tools, output contract) invalidate all their cache entries automatically because the agent file's content is not hashed; but the `agent_path` string is concatenated. Upgrading agents between versions naturally busts the cache only when the path changes. Plan 10.1-04 (shared preamble extraction) is expected to slightly adjust agent bodies - consumers should treat the first post-10.1 run as a full cache miss, which is the intended behavior.
62
-
63
- ## Manifest Shape (Layer B)
64
-
65
- See `./config-schema.md` §.design/cache-manifest.json Schema (Phase 10.1) for the authoritative schema. Keyed object, flat SHA-256 hex keys. Example:
66
-
67
- ```json
68
- {
69
- "a3f1e...": {
70
- "agent": "design-verifier",
71
- "result": "<base64-or-path>",
72
- "written_at": "2026-04-18T12:00:00Z",
73
- "ttl_seconds": 3600,
74
- "expires_at": "2026-04-18T13:00:00Z"
75
- }
76
- }
77
- ```
78
-
79
- ## TTL Semantics (Layer B)
80
-
81
- - Default `ttl_seconds` = `.design/budget.json.cache_ttl_seconds` = 3600s (1 hour) per D-10.
82
- - `expires_at` is computed at write time and stored; readers do not recompute.
83
- - Lazy cleanup: stale entries are not actively deleted on read (overhead for no benefit in normal operation). A separate reaper is optional and out of v1 scope.
84
-
85
- ## Concrete Warm-Cache Command Examples (Layer A)
86
-
87
- Full invocation:
88
-
89
- ```
90
- $ /gdd:warm-cache
91
-
92
- Warming Anthropic prompt cache for 14 agents (5 min TTL)...
93
- [1/14] design-verifier ... ok (0.3s)
94
- [2/14] design-planner ... ok (0.3s)
95
- [3/14] design-integration-checker ... ok (0.3s)
96
- ...
97
- [14/14] design-reflector ... ok (0.3s)
98
-
99
- ## Warm-cache complete
100
- - Agents warmed: 14
101
- - Skipped (no shared preamble import): 3 (agents/README.md not an agent; 2 agents not yet migrated to shared preamble)
102
- - Duration: 4.2s
103
- - Next 5 min: repeated spawns of these agents pay cached_input_per_1m rate
104
- ```
105
-
106
- Filtered invocation:
107
-
108
- ```
109
- $ /gdd:warm-cache --agents design-verifier,design-planner
110
-
111
- Warming Anthropic prompt cache for 2 agents (filtered from 14)...
112
- [1/2] design-verifier ... ok (0.3s)
113
- [2/2] design-planner ... ok (0.3s)
114
-
115
- ## Warm-cache complete
116
- - Agents warmed: 2
117
- - Filtered out by --agents: 12
118
- - Duration: 0.7s
119
- ```
120
-
121
- ## Cost Model (Layer A)
122
-
123
- - Each no-op Haiku ping: ~50 input tokens (shared preamble + "No-op warm: acknowledge..." system+user) + ~5 output tokens ("ok").
124
- - At Haiku rates (`./model-prices.md`): `(50 / 1e6) * 1.00 + (5 / 1e6) * 5.00 = $0.00005 + $0.000025 = $0.000075` per agent.
125
- - 14 agents × $0.000075 = **$0.00105** total for a full warm-cache invocation.
126
- - Payback: a single subsequent Opus spawn with 40k cached input tokens saves `(40000/1e6) * (15.00 - 1.50) = $0.54`. Warm-cache pays for itself ~500× over on the first repeated planner spawn.