@hegemonart/get-design-done 1.57.1 → 1.57.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/.claude-plugin/marketplace.json +26 -41
  2. package/.claude-plugin/plugin.json +23 -48
  3. package/CHANGELOG.md +91 -0
  4. package/README.md +166 -511
  5. package/SKILL.md +2 -0
  6. package/agents/README.md +33 -36
  7. package/agents/a11y-mapper.md +3 -3
  8. package/agents/component-benchmark-harvester.md +6 -6
  9. package/agents/component-benchmark-synthesizer.md +3 -3
  10. package/agents/compose-executor.md +3 -3
  11. package/agents/cost-forecaster.md +2 -2
  12. package/agents/design-auditor.md +7 -7
  13. package/agents/design-authority-watcher.md +15 -15
  14. package/agents/design-context-builder.md +4 -4
  15. package/agents/design-context-checker-gate.md +1 -1
  16. package/agents/design-discussant.md +2 -2
  17. package/agents/design-doc-writer.md +1 -1
  18. package/agents/design-executor.md +2 -2
  19. package/agents/design-figma-writer.md +2 -2
  20. package/agents/design-fixer.md +7 -7
  21. package/agents/design-integration-checker-gate.md +1 -1
  22. package/agents/design-integration-checker.md +1 -1
  23. package/agents/design-paper-writer.md +3 -3
  24. package/agents/design-pencil-writer.md +1 -1
  25. package/agents/design-planner.md +21 -0
  26. package/agents/design-reflector.md +39 -39
  27. package/agents/design-research-synthesizer.md +1 -0
  28. package/agents/design-start-writer.md +1 -1
  29. package/agents/design-update-checker.md +5 -5
  30. package/agents/design-verifier-gate.md +1 -1
  31. package/agents/design-verifier.md +52 -48
  32. package/agents/ds-generator.md +2 -2
  33. package/agents/ds-migration-planner.md +4 -4
  34. package/agents/email-executor.md +9 -9
  35. package/agents/experiment-result-ingester.md +3 -3
  36. package/agents/flutter-executor.md +5 -5
  37. package/agents/gdd-graph-refresh.md +3 -3
  38. package/agents/gdd-intel-updater.md +2 -2
  39. package/agents/motion-mapper.md +2 -2
  40. package/agents/motion-verifier.md +4 -4
  41. package/agents/pdf-executor.md +8 -8
  42. package/agents/perf-analyzer.md +17 -17
  43. package/agents/pr-commenter.md +9 -9
  44. package/agents/prototype-gate.md +2 -2
  45. package/agents/quality-gate-runner.md +1 -1
  46. package/agents/rollout-coordinator.md +3 -3
  47. package/agents/swift-executor.md +4 -4
  48. package/agents/ticket-sync-agent.md +6 -6
  49. package/agents/user-research-synthesizer.md +2 -2
  50. package/connections/connections.md +44 -45
  51. package/connections/cursor.md +73 -0
  52. package/connections/preview.md +3 -3
  53. package/dist/claude-code/.claude/skills/cache-manager/SKILL.md +3 -3
  54. package/dist/claude-code/.claude/skills/cache-manager/cache-policy.md +1 -1
  55. package/dist/claude-code/.claude/skills/design/SKILL.md +19 -0
  56. package/dist/claude-code/.claude/skills/explore/SKILL.md +11 -0
  57. package/dist/claude-code/.claude/skills/figma-write/SKILL.md +13 -2
  58. package/dist/claude-code/.claude/skills/paper-write/SKILL.md +54 -0
  59. package/dist/claude-code/.claude/skills/pencil-write/SKILL.md +54 -0
  60. package/dist/claude-code/.claude/skills/report-issue/SKILL.md +2 -2
  61. package/dist/claude-code/.claude/skills/router/SKILL.md +2 -2
  62. package/dist/claude-code/.claude/skills/verify/verify-procedure.md +10 -11
  63. package/dist/claude-code/.claude/skills/warm-cache/SKILL.md +1 -1
  64. package/hooks/first-run-nudge.cjs +171 -0
  65. package/hooks/gdd-intel-trigger.js +243 -0
  66. package/hooks/gdd-mcp-circuit-breaker.js +62 -7
  67. package/hooks/gdd-precompact-snapshot.js +50 -29
  68. package/hooks/gdd-protected-paths.js +150 -18
  69. package/hooks/gdd-risk-gate.js +93 -1
  70. package/hooks/gdd-sessionstart-recap.js +59 -24
  71. package/hooks/hooks.json +13 -4
  72. package/hooks/inject-using-gdd.cjs +188 -0
  73. package/hooks/update-check.cjs +511 -0
  74. package/package.json +9 -2
  75. package/reference/STATE-TEMPLATE.md +10 -13
  76. package/reference/audit-scoring.md +1 -1
  77. package/reference/cache-tier-doctrine.md +46 -0
  78. package/reference/config-schema.md +9 -9
  79. package/reference/i18n.md +1 -1
  80. package/reference/intel-schema.md +37 -2
  81. package/reference/meta-rules.md +4 -4
  82. package/reference/model-tiers.md +2 -2
  83. package/reference/registry.json +101 -94
  84. package/reference/runtime-models.md +11 -1
  85. package/reference/shared-preamble.md +13 -14
  86. package/reference/skill-graph.md +24 -1
  87. package/scripts/bootstrap.cjs +373 -0
  88. package/scripts/injection-patterns.cjs +58 -0
  89. package/scripts/lib/apply-reflections/incubator-proposals.cjs +57 -26
  90. package/scripts/lib/install/converters/codex-plugin.cjs +5 -2
  91. package/scripts/lib/install/converters/cursor.cjs +20 -0
  92. package/scripts/lib/issue-reporter/report-flow.cjs +1 -1
  93. package/scripts/lib/manifest/skills.json +80 -13
  94. package/scripts/lib/state/query-surface.cjs +67 -9
  95. package/scripts/lib/state/state-store.cjs +68 -26
  96. package/sdk/cli/commands/stage.ts +17 -0
  97. package/sdk/cli/index.js +14 -0
  98. package/skills/cache-manager/SKILL.md +3 -3
  99. package/skills/cache-manager/cache-policy.md +1 -1
  100. package/skills/design/SKILL.md +19 -0
  101. package/skills/explore/SKILL.md +11 -0
  102. package/skills/figma-write/SKILL.md +13 -2
  103. package/skills/paper-write/SKILL.md +54 -0
  104. package/skills/pencil-write/SKILL.md +54 -0
  105. package/skills/report-issue/SKILL.md +2 -2
  106. package/skills/router/SKILL.md +2 -2
  107. package/skills/verify/verify-procedure.md +10 -11
  108. package/skills/warm-cache/SKILL.md +1 -1
  109. package/hooks/first-run-nudge.sh +0 -82
  110. package/hooks/inject-using-gdd.sh +0 -72
  111. package/hooks/update-check.sh +0 -251
  112. package/scripts/lib/audit-aggregator/index.cjs +0 -219
  113. package/scripts/lib/hedge-ensemble.cjs +0 -217
