@hegemonart/get-design-done 1.24.2 → 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +87 -0
  4. package/README.de.md +679 -0
  5. package/README.fr.md +679 -0
  6. package/README.it.md +679 -0
  7. package/README.ja.md +679 -0
  8. package/README.ko.md +679 -0
  9. package/README.md +399 -728
  10. package/README.zh-CN.md +480 -133
  11. package/SKILL.md +2 -0
  12. package/agents/README.md +60 -0
  13. package/agents/design-reflector.md +43 -0
  14. package/agents/gdd-intel-updater.md +34 -1
  15. package/agents/prototype-gate.md +122 -0
  16. package/agents/quality-gate-runner.md +125 -0
  17. package/hooks/budget-enforcer.ts +275 -11
  18. package/hooks/gdd-decision-injector.js +183 -3
  19. package/hooks/gdd-turn-closeout.js +238 -0
  20. package/hooks/hooks.json +10 -0
  21. package/package.json +5 -5
  22. package/reference/STATE-TEMPLATE.md +41 -0
  23. package/reference/config-schema.md +30 -0
  24. package/reference/model-prices.md +40 -19
  25. package/reference/prices/antigravity.md +21 -0
  26. package/reference/prices/augment.md +21 -0
  27. package/reference/prices/claude.md +42 -0
  28. package/reference/prices/cline.md +23 -0
  29. package/reference/prices/codebuddy.md +21 -0
  30. package/reference/prices/codex.md +25 -0
  31. package/reference/prices/copilot.md +21 -0
  32. package/reference/prices/cursor.md +21 -0
  33. package/reference/prices/gemini.md +25 -0
  34. package/reference/prices/kilo.md +21 -0
  35. package/reference/prices/opencode.md +23 -0
  36. package/reference/prices/qwen.md +25 -0
  37. package/reference/prices/trae.md +23 -0
  38. package/reference/prices/windsurf.md +21 -0
  39. package/reference/registry.json +107 -1
  40. package/reference/runtime-models.md +446 -0
  41. package/reference/schemas/runtime-models.schema.json +123 -0
  42. package/scripts/install.cjs +8 -0
  43. package/scripts/lib/budget-enforcer.cjs +446 -0
  44. package/scripts/lib/cost-arbitrage.cjs +294 -0
  45. package/scripts/lib/gdd-state/mutator.ts +454 -0
  46. package/scripts/lib/gdd-state/parser.ts +351 -1
  47. package/scripts/lib/gdd-state/types.ts +193 -0
  48. package/scripts/lib/install/installer.cjs +188 -11
  49. package/scripts/lib/install/parse-runtime-models.cjs +267 -0
  50. package/scripts/lib/install/runtimes.cjs +43 -0
  51. package/scripts/lib/quality-gate-detect.cjs +126 -0
  52. package/scripts/lib/runtime-detect.cjs +96 -0
  53. package/scripts/lib/tier-resolver.cjs +311 -0
  54. package/scripts/validate-frontmatter.ts +138 -1
  55. package/skills/quality-gate/SKILL.md +222 -0
  56. package/skills/router/SKILL.md +79 -10
  57. package/skills/sketch-wrap-up/SKILL.md +47 -2
  58. package/skills/spike-wrap-up/SKILL.md +41 -2
  59. package/skills/turn-closeout/SKILL.md +115 -0
  60. package/skills/verify/SKILL.md +22 -0
