@hegemonart/get-design-done 1.28.0 → 1.28.5

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 (98) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +78 -0
  4. package/SKILL.md +1 -1
  5. package/hooks/gdd-decision-injector.js +149 -3
  6. package/package.json +1 -1
  7. package/reference/adr-format.md +96 -0
  8. package/reference/apply-reflections-procedure.md +68 -0
  9. package/reference/architecture-vocabulary.md +102 -0
  10. package/reference/cache-policy.md +126 -0
  11. package/reference/compare-rubric.md +171 -0
  12. package/reference/connections-onboarding.md +417 -0
  13. package/reference/context-md-format.md +106 -0
  14. package/reference/darkmode-audit-procedure.md +258 -0
  15. package/reference/debug-feedback-loops.md +119 -0
  16. package/reference/design-procedure.md +304 -0
  17. package/reference/discover-procedure.md +204 -0
  18. package/reference/explore-procedure.md +267 -0
  19. package/reference/health-mcp-detection.md +44 -0
  20. package/reference/health-skill-length-report.md +69 -0
  21. package/reference/heuristics.md +84 -0
  22. package/reference/milestone-completeness-rubric.md +87 -0
  23. package/reference/peer-cli-protocol.md +161 -0
  24. package/reference/plan-procedure.md +278 -0
  25. package/reference/registry.json +169 -1
  26. package/reference/registry.schema.json +1 -1
  27. package/reference/router-rules.md +84 -0
  28. package/reference/scan-procedure.md +731 -0
  29. package/reference/shared-preamble.md +78 -6
  30. package/reference/skill-authoring-contract.md +128 -0
  31. package/reference/start-procedure.md +115 -0
  32. package/reference/style-doc-procedure.md +150 -0
  33. package/reference/threat-modeling.md +101 -0
  34. package/reference/verify-procedure.md +512 -0
  35. package/scripts/validate-skill-length.cjs +283 -0
  36. package/skills/add-backlog/SKILL.md +1 -0
  37. package/skills/analyze-dependencies/SKILL.md +33 -122
  38. package/skills/apply-reflections/SKILL.md +1 -40
  39. package/skills/audit/SKILL.md +3 -1
  40. package/skills/bandit-status/SKILL.md +31 -66
  41. package/skills/benchmark/SKILL.md +15 -55
  42. package/skills/brief/SKILL.md +12 -1
  43. package/skills/cache-manager/SKILL.md +3 -57
  44. package/skills/check-update/SKILL.md +38 -75
  45. package/skills/compare/SKILL.md +29 -269
  46. package/skills/complete-cycle/SKILL.md +1 -1
  47. package/skills/connections/SKILL.md +21 -427
  48. package/skills/continue/SKILL.md +1 -0
  49. package/skills/darkmode/SKILL.md +32 -287
  50. package/skills/debug/SKILL.md +11 -8
  51. package/skills/design/SKILL.md +27 -245
  52. package/skills/discover/SKILL.md +26 -133
  53. package/skills/discuss/SKILL.md +18 -2
  54. package/skills/explore/SKILL.md +40 -205
  55. package/skills/fast/SKILL.md +1 -0
  56. package/skills/figma-write/SKILL.md +2 -2
  57. package/skills/health/SKILL.md +11 -33
  58. package/skills/help/SKILL.md +1 -0
  59. package/skills/list-assumptions/SKILL.md +1 -0
  60. package/skills/map/SKILL.md +8 -31
  61. package/skills/new-cycle/SKILL.md +3 -1
  62. package/skills/next/SKILL.md +1 -0
  63. package/skills/note/SKILL.md +1 -0
  64. package/skills/optimize/SKILL.md +21 -44
  65. package/skills/pause/SKILL.md +1 -0
  66. package/skills/peer-cli-add/SKILL.md +26 -108
  67. package/skills/peer-cli-customize/SKILL.md +22 -42
  68. package/skills/peers/SKILL.md +33 -57
  69. package/skills/plan/SKILL.md +33 -220
  70. package/skills/plant-seed/SKILL.md +1 -0
  71. package/skills/pr-branch/SKILL.md +1 -0
  72. package/skills/progress/SKILL.md +1 -7
  73. package/skills/quality-gate/SKILL.md +34 -166
  74. package/skills/quick/SKILL.md +1 -0
  75. package/skills/reapply-patches/SKILL.md +1 -0
  76. package/skills/recall/SKILL.md +1 -0
  77. package/skills/resume/SKILL.md +1 -0
  78. package/skills/review-backlog/SKILL.md +1 -0
  79. package/skills/router/SKILL.md +3 -59
  80. package/skills/scan/SKILL.md +36 -675
  81. package/skills/settings/SKILL.md +1 -0
  82. package/skills/ship/SKILL.md +1 -0
  83. package/skills/sketch/SKILL.md +1 -1
  84. package/skills/sketch-wrap-up/SKILL.md +13 -54
  85. package/skills/spike/SKILL.md +1 -1
  86. package/skills/spike-wrap-up/SKILL.md +12 -46
  87. package/skills/start/SKILL.md +13 -112
  88. package/skills/stats/SKILL.md +1 -0
  89. package/skills/style/SKILL.md +18 -140
  90. package/skills/synthesize/SKILL.md +1 -0
  91. package/skills/timeline/SKILL.md +1 -0
  92. package/skills/todo/SKILL.md +1 -0
  93. package/skills/turn-closeout/SKILL.md +36 -56
  94. package/skills/undo/SKILL.md +1 -0
  95. package/skills/update/SKILL.md +1 -0
  96. package/skills/verify/SKILL.md +42 -457
  97. package/skills/warm-cache/SKILL.md +3 -35
  98. 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.0"