@@ -6,7 +6,7 @@ color: yellow
6
6
  default-tier: sonnet
7
7
  tier-rationale: "Follows an Opus-authored plan; executes rather than plans"
8
8
  size_budget: XXL
9
- size_budget_rationale: "Phase 17 added Benchmark Spec Pre-Flight section for type:components (+17 lines)"
9
+ size_budget_rationale: "Benchmark Spec Pre-Flight section for type:components adds ~17 lines"
10
10
  parallel-safe: conditional-on-touches
11
11
  typical-duration-seconds: 60
12
12
  reads-only: false
@@ -34,7 +34,7 @@ The orchestrating stage supplies a `<required_reading>` block in the prompt. Rea
34
34
  - `.design/STATE.md` - pipeline state (decisions, blockers, must-haves)
35
35
  - `.design/DESIGN-PLAN.md` - full task list (your task is identified by task_id)
36
36
  - `.design/DESIGN-CONTEXT.md` - brand decisions, constraints, locked choices
37
- - The reference file(s) relevant to the task type (e.g., `reference/typography.md` for a typography task). The 7 domain-index entry-points `reference/{typography,color,spatial,motion,interaction,responsive,ux-writing}.md` (Phase 45) are the navigation start: load the index, drill into the fragments it lists only as the task needs them.
37
+ - The reference file(s) relevant to the task type (e.g., `reference/typography.md` for a typography task). The 7 domain-index entry-points `reference/{typography,color,spatial,motion,interaction,responsive,ux-writing}.md` are the navigation start: load the index, drill into the fragments it lists only as the task needs them.
38
38
 
39
39
  **Invariant:** read all listed files FIRST, before making any changes.
40
40
 
@@ -153,8 +153,8 @@ Build a numbered operation list based on mode. Do not execute yet.
153
153
 
154
154
  ```
155
155
  Proposed annotations (N operations):
156
- 1. Layer "Button/Primary" → add comment: "Background: brand-primary-500 (#1A73E8) per D-03"
157
- 2. Layer "Typography/H1" → add comment: "Font: Inter 32/40 per D-07"
156
+ 1. Layer "Button/Primary" → add comment: "Background: brand-primary-500 (#1A73E8) per color decision"
157
+ 2. Layer "Typography/H1" → add comment: "Font: Inter 32/40 per typography decision"
158
158
  ... (one line per annotation)
159
159
  ```
160
160
 
@@ -23,7 +23,7 @@ You fix design gaps atomically. One agent invocation = fix all in-scope gaps fro
23
23
 
24
24
  You have zero session memory. Every invocation starts fresh. The orchestrating stage supplies all context via the `<required_reading>` block and prompt context fields - you rely entirely on those inputs.
25
25
 
26
- **Scope of work:** You apply targeted source-code fixes for gaps listed in `.design/DESIGN-VERIFICATION.md ## Phase 5 — Gaps`. You commit one fix per gap. You do nothing else.
26
+ **Scope of work:** You apply targeted source-code fixes for gaps listed in `.design/DESIGN-VERIFICATION.md ## Stage 5 — Gaps`. You commit one fix per gap. You do nothing else.
27
27
 
28
28
  **Accessibility failures route here too.** When the quality-gate skill classifies a failure into the `a11y` bucket (sourced from axe / pa11y / lighthouse / jsx-a11y runs), it spawns you with that failure exactly like a `lint`, `type`, `test`, or `visual` failure. Treat an `a11y` classified failure as a normal in-scope fix: read the cited rule, apply the minimal source change that clears the violation (a missing label, an aria attribute, a contrast token), confirm the fix, and commit one fix per gap. No special handling beyond the standard fix sequence below.
29
29
 
@@ -43,7 +43,7 @@ You have zero session memory. Every invocation starts fresh. The orchestrating s
43
43
  The orchestrating stage supplies a `<required_reading>` block in the prompt. Read every listed file before acting - this is mandatory. Minimum expected files:
44
44
 
45
45
  - `.design/STATE.md` - pipeline state, blockers, decisions
