@hegemonart/get-design-done 1.28.0 → 1.28.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +134 -0
- package/SKILL.md +1 -1
- package/hooks/gdd-decision-injector.js +149 -3
- package/package.json +1 -1
- package/reference/adr-format.md +96 -0
- package/reference/architecture-vocabulary.md +102 -0
- package/reference/context-md-format.md +106 -0
- package/reference/heuristics.md +84 -0
- package/reference/registry.json +29 -1
- package/reference/registry.schema.json +1 -1
- package/reference/shared-preamble.md +78 -6
- package/reference/skill-authoring-contract.md +159 -0
- package/scripts/validate-skill-length.cjs +283 -0
- package/skills/add-backlog/SKILL.md +1 -0
- package/skills/analyze-dependencies/SKILL.md +33 -122
- package/skills/apply-reflections/SKILL.md +1 -40
- package/skills/apply-reflections/apply-reflections-procedure.md +68 -0
- package/skills/audit/SKILL.md +3 -1
- package/skills/bandit-status/SKILL.md +31 -66
- package/skills/benchmark/SKILL.md +15 -55
- package/skills/brief/SKILL.md +12 -1
- package/skills/cache-manager/SKILL.md +3 -57
- package/skills/cache-manager/cache-policy.md +126 -0
- package/skills/check-update/SKILL.md +38 -75
- package/skills/compare/SKILL.md +29 -269
- package/skills/compare/compare-rubric.md +171 -0
- package/skills/complete-cycle/SKILL.md +1 -1
- package/skills/connections/SKILL.md +21 -427
- package/skills/connections/connections-onboarding.md +417 -0
- package/skills/continue/SKILL.md +1 -0
- package/skills/darkmode/SKILL.md +32 -287
- package/skills/darkmode/darkmode-audit-procedure.md +258 -0
- package/skills/debug/SKILL.md +11 -8
- package/skills/debug/debug-feedback-loops.md +119 -0
- package/skills/design/SKILL.md +27 -245
- package/skills/design/design-procedure.md +304 -0
- package/skills/discover/SKILL.md +26 -133
- package/skills/discover/discover-procedure.md +204 -0
- package/skills/discuss/SKILL.md +18 -2
- package/skills/explore/SKILL.md +40 -205
- package/skills/explore/explore-procedure.md +267 -0
- package/skills/fast/SKILL.md +1 -0
- package/skills/figma-write/SKILL.md +2 -2
- package/skills/health/SKILL.md +11 -33
- package/skills/health/health-mcp-detection.md +44 -0
- package/skills/health/health-skill-length-report.md +69 -0
- package/skills/help/SKILL.md +1 -0
- package/skills/list-assumptions/SKILL.md +1 -0
- package/skills/map/SKILL.md +8 -31
- package/skills/new-cycle/SKILL.md +3 -1
- package/skills/new-cycle/milestone-completeness-rubric.md +87 -0
- package/skills/next/SKILL.md +1 -0
- package/skills/note/SKILL.md +1 -0
- package/skills/optimize/SKILL.md +21 -44
- package/skills/pause/SKILL.md +1 -0
- package/skills/peer-cli-add/SKILL.md +26 -108
- package/skills/peer-cli-add/peer-cli-protocol.md +161 -0
- package/skills/peer-cli-customize/SKILL.md +22 -42
- package/skills/peers/SKILL.md +33 -57
- package/skills/plan/SKILL.md +33 -220
- package/skills/plan/plan-procedure.md +278 -0
- package/skills/plant-seed/SKILL.md +1 -0
- package/skills/pr-branch/SKILL.md +1 -0
- package/skills/progress/SKILL.md +1 -7
- package/skills/quality-gate/SKILL.md +34 -166
- package/skills/quality-gate/threat-modeling.md +101 -0
- package/skills/quick/SKILL.md +1 -0
- package/skills/reapply-patches/SKILL.md +1 -0
- package/skills/recall/SKILL.md +1 -0
- package/skills/resume/SKILL.md +1 -0
- package/skills/review-backlog/SKILL.md +1 -0
- package/skills/router/SKILL.md +3 -59
- package/skills/router/router-rules.md +84 -0
- package/skills/scan/SKILL.md +36 -675
- package/skills/scan/scan-procedure.md +731 -0
- package/skills/settings/SKILL.md +1 -0
- package/skills/ship/SKILL.md +1 -0
- package/skills/sketch/SKILL.md +1 -1
- package/skills/sketch-wrap-up/SKILL.md +13 -54
- package/skills/spike/SKILL.md +1 -1
- package/skills/spike-wrap-up/SKILL.md +12 -46
- package/skills/start/SKILL.md +13 -112
- package/skills/start/start-procedure.md +115 -0
- package/skills/stats/SKILL.md +1 -0
- package/skills/style/SKILL.md +18 -140
- package/skills/style/style-doc-procedure.md +150 -0
- package/skills/synthesize/SKILL.md +1 -0
- package/skills/timeline/SKILL.md +1 -0
- package/skills/todo/SKILL.md +1 -0
- package/skills/turn-closeout/SKILL.md +36 -56
- package/skills/undo/SKILL.md +1 -0
- package/skills/update/SKILL.md +1 -0
- package/skills/verify/SKILL.md +42 -457
- package/skills/verify/verify-procedure.md +512 -0
- package/skills/warm-cache/SKILL.md +3 -35
- package/skills/zoom-out/SKILL.md +26 -0
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
},
|
|
6
6
|
"metadata": {
|
|
7
7
|
"description": "Get Design Done — 5-stage agent-orchestrated design pipeline with 9 connections, handoff-first workflow, bidirectional Figma write-back, 22+ specialized agents, queryable knowledge layer (intel store, dependency analysis, learnings extraction), and a self-improvement loop (reflector, frontmatter + budget feedback, global-skills layer). v1.20.0 ships the SDK foundation: gdd-state MCP server (11 typed tools), lockfile-safe STATE.md mutations, event stream, and resilience primitives (jittered-backoff, rate-guard, error-classifier, iteration-budget) for rate-limit + 429 + context-overflow recovery. Full CI/CD pipeline (Node 22/24 × Linux/macOS/Windows) and release automation (auto-tag + GitHub Release + release-time smoke test).",
|
|
8
|
-
"version": "1.28.
|
|
8
|
+
"version": "1.28.6"
|
|
9
9
|
},
|
|
10
10
|
"plugins": [
|
|
11
11
|
{
|
|
12
12
|
"name": "get-design-done",
|
|
13
13
|
"source": "./",
|
|
14
14
|
"description": "Agent-orchestrated 5-stage design pipeline: Brief → Explore → Plan → Design → Verify. 22+ specialized agents, 9 connections (Figma, Refero, Preview, Storybook, Chromatic, Figma Writer, Graphify, Pinterest, Claude Design), Claude Design handoff, bidirectional Figma write-back, and a queryable intel store (.design/intel/) for dependency and learnings queries. Standalone commands: style, darkmode, compare, figma-write, graphify, handoff, analyze-dependencies, skill-manifest, extract-learnings. Embeds NNG heuristics, WCAG thresholds, typographic systems, motion framework, and anti-pattern catalog. Ships with a full CI/CD pipeline (Node 22/24 × Linux/macOS/Windows) and release automation. Optimization layer (v1.0.4.1, retroactive): gdd-router + gdd-cache-manager skills, PreToolUse budget-enforcer hook, tier-aware agent frontmatter, lazy checker gates, streaming synthesizer, /gdd:warm-cache + /gdd:optimize commands, and cost telemetry at .design/telemetry/costs.jsonl — targeting 50-70% per-task token-cost reduction with no quality-floor regression. v1.20.0 SDK foundation: gdd-state MCP server (11 typed tools), lockfile-safe STATE.md mutations, event stream at .design/telemetry/events.jsonl, resilience primitives (jittered-backoff, rate-guard, error-classifier, iteration-budget) with rate-limit + 429 + context-overflow recovery, and TypeScript toolchain.",
|
|
15
|
-
"version": "1.28.
|
|
15
|
+
"version": "1.28.6",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "hegemonart"
|
|
18
18
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "get-design-done",
|
|
3
3
|
"short_name": "gdd",
|
|
4
|
-
"version": "1.28.
|
|
4
|
+
"version": "1.28.6",
|
|
5
5
|
"description": "Agent-orchestrated 5-stage design pipeline: Brief → Explore → Plan → Design → Verify. 22+ specialized agents, 9 connections (Figma, Refero, Preview, Storybook, Chromatic, Figma Writer, Graphify, Pinterest, Claude Design), handoff-first workflow via Claude Design bundles, bidirectional Figma write-back (annotations, Code Connect), queryable intel store (`.design/intel/`) for O(1) design surface lookups, and self-improvement loop (reflector agent, frontmatter + budget feedback, global-skills layer at `~/.claude/gdd/global-skills/`). Standalone commands: style, darkmode, compare, figma-write, graphify, handoff, analyze-dependencies, skill-manifest, extract-learnings, reflect, apply-reflections. Embeds NNG heuristics, WCAG thresholds, typographic systems, motion framework, and anti-pattern catalog. Ships with a full CI/CD pipeline (Node 22/24 × Linux/macOS/Windows, lint + schema + frontmatter + stale-ref + shellcheck + gitleaks + injection-scan + blocking size-budget) and release automation (auto-tag + GitHub Release + release-time smoke test). Optimization layer (v1.0.4.1, retroactive): gdd-router + gdd-cache-manager skills, PreToolUse budget-enforcer hook, tier-aware agent frontmatter, lazy checker gates, streaming synthesizer, /gdd:warm-cache + /gdd:optimize commands, and cost telemetry at .design/telemetry/costs.jsonl — targeting 50-70% per-task token-cost reduction with no quality-floor regression. v1.20.0 SDK foundation: gdd-state MCP server (11 typed tools), lockfile-safe STATE.md mutations, event stream at .design/telemetry/events.jsonl, resilience primitives (jittered-backoff, rate-guard, error-classifier, iteration-budget) with rate-limit + 429 + context-overflow recovery, and TypeScript toolchain. v1.27.7 ships gdd-mcp (Phase 27.7): 12 read-only MCP tools for sub-3s priming. v1.28.0 (Phase 28): Foundational References Tier 2 — 5 new reference files (color-theory, composition, proportion-systems, i18n, contrast-advanced), 2 verifier i18n probes + 1 explore i18n-readiness probe, 12 additive cross-link insertions across 10 existing references, 2 orthogonal audit-scoring lens-tags (composition_alignment + i18n_readiness).",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "hegemonart",
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,140 @@ All notable changes to get-design-done are documented here. Versions follow [sem
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [1.28.6] — 2026-05-18
|
|
8
|
+
|
|
9
|
+
### Phase 28.6 — Skill Reference Co-Location (Corrective Follow-Up to Phase 28.5)
|
|
10
|
+
|
|
11
|
+
Corrects Phase 28.5's CONTEXT.md D-06 over-generalization. Phase 28.5 extracted 20 skill-private procedure refs into a central `reference/` folder, but each of those refs is consumed by exactly 1 (or in 2 borderline cases, 2 sibling) skills. Per mattpocock/skills' actual structure at `https://github.com/mattpocock/skills/tree/main/skills`, skill-private procedure docs live next to the `SKILL.md` they describe. Phase 28.6 co-locates the 20 refs into per-skill folders and refreshes the contract's §D-06 to endorse the per-skill folder pattern for 1-/2-consumer content. No new features. No breaking changes. `git mv` preserves history on every file. Phase 28.5's contract spec, validator, CI gate, `zoom-out`, debug Phase 1 patch, CONTEXT.md + ADR project artifacts, decision-injector extension, and 70/70 length compliance are all PRESERVED; only the location of skill-private refs changes.
|
|
12
|
+
|
|
13
|
+
#### Migrated refs (20 — `reference/<topic>.md` -> `skills/<owner>/<topic>.md`)
|
|
14
|
+
|
|
15
|
+
- `apply-reflections-procedure.md` -> `skills/apply-reflections/`
|
|
16
|
+
- `cache-policy.md` -> `skills/cache-manager/` (primary; `warm-cache` secondary via `./../cache-manager/cache-policy.md`)
|
|
17
|
+
- `compare-rubric.md` -> `skills/compare/`
|
|
18
|
+
- `connections-onboarding.md` -> `skills/connections/`
|
|
19
|
+
- `darkmode-audit-procedure.md` -> `skills/darkmode/`
|
|
20
|
+
- `debug-feedback-loops.md` -> `skills/debug/`
|
|
21
|
+
- `design-procedure.md` -> `skills/design/`
|
|
22
|
+
- `discover-procedure.md` -> `skills/discover/`
|
|
23
|
+
- `explore-procedure.md` -> `skills/explore/`
|
|
24
|
+
- `health-mcp-detection.md` -> `skills/health/`
|
|
25
|
+
- `health-skill-length-report.md` -> `skills/health/`
|
|
26
|
+
- `milestone-completeness-rubric.md` -> `skills/new-cycle/` (primary; `turn-closeout` secondary)
|
|
27
|
+
- `peer-cli-protocol.md` -> `skills/peer-cli-add/` (primary; `peer-cli-customize` + `peers` secondary)
|
|
28
|
+
- `plan-procedure.md` -> `skills/plan/`
|
|
29
|
+
- `router-rules.md` -> `skills/router/`
|
|
30
|
+
- `scan-procedure.md` -> `skills/scan/`
|
|
31
|
+
- `start-procedure.md` -> `skills/start/`
|
|
32
|
+
- `style-doc-procedure.md` -> `skills/style/`
|
|
33
|
+
- `threat-modeling.md` -> `skills/quality-gate/`
|
|
34
|
+
- `verify-procedure.md` -> `skills/verify/`
|
|
35
|
+
|
|
36
|
+
#### Contract refresh
|
|
37
|
+
|
|
38
|
+
- `reference/skill-authoring-contract.md` §D-06 refreshed: per-skill folder pattern explicitly endorsed for skill-private content. Three placement classes codified — 1-consumer in `skills/<owner>/<topic>.md`; 2-consumer in primary owner's folder with `./../<primary>/<topic>.md` secondary cross-link; multi-consumer (3+ skills across different domains) in `reference/<topic>.md`. The Phase 28.5 "rare exception only" framing is reversed.
|
|
39
|
+
|
|
40
|
+
#### Registry purge
|
|
41
|
+
|
|
42
|
+
- `reference/registry.json`: 20 entries removed (the migrated procedure refs are no longer tracked centrally; they're discoverable via the skill folder itself, per mattpocock's pattern). Universal refs (consumed by 3+ skills) remain in the registry.
|
|
43
|
+
|
|
44
|
+
#### Phase 28.5 retrospective annotation
|
|
45
|
+
|
|
46
|
+
- `.planning/phases/28.5-skill-authoring-contract/CONTEXT.md` D-06 annotated with a "Corrected by Phase 28.6" pointer for audit-trail preservation. Phase 28.5 decisions stay visible but flagged as superseded.
|
|
47
|
+
|
|
48
|
+
#### Plans
|
|
49
|
+
|
|
50
|
+
- 28.6-01 — `git mv` 20 refs + cross-link updates across 23 SKILL.md consumers (`./../reference/<topic>.md` -> `./<topic>.md` or `./../<primary>/<topic>.md`). (COLOC-01)
|
|
51
|
+
- 28.6-02 — `reference/registry.json` 20-entry purge (D-03) + `reference/skill-authoring-contract.md` §D-06 refresh (D-04). (COLOC-02)
|
|
52
|
+
- 28.6-03 — Validator + baseline + full `npm test` sweep (all green; D-05 confirmation that `scripts/validate-skill-length.cjs` globs `SKILL.md` only; no validator edit). (COLOC-03)
|
|
53
|
+
- 28.6-04 — Closeout (4-manifest lockstep at v1.28.6, `OFF_CADENCE_VERSIONS.add('1.28.6')`, CHANGELOG, ROADMAP add + scoped flip, baseline at `test-fixture/baselines/phase-28.6/`, Phase 28.5 CONTEXT.md retrospective annotation). (COLOC-04)
|
|
54
|
+
|
|
55
|
+
#### Non-changes
|
|
56
|
+
|
|
57
|
+
- NOTICE unchanged — Phase 28.5's mattpocock/skills MIT attribution still applies (same content; file paths shifted only).
|
|
58
|
+
- `test-fixture/baselines/phase-20/skill-list.txt` unchanged — no skills added or removed.
|
|
59
|
+
- `scripts/validate-skill-length.cjs` unchanged — D-05 verified the validator globs `SKILL.md` only and is unaffected by co-located procedure refs.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## [1.28.5] — 2026-05-18
|
|
64
|
+
|
|
65
|
+
### Phase 28.5 — Skill Authoring Contract + Skill Rework + Project Artifacts
|
|
66
|
+
|
|
67
|
+
Adopts the mattpocock/skills (MIT) authoring contract and applies it retroactively across the entire shipped skill set. Closes the authoring-discipline gap surfaced by the 2026-05-02 comparison audit. 12 plans across 4 waves; off-cadence decimal patch from v1.28.0 parent (CONTEXT.md D-12 convention).
|
|
68
|
+
|
|
69
|
+
#### New reference files
|
|
70
|
+
|
|
71
|
+
- `reference/skill-authoring-contract.md` (28.5-01) — 100-line `SKILL.md` cap (warn >=100, block >=250 in CI), 1024-char description cap, required `<what>. Use when <triggers>.` form, frontmatter required fields, progressive-disclosure one-level-deep rule, when to add `scripts/`, per-skill domain-specific files allowed only when content is single-skill-private.
|
|
72
|
+
- `reference/context-md-format.md` (28.5-02) — DDD-style ubiquitous-language glossary schema with optional `first-seen` + `aliases` GDD additions; CONTEXT-MAP.md multi-context pattern; inline-write-on-resolution trigger.
|
|
73
|
+
- `reference/adr-format.md` (28.5-02) — 3-criteria offer gate (hard-to-reverse AND surprising-without-context AND real-tradeoff), 4-state status lifecycle, optional `cycle-id` + `phase-id` cross-refs back to STATE.md (GDD addition).
|
|
74
|
+
- `reference/architecture-vocabulary.md` (28.5-03) — Ousterhout's 8 core terms (Module / Interface / Implementation / Depth / Seam / Adapter / Leverage / Locality) + 3 principles (deletion test, interface-is-test-surface, two-adapters-rule).
|
|
75
|
+
- `reference/scan-procedure.md`, `verify-procedure.md`, `design-procedure.md`, `plan-procedure.md`, `explore-procedure.md`, `discover-procedure.md` (28.5-04) — 6 procedure references extracted from pipeline-stage skills as progressive-disclosure satellites.
|
|
76
|
+
- `reference/shared-preamble.md` (28.5-05, extended), `style-doc-procedure.md`, `compare-rubric.md`, `darkmode-audit-procedure.md`, `connections-onboarding.md` (28.5-05) — 4 new + 1 extended (Bucket 2 design-family rework).
|
|
77
|
+
- `reference/health-mcp-detection.md`, `apply-reflections-procedure.md`, `cache-policy.md`, `router-rules.md`, `start-procedure.md` (28.5-06) — 5 references extracted from Bucket 3 orchestrator + utility skills.
|
|
78
|
+
- `reference/debug-feedback-loops.md` (28.5-07 scaffold + 28.5-09 fill) — 10 construction paths in priority order, iterate-on-loop sub-discipline, non-determinism reproduction-rate branch.
|
|
79
|
+
- `reference/threat-modeling.md`, `milestone-completeness-rubric.md`, `peer-cli-protocol.md` (28.5-07) — 3 additional Bucket 4 extraction targets (analysis + audit skills).
|
|
80
|
+
- `reference/health-skill-length-report.md` (28.5-11) — health-skill subsection contract documenting validator JSON shape + threshold rationale.
|
|
81
|
+
|
|
82
|
+
#### Skill rework
|
|
83
|
+
|
|
84
|
+
- Bucket 1 (28.5-04) — 11 pipeline-stage skills (`brief`, `discuss`, `plan`, `design`, `verify`, `explore`, `discover`, `scan`, `sketch`, `spike`, `new-cycle`, `complete-cycle`) reworked to <=100 lines.
|
|
85
|
+
- Bucket 2 (28.5-05) — 7 design-family skills (`audit`, `style`, `darkmode`, `compare`, `design`, `figma-write`, `connections`, `benchmark`) cross-link cleanup + description standardization.
|
|
86
|
+
- Bucket 3 (28.5-06) — 34 orchestrator + utility skills (`help`, `stats`, `note`, `add-backlog`, `todo`, `progress`, `health`, `update`, `undo`, `fast`, `quick`, `next`, `do`, `resume`, `pause`, etc.) `disable-model-invocation: true` whitelist applied; targeted trims on the offenders.
|
|
87
|
+
- Bucket 4 (28.5-07) — 17 analysis + audit skills (`scan`, `map`, `analyze-dependencies`, `sketch-wrap-up`, `spike-wrap-up`, `skill-manifest`, `debug`, `peers`, `peer-cli-add`, `peer-cli-customize`, `quality-gate`, `turn-closeout`, `start`, `check-update`, `optimize`, etc.) extraction-then-link pattern; new refs created where content qualified as proper reference material.
|
|
88
|
+
- All 70 skills under 100 lines post-rework (`scripts/validate-skill-length.cjs --quiet --json` summary: 70 total / 70 clean / 0 warn / 0 block).
|
|
89
|
+
|
|
90
|
+
#### Skill patches + new skill
|
|
91
|
+
|
|
92
|
+
- `discuss` + `brief` skill patches (28.5-08) — inline `CONTEXT.md` glossary maintenance (no batching) + ADR-offer 3-criteria gate at session end.
|
|
93
|
+
- `hooks/gdd-decision-injector.js` extended (28.5-08) — reads `CONTEXT.md` + `docs/adr/*` additively alongside STATE.md cycle-scoped decisions.
|
|
94
|
+
- `debug` skill Phase 1 patch (28.5-09) — explicit feedback-loop gate before any hypothesizing; cross-link to `reference/debug-feedback-loops.md` one level deep.
|
|
95
|
+
- New `/gdd:zoom-out` micro-skill (28.5-10) at `skills/zoom-out/SKILL.md` — ~10 lines body, frontmatter `disable-model-invocation: true`. Direct port from mattpocock/skills (MIT). Total shipped skills: 69 -> 70.
|
|
96
|
+
|
|
97
|
+
#### CI gate + health reporting (28.5-11)
|
|
98
|
+
|
|
99
|
+
- `.github/workflows/ci.yml` lint job invokes `node scripts/validate-skill-length.cjs --quiet --json`. Block-level errors (>=250 lines, missing required frontmatter, description out of 1024-char range, unauthorized `disable-model-invocation: true`) fail the build. Warn-level findings (>=100 lines) are advisory.
|
|
100
|
+
- `skills/health/SKILL.md` gains a "Skill-length report" subsection rendering validator summary post-health-table.
|
|
101
|
+
- Regression baseline at `test-fixture/baselines/phase-28.5/` snapshots current line-count distribution + validator summary + 4-manifest version + cross-link integrity + registry diff.
|
|
102
|
+
- `tests/phase-28.5-baseline.test.cjs` (9 assertions) locks the baseline; future PRs cannot regress without regenerating the fixture.
|
|
103
|
+
|
|
104
|
+
#### Closeout (28.5-12)
|
|
105
|
+
|
|
106
|
+
- 4-manifest lockstep at v1.28.5: `package.json`, `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version), `test-fixture/baselines/phase-28/manifests-version.txt` (Phase 28 baseline propagates forward per closeout discipline).
|
|
107
|
+
- `tests/semver-compare.test.cjs`: `OFF_CADENCE_VERSIONS.add('1.28.5')`.
|
|
108
|
+
- `NOTICE` extended with Phase 28.5 MIT attribution block for mattpocock/skills (covers 5 reference ports + zoom-out direct port + debug Phase 1 ordering).
|
|
109
|
+
- `reference/registry.json` += 24 new Phase 28.5 entries; `reference/registry.schema.json` aligned to `"phase": { "type": "number" }` (precedent already established by phase 19.6 / 27.5 / 27.6 / 27.7 entries).
|
|
110
|
+
- `test-fixture/baselines/phase-20/skill-list.txt` += `zoom-out` (now 70 skills).
|
|
111
|
+
- `.planning/ROADMAP.md` Phase 28.5 plan checkboxes (28.5-01..28.5-12) flipped to `[x]`; top-level overview entry flipped.
|
|
112
|
+
|
|
113
|
+
### Decisions locked
|
|
114
|
+
|
|
115
|
+
- D-01: SKILL.md hard cap = 100 lines (warn), 250 lines (block). Strict description-format off by default — validator regex stays open until Phase 33's A/B evidence lands.
|
|
116
|
+
- D-02: Description format follows `<what>. Use when <triggers>.` shape (lax-mode default; Phase 33 A/B will tighten or relax).
|
|
117
|
+
- D-03: NOTICE MIT attribution covers 5 reference ports + zoom-out direct port + debug Phase 1 ordering.
|
|
118
|
+
- D-04: `reference/debug-feedback-loops.md` ships as a proper reference, not inline in the debug SKILL — per progressive-disclosure rule.
|
|
119
|
+
- D-05: `gdd-zoom-out` skill ships with `disable-model-invocation: true` (user-invoked-only shortcut).
|
|
120
|
+
- D-06: CI gate is two-tier — warn-level advisory, block-level fails the build.
|
|
121
|
+
- D-07: `hooks/gdd-decision-injector.js` reads CONTEXT.md + `docs/adr/*` additively alongside STATE.md (no replacement, no precedence change).
|
|
122
|
+
- D-08: ADR-offer fires only when ALL three criteria hold (hard-to-reverse AND surprising-without-context AND real-tradeoff). Routine decisions are explicitly skipped.
|
|
123
|
+
- D-09: 28 skills marked `disable-model-invocation: true` (27 from Bucket 3 + new zoom-out).
|
|
124
|
+
- D-10: Health-MCP detection procedure extracted to `reference/health-mcp-detection.md`; SKILL links one level deep.
|
|
125
|
+
- D-11: `gdd-health` SKILL gains skill-length report subsection — validator JSON shape documented in `reference/health-skill-length-report.md`.
|
|
126
|
+
- D-12: 4-manifest lockstep at v1.28.5; off-cadence decimal patch from v1.28.0 parent. `OFF_CADENCE_VERSIONS.add('1.28.5')` per Phase 27.5/27.6/27.7 closeout discipline.
|
|
127
|
+
|
|
128
|
+
### Out of scope (deferred or rejected)
|
|
129
|
+
|
|
130
|
+
- Description-format regex tightening — deferred until Phase 33 A/B evidence on `<what>` clause shortcut behavior lands at `.design/research/description-format-ab.md`.
|
|
131
|
+
- Generating SKILL.md from a frontmatter-only spec (DSL) — keeps SKILL.md authorable by humans; reject machine-only generation per first-class-prose principle.
|
|
132
|
+
- Auto-fixer for over-limit skills — validator is read-only; manual rework preserves authorial intent.
|
|
133
|
+
- Cross-skill description deduplication — accept some triggering overlap; D-02 form is a soft cap, not a uniqueness invariant.
|
|
134
|
+
|
|
135
|
+
### Attribution
|
|
136
|
+
|
|
137
|
+
See `NOTICE` Phase 28.5 block for the mattpocock/skills (MIT) attribution covering ported content. License remains MIT (compatible with mattpocock's MIT) — see `LICENSE`.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
7
141
|
## [1.28.0] — 2026-05-18
|
|
8
142
|
|
|
9
143
|
### Phase 28 — Foundational References Tier 2 — Color, Composition, Proportion, i18n
|
package/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: get-design-done
|
|
3
3
|
short_name: gdd
|
|
4
4
|
description: "Master design pipeline for Claude Code. 5-stage workflow: Brief → Explore → Plan → Design → Verify. Run 'brief' first in any new project to capture the design problem, then 'explore' to inventory the codebase and interview for context. Invoke without arguments for status and auto-routing."
|
|
5
|
-
argument-hint: "[brief|explore|plan|design|verify|handoff|map|next|help|status|style|darkmode|compare|figma-write|graphify|discuss|list-assumptions|progress|health|todo|stats|note|plant-seed|add-backlog|review-backlog|scan|discover|settings|update|reapply-patches|audit|pause|resume|new-cycle|debug|quick|new-project|complete-cycle|fast|do|ship|undo|pr-branch|sketch|sketch-wrap-up|spike|spike-wrap-up|reflect|apply-reflections|analyze-dependencies|extract-learnings|skill-manifest|warm-cache|optimize|cache-manager|watch-authorities|check-update|benchmark|recall|timeline|continue]"
|
|
5
|
+
argument-hint: "[brief|explore|plan|design|verify|handoff|map|next|help|status|style|darkmode|compare|figma-write|graphify|discuss|list-assumptions|progress|health|todo|stats|note|plant-seed|add-backlog|review-backlog|scan|discover|settings|update|reapply-patches|audit|pause|resume|new-cycle|debug|quick|new-project|complete-cycle|fast|do|ship|undo|pr-branch|sketch|sketch-wrap-up|spike|spike-wrap-up|reflect|apply-reflections|analyze-dependencies|extract-learnings|skill-manifest|warm-cache|optimize|cache-manager|watch-authorities|check-update|benchmark|recall|timeline|continue|zoom-out]"
|
|
6
6
|
user-invocable: true
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -280,6 +280,128 @@ function buildPrototypingBlock(stateFile, basename, relPath) {
|
|
|
280
280
|
return lines.join('\n');
|
|
281
281
|
}
|
|
282
282
|
|
|
283
|
+
/**
|
|
284
|
+
* Phase 28.5 plan 08 (D-04) — additive CONTEXT.md / ADR context.
|
|
285
|
+
*
|
|
286
|
+
* `CONTEXT.md` is a project-scoped ubiquitous-language glossary (schema:
|
|
287
|
+
* reference/context-md-format.md). Each entry is an `## Term` heading + body
|
|
288
|
+
* paragraph; optional `**Aliases:** [...]` line enables term-merging. The hook
|
|
289
|
+
* surfaces entries whose name or aliases match the opened file's tokens.
|
|
290
|
+
*
|
|
291
|
+
* ADRs live at `docs/adr/NNNN-<slug>.md` (schema: reference/adr-format.md). The
|
|
292
|
+
* hook surfaces matching titles as one-line cross-references.
|
|
293
|
+
*
|
|
294
|
+
* All file reads are defensive: missing or malformed files yield [] silently so
|
|
295
|
+
* the hook NEVER crashes (T-28.5-08-01 mitigation). Output is bounded by
|
|
296
|
+
* PROTOTYPING_TOP_N to prevent DoS (T-28.5-08-03).
|
|
297
|
+
*/
|
|
298
|
+
function readContextMd(repoRoot) {
|
|
299
|
+
const ctxPath = path.join(repoRoot, 'CONTEXT.md');
|
|
300
|
+
if (!fs.existsSync(ctxPath)) return [];
|
|
301
|
+
let content;
|
|
302
|
+
try { content = fs.readFileSync(ctxPath, 'utf8'); } catch { return []; }
|
|
303
|
+
const entries = [];
|
|
304
|
+
// Split on `## ` only when it is the start of a line. The first segment is
|
|
305
|
+
// preamble (everything before the first ## heading) — discard it.
|
|
306
|
+
const sections = content.split(/^## /m).slice(1);
|
|
307
|
+
for (const sec of sections) {
|
|
308
|
+
const lines = sec.split(/\r?\n/);
|
|
309
|
+
const term = (lines[0] || '').trim();
|
|
310
|
+
if (!term) continue;
|
|
311
|
+
const body = lines.slice(1).join('\n');
|
|
312
|
+
let aliases = [];
|
|
313
|
+
const aliasMatch = body.match(/\*\*Aliases:\*\*\s*\[([^\]]+)\]/);
|
|
314
|
+
if (aliasMatch) {
|
|
315
|
+
aliases = aliasMatch[1]
|
|
316
|
+
.split(',')
|
|
317
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ''))
|
|
318
|
+
.filter(Boolean);
|
|
319
|
+
}
|
|
320
|
+
entries.push({ term, body, aliases });
|
|
321
|
+
}
|
|
322
|
+
return entries;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function readAdrs(repoRoot) {
|
|
326
|
+
const adrDir = path.join(repoRoot, 'docs', 'adr');
|
|
327
|
+
if (!fs.existsSync(adrDir)) return [];
|
|
328
|
+
let files;
|
|
329
|
+
try { files = fs.readdirSync(adrDir); } catch { return []; }
|
|
330
|
+
const entries = [];
|
|
331
|
+
for (const f of files) {
|
|
332
|
+
if (!/^\d{4}-.*\.md$/.test(f)) continue;
|
|
333
|
+
let content;
|
|
334
|
+
try { content = fs.readFileSync(path.join(adrDir, f), 'utf8'); } catch { continue; }
|
|
335
|
+
// Title from frontmatter `title:` line, else first H1, else filename.
|
|
336
|
+
const titleMatch = content.match(/^title:\s*(.+)$/m) || content.match(/^# (.+)$/m);
|
|
337
|
+
const title = titleMatch
|
|
338
|
+
? titleMatch[1].trim().replace(/^["']|["']$/g, '')
|
|
339
|
+
: f.replace(/\.md$/, '');
|
|
340
|
+
entries.push({ path: `docs/adr/${f}`, title, body: content.slice(0, 500) });
|
|
341
|
+
}
|
|
342
|
+
return entries;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
function matchContextEntries(entries, tokens) {
|
|
346
|
+
if (!entries.length || !tokens.length) return [];
|
|
347
|
+
const lcTokens = tokens.map((t) => String(t).toLowerCase()).filter(Boolean);
|
|
348
|
+
const out = [];
|
|
349
|
+
for (const e of entries) {
|
|
350
|
+
const candidates = [e.term, ...e.aliases].map((s) => String(s).toLowerCase());
|
|
351
|
+
const hit = candidates.some((cand) =>
|
|
352
|
+
lcTokens.some((tok) => cand.includes(tok) || tok.includes(cand))
|
|
353
|
+
);
|
|
354
|
+
if (hit) out.push(e);
|
|
355
|
+
}
|
|
356
|
+
return out;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function matchAdrEntries(entries, tokens) {
|
|
360
|
+
if (!entries.length || !tokens.length) return [];
|
|
361
|
+
const lcTokens = tokens.map((t) => String(t).toLowerCase()).filter(Boolean);
|
|
362
|
+
return entries.filter((a) => {
|
|
363
|
+
const t = a.title.toLowerCase();
|
|
364
|
+
return lcTokens.some((tok) => t.includes(tok));
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
function buildGlossaryBlock(matched) {
|
|
369
|
+
if (!matched.length) return null;
|
|
370
|
+
const lines = [];
|
|
371
|
+
lines.push('');
|
|
372
|
+
lines.push('### Project glossary (CONTEXT.md)');
|
|
373
|
+
for (const e of matched.slice(0, PROTOTYPING_TOP_N)) {
|
|
374
|
+
const snippet = e.body
|
|
375
|
+
.split(/\r?\n/)
|
|
376
|
+
.filter((l) => l.trim() && !l.startsWith('**'))
|
|
377
|
+
.slice(0, 2)
|
|
378
|
+
.join(' ')
|
|
379
|
+
.trim();
|
|
380
|
+
const trimmed = snippet.length > 200 ? snippet.slice(0, 197) + '…' : snippet;
|
|
381
|
+
lines.push(`> - **${e.term}** — ${trimmed}`);
|
|
382
|
+
}
|
|
383
|
+
if (matched.length > PROTOTYPING_TOP_N) {
|
|
384
|
+
lines.push(`> … (${matched.length - PROTOTYPING_TOP_N} more glossary entr${matched.length - PROTOTYPING_TOP_N === 1 ? 'y' : 'ies'})`);
|
|
385
|
+
}
|
|
386
|
+
lines.push('');
|
|
387
|
+
return lines.join('\n');
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function buildAdrBlock(matched) {
|
|
391
|
+
if (!matched.length) return null;
|
|
392
|
+
const lines = [];
|
|
393
|
+
lines.push('');
|
|
394
|
+
lines.push('### Architecture Decision Records (ADRs)');
|
|
395
|
+
for (const a of matched.slice(0, PROTOTYPING_TOP_N)) {
|
|
396
|
+
lines.push(`> - [${a.title}](${a.path})`);
|
|
397
|
+
}
|
|
398
|
+
if (matched.length > PROTOTYPING_TOP_N) {
|
|
399
|
+
lines.push(`> … (${matched.length - PROTOTYPING_TOP_N} more ADR${matched.length - PROTOTYPING_TOP_N === 1 ? '' : 's'})`);
|
|
400
|
+
}
|
|
401
|
+
lines.push('');
|
|
402
|
+
return lines.join('\n');
|
|
403
|
+
}
|
|
404
|
+
|
|
283
405
|
function buildRecallBlock(matches, basename, backendLabel) {
|
|
284
406
|
if (!matches.length) return null;
|
|
285
407
|
const uniq = [];
|
|
@@ -380,15 +502,39 @@ async function main() {
|
|
|
380
502
|
const stateFile = sources.find((p) => p.endsWith(path.sep + 'STATE.md') || p.endsWith('/STATE.md'));
|
|
381
503
|
const protoBlock = buildPrototypingBlock(stateFile, basename, relPath);
|
|
382
504
|
|
|
383
|
-
|
|
505
|
+
// Phase 28.5 plan 08 (D-04): additive CONTEXT.md + ADR context. Tokens used
|
|
506
|
+
// for matching are derived from the opened file's basename + relPath, split
|
|
507
|
+
// on kebab/snake/path separators and filtered down to substantive tokens.
|
|
508
|
+
// The match is intentionally loose (substring both ways) so an alias like
|
|
509
|
+
// "heuristics" surfaces when opening reference/heuristics.md.
|
|
510
|
+
const matchTokens = Array.from(new Set([
|
|
511
|
+
basename.replace(/\.md$/i, ''),
|
|
512
|
+
...basename.replace(/\.md$/i, '').split(/[-_./\\]/),
|
|
513
|
+
...relPath.split(/[-_./\\]/),
|
|
514
|
+
].filter((t) => t && t.length > 2)));
|
|
515
|
+
|
|
516
|
+
let glossaryBlock = null;
|
|
517
|
+
let adrBlock = null;
|
|
518
|
+
try {
|
|
519
|
+
const ctxEntries = readContextMd(cwd);
|
|
520
|
+
const matchedCtx = matchContextEntries(ctxEntries, matchTokens);
|
|
521
|
+
glossaryBlock = buildGlossaryBlock(matchedCtx);
|
|
522
|
+
} catch { /* defensive: never crash on CONTEXT.md issues */ }
|
|
523
|
+
try {
|
|
524
|
+
const adrEntries = readAdrs(cwd);
|
|
525
|
+
const matchedAdrs = matchAdrEntries(adrEntries, matchTokens);
|
|
526
|
+
adrBlock = buildAdrBlock(matchedAdrs);
|
|
527
|
+
} catch { /* defensive: never crash on ADR issues */ }
|
|
528
|
+
|
|
529
|
+
if (!block && !protoBlock && !glossaryBlock && !adrBlock) {
|
|
384
530
|
try { require('./_hook-emit.js').emitHookFired('gdd-decision-injector', 'no-hits', { backend: backendLabel }); } catch { /* swallow */ }
|
|
385
531
|
process.stdout.write(JSON.stringify({ continue: true }));
|
|
386
532
|
return;
|
|
387
533
|
}
|
|
388
534
|
|
|
389
|
-
const additionalContext = [block, protoBlock].filter(Boolean).join('\n');
|
|
535
|
+
const additionalContext = [block, protoBlock, glossaryBlock, adrBlock].filter(Boolean).join('\n');
|
|
390
536
|
|
|
391
|
-
try { require('./_hook-emit.js').emitHookFired('gdd-decision-injector', 'inject', { backend: backendLabel, hit_count: hits.length, prototyping: !!protoBlock }); } catch { /* swallow */ }
|
|
537
|
+
try { require('./_hook-emit.js').emitHookFired('gdd-decision-injector', 'inject', { backend: backendLabel, hit_count: hits.length, prototyping: !!protoBlock, glossary: !!glossaryBlock, adr: !!adrBlock }); } catch { /* swallow */ }
|
|
392
538
|
process.stdout.write(JSON.stringify({
|
|
393
539
|
continue: true,
|
|
394
540
|
hookSpecificOutput: { hookEventName: 'PreToolUse', additionalContext },
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hegemonart/get-design-done",
|
|
3
|
-
"version": "1.28.
|
|
3
|
+
"version": "1.28.6",
|
|
4
4
|
"description": "A design-quality pipeline for AI coding agents: brief, plan, implement, and verify UI work against your design system.",
|
|
5
5
|
"author": "Hegemon",
|
|
6
6
|
"homepage": "https://github.com/hegemonart/get-design-done",
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: adr-format
|
|
3
|
+
type: meta-rules
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
phase: 28.5
|
|
6
|
+
tags: [adr, decision, project-scoped, architecture, offer-gate]
|
|
7
|
+
last_updated: 2026-05-18
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Source: mattpocock/skills (MIT) — adapted with permission. See `../NOTICE` for the full attribution block.
|
|
11
|
+
|
|
12
|
+
# ADR Format
|
|
13
|
+
|
|
14
|
+
An Architecture Decision Record (ADR) is a project-scoped record of a decision that
|
|
15
|
+
outlives the current cycle. ADRs live at `docs/adr/NNNN-<slug>.md` (zero-padded sequence,
|
|
16
|
+
kebab-case slug) and are offered SPARINGLY — only when all three criteria of the offer
|
|
17
|
+
gate hold (D-04). Most decisions stay in `STATE.md` and roll over with the cycle; ADRs
|
|
18
|
+
are the rare exception. See `./context-md-format.md` for the lighter glossary form that
|
|
19
|
+
shares the same project-scoped lifetime.
|
|
20
|
+
|
|
21
|
+
## 3-criteria offer gate
|
|
22
|
+
|
|
23
|
+
ALL THREE criteria must hold for the agent to offer an ADR. If ANY criterion fails, keep
|
|
24
|
+
the decision in `STATE.md` instead.
|
|
25
|
+
|
|
26
|
+
- **hard-to-reverse.** Undoing this decision requires migrating data, breaking APIs, or
|
|
27
|
+
coordinating across multiple teams or agents. Routine code changes do not qualify.
|
|
28
|
+
- **surprising-without-context.** A reader six months from now, given only the codebase,
|
|
29
|
+
would be confused. The rationale must be NON-OBVIOUS from the result.
|
|
30
|
+
- **real-tradeoff.** At least one credible alternative was considered and rejected for
|
|
31
|
+
stated reasons. Decisions with no plausible alternative (e.g., "use HTTPS") do not
|
|
32
|
+
qualify.
|
|
33
|
+
|
|
34
|
+
Worked example — **qualifier:** "Switch from REST to GraphQL for the public API."
|
|
35
|
+
Hard-to-reverse (clients integrate against the schema), surprising-without-context (most
|
|
36
|
+
greenfield APIs default to REST), real-tradeoff (tRPC and gRPC were rejected for stated
|
|
37
|
+
reasons). Ship an ADR.
|
|
38
|
+
|
|
39
|
+
Worked example — **disqualifier:** "Rename the `users` table to `accounts`." Hard-to-reverse,
|
|
40
|
+
but the rationale is obvious from the rename and there is no real alternative once the
|
|
41
|
+
domain has settled on the word. Log in `STATE.md`, not an ADR.
|
|
42
|
+
|
|
43
|
+
## Frontmatter
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
---
|
|
47
|
+
title: <Active-voice imperative — e.g., "Adopt OKLCH for design tokens">
|
|
48
|
+
status: Proposed | Accepted | Superseded | Deprecated
|
|
49
|
+
date: <ISO 8601, YYYY-MM-DD>
|
|
50
|
+
cycle-id: <optional GDD addition — originating cycle slug, e.g., "v1.28.5">
|
|
51
|
+
phase-id: <optional GDD addition — originating phase, e.g., "28.5">
|
|
52
|
+
supersedes: <optional — ADR number this one replaces, e.g., "0042">
|
|
53
|
+
---
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- **Required.** `title`, `status`, `date`.
|
|
57
|
+
- **Optional (GDD additions per D-04).** `cycle-id` and `phase-id` back-link to the
|
|
58
|
+
originating cycle's `STATE.md` and the phase that produced the decision. `supersedes`
|
|
59
|
+
points at the prior ADR number when this ADR replaces one.
|
|
60
|
+
- **Path convention.** `docs/adr/NNNN-<slug>.md` where `NNNN` is zero-padded (`0001`,
|
|
61
|
+
`0042`, etc.) and the slug is kebab-case.
|
|
62
|
+
|
|
63
|
+
## Body structure
|
|
64
|
+
|
|
65
|
+
The ADR body uses four `##` sections in the following order. Each section is a thin
|
|
66
|
+
paragraph or short bullet list — ADRs are decision records, not design docs.
|
|
67
|
+
|
|
68
|
+
- `## Context` — what situation made this decision necessary; cite the originating
|
|
69
|
+
cycle's `BRIEF.md` or `STATE.md` if relevant.
|
|
70
|
+
- `## Decision` — what was chosen, stated as an imperative.
|
|
71
|
+
- `## Alternatives` — what was considered and rejected, with brief rationale per
|
|
72
|
+
alternative.
|
|
73
|
+
- `## Consequences` — what this enables, what it costs, what it constrains downstream.
|
|
74
|
+
|
|
75
|
+
## Status lifecycle
|
|
76
|
+
|
|
77
|
+
ADRs progress through four states. The status field in frontmatter is the source of
|
|
78
|
+
truth; transitions are explicit, never silent.
|
|
79
|
+
|
|
80
|
+
- **Proposed.** Drafted but not yet decided; reviewer pass pending. Downstream work
|
|
81
|
+
does not cite Proposed ADRs.
|
|
82
|
+
- **Accepted.** Decision active; downstream work cites this ADR by number.
|
|
83
|
+
- **Superseded.** Replaced by a later ADR. The later ADR's `supersedes:` field points
|
|
84
|
+
here, and this ADR's status is flipped to Superseded. NEVER delete a Superseded ADR —
|
|
85
|
+
the audit trail is the point.
|
|
86
|
+
- **Deprecated.** No longer relevant (e.g., the system the ADR governed was removed).
|
|
87
|
+
Kept for history.
|
|
88
|
+
|
|
89
|
+
## Cross-references
|
|
90
|
+
|
|
91
|
+
- Domain terms used in the ADR body should already appear in `CONTEXT.md` — see
|
|
92
|
+
`./context-md-format.md`. If a term is missing, the writer adds it before referencing it.
|
|
93
|
+
- Cycle-scoped decisions (most routine choices) stay in `STATE.md` — see
|
|
94
|
+
`./STATE-TEMPLATE.md`.
|
|
95
|
+
- Skill structural rules (length cap, frontmatter, progressive disclosure) — see
|
|
96
|
+
`./skill-authoring-contract.md`.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architecture-vocabulary
|
|
3
|
+
type: principles
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
phase: 28.5
|
|
6
|
+
tags: [architecture, ousterhout, module, interface, depth, seam, adapter, leverage, locality]
|
|
7
|
+
last_updated: 2026-05-18
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Source: mattpocock/skills (MIT) via Ousterhout, *A Philosophy of Software Design* — adapted with permission. See `../NOTICE` for the full attribution block.
|
|
11
|
+
|
|
12
|
+
# Architecture Vocabulary
|
|
13
|
+
|
|
14
|
+
A shared vocabulary for architectural reasoning across GDD skills. Same words mean the same things across `zoom-out`, `debug`, `analyze-dependencies`, `map`, `quality-gate`, and the planning skills — so agents and humans do not re-litigate "what did you mean by *module*" every conversation. Drawn from John Ousterhout's *A Philosophy of Software Design* via mattpocock's `improve-codebase-architecture/LANGUAGE.md`. GDD design-engineering analogs are surfaced where applicable — a UI component is a module, a design-token API is an interface, a token theme is an adapter.
|
|
15
|
+
|
|
16
|
+
This file is the canonical reference; skills cite it instead of re-defining terms inline.
|
|
17
|
+
|
|
18
|
+
## Module
|
|
19
|
+
|
|
20
|
+
A unit of code that hides implementation behind an interface. The module's value to its caller is everything inside that the caller no longer has to think about.
|
|
21
|
+
|
|
22
|
+
- A React component is a module — props are the interface, internal state and effects are the implementation.
|
|
23
|
+
- A skill is a module — frontmatter + workflow are the interface, the SKILL.md body is the implementation.
|
|
24
|
+
- See `./design-system-guidance.md` for the design-system-level analog: a component is a module; the token contract is its interface.
|
|
25
|
+
|
|
26
|
+
## Interface
|
|
27
|
+
|
|
28
|
+
What a module exposes to callers — function signatures, props, return types, error contracts, side-effect promises. The interface is what callers depend on; everything else they must NOT depend on. Small, stable interfaces are the goal.
|
|
29
|
+
|
|
30
|
+
- `function fetchUser(id: string): Promise<User>` is the interface. How `fetchUser` calls the database is implementation.
|
|
31
|
+
- A React component's `props` plus its rendered DOM contract is the interface; useState, useEffect, internal helpers are not.
|
|
32
|
+
- See `./component-authoring.md` (6-principle quality standard, esp. "Minimal API" and "Composability") for the component-library-level analog.
|
|
33
|
+
|
|
34
|
+
## Implementation
|
|
35
|
+
|
|
36
|
+
What the module hides — the code that does the work. Callers must not depend on it. Implementation is free to change as long as the interface holds.
|
|
37
|
+
|
|
38
|
+
- Switching `fetchUser` from REST to GraphQL without changing the call site = implementation change without interface change. Healthy.
|
|
39
|
+
- Renaming a private helper inside a React component does not break callers. Healthy.
|
|
40
|
+
- Exposing a class's "private" field that callers started reading turns implementation into de-facto interface. Unhealthy — fix by either formalizing the field as interface or stopping the leak.
|
|
41
|
+
|
|
42
|
+
## Depth
|
|
43
|
+
|
|
44
|
+
A module is **deep** when the interface is simple and the implementation hides genuine complexity. A module is **shallow** when the interface is as complex as the implementation — the wrapper adds no leverage and just shuffles the caller's mental load sideways.
|
|
45
|
+
|
|
46
|
+
- `Array.sort()` is deep — one method name hides ~50 lines of comparison-sort logic plus stable-ordering guarantees.
|
|
47
|
+
- `class Wrapper { getX() { return this.x; } }` is shallow — the wrapper adds no leverage; the caller has to know about `Wrapper` AND `x`.
|
|
48
|
+
- Asymmetry in the caller's favor is the goal. Shallow modules cost the caller mental complexity without paying it back.
|
|
49
|
+
- See `./component-authoring.md` "Minimal API" — a 1-prop `<Image src=... />` that handles preload, lazy load, srcset, blur placeholder, error fallback is the depth principle applied to component design.
|
|
50
|
+
|
|
51
|
+
## Seam
|
|
52
|
+
|
|
53
|
+
The boundary where two abstractions meet — where one module's interface is consumed by another. Seams are where you can replace one side without touching the other.
|
|
54
|
+
|
|
55
|
+
- **Hypothetical seam.** Only one implementation exists behind the boundary. Nothing yet validates the abstraction is meaningful — the seam is a possibility statement.
|
|
56
|
+
- **Real seam.** Two or more implementations exist; the boundary has been proved load-bearing by actual substitution. The seam is evidence.
|
|
57
|
+
- "One adapter = hypothetical seam; two adapters = real seam." See `## Principles` below.
|
|
58
|
+
- A `fetchUser` function backed only by Postgres is hypothetical; once a test double + a Postgres impl coexist, the seam is real.
|
|
59
|
+
|
|
60
|
+
## Adapter
|
|
61
|
+
|
|
62
|
+
A module that transforms one interface into another to enable substitution behind a seam. Adapters create seams; the count of distinct adapters approximates the seam's realism.
|
|
63
|
+
|
|
64
|
+
- A Redux-to-Zustand adapter exposes Redux's `store.dispatch` while wrapping a Zustand store underneath — callers keep their Redux API; the implementation moved.
|
|
65
|
+
- A design-token theme is an adapter: it transforms one token contract (`--color-bg`) into specific concrete values (`oklch(98% 0 0)` in light theme, `oklch(15% 0 0)` in dark).
|
|
66
|
+
- An `acp-client` plus an `asp-client` are two adapters over the same "peer-CLI" seam — the second one proves the seam is meaningful (Phase 27).
|
|
67
|
+
|
|
68
|
+
## Leverage
|
|
69
|
+
|
|
70
|
+
The ratio of work-the-system-does to interface-the-caller-touches. High leverage = high depth = the caller buys a lot of work for a little API. Architectural choices that maximize leverage reduce future cost across all callers.
|
|
71
|
+
|
|
72
|
+
- `<Image />` with a `src` prop that handles preload, lazy load, srcset generation, blur placeholder, error fallback — high leverage from a 1-prop API. Every caller benefits.
|
|
73
|
+
- A 5-prop `<Button variant size leftIcon rightIcon onClick />` that only renders a styled `<button>` — low leverage; the caller is still doing most of the configuration work.
|
|
74
|
+
- Leverage compounds. A high-leverage primitive used by 20 components multiplies the original investment 20×.
|
|
75
|
+
|
|
76
|
+
## Locality
|
|
77
|
+
|
|
78
|
+
Related changes happen in the same place; unrelated changes do not ripple. Spatial cohesion of the change footprint. Locality is what makes a codebase "easy to modify" — you can find the thing and change just the thing.
|
|
79
|
+
|
|
80
|
+
- Healthy: adding a new chart type touches `chart-types/<new-type>.ts` only.
|
|
81
|
+
- Broken: adding a new chart type touches `chart-types.ts` AND `chart-renderer.ts` AND `chart-config.ts` AND `chart-styles.css` AND `chart-icons.svg`. The system is forcing the author to remember 5 files for a 1-concept change.
|
|
82
|
+
- Test it with the **deletion test** (see `## Principles`) — if removing the feature requires touching the same N files, locality is asymmetric and the abstraction is leaking.
|
|
83
|
+
|
|
84
|
+
## Principles
|
|
85
|
+
|
|
86
|
+
Three load-bearing rules that operationalize the vocabulary above. Each one is a question you can ask during review.
|
|
87
|
+
|
|
88
|
+
- **Deletion test.** Can you delete the implementation and the interface still tells callers what they could do? If yes, the interface is well-defined and the module is properly encapsulated. If no, the interface is leaking implementation — callers are reaching past the abstraction. Apply this when reviewing a new module: imagine deleting the body; can a reader still describe the surface from the signature alone?
|
|
89
|
+
- **Interface is the test surface.** Tests target the interface; implementation churn does not churn tests. If a refactor that preserves behavior breaks tests, the test was implementation-coupled — fix the test, not the refactor. This is also the diagnostic for whether you have a real interface at all: if you cannot test through it, the interface is too narrow or the implementation is leaking.
|
|
90
|
+
- **One adapter = hypothetical seam; two adapters = real seam.** One substitution is a possibility statement; two substitutions are evidence the boundary is meaningful. Do not over-design seams without ≥2 implementations — the second one teaches you what the seam actually needs. This is YAGNI for boundaries: ship the first impl, extract the seam when the second one arrives.
|
|
91
|
+
|
|
92
|
+
## How this applies to skill authoring
|
|
93
|
+
|
|
94
|
+
Skills are modules. The frontmatter (`name`, `description`, `tags`) plus the workflow signature is the interface; the SKILL.md body is the implementation. A deep skill has a small, predictable interface (clear when to invoke, clear output shape) hiding genuine workflow value. A shallow skill is one whose body adds little beyond what the frontmatter already implies — those skills should be either deepened or deleted. The skill-authoring contract's 100-line cap is the depth principle applied to skills: if the implementation cannot fit in 100 lines, either the workflow is too broad (split it) or supporting domain content should move to `reference/*.md` (extract-then-link, D-10). See `./skill-authoring-contract.md` for the full spec.
|
|
95
|
+
|
|
96
|
+
## Cross-references
|
|
97
|
+
|
|
98
|
+
- Design-system-level analog — component-as-module, design-token-as-interface: see `./design-system-guidance.md`.
|
|
99
|
+
- Component-library-level analog — the 6-principle quality standard (Minimal API, Composability, ...): see `./component-authoring.md`.
|
|
100
|
+
- Skill-authoring application — extract-then-link, 100-line cap, refs-one-level-deep: see `./skill-authoring-contract.md`.
|
|
101
|
+
- `CONTEXT.md` glossary format (project-scoped ubiquitous language alongside this vocabulary): see `./context-md-format.md`.
|
|
102
|
+
- ADR format (heavier project-scoped decisions about architectural seams): see `./adr-format.md`.
|