8
+ "version": "1.28.5"
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.0",
15
+ "version": "1.28.5",
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.0",
4
+ "version": "1.28.5",
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,84 @@ All notable changes to get-design-done are documented here. Versions follow [sem
4
4
 
5
5
  ---
6
6
 
7
+ ## [1.28.5] — 2026-05-18
8
+
9
+ ### Phase 28.5 — Skill Authoring Contract + Skill Rework + Project Artifacts
10
+
11
+ 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).
12
+
13
+ #### New reference files
14
+
15
+ - `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.
16
+ - `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.
17
+ - `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).
18
+ - `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).
19
+ - `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.
20
+ - `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).
21
+ - `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.
22
+ - `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.
23
+ - `reference/threat-modeling.md`, `milestone-completeness-rubric.md`, `peer-cli-protocol.md` (28.5-07) — 3 additional Bucket 4 extraction targets (analysis + audit skills).
24
+ - `reference/health-skill-length-report.md` (28.5-11) — health-skill subsection contract documenting validator JSON shape + threshold rationale.
25
+
26
+ #### Skill rework
27
+
28
+ - 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.
29
+ - Bucket 2 (28.5-05) — 7 design-family skills (`audit`, `style`, `darkmode`, `compare`, `design`, `figma-write`, `connections`, `benchmark`) cross-link cleanup + description standardization.
30
+ - 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.
31
+ - 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.
32
+ - All 70 skills under 100 lines post-rework (`scripts/validate-skill-length.cjs --quiet --json` summary: 70 total / 70 clean / 0 warn / 0 block).
33
+
34
+ #### Skill patches + new skill
35
+
36
+ - `discuss` + `brief` skill patches (28.5-08) — inline `CONTEXT.md` glossary maintenance (no batching) + ADR-offer 3-criteria gate at session end.
37
+ - `hooks/gdd-decision-injector.js` extended (28.5-08) — reads `CONTEXT.md` + `docs/adr/*` additively alongside STATE.md cycle-scoped decisions.
38
+ - `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.
39
+ - 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.
40
+
41
+ #### CI gate + health reporting (28.5-11)
42
+
43
+ - `.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.
44
+ - `skills/health/SKILL.md` gains a "Skill-length report" subsection rendering validator summary post-health-table.
45
+ - Regression baseline at `test-fixture/baselines/phase-28.5/` snapshots current line-count distribution + validator summary + 4-manifest version + cross-link integrity + registry diff.
46
+ - `tests/phase-28.5-baseline.test.cjs` (9 assertions) locks the baseline; future PRs cannot regress without regenerating the fixture.
47
+
48
+ #### Closeout (28.5-12)
49
+
50
+ - 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).
51
+ - `tests/semver-compare.test.cjs`: `OFF_CADENCE_VERSIONS.add('1.28.5')`.
52
+ - `NOTICE` extended with Phase 28.5 MIT attribution block for mattpocock/skills (covers 5 reference ports + zoom-out direct port + debug Phase 1 ordering).
53
+ - `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).
54
+ - `test-fixture/baselines/phase-20/skill-list.txt` += `zoom-out` (now 70 skills).
55
+ - `.planning/ROADMAP.md` Phase 28.5 plan checkboxes (28.5-01..28.5-12) flipped to `[x]`; top-level overview entry flipped.
56
+
57
+ ### Decisions locked
58
+
59
+ - 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.
60
+ - D-02: Description format follows `<what>. Use when <triggers>.` shape (lax-mode default; Phase 33 A/B will tighten or relax).
61
+ - D-03: NOTICE MIT attribution covers 5 reference ports + zoom-out direct port + debug Phase 1 ordering.
62
+ - D-04: `reference/debug-feedback-loops.md` ships as a proper reference, not inline in the debug SKILL — per progressive-disclosure rule.
63
+ - D-05: `gdd-zoom-out` skill ships with `disable-model-invocation: true` (user-invoked-only shortcut).
64
+ - D-06: CI gate is two-tier — warn-level advisory, block-level fails the build.
65
+ - D-07: `hooks/gdd-decision-injector.js` reads CONTEXT.md + `docs/adr/*` additively alongside STATE.md (no replacement, no precedence change).
66
+ - 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.
67
+ - D-09: 28 skills marked `disable-model-invocation: true` (27 from Bucket 3 + new zoom-out).
68
+ - D-10: Health-MCP detection procedure extracted to `reference/health-mcp-detection.md`; SKILL links one level deep.
69
+ - D-11: `gdd-health` SKILL gains skill-length report subsection — validator JSON shape documented in `reference/health-skill-length-report.md`.
70
+ - 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.
71
+
72
+ ### Out of scope (deferred or rejected)
73
+
74
+ - Description-format regex tightening — deferred until Phase 33 A/B evidence on `<what>` clause shortcut behavior lands at `.design/research/description-format-ab.md`.
75
+ - Generating SKILL.md from a frontmatter-only spec (DSL) — keeps SKILL.md authorable by humans; reject machine-only generation per first-class-prose principle.
76
+ - Auto-fixer for over-limit skills — validator is read-only; manual rework preserves authorial intent.
77
+ - Cross-skill description deduplication — accept some triggering overlap; D-02 form is a soft cap, not a uniqueness invariant.
78
+
79
+ ### Attribution
80
+
81
+ 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`.
82
+
83
+ ---
84
+
7
85
  ## [1.28.0] — 2026-05-18
8
86
 
9
87
  ### 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
- if (!block && !protoBlock) {
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.0",
3
+ "version": "1.28.5",
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,68 @@
1
+ ---
2
+ name: apply-reflections-procedure
3
+ type: heuristic
4
+ version: 1.0.0
5
+ phase: 28.5
6
+ tags: [apply-reflections, proposal, frontmatter, reference, budget, question, global-skill]
7
+ last_updated: 2026-05-18
8
+ ---
9
+
10
+ # Apply-Reflections — Per-Type Procedure
11
+
12
+ Extracted from `skills/apply-reflections/SKILL.md` per Phase 28.5 D-10 (extract-then-link,
13
+ never delete content). The orchestrator loop in `apply-reflections` (resolve file → parse →
14
+ review loop → summary) stays in the SKILL. The per-proposal-type apply logic below moves
15
+ here because it is content-class methodology, not workflow.
16
+
17
+ ## Apply Logic by Proposal Type
18
+
19
+ After the user chooses `a` (apply) or `e` (edit-then-apply) in the review loop, branch by
20
+ the proposal's bracketed type tag.
21
+
22
+ ### [FRONTMATTER]
23
+
24
+ 1. Extract agent name from Change field (e.g., `agents/design-verifier.md`)
25
+ 2. Read the agent file
26
+ 3. Find the frontmatter line matching the field being changed
27
+ 4. Use Edit tool to update the specific line
28
+ 5. Append `**Applied**: <date>` to the proposal in reflections file
29
+
30
+ ### [REFERENCE]
31
+
32
+ 1. Extract target file path from Change field (e.g., `reference/heuristics.md`)
33
+ 2. If file exists: append the drafted text using Edit tool
34
+ 3. If file doesn't exist: create it with a minimal header + the drafted text using Write tool
35
+ 4. Append `**Applied**: <date>` to proposal in reflections file
36
+
37
+ ### [BUDGET]
38
+
39
+ 1. Read `.design/budget.json`
40
+ 2. Locate the key path from the Change field (e.g., `design-verifier.per_run_cap_usd`)
41
+ 3. Update the value
42
+ 4. Write updated JSON back to `.design/budget.json`
43
+ 5. Append `**Applied**: <date>` to proposal in reflections file
44
+
45
+ ### [QUESTION]
46
+
47
+ 1. Read `agents/design-discussant.md`
48
+ 2. Find the question text specified in the Change field
49
+ 3. If pruning: remove the question lines using Edit tool
50
+ 4. If rewording: replace the question text using Edit tool
51
+ 5. Append `**Applied**: <date>` to proposal in reflections file
52
+
53
+ ### [GLOBAL-SKILL]
54
+
55
+ 1. Extract target filename from Change field (e.g., `design-color-conventions.md`)
56
+ 2. Ensure `~/.claude/gdd/global-skills/` directory exists (create with `mkdir -p` if not)
57
+ 3. If target file exists: append new content using Edit tool (add a `---` separator first)
58
+ 4. If target file doesn't exist: create with header + content using Write tool:
59
+
60
+ ```markdown
61
+ # <Topic> Conventions (Global)
62
+ *Promoted from project: <project-name>, cycle: <cycle-slug>*
63
+
64
+ <content>
65
+ ```
66
+
67
+ 5. Print: "Global skill written to ~/.claude/gdd/global-skills/<name>.md — auto-loads in all future gdd sessions"
68
+ 6. Append `**Applied**: <date>` to proposal in reflections file
@@ -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`.