@namewta/speculo 0.7.2 → 0.7.4

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 (55) hide show
  1. package/dist/src/migrations.js +755 -23
  2. package/dist/src/migrations.js.map +1 -1
  3. package/package.json +1 -1
  4. package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +200 -448
  5. package/template/canonical/canonical-specdev-goal-plan.md +744 -1108
  6. package/template/canonical/canonical-specdev-grill-with-docs.md +201 -449
  7. package/template/canonical/canonical-specdev-spec.md +232 -486
  8. package/template/canonical/canonical-specdev-tickets.md +411 -590
  9. package/template/canonical/canonical-specdev-wayfinder.md +199 -447
  10. package/template/skills/migrate-runtime-state/SKILL.md +6 -6
  11. package/template/skills/migrate-runtime-state/references/migration-contract.md +9 -3
  12. package/template/skills/migrate-runtime-state/scripts/migrate-runtime-state.mjs +404 -33
  13. package/template/workflows/specdev/I-implement/I-implement.md +98 -143
  14. package/template/workflows/specdev/I-implement/evidence-template.md +66 -48
  15. package/template/workflows/specdev/I-implement/execution-preflight.md +31 -21
  16. package/template/workflows/specdev/I-implement/merge-conflict-protocol.md +12 -12
  17. package/template/workflows/specdev/I-init-setup/I-init-setup.md +4 -5
  18. package/template/workflows/specdev/I-init-setup/change-status-template.json +14 -1
  19. package/template/workflows/specdev/I-init-setup/config-template.json +7 -6
  20. package/template/workflows/specdev/I-init-setup/status-template.json +1 -1
  21. package/template/workflows/specdev/INDEX.md +11 -8
  22. package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +76 -102
  23. package/template/workflows/specdev/P-goal-plan/completion-control.md +26 -44
  24. package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +46 -37
  25. package/template/workflows/specdev/P-goal-plan/lead-orchestration.md +34 -0
  26. package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +31 -46
  27. package/template/workflows/specdev/P-goal-plan/planning-modes.md +67 -89
  28. package/template/workflows/specdev/P-prototype/ui-prototype.md +1 -1
  29. package/template/workflows/specdev/T-tickets/T-tickets.md +6 -3
  30. package/template/workflows/specdev/T-tickets/ticket-readiness.md +5 -3
  31. package/template/workflows/specdev/T-tickets/ticket-template.md +8 -1
  32. package/template/workflows/specdev/T-tickets/tickets-map-template.md +5 -4
  33. package/template/workflows/specdev/_state/status.json +1 -1
  34. package/template/workflows/specdev/common/README.md +2 -2
  35. package/template/workflows/specdev/common/rules/change-completion.md +17 -20
  36. package/template/workflows/specdev/common/rules/deviation-control.md +1 -1
  37. package/template/workflows/specdev/common/rules/evidence-and-verification.md +31 -37
  38. package/template/workflows/specdev/common/rules/path-ownership.md +21 -23
  39. package/template/workflows/specdev/common/rules/readiness-and-depth.md +1 -1
  40. package/template/workflows/specdev/common/schemas/change-status.schema.json +153 -363
  41. package/template/workflows/specdev/common/schemas/config.schema.json +17 -13
  42. package/template/workflows/specdev/common/schemas/goal-plan.schema.json +33 -16
  43. package/template/workflows/specdev/common/schemas/status.schema.json +7 -63
  44. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +42 -21
  45. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +36 -21
  46. package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +46 -18
  47. package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +34 -31
  48. package/template/workflows/specdev/common/skills/subagent-delivery/references/external-web-subagent.md +10 -23
  49. package/template/workflows/specdev/common/skills/subagent-delivery/references/native-subagent.md +15 -25
  50. package/template/workflows/specdev/common/tools/README.md +2 -1
  51. package/template/workflows/specdev/common/tools/validate-specdev.mjs +591 -219
  52. package/template/workflows/specdev/I-implement/delegated-evidence-template.md +0 -12
  53. package/template/workflows/specdev/P-goal-plan/delegated-execution-template.md +0 -35
  54. package/template/workflows/specdev/P-goal-plan/delegated-execution.md +0 -59
  55. package/template/workflows/specdev/P-goal-plan/workspace-execution-template.md +0 -24
@@ -1,391 +1,181 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "urn:speculo:specdev:change-status:v3",
3
+ "$id": "urn:speculo:specdev:change-status:v6",
4
4
  "title": "SpecDev Change Status",