46
- - `.design/DESIGN-VERIFICATION.md` - gaps to fix (## Phase 5 - Gaps section)
46
+ - `.design/DESIGN-VERIFICATION.md` - gaps to fix (## Stage 5 - Gaps section)
47
47
  - `.design/DESIGN-CONTEXT.md` - locked D-XX decisions; do not contradict them
48
48
 
49
49
  **Invariant:** read all listed files FIRST, before making any changes.
@@ -64,11 +64,11 @@ The stage embeds the following fields in the prompt:
64
64
 
65
65
  ## Gap Input Format
66
66
 
67
- Gaps are produced by design-verifier Phase 5 and written to the `## Phase 5 — Gaps` section of `.design/DESIGN-VERIFICATION.md`. The format is locked:
67
+ Gaps are produced by design-verifier Stage 5 and written to the `## Stage 5 — Gaps` section of `.design/DESIGN-VERIFICATION.md`. The format is locked:
68
68
 
69
69
  ```
70
70
  ### [BLOCKER|MAJOR|MINOR|COSMETIC] G-NN: [title]
71
- - Phase: [1|2|3|4]
71
+ - Stage: [1|2|3|4]
72
72
  - Description: [what is broken]
73
73
  - Expected: [what should be true]
74
74
  - Actual: [what is true]
@@ -85,12 +85,12 @@ Parse every entry in that section. The `G-NN` identifier, severity classificatio
85
85
  ### Step 1 - Read gaps and filter by scope
86
86
 
87
87
  1. Read `.design/DESIGN-VERIFICATION.md`.
88
- 2. Locate the `## Phase 5 — Gaps` section (or `## GAPS FOUND` if verifier used that heading).
88
+ 2. Locate the `## Stage 5 — Gaps` section (or `## GAPS FOUND` if verifier used that heading).
89
89
  3. Parse all gap entries in locked G-NN format.
90
90
  4. Filter by severity based on `auto_mode`:
91
91
  - Always include: `BLOCKER`, `MAJOR`
92
92
  - Include only if `auto_mode=true`: `MINOR`, `COSMETIC`
93
- 5. **Confidence routing filter (Phase 49, see `reference/reviewer-confidence-gate.md`).** Drop any gap that sits under a `## Tentative` heading: those never reach you. Then drop any `BLOCKER` or `MAJOR` gap whose `confidence` field is below `0.8` and route it to user review instead of auto-fix, since a high-severity gap without strong evidence is exactly the inflated-severity case the gate exists to catch. A gap missing its `confidence` field is treated as below the floor. The shared decision lives in `scripts/lib/confidence-route.cjs` (`route({ severity, confidence, tentative })` returns `'fix' | 'user-review' | 'drop'`); fix only the gaps it routes to `'fix'`.
93
+ 5. **Confidence routing filter (see `reference/reviewer-confidence-gate.md`).** Drop any gap that sits under a `## Tentative` heading: those never reach you. Then drop any `BLOCKER` or `MAJOR` gap whose `confidence` field is below `0.8` and route it to user review instead of auto-fix, since a high-severity gap without strong evidence is exactly the inflated-severity case the gate exists to catch. A gap missing its `confidence` field is treated as below the floor. The shared decision lives in `scripts/lib/confidence-route.cjs` (`route({ severity, confidence, tentative })` returns `'fix' | 'user-review' | 'drop'`); fix only the gaps it routes to `'fix'`.
94
94
  6. Build an ordered list: BLOCKER first, then MAJOR, then (if included) MINOR, COSMETIC.
95
95
 
96
96
  If no in-scope gaps are found (e.g., verifier found only MINOR gaps and `auto_mode=false`), emit `## FIX COMPLETE` immediately with "No in-scope gaps to fix."
@@ -125,7 +125,7 @@ f. **Record status.** Note `G-NN: fixed` in your running tracker.
125
125
  - **Rule 3 - Blocking issue:** If something prevents applying this specific fix (missing import, wrong file structure), resolve the blocking issue first, then apply the fix → continue.
126
126
  - **Rule 4 - Architectural change required:** If resolving the gap requires a new DB table, major schema change, switching libraries, or breaking API changes → DO NOT force a fix. Classify as unresolvable and proceed to Step 3 for this gap.
127
127
 
128
- ### Step 2.5 - Confidence x risk routing (Phase 56)
128
+ ### Step 2.5 - Confidence x risk routing
129
129
 
130
130
  Step 1's confidence filter (`scripts/lib/confidence-route.cjs`) already dropped tentative and low-confidence gaps. Step 2.5 adds the action-risk dimension: a fix that is correct can still be dangerous to APPLY (touching STATE.md, a schema, a hook, a large diff). Score the write, then combine score and confidence into one routing decision per gap.
131
131
 
@@ -88,7 +88,7 @@ You MAY:
88
88
 
89
89
  ## Why this agent exists
90
90
 
91
- Per 10.1-CONTEXT decision **D-21** (Lazy Checker Spawning): "Cheap Haiku gate agents at `agents/*-gate.md` decide whether to spawn full checker. If false, skip full checker, log as `lazy_skipped: true` in telemetry." This gate is the integration-checker-specific instance of that pattern - the full `design-integration-checker` is a LARGE-size post-verification spawn that grep-walks the codebase for D-XX decision application. If no decision or anchor doc moved in the diff, the wiring result is unchanged from the last verify and the spawn is wasted cost.
91
+ Lazy Checker Spawning: cheap Haiku gate agents at `agents/*-gate.md` decide whether to spawn the full checker. If false, the full checker is skipped and logged as `lazy_skipped: true` in telemetry. This gate is the integration-checker-specific instance of that pattern - the full `design-integration-checker` is a LARGE-size post-verification spawn that grep-walks the codebase for D-XX decision application. If no decision or anchor doc moved in the diff, the wiring result is unchanged from the last verify and the spawn is wasted cost.
92
92
 
93
93
  ## Record
94
94
 
@@ -21,7 +21,7 @@ writes: []
21
21
 
22
22
  You are a post-execution design decision wiring verifier. You confirm that each D-XX design decision recorded in `.design/DESIGN-CONTEXT.md` is actually reflected in the source code - not just described in planning documents.
23
23
 
24
- You are spawned by the verify stage **AFTER** design-verifier completes. You supplement the verifier's gap list with decision-wiring status: decisions that are documented but not applied in code are gaps that escaped Phase 1–4 verification.
24
+ You are spawned by the verify stage **AFTER** design-verifier completes. You supplement the verifier's gap list with decision-wiring status: decisions that are documented but not applied in code are gaps that escaped Stages 1–4 verification.
25
25
 
26
26
  You run once per verify session. You are read-only - no Write tool. Your findings are returned inline and incorporated into the verify stage's gap-response loop.
27
27
 
@@ -60,11 +60,11 @@ STOP.
60
60
 
61
61
  Read `.design/DESIGN-CONTEXT.md`. Build a numbered operation list per mode. Do NOT execute yet.
62
62
 
63
- **annotate mode** - extract confirmed D-XX decisions, map to canvas nodes:
63
+ **annotate mode** - extract confirmed decisions, map to canvas nodes:
64
64
  ```
65
65
  Proposed annotations (N operations):
66
- 1. Node "Button/Primary" → add_comment: "bg: brand-primary-500 per D-03"
67
- 2. Node "Typography/H1" → add_comment: "font: Inter 32/40 per D-07"
66
+ 1. Node "Button/Primary" → add_comment: "bg: brand-primary-500 per color decision"
67
+ 2. Node "Typography/H1" → add_comment: "font: Inter 32/40 per typography decision"
68
68
  ```
69
69
 
70
70
  **tokenize mode** - extract CSS literal values, map to paper.design style updates:
@@ -49,7 +49,7 @@ Parse mode: `annotate | roundtrip` (required). If absent, list modes and STOP.
49
49
  **annotate mode** - read `.design/DESIGN-DEBT.md`, map findings to .pen components:
50
50
  ```
51
51
  Proposed annotations (N operations):
52
- 1. Button.pen → add comment: "DEBT: padding token mismatch — D-03 says 8px, impl uses 10px"
52
+ 1. Button.pen → add comment: "DEBT: padding token mismatch — decision says 8px, impl uses 10px"
53
53
  2. Modal.pen → add comment: "DEBT: missing focus-trap per accessibility audit"
54
54
  ```
55
55
 
@@ -24,6 +24,27 @@ You are the design-planner agent. Spawned by the `plan` stage after optional res
24
24
 
25
25
  Do not start design work, generate code, or modify any file outside `.design/`. Your output is the plan that the `design` stage will execute.
26
26
 
27
+ ## Output Contract
28
+
29
+ Emit a single top-of-response fenced ```json block conforming to `reference/output-contracts/planner-decision.schema.json` BEFORE any prose. The envelope captures the typed plan summary so downstream stages can consume it without re-parsing markdown.
30
+
31
+ The envelope shape:
32
+
33
+ ```json
34
+ {
35
+ "schema_version": "1.0.0",
36
+ "plan_id": "<dated slug, e.g. 2026-06-04-dashboard>",
37
+ "tasks": [
38
+ { "task_id": "T-1", "summary": "<one line>", "touches": ["<glob>"], "dependencies": [], "parallel_safe": true, "estimated_minutes": 30 }
39
+ ],
40
+ "waves": [
41
+ { "wave": "A", "task_ids": ["T-1"] }
42
+ ]
43
+ }
44
+ ```
45
+
46
+ After the envelope, continue with the human-readable plan body in prose + markdown tables (the existing format). The DESIGN-PLAN.md file you write continues to include both; the envelope at the top, then the prose. The `parse-contract.cjs#parsePlannerDecision` consumer reads only the envelope; orchestrators and reviewers read the prose.
47
+
27
48
  ---
28
49
 
29
50
  ## Required Reading
@@ -5,7 +5,7 @@ tools: Read, Write, Bash, Grep, Glob
5
5
  color: purple
6
6
  model: inherit
7
7
  default-tier: opus
8
- tier-rationale: "Phase 11 strategic reflector; reads telemetry + proposes plugin-level changes"
8
+ tier-rationale: "Strategic reflector; reads telemetry + proposes plugin-level changes"
9
9
  size_budget: XL
10
10
  parallel-safe: never
11
11
  typical-duration-seconds: 60
@@ -24,7 +24,7 @@ You are a post-cycle reflection agent. You analyze what happened in a design cyc
24
24
 
25
25
  ## Event-Stream Mode (Phase 20 onwards)
26
26
 
27
- The reflector now reads proposals from `.design/telemetry/events.jsonl` - the append-only event stream introduced by Plan 20-06. It filters entries where `type === 'reflection.proposal'`. Each matching line is a JSON object whose `payload` carries fields like `{ source: <skill|hook>, proposal_kind: <string>, rationale: <string>, ... }` emitted by the producing skill or hook.
27
+ The reflector reads proposals from `.design/telemetry/events.jsonl` - the append-only event stream. It filters entries where `type === 'reflection.proposal'`. Each matching line is a JSON object whose `payload` carries fields like `{ source: <skill|hook>, proposal_kind: <string>, rationale: <string>, ... }` emitted by the producing skill or hook.
28
28
 
29
29
  Read flow:
30
30
 
@@ -33,17 +33,17 @@ Read flow:
33
33
  3. Collect every entry where `type === 'reflection.proposal'`. Render each payload into the appropriate Proposals section below.
34
34
  4. Cross-reference the event's `stage`, `cycle`, and `_meta.source` fields when citing evidence.
35
35
 
36
- Legacy grep-based parsing of skill outputs is preserved as a fallback for skills that haven't yet migrated to emit `reflection.proposal` events (Phase 22 scope). If no `reflection.proposal` events are present in the stream, run the legacy harvest across `.design/learnings/*.md` and `.design/intel/` exactly as before - both paths produce the same Proposals section format.
36
+ Legacy grep-based parsing of skill outputs is preserved as a fallback for skills that haven't yet migrated to emit `reflection.proposal` events. If no `reflection.proposal` events are present in the stream, run the legacy harvest across `.design/learnings/*.md` and `.design/intel/` exactly as before - both paths produce the same Proposals section format.
37
37
 
38
- ## Capability-gap pattern scan (Phase 29 Plan 02)
38
+ ## Capability-gap pattern scan
39
39
 
40
- During the reflection pass, also run the capability-gap pattern scan to detect recurring patterns lacking a dedicated executable owner. The scan emits `capability_gap` events with `source: "reflector_pattern"` for Plan 29-03 to aggregate.
40
+ During the reflection pass, also run the capability-gap pattern scan to detect recurring patterns lacking a dedicated executable owner. The scan emits `capability_gap` events with `source: "reflector_pattern"` for downstream aggregation.
41
41
 
42
42
  ```
43
43
  node -e "console.log(JSON.stringify(require('./scripts/lib/reflector/capability-gap-scan.cjs').runCapabilityGapScan(), null, 2))"
44
44
  ```
45
45
 
46
- The scan reads three signal sources: `.design/intel/*.md` `Touches:` clusters, `.design/telemetry/posterior.json` high-usage arms with no specialized agent, and recent `.design/gep/events.jsonl` decision sequences. MCP-probe failures (`outcome === 'connection-error'`, `agent === 'mcp-probe'`, or `mcp_probe: true`) do NOT trigger gap events (CONTEXT D-08). See @skills/reflect/procedures/capability-gap-scan.md for the full contract.
46
+ The scan reads three signal sources: `.design/intel/*.md` `Touches:` clusters, `.design/telemetry/posterior.json` high-usage arms with no specialized agent, and recent `.design/gep/events.jsonl` decision sequences. MCP-probe failures (`outcome === 'connection-error'`, `agent === 'mcp-probe'`, or `mcp_probe: true`) do NOT trigger gap events. See @skills/reflect/procedures/capability-gap-scan.md for the full contract.
47
47
 
48
48
  Cite the returned `emittedEventIds` in the run summary under a `## Capability gaps emitted` heading. The threshold knob is `reflector.capability_gap_threshold` in `.design/config.json` (default `N=3`, integer ≥ 1).
49
49
 
@@ -54,10 +54,10 @@ The orchestrating stage supplies a `<required_reading>` block in the prompt. Rea
54
54
  Minimum expected inputs (skip gracefully if absent, note what's missing):
55
55
  - `.design/STATE.md` - cycle identity, decisions, session history
56
56
  - `.design/DESIGN-VERIFICATION.md` - cycle outcome scores + gaps
57
- - `.design/learnings/*.md` - structured learnings from Phase 10 extract
58
- - `.design/telemetry/costs.jsonl` - per-agent-spawn cost data (Phase 10.1)
59
- - `.design/agent-metrics.json` - aggregated agent performance data (Phase 10.1)
60
- - `.design/learnings/question-quality.jsonl` - discussant answer quality log (Phase 11)
57
+ - `.design/learnings/*.md` - structured learnings from extract
58
+ - `.design/telemetry/costs.jsonl` - per-agent-spawn cost data
59
+ - `.design/agent-metrics.json` - aggregated agent performance data
60
+ - `.design/learnings/question-quality.jsonl` - discussant answer quality log
61
61
  - `.design/cycles/<slug>/CYCLE-SUMMARY.md` - if present
62
62
 
63
63
  ## Output
@@ -66,13 +66,13 @@ Before writing any `.design/` artifact, resolve the main repo root via `scripts/
66
66
 
67
67
  Write `.design/reflections/<cycle-slug>.md`. If `--dry-run` is set in the spawning prompt, print proposals to stdout only - do not write the file.
68
68
 
69
- If the capability-gap pattern scan emitted any events during this run, include a `## Capability gaps emitted` heading listing each `event_id` with the source signal kind (`intel` | `posterior` | `trajectory`) and the `suggested_kind` (`agent` | `skill`) per event. Plan 29-03 reads these events from `.design/gep/events.jsonl` to cluster recurring `capability_gap` events for `/gdd:apply-reflections`.
69
+ If the capability-gap pattern scan emitted any events during this run, include a `## Capability gaps emitted` heading listing each `event_id` with the source signal kind (`intel` | `posterior` | `trajectory`) and the `suggested_kind` (`agent` | `skill`) per event. Downstream consumers read these events from `.design/gep/events.jsonl` to cluster recurring `capability_gap` events for `/gdd:apply-reflections`.
70
70
 
71
71
  Terminate with `## REFLECTION COMPLETE`.
72
72
 
73
73
  ## Reflection Sections
74
74
 
75
- Write these sections in order. If source data is missing, write the section heading and a single note: "Source not found - requires <phase-N> artifacts."
75
+ Write these sections in order. If source data is missing, write the section heading and a single note: "Source not found - requires upstream artifacts."
76
76
 
77
77
  ---
78
78
 
@@ -94,7 +94,7 @@ After listing standard surprises, apply the **Four Principles Checks** from `ref
94
94
 
95
95
  Scan STATE.md `<decisions>` block for D-XX codes. Cross-reference `.design/learnings/` files from prior cycles if present. Flag decisions that: (a) appeared in multiple sessions of the same cycle, or (b) appear under the same keyword in learnings from ≥2 prior cycles. These are candidates for `reference/` additions.
96
96
 
97
- **Per-author patterns (Phase 40, team mode).** When decisions carry the `[author= co-author=]` attribution suffix (see `reference/multi-author-model.md`), parse it with `scripts/lib/collab/attribution.cjs` (`parseDecisionsBlock` + `groupByAuthor`) and add a brief **Per-author patterns** sub-note: who locks decisions early, whose decisions get reverted or unlocked most, and any author whose decisions cluster around a recurring keyword. Skip silently when no decision is attributed (single-author projects).
97
+ **Per-author patterns (team mode).** When decisions carry the `[author= co-author=]` attribution suffix (see `reference/multi-author-model.md`), parse it with `scripts/lib/collab/attribution.cjs` (`parseDecisionsBlock` + `groupByAuthor`) and add a brief **Per-author patterns** sub-note: who locks decisions early, whose decisions get reverted or unlocked most, and any author whose decisions cluster around a recurring keyword. Skip silently when no decision is attributed (single-author projects).
98
98
 
99
99
  ### 3. Agent Performance
100
100
 
@@ -122,29 +122,29 @@ Read `.design/telemetry/costs.jsonl` (if exists). Aggregate per agent:
122
122
  - Sustained underspend: < 40% of allocation for ≥3 cycles → `[BUDGET]` proposal to lower cap
123
123
  - Consistent cap breaches: `cap_hit: true` ≥3 times → `[BUDGET]` proposal
124
124
 
125
- If `.design/budget.json` doesn't exist: note "budget.json not found - Phase 10.1 budget governance required."
125
+ If `.design/budget.json` doesn't exist: note "budget.json not found - budget governance required."
126
126
 
127
- ### 7. Cross-runtime cost arbitrage (Phase 26 - D-09)
127
+ ### 7. Cross-runtime cost arbitrage
128
128
 
129
- **Why this exists:** Phase 24 ships gdd to 14 runtimes (claude, codex, gemini, qwen, …). The same `(agent, tier)` pair can cost dramatically different amounts depending on which runtime executed the spawn - runtime-author pricing varies, and the user may already be paying for one runtime via subscription while paying per-token in another. This section surfaces those arbitrage opportunities as **structured, measurable signals** - never hand-wavy assumptions.
129
+ **Why this exists:** gdd ships to 14 runtimes (claude, codex, gemini, qwen, …). The same `(agent, tier)` pair can cost dramatically different amounts depending on which runtime executed the spawn - runtime-author pricing varies, and the user may already be paying for one runtime via subscription while paying per-token in another. This section surfaces those arbitrage opportunities as **structured, measurable signals** - never hand-wavy assumptions.
130
130
 
131
- **Data source:** `.design/telemetry/events.jsonl` - filter entries where `type === 'cost.update'`. Each cost row is tagged with `payload.runtime` (Plan 26-05) so spawns from different runtimes are attributable apples-to-apples. The reflector reads cost events from this stream alongside Section 6's `costs.jsonl` rollup; events.jsonl is authoritative for runtime attribution.
131
+ **Data source:** `.design/telemetry/events.jsonl` - filter entries where `type === 'cost.update'`. Each cost row is tagged with `payload.runtime` so spawns from different runtimes are attributable apples-to-apples. The reflector reads cost events from this stream alongside Section 6's `costs.jsonl` rollup; events.jsonl is authoritative for runtime attribution.
132
132
 
133
133
  **The rule:**
134
134
 
135
- For each `(agent, tier)` pair observed in the last 5 cycles (D-09 default window):
135
+ For each `(agent, tier)` pair observed in the last 5 cycles (default window):
136
136
 
137
137
  1. Bucket cost events by `(agent, tier, runtime, cycle)` and sum within each bucket. Sum-then-average is critical: a cycle that ran 4 design-verifier spawns in claude and 1 in codex must NOT inflate claude's per-cycle average by a factor of 4. Sum the 4 spawns into one cycle-sum, then average across the cycles where the runtime appeared.
138
138
  2. Compute `avg_cost_per_cycle` per `(agent, tier, runtime)` triple, restricted to the recency window.
139
139
  3. For each pair that has ≥2 runtimes in the window, find the cheapest and most expensive runtime. Compute `delta_pct = (max_avg - min_avg) / min_avg`.
140
- 4. If `delta_pct > 0.5` (50%, D-09 starting heuristic), emit a structured `cost_arbitrage` proposal.
140
+ 4. If `delta_pct > 0.5` (50%, starting heuristic), emit a structured `cost_arbitrage` proposal.
141
141
 
142
142
  **Important guardrails (failure modes the rule must avoid):**
143
143
 
144
144
  - **Mixed-runtime cycles must not crash or double-count.** A single cycle where some agent spawns ran in CC and others in Codex is normal - runtime attribution is per-spawn (`payload.runtime`), never per-cycle.
145
145
  - **Single-runtime-only history is silent.** If only one runtime has events for an `(agent, tier)` pair in the window, no arbitrage can be computed - emit nothing rather than a misleading "no comparison available" proposal.
146
146
  - **Zero-cost denominators are skipped.** A runtime that averaged $0 in the window would produce `delta_pct: Infinity`; skip the pair rather than emit a useless signal.
147
- - **The 50% threshold is a starting heuristic.** Bandit-style learning over arbitrage outcomes (was the proposal applied? did costs drop?) is **Phase 23.5+ territory** - it lives in the bandit posterior, NOT here. This section's job is to surface measurement signals; tier-selection learning is a separate data product.
147
+ - **The 50% threshold is a starting heuristic.** Bandit-style learning over arbitrage outcomes (was the proposal applied? did costs drop?) is bandit-posterior territory - it lives in the bandit posterior, NOT here. This section's job is to surface measurement signals; tier-selection learning is a separate data product.
148
148
 
149
149
  **Helper:** `scripts/lib/cost-arbitrage.cjs` exports `analyze(events, options) → proposals[]` implementing the above rule deterministically. The executor agent following this skill loads `events.jsonl`, parses each line as JSON (skipping malformed lines), and passes the array of envelopes to `analyze()`. No re-derivation of the rule in prose - call the helper.
150
150
 
@@ -165,17 +165,17 @@ For each `(agent, tier)` pair observed in the last 5 cycles (D-09 default window
165
165
  }
166
166
  ```
167
167
 
168
- Render each `cost_arbitrage` entry into the Proposals section as a `[BUDGET]`-tagged proposal carrying the structured payload verbatim - `/gdd:apply-reflections` will route it to the runtime-routing layer (Phase 26's tier-resolver / runtime-detect) rather than to `.design/budget.json`.
168
+ Render each `cost_arbitrage` entry into the Proposals section as a `[BUDGET]`-tagged proposal carrying the structured payload verbatim - `/gdd:apply-reflections` will route it to the runtime-routing layer (tier-resolver / runtime-detect) rather than to `.design/budget.json`.
169
169
 
170
170
  ---
171
171
 
172
- ### 8. Bandit-arbitrage analysis (Phase 27.5 - D-10)
172
+ ### 8. Bandit-arbitrage analysis
173
173
 
174
- **Why this exists:** Phase 27.5 (v1.27.5) wired the bandit posterior + delegate dimension into production. The posterior now accumulates per-`(agent, bin, delegate, tier)` win-rates from real spawns. Once the posterior has enough data, the bandit's best-arm tier for an agent may differ from that agent's frontmatter `default-tier:` - a measurement signal that the frontmatter is stale. This section surfaces that signal as a `[FRONTMATTER]` proposal.
174
+ **Why this exists:** The bandit posterior + delegate dimension is wired into production. The posterior accumulates per-`(agent, bin, delegate, tier)` win-rates from real spawns. Once the posterior has enough data, the bandit's best-arm tier for an agent may differ from that agent's frontmatter `default-tier:` - a measurement signal that the frontmatter is stale. This section surfaces that signal as a `[FRONTMATTER]` proposal.
175
175
 
176
176
  **Data sources:**
177
177
 
178
- - `.design/telemetry/posterior.json` - the bandit posterior file written by Phase 23.5's `bandit-router.cjs` + Phase 27.5-02/03's production callers. Path matches `bandit-router.cjs`'s `DEFAULT_POSTERIOR_PATH`. If the file does not exist, skip this section with note "posterior.json not found - Phase 27.5 wiring required."
178
+ - `.design/telemetry/posterior.json` - the bandit posterior file written by `bandit-router.cjs` + production callers. Path matches `bandit-router.cjs`'s `DEFAULT_POSTERIOR_PATH`. If the file does not exist, skip this section with note "posterior.json not found - bandit wiring required."
179
179
  - `agents/*.md` - read each agent's frontmatter `default-tier:` value. The reflector already parses frontmatter in Section 3 ("Agent Performance"); reuse that parse pass and build a `{agent: defaultTier}` map keyed by the agent's `name:` field.
180
180
 
181
181
  **The rule:**
@@ -185,7 +185,7 @@ For each `(agent, bin)` slice in the posterior (defaulting to `delegate='none'`
185
185
  1. Compute per-tier posterior mean = `α / (α + β)` and stddev = `sqrt(αβ / ((α+β)² · (α+β+1)))`.
186
186
  2. Identify `posterior_best_tier = argmax(mean)` across the tiers present in the slice.
187
187
  3. Gates (all must hold to emit):
188
- - `sum(arm.count)` across the slice's tier rows >= 3 (D-10's "3+ cycles" proxy).
188
+ - `sum(arm.count)` across the slice's tier rows >= 3 ("3+ cycles" proxy).
189
189
  - `(best_mean - second_best_mean) / second_best_mean >= 0.5` (50% delta heuristic).
190
190
  - `stddev(best_tier) < 0.05` (credible interval narrow enough).
191
191
  - `frontmatter[agent].default-tier !== posterior_best_tier` (the actual stale signal).
@@ -196,7 +196,7 @@ For each `(agent, bin)` slice in the posterior (defaulting to `delegate='none'`
196
196
  - **Single-tier-only history is silent.** If only one tier has been pulled for `(agent, bin)`, no comparison is possible - emit nothing rather than a misleading "winner" proposal.
197
197
  - **Wide credible intervals are silent.** Bandit posteriors are noisy early on; the 0.05 stddev gate ensures we only surface signals where the bandit is confident.
198
198
  - **The 50% threshold is a starting heuristic.** Same discipline as cost-arbitrage Section 7 - bandit-learning over which arbitrage proposals were APPLIED (and whether the posterior subsequently shifted) is a separate (future) phase.
199
- - **delegateFilter='none' is the v1.27.5 default.** Arbitrage analysis on the 5 peer-delegate slices is left for a future plan; current peer data is too sparse to credibly disagree with frontmatter.
199
+ - **delegateFilter='none' is the current default.** Arbitrage analysis on the 5 peer-delegate slices is left for a future plan; current peer data is too sparse to credibly disagree with frontmatter.
200
200
 
201
201
  **Helper:** `scripts/lib/bandit-arbitrage.cjs` exports `analyze(posterior, options) → proposals[]` implementing the above rule deterministically. The executor agent following this skill loads the posterior via `bandit-router.loadPosterior()`, builds the `{agent: defaultTier}` map from `agents/*.md` frontmatter, and passes both to `analyze()`. No re-derivation of the rule in prose - call the helper.
202
202
 
@@ -221,14 +221,14 @@ Render each `bandit_arbitrage` entry into the Proposals section as a `[FRONTMATT
221
221
 
222
222
  ---
223
223
 
224
- ### 9. Capability gaps observed (Phase 29 - D-01 / D-03)
224
+ ### 9. Capability gaps observed
225
225
 
226
- **Why this exists:** Plans 29-01 and 29-02 emit `capability_gap` events to `.design/gep/events.jsonl` whenever `/gdd:fast`, `gdd-router`, or the reflector pattern-detection pass identifies a lookup-fail with no dedicated owner. This section surfaces those events as clusters in the cycle markdown and evaluates the Stage-0 → Stage-1 gate per `reference/capability-gap-stage-gate.md`.
226
+ **Why this exists:** Capability-gap detectors emit `capability_gap` events to `.design/gep/events.jsonl` whenever `/gdd:fast`, `gdd-router`, or the reflector pattern-detection pass identifies a lookup-fail with no dedicated owner. This section surfaces those events as clusters in the cycle markdown and evaluates the Stage-0 → Stage-1 gate per `reference/capability-gap-stage-gate.md`.
227
227
 
228
228
  **Data sources:**
229
229
 
230
- - `.design/gep/events.jsonl` - the Phase 22 causal event chain. Rows where `type === 'capability_gap'` (or `outcome === 'capability_gap'`) are aggregated by `payload.context_hash`.
231
- - `.design/config.json` (optional) - `capability_gap_gate.{K, M, stddev_threshold}` overrides. Defaults: `K=3`, `M=10`, `stddev_threshold=0.05` per D-03.
230
+ - `.design/gep/events.jsonl` - the causal event chain. Rows where `type === 'capability_gap'` (or `outcome === 'capability_gap'`) are aggregated by `payload.context_hash`.
231
+ - `.design/config.json` (optional) - `capability_gap_gate.{K, M, stddev_threshold}` overrides. Defaults: `K=3`, `M=10`, `stddev_threshold=0.05`.
232
232
 
233
233
  **The mechanism:**
234
234
 
@@ -247,19 +247,19 @@ node scripts/lib/reflections-cycle-writer.cjs \
247
247
 
248
248
  Append stdout to the cycle markdown body (after Section 8 / before the Proposals header). If `--history=<path>` is wired by a future cycle-aggregator, add the flag. For Stage 0 (this phase), per-cycle cluster aggregation alone is the deliverable - gate evaluation surfaces additively when history is present.
249
249
 
250
- **Important discipline (D-01 lock):**
250
+ **Important discipline:**
251
251
 
252
- - This section NEVER auto-flips `capability_gap_gate.stage` or any other runtime state. The output is markdown only; the user opts in via Plan 29-05's apply-reflections extension.
253
- - The shim is read-only with respect to `.design/config.json`. The only state-mutating writer is the user-driven opt-in path (deferred to 29-05).
254
- - `evidence_refs[]` content is rendered as-is in the markdown table examples column - per the plan's threat model T-29.03-04, evidence refs are trusted-content (file:line or event-id strings from the 29-01 schema).
252
+ - This section NEVER auto-flips `capability_gap_gate.stage` or any other runtime state. The output is markdown only; the user opts in via the apply-reflections extension.
253
+ - The shim is read-only with respect to `.design/config.json`. The only state-mutating writer is the user-driven opt-in path.
254
+ - `evidence_refs[]` content is rendered as-is in the markdown table examples column - evidence refs are trusted-content (file:line or event-id strings from the capability-gap schema).
255
255
 
256
- **Helper:** `scripts/lib/reflector-capability-gap-aggregator.cjs` exports `aggregateCapabilityGaps`, `renderGapsSection`, `evaluateStageGate`. The shim wraps these for invocation from the agent prompt; tests in `tests/reflector-capability-gap-aggregation.test.cjs` cover the helper directly with synthetic fixtures (D-11).
256
+ **Helper:** `scripts/lib/reflector-capability-gap-aggregator.cjs` exports `aggregateCapabilityGaps`, `renderGapsSection`, `evaluateStageGate`. The shim wraps these for invocation from the agent prompt; tests in `tests/reflector-capability-gap-aggregation.test.cjs` cover the helper directly with synthetic fixtures.
257
257
 
258
258
  ---
259
259
 
260
260
  ## Atomic instincts
261
261
 
262
- Phase 51 adds atomic instinct units alongside the prose reflection. For each pattern you observed this cycle that is small enough to state as a single trigger plus a one-line response, emit a structured instinct unit. The narrative below stays for human reading; this section is the machine-readable twin. Both are emitted for one minor version so readers and tooling migrate together.
262
+ Alongside the prose reflection, emit atomic instinct units. For each pattern you observed this cycle that is small enough to state as a single trigger plus a one-line response, emit a structured instinct unit. The narrative below stays for human reading; this section is the machine-readable twin. Both are emitted for one minor version so readers and tooling migrate together.
263
263
 
264
264
  Emit 0 to N units. Each unit follows `reference/instinct-format.md` exactly: YAML frontmatter (`id`, `trigger`, `confidence` from 0.3 to 0.9, `domain` from the format's enum, `scope`, `project_id`, `source`, `cycles_seen`, `first_seen`, `last_seen`) plus a short body. Set `source: design-reflector`. Set `confidence` from the strength of the evidence - a pattern seen once this cycle stays near 0.3 to 0.5; a pattern that recurs across prior learnings earns more. Do not exceed 0.9.
265
265
 
@@ -337,7 +337,7 @@ For each keyword cluster meeting threshold:
337
337
 
338
338
  ## Discussant Question Quality (generates [QUESTION] proposals)
339
339
 
340
- Read `.design/learnings/question-quality.jsonl` (if exists). If it doesn't exist: skip and note "question-quality.jsonl not found - requires at least one discuss session with Phase 11 discussant."
340
+ Read `.design/learnings/question-quality.jsonl` (if exists). If it doesn't exist: skip and note "question-quality.jsonl not found - requires at least one discuss session with the discussant."
341
341
 
342
342
  Aggregate per `question_id` across all entries:
343
343
  - Compute: `(count_skipped + count_low) / total_asks`
@@ -355,9 +355,9 @@ For each flagged question, emit a `[QUESTION]` proposal:
355
355
 
356
356
  ## Budget Analysis (generates [BUDGET] proposals)
357
357
 
358
- Read `.design/telemetry/costs.jsonl` (if exists). If it doesn't exist: skip and note "costs.jsonl not found - Phase 10.1 telemetry required."
358
+ Read `.design/telemetry/costs.jsonl` (if exists). If it doesn't exist: skip and note "costs.jsonl not found - telemetry required."
359
359
 
360
- Read `.design/budget.json` to get per-agent cap allocations. If it doesn't exist: skip budget analysis and note "budget.json not found - Phase 10.1 budget governance required."
360
+ Read `.design/budget.json` to get per-agent cap allocations. If it doesn't exist: skip budget analysis and note "budget.json not found - budget governance required."
361
361
 
362
362
  Aggregate per agent across cycles:
363
363
  - **Sustained overspend**: `est_cost_usd` > (budget allocation × 1.2) in ≥3 consecutive cycles → propose raising cap
@@ -12,6 +12,7 @@ reads-only: false
12
12
  writes:
13
13
  - ".design/DESIGN-CONTEXT.md"
14
14
  - ".design/context-graph.json"
15
+ delegate_to: gemini-research
15
16
  ---
16
17
 
17
18
  @reference/shared-preamble.md
@@ -6,7 +6,7 @@ color: green
6
6
 
7
7
  model: haiku
8
8
  default-tier: haiku
9
- tier-rationale: "Formatting + light synthesis over a bounded ~3KB input; Haiku is the correct tier per Phase 10.1 D-14 (Haiku = writers/formatters with fixed schemas)."
9
+ tier-rationale: "Formatting + light synthesis over a bounded ~3KB input; Haiku is the correct tier (writers/formatters with fixed schemas)."
10
10
 
11
11
  parallel-safe: always
12
12
  typical-duration-seconds: 10
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: design-update-checker
3
- description: Cold-path enrichment agent for /gdd:check-update --prompt. Reads .design/update-cache.json plus a release body supplied in the prompt, classifies the delta (major|minor|patch|off-cadence), and returns a 3-5-line human-friendly "what this release changes for you" summary. Does not write any file. Haiku-tier summarizer per Phase 10.1 D-14/D-18.
3
+ description: Cold-path enrichment agent for /gdd:check-update --prompt. Reads .design/update-cache.json plus a release body supplied in the prompt, classifies the delta (major|minor|patch|off-cadence), and returns a 3-5-line human-friendly "what this release changes for you" summary. Does not write any file. Haiku-tier summarizer.
4
4
  tools: Read, Grep, Glob
5
5
  color: yellow
6
6
  model: haiku
7
7
  default-tier: haiku
8
- tier-rationale: "Pure summarization + classification over a bounded 500-char input; Haiku is correct tier per Phase 10.1 D-14 table (Haiku = verifiers/checkers/summarizers)"
8
+ tier-rationale: "Pure summarization + classification over a bounded 500-char input; Haiku is correct tier for verifiers/checkers/summarizers"
9
9
  parallel-safe: always
10
10
  typical-duration-seconds: 8
11
11
  reads-only: true
@@ -30,7 +30,7 @@ You have zero session memory. One invocation = one release summarized. Everythin
30
30
 
31
31
  Before producing output you MUST read:
32
32
 
33
- 1. `.design/update-cache.json` - canonical delta classification, `current_tag`, `latest_tag`, `changelog_excerpt` (up to 500 chars of the release body). Written by `hooks/update-check.sh` (Phase 13.3 plan 02).
33
+ 1. `.design/update-cache.json` - canonical delta classification, `current_tag`, `latest_tag`, `changelog_excerpt` (up to 500 chars of the release body). Written by `hooks/update-check.sh`.
34
34
  2. Any `release_body` string supplied in the spawning prompt context - may be fuller than the 500-char cache excerpt. Prefer it over `changelog_excerpt` when both are present.
35
35
 
36
36
  If `.design/update-cache.json` does not exist, return exactly:
@@ -49,7 +49,7 @@ From the spawning prompt (`/gdd:check-update --prompt` in plan 13.3-04) you rece
49
49
  |-------|------|---------|--------|
50
50
  | `current_tag` | string | `v1.0.7` | installed plugin version |
51
51
  | `latest_tag` | string | `v1.0.7.3` | GitHub Releases latest tag |
52
- | `delta` | enum | `major` \| `minor` \| `patch` \| `off-cadence` | pre-classified by the hot-path hook per D-10 |
52
+ | `delta` | enum | `major` \| `minor` \| `patch` \| `off-cadence` | pre-classified by the hot-path hook |
53
53
  | `release_body` | string (markdown) | release-notes markdown, up to a few thousand chars | optional; fuller than the cached excerpt |
54
54
 
55
55
  When `release_body` is absent, fall back to `changelog_excerpt` from the cache. When both are missing, emit the fallback message above.
@@ -87,7 +87,7 @@ Bullets must name concrete user impact (new command, changed behavior, fixed bug
87
87
 
88
88
  ## Classification boundary
89
89
 
90
- Do NOT reclassify the delta. The hot-path script (`hooks/update-check.sh`) already wrote `delta` into `.design/update-cache.json` per D-10 (4-segment semver compare). Echo the incoming delta verbatim.
90
+ Do NOT reclassify the delta. The hot-path script (`hooks/update-check.sh`) already wrote `delta` into `.design/update-cache.json` (4-segment semver compare). Echo the incoming delta verbatim.
91
91
 
92
92
  If the incoming delta looks wrong given the release body (e.g. body headlines a breaking change but `delta` is `patch`), note the discrepancy in a single inline line after the bullets - but do **not** override the field. Example:
93
93
 
@@ -92,7 +92,7 @@ You MAY:
92
92
 
93
93
  ## Why this agent exists
94
94
 
95
- Per 10.1-CONTEXT decision **D-21** (Lazy Checker Spawning): "Cheap Haiku gate agents at `agents/*-gate.md` decide whether to spawn full checker. Gate agent: reads DIFF of changed files, applies heuristic (design-system paths touched? copy strings touched? token files touched?), returns `{spawn: true|false, rationale: '...'}`. If false, skip full checker, log as `lazy_skipped: true` in telemetry." This gate is the verifier-specific instance of that pattern - full `design-verifier` is an XL-size spawn and the most expensive single agent in the pipeline, so gating it behind a cheap Haiku diff-scan yields the largest single cost win in Phase 10.1.
95
+ Lazy Checker Spawning: cheap Haiku gate agents at `agents/*-gate.md` decide whether to spawn the full checker. The gate agent reads the DIFF of changed files, applies a heuristic (design-system paths touched? copy strings touched? token files touched?), and returns `{spawn: true|false, rationale: '...'}`. If false, the full checker is skipped and logged as `lazy_skipped: true` in telemetry. This gate is the verifier-specific instance of that pattern - full `design-verifier` is an XL-size spawn and the most expensive single agent in the pipeline, so gating it behind a cheap Haiku diff-scan yields the largest single cost win for lazy-spawn savings.
96
96
 
97
97
  ## Record
98
98