@@ -0,0 +1,446 @@
1
+ # Runtime Models — Per-Runtime Tier→Model Adapter Map
2
+
3
+ **Phase 26 source-of-truth (D-01).** Single canonical map from canonical Anthropic tier names (`opus|sonnet|haiku`) and runtime-neutral reasoning-class aliases (`high|medium|low`, D-10) to concrete model identifiers for each of the 14 runtimes the multi-runtime installer ships to (Phase 24 D-02).
4
+
5
+ This file is parsed by `scripts/lib/install/parse-runtime-models.cjs` and consumed by:
6
+
7
+ - `scripts/lib/tier-resolver.cjs` (26-02) — runtime tier resolution (`resolve(runtime, tier) → model`).
8
+ - `scripts/lib/install/installer.cjs` (26-03) — emits `models.json` per runtime config-dir at install time.
9
+ - `hooks/budget-enforcer.ts` + `scripts/lib/budget-enforcer.cjs` (26-05) — concrete model name for cost lookup.
10
+
11
+ **Strict schema** (D-03): each runtime block is a fenced ```json ... ``` block validated against `reference/schemas/runtime-models.schema.json`. Schema version is locked at `1` until a breaking change forces a version bump.
12
+
13
+ **Provenance discipline** (D-01): every row carries a `source_url` (runtime-author docs), `retrieved_at` (ISO timestamp), and `last_validated_cycle` (current GDD cycle ID). Placeholder URLs are tagged `<TODO: confirm at <runtime-author-docs-url>>` and validated by Phase 13.2 authority-watcher on later cycles.
14
+
15
+ **Single-tier runtimes** (D-02): if a runtime exposes only one model, that model maps to all three tiers and the entry carries `"single_tier": true`. Downstream consumers (router, budget-enforcer) may render a UI affordance noting tier selection has no cost effect for that runtime.
16
+
17
+ **Cycle ID:** `2026-04-29-v1.26` (rows validated in this cycle carry this string in `last_validated_cycle`).
18
+
19
+ ---
20
+
21
+ ## Schema version
22
+
23
+ ```json
24
+ { "$schema_version": 1 }
25
+ ```
26
+
27
+ ---
28
+
29
+ ## claude — Claude Code
30
+
31
+ Anthropic's first-party runtime. Public tier docs at https://docs.anthropic.com/en/docs/about-claude/models. Seed picks per CONTEXT.md D-02.
32
+
33
+ ```json
34
+ {
35
+ "id": "claude",
36
+ "tier_to_model": {
37
+ "opus": { "model": "claude-opus-4-7" },
38
+ "sonnet": { "model": "claude-sonnet-4-6" },
39
+ "haiku": { "model": "claude-haiku-4-5" }
40
+ },
41
+ "reasoning_class_to_model": {
42
+ "high": { "model": "claude-opus-4-7" },
43
+ "medium": { "model": "claude-sonnet-4-6" },
44
+ "low": { "model": "claude-haiku-4-5" }
45
+ },
46
+ "provenance": [
47
+ {
48
+ "source_url": "https://docs.anthropic.com/en/docs/about-claude/models",
49
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
50
+ "last_validated_cycle": "2026-04-29-v1.26",
51
+ "note": "Anthropic public model catalog — first-party runtime."
52
+ }
53
+ ]
54
+ }
55
+ ```
56
+
57
+ ---
58
+
59
+ ## codex — OpenAI Codex CLI
60
+
61
+ OpenAI's Codex CLI runtime. Public tier docs at https://platform.openai.com/docs/models. Seed picks per CONTEXT.md D-02.
62
+
63
+ ```json
64
+ {
65
+ "id": "codex",
66
+ "tier_to_model": {
67
+ "opus": { "model": "gpt-5" },
68
+ "sonnet": { "model": "gpt-5-mini" },
69
+ "haiku": { "model": "gpt-5-nano" }
70
+ },
71
+ "reasoning_class_to_model": {
72
+ "high": { "model": "gpt-5" },
73
+ "medium": { "model": "gpt-5-mini" },
74
+ "low": { "model": "gpt-5-nano" }
75
+ },
76
+ "provenance": [
77
+ {
78
+ "source_url": "https://platform.openai.com/docs/models",
79
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
80
+ "last_validated_cycle": "2026-04-29-v1.26",
81
+ "note": "OpenAI public model catalog."
82
+ }
83
+ ]
84
+ }
85
+ ```
86
+
87
+ ---
88
+
89
+ ## gemini — Gemini CLI
90
+
91
+ Google's Gemini CLI runtime. Public tier docs at https://ai.google.dev/gemini-api/docs/models. Seed picks per CONTEXT.md D-02.
92
+
93
+ ```json
94
+ {
95
+ "id": "gemini",
96
+ "tier_to_model": {
97
+ "opus": { "model": "gemini-2.5-pro" },
98
+ "sonnet": { "model": "gemini-2.5-flash" },
99
+ "haiku": { "model": "gemini-2.5-flash-lite" }
100
+ },
101
+ "reasoning_class_to_model": {
102
+ "high": { "model": "gemini-2.5-pro" },
103
+ "medium": { "model": "gemini-2.5-flash" },
104
+ "low": { "model": "gemini-2.5-flash-lite" }
105
+ },
106
+ "provenance": [
107
+ {
108
+ "source_url": "https://ai.google.dev/gemini-api/docs/models",
109
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
110
+ "last_validated_cycle": "2026-04-29-v1.26",
111
+ "note": "Google Gemini API public model catalog."
112
+ }
113
+ ]
114
+ }
115
+ ```
116
+
117
+ ---
118
+
119
+ ## qwen — Qwen Code
120
+
121
+ Alibaba's Qwen Code runtime. Public tier docs at https://qwenlm.github.io/qwen-code/. Seed picks per CONTEXT.md D-02.
122
+
123
+ ```json
124
+ {
125
+ "id": "qwen",
126
+ "tier_to_model": {
127
+ "opus": { "model": "qwen3-max" },
128
+ "sonnet": { "model": "qwen3-plus" },
129
+ "haiku": { "model": "qwen3-flash" }
130
+ },
131
+ "reasoning_class_to_model": {
132
+ "high": { "model": "qwen3-max" },
133
+ "medium": { "model": "qwen3-plus" },
134
+ "low": { "model": "qwen3-flash" }
135
+ },
136
+ "provenance": [
137
+ {
138
+ "source_url": "https://qwenlm.github.io/qwen-code/",
139
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
140
+ "last_validated_cycle": "2026-04-29-v1.26",
141
+ "note": "Qwen Code public model catalog."
142
+ }
143
+ ]
144
+ }
145
+ ```
146
+
147
+ ---
148
+
149
+ ## kilo — Kilo Code
150
+
151
+ Kilo Code adapter — multi-provider, Anthropic-default fill until runtime-author docs confirm. Researcher fill needed (CONTEXT.md D-02).
152
+
153
+ ```json
154
+ {
155
+ "id": "kilo",
156
+ "tier_to_model": {
157
+ "opus": { "model": "claude-opus-4-7" },
158
+ "sonnet": { "model": "claude-sonnet-4-6" },
159
+ "haiku": { "model": "claude-haiku-4-5" }
160
+ },
161
+ "reasoning_class_to_model": {
162
+ "high": { "model": "claude-opus-4-7" },
163
+ "medium": { "model": "claude-sonnet-4-6" },
164
+ "low": { "model": "claude-haiku-4-5" }
165
+ },
166
+ "provenance": [
167
+ {
168
+ "source_url": "<TODO: confirm at https://kilocode.ai/docs/models>",
169
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
170
+ "last_validated_cycle": "2026-04-29-v1.26",
171
+ "note": "TODO: confirm at runtime-author docs. Anthropic-default placeholder fill — Kilo's BYOK model means the user-configured provider may differ; researcher follow-up Phase 26 tail."
172
+ }
173
+ ]
174
+ }
175
+ ```
176
+
177
+ ---
178
+
179
+ ## copilot — GitHub Copilot CLI
180
+
181
+ GitHub Copilot CLI — multi-provider routing under the hood. Researcher fill needed (CONTEXT.md D-02).
182
+
183
+ ```json
184
+ {
185
+ "id": "copilot",
186
+ "tier_to_model": {
187
+ "opus": { "model": "gpt-5" },
188
+ "sonnet": { "model": "gpt-5-mini" },
189
+ "haiku": { "model": "gpt-4o-mini" }
190
+ },
191
+ "reasoning_class_to_model": {
192
+ "high": { "model": "gpt-5" },
193
+ "medium": { "model": "gpt-5-mini" },
194
+ "low": { "model": "gpt-4o-mini" }
195
+ },
196
+ "provenance": [
197
+ {
198
+ "source_url": "<TODO: confirm at https://docs.github.com/en/copilot/github-copilot-in-the-cli>",
199
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
200
+ "last_validated_cycle": "2026-04-29-v1.26",
201
+ "note": "TODO: confirm at runtime-author docs. Copilot CLI routes through GitHub's model gateway; concrete tier names may differ from underlying OpenAI IDs — researcher follow-up Phase 26 tail."
202
+ }
203
+ ]
204
+ }
205
+ ```
206
+
207
+ ---
208
+
209
+ ## cursor — Cursor
210
+
211
+ Cursor IDE/CLI — multi-provider routing. Researcher fill needed (CONTEXT.md D-02).
212
+
213
+ ```json
214
+ {
215
+ "id": "cursor",
216
+ "tier_to_model": {
217
+ "opus": { "model": "claude-opus-4-7" },
218
+ "sonnet": { "model": "claude-sonnet-4-6" },
219
+ "haiku": { "model": "claude-haiku-4-5" }
220
+ },
221
+ "reasoning_class_to_model": {
222
+ "high": { "model": "claude-opus-4-7" },
223
+ "medium": { "model": "claude-sonnet-4-6" },
224
+ "low": { "model": "claude-haiku-4-5" }
225
+ },
226
+ "provenance": [
227
+ {
228
+ "source_url": "<TODO: confirm at https://docs.cursor.com/models>",
229
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
230
+ "last_validated_cycle": "2026-04-29-v1.26",
231
+ "note": "TODO: confirm at runtime-author docs. Cursor's user-selectable model dropdown means the resolved tier depends on user config; Anthropic-default fill is the closest published equivalent — researcher follow-up Phase 26 tail."
232
+ }
233
+ ]
234
+ }
235
+ ```
236
+
237
+ ---
238
+
239
+ ## windsurf — Windsurf
240
+
241
+ Windsurf (formerly Codeium) — multi-provider Cascade router. Researcher fill needed (CONTEXT.md D-02).
242
+
243
+ ```json
244
+ {
245
+ "id": "windsurf",
246
+ "tier_to_model": {
247
+ "opus": { "model": "claude-opus-4-7" },
248
+ "sonnet": { "model": "claude-sonnet-4-6" },
249
+ "haiku": { "model": "claude-haiku-4-5" }
250
+ },
251
+ "reasoning_class_to_model": {
252
+ "high": { "model": "claude-opus-4-7" },
253
+ "medium": { "model": "claude-sonnet-4-6" },
254
+ "low": { "model": "claude-haiku-4-5" }
255
+ },
256
+ "provenance": [
257
+ {
258
+ "source_url": "<TODO: confirm at https://docs.windsurf.com/cascade/models>",
259
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
260
+ "last_validated_cycle": "2026-04-29-v1.26",
261
+ "note": "TODO: confirm at runtime-author docs. Cascade routes among multiple providers — Anthropic-default fill is the closest published equivalent. Researcher follow-up Phase 26 tail."
262
+ }
263
+ ]
264
+ }
265
+ ```
266
+
267
+ ---
268
+
269
+ ## antigravity — Antigravity
270
+
271
+ Antigravity — Google's agentic coding platform. Researcher fill needed (CONTEXT.md D-02).
272
+
273
+ ```json
274
+ {
275
+ "id": "antigravity",
276
+ "tier_to_model": {
277
+ "opus": { "model": "gemini-2.5-pro" },
278
+ "sonnet": { "model": "gemini-2.5-flash" },
279
+ "haiku": { "model": "gemini-2.5-flash-lite" }
280
+ },
281
+ "reasoning_class_to_model": {
282
+ "high": { "model": "gemini-2.5-pro" },
283
+ "medium": { "model": "gemini-2.5-flash" },
284
+ "low": { "model": "gemini-2.5-flash-lite" }
285
+ },
286
+ "provenance": [
287
+ {
288
+ "source_url": "<TODO: confirm at https://antigravity.google/docs/models>",
289
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
290
+ "last_validated_cycle": "2026-04-29-v1.26",
291
+ "note": "TODO: confirm at runtime-author docs. Antigravity is Gemini-native; gemini-2.5 tier alignment is the closest published equivalent. Researcher follow-up Phase 26 tail."
292
+ }
293
+ ]
294
+ }
295
+ ```
296
+
297
+ ---
298
+
299
+ ## augment — Augment
300
+
301
+ Augment Code — multi-provider agentic IDE. Researcher fill needed (CONTEXT.md D-02).
302
+
303
+ ```json
304
+ {
305
+ "id": "augment",
306
+ "tier_to_model": {
307
+ "opus": { "model": "claude-opus-4-7" },
308
+ "sonnet": { "model": "claude-sonnet-4-6" },
309
+ "haiku": { "model": "claude-haiku-4-5" }
310
+ },
311
+ "reasoning_class_to_model": {
312
+ "high": { "model": "claude-opus-4-7" },
313
+ "medium": { "model": "claude-sonnet-4-6" },
314
+ "low": { "model": "claude-haiku-4-5" }
315
+ },
316
+ "provenance": [
317
+ {
318
+ "source_url": "<TODO: confirm at https://docs.augmentcode.com/models>",
319
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
320
+ "last_validated_cycle": "2026-04-29-v1.26",
321
+ "note": "TODO: confirm at runtime-author docs. Augment routes among providers — Anthropic-default fill. Researcher follow-up Phase 26 tail."
322
+ }
323
+ ]
324
+ }
325
+ ```
326
+
327
+ ---
328
+
329
+ ## trae — Trae
330
+
331
+ Trae — single-model session runtime per CONTEXT.md D-02 example. `single_tier: true` annotates the row. Researcher fill needed.
332
+
333
+ ```json
334
+ {
335
+ "id": "trae",
336
+ "single_tier": true,
337
+ "tier_to_model": {
338
+ "opus": { "model": "trae-builder" },
339
+ "sonnet": { "model": "trae-builder" },
340
+ "haiku": { "model": "trae-builder" }
341
+ },
342
+ "reasoning_class_to_model": {
343
+ "high": { "model": "trae-builder" },
344
+ "medium": { "model": "trae-builder" },
345
+ "low": { "model": "trae-builder" }
346
+ },
347
+ "provenance": [
348
+ {
349
+ "source_url": "<TODO: confirm at https://docs.trae.ai/models>",
350
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
351
+ "last_validated_cycle": "2026-04-29-v1.26",
352
+ "note": "TODO: confirm at runtime-author docs. Trae exposes a single managed-model session per CONTEXT.md D-02; tier selection has no cost effect — UI may surface this. Researcher follow-up Phase 26 tail."
353
+ }
354
+ ]
355
+ }
356
+ ```
357
+
358
+ ---
359
+
360
+ ## codebuddy — CodeBuddy
361
+
362
+ CodeBuddy (Tencent) — multi-provider routing. Researcher fill needed (CONTEXT.md D-02).
363
+
364
+ ```json
365
+ {
366
+ "id": "codebuddy",
367
+ "tier_to_model": {
368
+ "opus": { "model": "claude-opus-4-7" },
369
+ "sonnet": { "model": "claude-sonnet-4-6" },
370
+ "haiku": { "model": "claude-haiku-4-5" }
371
+ },
372
+ "reasoning_class_to_model": {
373
+ "high": { "model": "claude-opus-4-7" },
374
+ "medium": { "model": "claude-sonnet-4-6" },
375
+ "low": { "model": "claude-haiku-4-5" }
376
+ },
377
+ "provenance": [
378
+ {
379
+ "source_url": "<TODO: confirm at https://copilot.tencent.com/docs/models>",
380
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
381
+ "last_validated_cycle": "2026-04-29-v1.26",
382
+ "note": "TODO: confirm at runtime-author docs. CodeBuddy routes among providers — Anthropic-default fill. Researcher follow-up Phase 26 tail."
383
+ }
384
+ ]
385
+ }
386
+ ```
387
+
388
+ ---
389
+
390
+ ## cline — Cline
391
+
392
+ Cline (formerly Claude Dev) — multi-provider VS Code agent. Researcher fill needed (CONTEXT.md D-02).
393
+
394
+ ```json
395
+ {
396
+ "id": "cline",
397
+ "tier_to_model": {
398
+ "opus": { "model": "claude-opus-4-7" },
399
+ "sonnet": { "model": "claude-sonnet-4-6" },
400
+ "haiku": { "model": "claude-haiku-4-5" }
401
+ },
402
+ "reasoning_class_to_model": {
403
+ "high": { "model": "claude-opus-4-7" },
404
+ "medium": { "model": "claude-sonnet-4-6" },
405
+ "low": { "model": "claude-haiku-4-5" }
406
+ },
407
+ "provenance": [
408
+ {
409
+ "source_url": "<TODO: confirm at https://docs.cline.bot/models>",
410
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
411
+ "last_validated_cycle": "2026-04-29-v1.26",
412
+ "note": "TODO: confirm at runtime-author docs. Cline is BYOK-multi-provider; Anthropic-default fill is the namesake provider. Researcher follow-up Phase 26 tail."
413
+ }
414
+ ]
415
+ }
416
+ ```
417
+
418
+ ---
419
+
420
+ ## opencode — OpenCode
421
+
422
+ OpenCode — open-source AI coding agent, BYOK multi-provider. Researcher fill needed (CONTEXT.md D-02).
423
+
424
+ ```json
425
+ {
426
+ "id": "opencode",
427
+ "tier_to_model": {
428
+ "opus": { "model": "claude-opus-4-7" },
429
+ "sonnet": { "model": "claude-sonnet-4-6" },
430
+ "haiku": { "model": "claude-haiku-4-5" }
431
+ },
432
+ "reasoning_class_to_model": {
433
+ "high": { "model": "claude-opus-4-7" },
434
+ "medium": { "model": "claude-sonnet-4-6" },
435
+ "low": { "model": "claude-haiku-4-5" }
436
+ },
437
+ "provenance": [
438
+ {
439
+ "source_url": "<TODO: confirm at https://opencode.ai/docs/models>",
440
+ "retrieved_at": "2026-04-29T00:00:00.000Z",
441
+ "last_validated_cycle": "2026-04-29-v1.26",
442
+ "note": "TODO: confirm at runtime-author docs. OpenCode is BYOK — user-configured provider may differ. Anthropic-default fill is a sensible baseline. Researcher follow-up Phase 26 tail."
443
+ }
444
+ ]
445
+ }
446
+ ```
@@ -0,0 +1,123 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://get-design-done.example/schemas/runtime-models.schema.json",
4
+ "title": "Runtime Models — Tier-to-Model Map",
5
+ "description": "Parsed shape of reference/runtime-models.md — the per-runtime tier→model adapter source-of-truth shipped in Phase 26 (D-01..D-03). Consumed by scripts/lib/install/parse-runtime-models.cjs at install time and scripts/lib/tier-resolver.cjs at runtime. Strict enums catch typos at install time, not at runtime. Schema versioned via $schema_version for forward-compat (D-03).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["$schema_version", "runtimes"],
9
+ "properties": {
10
+ "$schema_version": {
11
+ "const": 1,
12
+ "description": "Top-level schema version (D-03). Bump on breaking changes; downstream consumers must check before parsing."
13
+ },
14
+ "runtimes": {
15
+ "type": "array",
16
+ "minItems": 1,
17
+ "items": { "$ref": "#/definitions/runtimeEntry" }
18
+ }
19
+ },
20
+ "definitions": {
21
+ "runtimeEntry": {
22
+ "type": "object",
23
+ "additionalProperties": false,
24
+ "required": ["id", "tier_to_model", "reasoning_class_to_model", "provenance"],
25
+ "properties": {
26
+ "id": {
27
+ "type": "string",
28
+ "description": "Runtime ID. MUST match one of the 14 runtime IDs exported from scripts/lib/install/runtimes.cjs (Phase 24 D-02 lock).",
29
+ "enum": [
30
+ "claude",
31
+ "codex",
32
+ "gemini",
33
+ "qwen",
34
+ "kilo",
35
+ "copilot",
36
+ "cursor",
37
+ "windsurf",
38
+ "antigravity",
39
+ "augment",
40
+ "trae",
41
+ "codebuddy",
42
+ "cline",
43
+ "opencode"
44
+ ]
45
+ },
46
+ "single_tier": {
47
+ "type": "boolean",
48
+ "description": "When true, the runtime exposes a single model that maps to all three tiers (D-02). Downstream consumers (router, budget-enforcer) may render a UI affordance noting tier-selection has no cost effect for this runtime."
49
+ },
50
+ "tier_to_model": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": ["opus", "sonnet", "haiku"],
54
+ "description": "Map of canonical Anthropic tier names (D-03) to the runtime's concrete model identifier. All three keys are required even when single_tier=true (assign the same model three times).",
55
+ "properties": {
56
+ "opus": { "$ref": "#/definitions/modelRow" },
57
+ "sonnet": { "$ref": "#/definitions/modelRow" },
58
+ "haiku": { "$ref": "#/definitions/modelRow" }
59
+ }
60
+ },
61
+ "reasoning_class_to_model": {
62
+ "type": "object",
63
+ "additionalProperties": false,
64
+ "required": ["high", "medium", "low"],
65
+ "description": "Map of runtime-neutral reasoning-class names (D-10 alias) to the runtime's concrete model identifier. Equivalence with tier_to_model is enforced by Phase 26-08 frontmatter validator (high↔opus, medium↔sonnet, low↔haiku).",
66
+ "properties": {
67
+ "high": { "$ref": "#/definitions/modelRow" },
68
+ "medium": { "$ref": "#/definitions/modelRow" },
69
+ "low": { "$ref": "#/definitions/modelRow" }
70
+ }
71
+ },
72
+ "provenance": {
73
+ "type": "array",
74
+ "minItems": 1,
75
+ "description": "Source citations for this runtime's tier map. At minimum one entry pointing at the runtime-author docs URL plus retrieval timestamp + last-validated cycle. Phase 13.2 authority-watcher uses this to flag drift.",
76
+ "items": {
77
+ "type": "object",
78
+ "additionalProperties": false,
79
+ "required": ["source_url", "retrieved_at", "last_validated_cycle"],
80
+ "properties": {
81
+ "source_url": {
82
+ "type": "string",
83
+ "minLength": 1,
84
+ "description": "URL of the runtime-author documentation that authoritatively names the tier→model mapping. Placeholder URLs prefixed with `<TODO: confirm at ...>` are acceptable for v1.26 ship and flag the row as researcher-fill-needed."
85
+ },
86
+ "retrieved_at": {
87
+ "type": "string",
88
+ "format": "date-time",
89
+ "description": "ISO 8601 timestamp when the source URL was retrieved."
90
+ },
91
+ "last_validated_cycle": {
92
+ "type": "string",
93
+ "minLength": 1,
94
+ "description": "GDD cycle ID that last validated this row (e.g. '2026-04-29-v1.26')."
95
+ },
96
+ "note": {
97
+ "type": "string",
98
+ "description": "Optional inline note (e.g. 'TODO: confirm at runtime-author docs', 'single-tier runtime — same model x3')."
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ },
105
+ "modelRow": {
106
+ "type": "object",
107
+ "additionalProperties": false,
108
+ "required": ["model"],
109
+ "properties": {
110
+ "model": {
111
+ "type": "string",
112
+ "minLength": 1,
113
+ "description": "Public model name as documented by the runtime author."
114
+ },
115
+ "provider_model_id": {
116
+ "type": "string",
117
+ "minLength": 1,
118
+ "description": "Optional internal/provider model ID for runtimes whose API identifiers differ from the public name (D-03)."
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
@@ -109,6 +109,14 @@ function summariseResults(results) {
109
109
  const status = r.action;
110
110
  lines.push(`${tag}• ${r.runtime.padEnd(12)} ${status.padEnd(16)} ${r.path}`);
111
111
  if (r.reason) lines.push(` ${r.reason}`);
112
+ // Phase 26 D-06 — surface the models.json side-effect inline so
113
+ // operators see what was written / would be written / was removed.
114
+ if (r.modelsJson) {
115
+ const m = r.modelsJson;
116
+ const mTag = m.dryRun ? '[dry-run] ' : '';
117
+ lines.push(`${mTag} ↳ models.json ${m.action.padEnd(16)} ${m.path}`);
118
+ if (m.reason) lines.push(` ${m.reason}`);
119
+ }
112
120
  }
113
121
  return lines.join('\n');
114
122
  }