5
5
  "type": "object",
6
6
  "required": [
7
- "schema_version",
8
- "artifact",
9
- "change",
10
- "change_status",
11
- "current_work",
12
- "created_at",
13
- "updated_at",
14
- "completed_at",
15
- "archived",
16
- "archive_path",
17
- "blockers",
18
- "deviations"
7
+ "schema_version", "artifact", "change", "change_status", "current_work", "works_run",
8
+ "claimed_investigations", "execution_authorization", "leadership", "created_at", "updated_at",
9
+ "completed_at", "archived", "archive_path", "blockers", "deviations", "worktrees"
19
10
  ],
20
11
  "properties": {
21
- "schema_version": {
22
- "const": 3
23
- },
24
- "artifact": {
25
- "const": "change-status"
26
- },
27
- "change": {
28
- "type": "string",
29
- "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
30
- },
31
- "change_status": {
32
- "enum": [
33
- "active",
34
- "blocked",
35
- "completed",
36
- "archived"
37
- ]
12
+ "schema_version": {"const": 6},
13
+ "artifact": {"const": "change-status"},
14
+ "change": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"},
15
+ "change_status": {"enum": ["active", "blocked", "completed", "archived"]},
16
+ "current_work": {"type": ["string", "null"], "pattern": "^specdev/"},
17
+ "works_run": {"type": "array", "items": {"type": "string", "pattern": "^specdev/"}, "uniqueItems": true},
18
+ "claimed_investigations": {"type": "array", "items": {"$ref": "#/$defs/claim"}},
19
+ "execution_authorization": {"$ref": "#/$defs/authorization"},
20
+ "leadership": {"$ref": "#/$defs/leadership"},
21
+ "created_at": {"type": "string", "minLength": 1},
22
+ "updated_at": {"type": "string", "minLength": 1},
23
+ "completed_at": {"type": ["string", "null"]},
24
+ "archived": {"type": "boolean"},
25
+ "archive_path": {"anyOf": [{"type": "null"}, {"type": "string", "pattern": "^<Path>\\{roots\\.state\\}/specdev/archive/[^<]+</Path>$"}]},
26
+ "blockers": {"type": "array", "items": {"type": "string"}},
27
+ "deviations": {"type": "array", "items": {"type": "string"}},
28
+ "worktrees": {"type": "array", "items": {"$ref": "#/$defs/worktree"}}
29
+ },
30
+ "$defs": {
31
+ "claim": {
32
+ "type": "object",
33
+ "required": ["id", "owner", "session", "claimed_at"],
34
+ "properties": {
35
+ "id": {"type": "string", "minLength": 1},
36
+ "owner": {"type": "string", "minLength": 1},
37
+ "session": {"type": ["string", "null"]},
38
+ "claimed_at": {"type": "string", "minLength": 1}
39
+ },
40
+ "additionalProperties": false
38
41
  },
39
- "current_work": {
40
- "type": [
41
- "string",
42
- "null"
43
- ]
42
+ "authorization-entry": {
43
+ "type": "object",
44
+ "required": ["status", "source", "granted_at", "scope"],
45
+ "properties": {
46
+ "status": {"enum": ["authorized", "not-authorized", "revoked"]},
47
+ "source": {"type": ["string", "null"]},
48
+ "granted_at": {"type": ["string", "null"]},
49
+ "scope": {"type": "string", "minLength": 1}
50
+ },
51
+ "allOf": [{
52
+ "if": {"properties": {"status": {"const": "authorized"}}, "required": ["status"]},
53
+ "then": {"properties": {"source": {"type": "string", "minLength": 1}, "granted_at": {"type": "string", "minLength": 1}}}
54
+ }],
55
+ "additionalProperties": false
44
56
  },
45
- "created_at": {
46
- "type": "string",
47
- "minLength": 1
57
+ "authorization": {
58
+ "type": "object",
59
+ "required": ["implementation_commit", "local_candidate_integration", "source_cleanup"],
60
+ "properties": {
61
+ "implementation_commit": {"$ref": "#/$defs/authorization-entry"},
62
+ "local_candidate_integration": {"$ref": "#/$defs/authorization-entry"},
63
+ "source_cleanup": {"$ref": "#/$defs/authorization-entry"}
64
+ },
65
+ "additionalProperties": false
48
66
  },
49
- "updated_at": {
50
- "type": "string",
51
- "minLength": 1
67
+ "leadership-history": {
68
+ "type": "object",
69
+ "required": ["owner", "epoch", "assigned_at", "ended_at"],
70
+ "properties": {
71
+ "owner": {"type": "string", "minLength": 1},
72
+ "epoch": {"type": "integer", "minimum": 1},
73
+ "assigned_at": {"type": "string", "minLength": 1},
74
+ "ended_at": {"type": "string", "minLength": 1}
75
+ },
76
+ "additionalProperties": false
52
77
  },
53
- "completed_at": {
54
- "type": [
55
- "string",
56
- "null"
57
- ]
78
+ "leadership": {
79
+ "type": "object",
80
+ "required": ["current", "epoch", "assigned_at", "history"],
81
+ "properties": {
82
+ "current": {"type": "string", "minLength": 1},
83
+ "epoch": {"type": "integer", "minimum": 1},
84
+ "assigned_at": {"type": "string", "minLength": 1},
85
+ "history": {"type": "array", "items": {"$ref": "#/$defs/leadership-history"}}
86
+ },
87
+ "additionalProperties": false
58
88
  },
59
- "archived": {
60
- "type": "boolean"
89
+ "full-suite": {
90
+ "type": "object",
91
+ "required": ["required", "status", "reason", "evidence"],
92
+ "properties": {
93
+ "required": {"type": "boolean"},
94
+ "status": {"enum": ["not-required", "pending", "passed", "failed"]},
95
+ "reason": {"type": ["string", "null"]},
96
+ "evidence": {"type": ["string", "null"]}
97
+ },
98
+ "allOf": [{
99
+ "if": {"properties": {"required": {"const": false}}, "required": ["required"]},
100
+ "then": {"properties": {"status": {"const": "not-required"}, "reason": {"type": "string", "minLength": 1}}}
101
+ }],
102
+ "additionalProperties": false
61
103
  },
62
- "archive_path": {
63
- "anyOf": [
64
- {
65
- "type": "null"
66
- },
104
+ "worktree": {
105
+ "type": "object",
106
+ "required": ["ticket_id", "owner", "implementation_owner", "integration_owner", "provider", "base_sha", "parent_branch", "branch", "workspace_ref", "source_checkpoint", "integration", "status", "updated_at"],
107
+ "properties": {
108
+ "ticket_id": {"type": "string", "pattern": "^T-[0-9]{2,}$"},
109
+ "owner": {"type": "string", "minLength": 1},
110
+ "implementation_owner": {"type": "string", "minLength": 1},
111
+ "integration_owner": {"type": "string", "minLength": 1},
112
+ "provider": {"const": "git"},
113
+ "base_sha": {"type": "string", "minLength": 1},
114
+ "parent_branch": {"type": "string", "minLength": 1},
115
+ "branch": {"type": "string", "minLength": 1},
116
+ "workspace_ref": {"type": "string", "pattern": "^(?:current|specdev-worktree/[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*/T-[0-9]{2,})$"},
117
+ "source_checkpoint": {"type": ["string", "null"]},
118
+ "integration": {"$ref": "#/$defs/integration"},
119
+ "status": {"enum": ["planned", "active", "review", "integrating", "integrated", "removed", "blocked"]},
120
+ "updated_at": {"type": "string", "minLength": 1}
121
+ },
122
+ "allOf": [
67
123
  {
68
- "type": "string",
69
- "pattern": "^<Path>\\{roots\\.state\\}/specdev/archive/[^<]+</Path>$"
70
- }
71
- ]
72
- },
73
- "blockers": {
74
- "type": "array",
75
- "items": {
76
- "type": "string"
77
- }
78
- },
79
- "deviations": {
80
- "type": "array",
81
- "items": {
82
- "type": "string"
83
- }
84
- },
85
- "worktrees": {
86
- "type": "array",
87
- "items": {
88
- "type": "object",
89
- "required": [
90
- "ticket_id",
91
- "owner",
92
- "provider",
93
- "base_sha",
94
- "branch",
95
- "workspace_ref",
96
- "status",
97
- "updated_at"
98
- ],
99
- "properties": {
100
- "ticket_id": {
101
- "type": "string",
102
- "pattern": "^T-[0-9]{2,}$"
103
- },
104
- "owner": {
105
- "type": "string",
106
- "minLength": 1
107
- },
108
- "integration_owner": {
109
- "type": "string",
110
- "minLength": 1
111
- },
112
- "provider": {
113
- "enum": [
114
- "native",
115
- "git",
116
- "external"
117
- ]
118
- },
119
- "base_sha": {
120
- "type": "string",
121
- "minLength": 1
122
- },
123
- "parent_branch": {
124
- "type": "string",
125
- "minLength": 1
126
- },
127
- "branch": {
128
- "type": "string",
129
- "minLength": 1
130
- },
131
- "workspace_ref": {
132
- "type": "string",
133
- "minLength": 1,
134
- "pattern": "^(?!/)(?![A-Za-z]:[\\\\/]).+"
135
- },
136
- "terminal_action": {
137
- "enum": [
138
- "integrate",
139
- "retain"
140
- ]
141
- },
142
- "source_checkpoint": {
143
- "type": [
144
- "string",
145
- "null"
146
- ]
147
- },
148
- "integration": {
149
- "type": "object",
150
- "required": [
151
- "status",
152
- "parent_before_sha",
153
- "source_sha",
154
- "result_sha",
155
- "method",
156
- "conflict_paths",
157
- "verification",
158
- "evidence",
159
- "attempts"
160
- ],
124
+ "if": {"properties": {"workspace_ref": {"const": "current"}}, "required": ["workspace_ref"]},
125
+ "then": {
161
126
  "properties": {
162
- "status": {
163
- "enum": [
164
- "pending",
165
- "running",
166
- "passed",
167
- "blocked"
168
- ]
169
- },
170
- "parent_before_sha": {
171
- "type": ["string", "null"]
172
- },
173
- "source_sha": {
174
- "type": ["string", "null"]
175
- },
176
- "result_sha": {
177
- "type": ["string", "null"]
178
- },
179
- "method": {
180
- "enum": [null, "fast-forward", "merge-commit"]
181
- },
182
- "conflict_paths": {
183
- "type": "array",
184
- "items": {"type": "string"}
185
- },
186
- "verification": {
187
- "enum": ["pending", "passed", "failed"]
188
- },
189
- "evidence": {
190
- "type": "string",
191
- "pattern": "^<Path>\\{roots\\.state\\}/specdev/changes/[^<]+/evidence/T-[0-9]{2,}\\.md</Path>$"
192
- },
193
- "attempts": {
194
- "type": "integer",
195
- "minimum": 0
196
- }
197
- },
198
- "additionalProperties": true
199
- },
200
- "status": {
201
- "enum": [
202
- "planned",
203
- "active",
204
- "review",
205
- "integrating",
206
- "integrated",
207
- "removed",
208
- "blocked"
209
- ]
210
- },
211
- "updated_at": {
212
- "type": "string",
213
- "minLength": 1
214
- }
215
- },
216
- "dependentRequired": {
217
- "terminal_action": [
218
- "integration_owner",
219
- "parent_branch",
220
- "source_checkpoint",
221
- "integration"
222
- ]
223
- },
224
- "allOf": [
225
- {
226
- "if": {
227
- "properties": {
228
- "status": {"const": "integrating"}
229
- },
230
- "required": ["status"]
231
- },
232
- "then": {
233
- "required": [
234
- "terminal_action",
235
- "integration_owner",
236
- "parent_branch",
237
- "source_checkpoint",
238
- "integration"
239
- ],
240
- "properties": {
241
- "terminal_action": {"const": "integrate"}
242
- }
243
- }
244
- },
245
- {
246
- "if": {
247
- "properties": {
248
- "status": {"enum": ["integrating", "integrated"]},
249
- "terminal_action": {"const": "integrate"}
250
- },
251
- "required": ["status", "terminal_action"]
252
- },
253
- "then": {
254
- "properties": {
255
- "source_checkpoint": {"type": "string", "minLength": 1},
256
- "integration": {
257
- "properties": {
258
- "parent_before_sha": {"type": "string", "minLength": 1},
259
- "source_sha": {"type": "string", "minLength": 1},
260
- "attempts": {"type": "integer", "minimum": 1}
261
- }
262
- }
263
- }
264
- }
265
- },
266
- {
267
- "if": {
268
- "properties": {
269
- "status": {"const": "integrating"},
270
- "terminal_action": {"const": "integrate"}
271
- },
272
- "required": ["status", "terminal_action"]
273
- },
274
- "then": {
275
- "properties": {
276
- "integration": {
277
- "properties": {
278
- "status": {"const": "running"}
279
- }
280
- }
281
- }
282
- }
283
- },
284
- {
285
- "if": {
286
- "properties": {
287
- "status": {"const": "integrated"},
288
- "terminal_action": {"const": "integrate"}
289
- },
290
- "required": ["status", "terminal_action"]
291
- },
292
- "then": {
293
- "properties": {
294
- "integration": {
127
+ "integration": {
128
+ "allOf": [{
295
129
  "properties": {
296
- "status": {"const": "passed"},
297
- "result_sha": {"type": "string", "minLength": 1},
298
- "method": {"enum": ["fast-forward", "merge-commit"]},
299
- "verification": {"const": "passed"}
130
+ "candidate_sha": {"const": null},
131
+ "candidate_tree_sha": {"const": null},
132
+ "candidate_branch": {"const": null},
133
+ "candidate_workspace_ref": {"const": null},
134
+ "method": {"enum": [null, "direct-parent"]}
300
135
  }
301
- }
136
+ }]
302
137
  }
303
138
  }
304
139
  },
305
- {
306
- "if": {
307
- "properties": {
308
- "terminal_action": {"const": "retain"}
309
- },
310
- "required": ["terminal_action"]
311
- },
312
- "then": {
313
- "properties": {
314
- "status": {
315
- "not": {"enum": ["integrating", "integrated"]}
316
- }
317
- }
318
- }
319
- }
320
- ],
321
- "additionalProperties": true
322
- }
323
- }
324
- },
325
- "allOf": [
326
- {
327
- "if": {
328
- "properties": {
329
- "worktrees": {
330
- "contains": {
331
- "properties": {
332
- "provider": {
333
- "const": "git"
334
- }
335
- },
336
- "required": [
337
- "provider"
338
- ]
339
- }
340
- }
341
- }
342
- },
343
- "then": {
344
- "properties": {
345
- "worktrees": {
346
- "items": {
347
- "if": {
348
- "properties": {
349
- "provider": {
350
- "const": "git"
351
- }
352
- },
353
- "required": [
354
- "provider"
355
- ]
356
- },
357
- "then": {
358
- "properties": {
359
- "workspace_ref": {
360
- "pattern": "^specdev-worktree/T-[0-9]{2,}$"
361
- }
362
- }
140
+ "else": {
141
+ "properties": {
142
+ "integration": {
143
+ "allOf": [{"properties": {"method": {"enum": [null, "fast-forward", "merge-commit"]}}}]
363
144
  }
364
145
  }
365
146
  }
366
147
  }
367
- }
148
+ ],
149
+ "additionalProperties": false
368
150
  },
369
- {
370
- "if": {
371
- "properties": {
372
- "change_status": {
373
- "const": "archived"
374
- }
375
- }
151
+ "integration": {
152
+ "type": "object",
153
+ "required": ["status", "parent_ref", "parent_before_sha", "source_sha", "candidate_sha", "candidate_tree_sha", "candidate_branch", "candidate_workspace_ref", "result_sha", "method", "conflict_paths", "verification", "full_suite", "e2e", "evidence", "attempts", "promotion_status"],
154
+ "properties": {
155
+ "status": {"enum": ["pending", "candidate", "passed", "failed", "stale"]},
156
+ "parent_ref": {"type": ["string", "null"]},
157
+ "parent_before_sha": {"type": ["string", "null"]},
158
+ "source_sha": {"type": ["string", "null"]},
159
+ "candidate_sha": {"type": ["string", "null"]},
160
+ "candidate_tree_sha": {"type": ["string", "null"]},
161
+ "candidate_branch": {"type": ["string", "null"]},
162
+ "candidate_workspace_ref": {"anyOf": [{"type": "null"}, {"type": "string", "pattern": "^specdev-worktree/\\.integration/[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*/T-[0-9]{2,}$"}]},
163
+ "result_sha": {"type": ["string", "null"]},
164
+ "method": {"enum": [null, "direct-parent", "fast-forward", "merge-commit"]},
165
+ "conflict_paths": {"type": "array", "items": {"type": "string"}},
166
+ "verification": {"enum": ["pending", "passed", "failed"]},
167
+ "full_suite": {"$ref": "#/$defs/full-suite"},
168
+ "e2e": {"$ref": "#/$defs/full-suite"},
169
+ "evidence": {"type": "string", "pattern": "^<Path>\\{roots\\.state\\}/specdev/changes/[^<]+/evidence/T-[0-9]{2,}\\.md</Path>$"},
170
+ "attempts": {"type": "integer", "minimum": 0},
171
+ "promotion_status": {"enum": ["pending", "applying", "applied", "failed", "stale"]}
376
172
  },
377
- "then": {
378
- "properties": {
379
- "archived": {
380
- "const": true
381
- },
382
- "archive_path": {
383
- "type": "string",
384
- "pattern": "^<Path>\\{roots\\.state\\}/specdev/archive/[^<]+</Path>$"
385
- }
386
- }
387
- }
173
+ "additionalProperties": false
388
174
  }
389
- ],
390
- "additionalProperties": true
175
+ },
176
+ "allOf": [{
177
+ "if": {"properties": {"change_status": {"const": "archived"}}, "required": ["change_status"]},
178
+ "then": {"properties": {"archived": {"const": true}, "archive_path": {"type": "string", "pattern": "^<Path>\\{roots\\.state\\}/specdev/archive/[^<]+</Path>$"}}}
179
+ }],
180
+ "additionalProperties": false
391
181
  }
@@ -1,32 +1,31 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "urn:speculo:specdev:config:v3",
3
+ "$id": "urn:speculo:specdev:config:v5",
4
4
  "title": "SpecDev Configuration",
5
5
  "type": "object",
6
6
  "required": ["schema_version", "interaction_language", "artifact_language", "git", "execution", "verification", "planning"],
7
7
  "properties": {
8
- "schema_version": {"const": 3},
8
+ "schema_version": {"const": 5},
9
9
  "interaction_language": {"type": "string", "minLength": 1},
10
10
  "artifact_language": {"type": "string", "minLength": 1},
11
11
  "git": {
12
12
  "type": "object",
13
- "required": ["auto_commit", "default_branch", "worktree_for_parallel"],
13
+ "required": ["default_branch"],
14
14
  "properties": {
15
- "auto_commit": {"type": "boolean"},
16
- "default_branch": {"type": ["string", "null"]},
17
- "worktree_for_parallel": {"type": "boolean"}
15
+ "default_branch": {"type": ["string", "null"]}
18
16
  },
19
- "additionalProperties": true
17
+ "additionalProperties": false
20
18
  },
21
19
  "execution": {
22
20
  "type": "object",
23
- "required": ["max_parallel", "deep_ticket_human_approval", "shared_path_owner"],
21
+ "required": ["max_implementation_agents", "max_integration_attempts", "deep_ticket_human_approval", "shared_path_owner"],
24
22
  "properties": {
25
- "max_parallel": {"type": "integer", "minimum": 1},
23
+ "max_implementation_agents": {"type": "integer", "minimum": 1},
24
+ "max_integration_attempts": {"type": "integer", "minimum": 1},
26
25
  "deep_ticket_human_approval": {"type": "boolean"},
27
26
  "shared_path_owner": {"type": "string", "minLength": 1}
28
27
  },
29
- "additionalProperties": true
28
+ "additionalProperties": false
30
29
  },
31
30
  "verification": {
32
31
  "type": "object",
@@ -41,14 +40,19 @@
41
40
  },
42
41
  "planning": {
43
42
  "type": "object",
44
- "required": ["default_depth", "require_ready_gate", "require_evidence"],
43
+ "required": ["default_depth", "require_ready_gate", "require_evidence", "ui_prototype_default_variants", "ui_prototype_max_variants"],
45
44
  "properties": {
46
45
  "default_depth": {"enum": ["lite", "standard", "deep"]},
47
46
  "require_ready_gate": {"type": "boolean"},
48
- "require_evidence": {"type": "boolean"}
47
+ "require_evidence": {"type": "boolean"},
48
+ "ui_prototype_default_variants": {"type": "integer", "minimum": 1},
49
+ "ui_prototype_max_variants": {"type": "integer", "minimum": 1}
49
50
  },
50
51
  "additionalProperties": true
51
52
  }
52
53
  },
53
- "additionalProperties": true
54
+ "allOf": [{
55
+ "$comment": "ui_prototype_default_variants <= ui_prototype_max_variants is enforced by validate-specdev.mjs because JSON Schema cannot compare sibling numeric values."
56
+ }],
57
+ "additionalProperties": false
54
58
  }