vinta-ai-workflows 0.6.1 → 0.7.0-alpha2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +288 -0
- package/README.md +21 -13
- package/package.json +2 -1
- package/schemas/README.md +5 -1
- package/schemas/postmortem.v1.schema.json +339 -0
- package/schemas/vinta-ai-workflows-config.v1.schema.json +13 -1
- package/schemas/workflow.v1.schema.json +833 -0
- package/skills/vinta-bootstrap-ai-tools/SKILL.md +9 -1
- package/skills/vinta-derive-skills/SKILL.md +6 -2
- package/skills/vinta-derive-skills/resources/foundation-skills/plan-feature/SKILL.md +622 -32
- package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/SKILL.md +24 -2
- package/skills/vinta-derive-skills/resources/plan-execution/README.md +21 -4
- package/skills/vinta-derive-skills/resources/plan-execution/partials/agent-models.md +30 -3
- package/skills/vinta-derive-skills/resources/plan-execution/partials/commit-strategy/modular.md +27 -14
- package/skills/vinta-derive-skills/resources/plan-execution/partials/commit-strategy/stacked.md +12 -18
- package/skills/vinta-derive-skills/resources/plan-execution/partials/implementer-prompt.md +19 -9
- package/skills/vinta-derive-skills/resources/plan-execution/partials/model-pick.md +25 -9
- package/skills/vinta-derive-skills/resources/plan-execution/partials/parallel-lanes.md +240 -0
- package/skills/vinta-derive-skills/resources/plan-execution/partials/review-layers.md +56 -5
- package/skills/vinta-derive-skills/resources/plan-execution/partials/worktree-seam.md +13 -6
- package/skills/vinta-derive-skills/resources/plan-execution/shell/amend-plan-template.md +17 -12
- package/skills/vinta-derive-skills/resources/plan-execution/shell/implement-phase-template.md +5 -3
- package/skills/vinta-derive-skills/resources/plan-execution/shell/implement-plan-template.md +94 -57
- package/skills/vinta-derive-skills/resources/plan-execution/shell/integrate-phase-template.md +2 -1
- package/skills/vinta-derive-skills/resources/plan-execution/shell/review-phase-template.md +16 -5
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/vintasoftware/vinta-ai-workflows/schemas/postmortem.v1.schema.json",
|
|
4
|
+
"title": "vinta-ai-maestro plan post-mortem",
|
|
5
|
+
"description": "What one finished `vinta-ai-maestro` run learned about the plan that produced it: dependencies that were never used, dependencies discovered missing, same-wave phases that conflicted, and phases whose duration diverged from their wave. Ids, waves, paths, durations and counts only. Lives at `.vinta-ai-maestro/runs/<run-id>/postmortem.json` in a target project, emitted by `vinta-ai-maestro` after a run ends and read by `plan-feature` when planning the next feature in the same repo. GENERATED from packages/vinta-ai-maestro/src/postmortem/postmortem.ts — edit there, not here. See schemas/README.md for versioning rules.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"description": "Optional URL of this schema, for editor validation. Ignored at runtime.",
|
|
10
|
+
"type": "string"
|
|
11
|
+
},
|
|
12
|
+
"schema_version": {
|
|
13
|
+
"type": "number",
|
|
14
|
+
"const": 1,
|
|
15
|
+
"description": "Schema major version. Bumped only on breaking changes."
|
|
16
|
+
},
|
|
17
|
+
"run_id": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"minLength": 1
|
|
20
|
+
},
|
|
21
|
+
"workflow_id": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"minLength": 1,
|
|
24
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
25
|
+
"description": "The workflow this run executed."
|
|
26
|
+
},
|
|
27
|
+
"plan_ref": {
|
|
28
|
+
"description": "The human-readable plan the workflow was emitted alongside, if it named one.",
|
|
29
|
+
"type": "string"
|
|
30
|
+
},
|
|
31
|
+
"run": {
|
|
32
|
+
"type": "object",
|
|
33
|
+
"properties": {
|
|
34
|
+
"status": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"enum": [
|
|
37
|
+
"done",
|
|
38
|
+
"failed"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"started_at_ms": {
|
|
42
|
+
"type": "integer",
|
|
43
|
+
"minimum": -9007199254740991,
|
|
44
|
+
"maximum": 9007199254740991
|
|
45
|
+
},
|
|
46
|
+
"ended_at_ms": {
|
|
47
|
+
"type": "integer",
|
|
48
|
+
"minimum": -9007199254740991,
|
|
49
|
+
"maximum": 9007199254740991
|
|
50
|
+
},
|
|
51
|
+
"elapsed_ms": {
|
|
52
|
+
"type": "integer",
|
|
53
|
+
"minimum": -9007199254740991,
|
|
54
|
+
"maximum": 9007199254740991
|
|
55
|
+
},
|
|
56
|
+
"node_count": {
|
|
57
|
+
"type": "integer",
|
|
58
|
+
"minimum": 1,
|
|
59
|
+
"maximum": 9007199254740991
|
|
60
|
+
},
|
|
61
|
+
"wave_count": {
|
|
62
|
+
"type": "integer",
|
|
63
|
+
"minimum": 1,
|
|
64
|
+
"maximum": 9007199254740991
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"required": [
|
|
68
|
+
"status",
|
|
69
|
+
"started_at_ms",
|
|
70
|
+
"ended_at_ms",
|
|
71
|
+
"elapsed_ms",
|
|
72
|
+
"node_count",
|
|
73
|
+
"wave_count"
|
|
74
|
+
],
|
|
75
|
+
"additionalProperties": false,
|
|
76
|
+
"description": "The run this describes. Always finished — an unfinished run has no post-mortem."
|
|
77
|
+
},
|
|
78
|
+
"findings": {
|
|
79
|
+
"type": "object",
|
|
80
|
+
"properties": {
|
|
81
|
+
"unused_dependencies": {
|
|
82
|
+
"type": "array",
|
|
83
|
+
"items": {
|
|
84
|
+
"type": "object",
|
|
85
|
+
"properties": {
|
|
86
|
+
"node": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"minLength": 1,
|
|
89
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
90
|
+
"description": "The dependent phase."
|
|
91
|
+
},
|
|
92
|
+
"depends_on": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"minLength": 1,
|
|
95
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
96
|
+
"description": "The upstream phase the edge names."
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"required": [
|
|
100
|
+
"node",
|
|
101
|
+
"depends_on"
|
|
102
|
+
],
|
|
103
|
+
"additionalProperties": false,
|
|
104
|
+
"description": "One dependency edge, by id. The plan’s own `artifact` prose is deliberately not carried: the reader has the plan, and this file must stay free of repository text."
|
|
105
|
+
},
|
|
106
|
+
"description": "Edges whose artifact the dependent never needed. Empty on every run today: nothing observes dependency use, and the schedule cannot substitute. See `gaps`."
|
|
107
|
+
},
|
|
108
|
+
"missing_dependencies": {
|
|
109
|
+
"type": "array",
|
|
110
|
+
"items": {
|
|
111
|
+
"type": "object",
|
|
112
|
+
"properties": {
|
|
113
|
+
"node": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"minLength": 1,
|
|
116
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
117
|
+
"description": "The phase that failed and later passed."
|
|
118
|
+
},
|
|
119
|
+
"depends_on": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"minLength": 1,
|
|
122
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
123
|
+
"description": "The undeclared phase that landed in between."
|
|
124
|
+
},
|
|
125
|
+
"failed_at_ms": {
|
|
126
|
+
"type": "integer",
|
|
127
|
+
"minimum": -9007199254740991,
|
|
128
|
+
"maximum": 9007199254740991,
|
|
129
|
+
"description": "When the phase first failed."
|
|
130
|
+
},
|
|
131
|
+
"landed_at_ms": {
|
|
132
|
+
"type": "integer",
|
|
133
|
+
"minimum": -9007199254740991,
|
|
134
|
+
"maximum": 9007199254740991,
|
|
135
|
+
"description": "When the undeclared phase reached `done`."
|
|
136
|
+
},
|
|
137
|
+
"passed_at_ms": {
|
|
138
|
+
"type": "integer",
|
|
139
|
+
"minimum": -9007199254740991,
|
|
140
|
+
"maximum": 9007199254740991,
|
|
141
|
+
"description": "When the phase finally reached `done`."
|
|
142
|
+
},
|
|
143
|
+
"gate": {
|
|
144
|
+
"description": "The gate whose recorded result is the evidence: it failed at `failed_at_ms` and passed at `passed_at_ms`. Absent when the run recorded no gate result for the phase and the window came from its status transitions instead — a weaker signal, flagged in `gaps`.",
|
|
145
|
+
"type": "string",
|
|
146
|
+
"minLength": 1,
|
|
147
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"required": [
|
|
151
|
+
"node",
|
|
152
|
+
"depends_on",
|
|
153
|
+
"failed_at_ms",
|
|
154
|
+
"landed_at_ms",
|
|
155
|
+
"passed_at_ms"
|
|
156
|
+
],
|
|
157
|
+
"additionalProperties": false,
|
|
158
|
+
"description": "A dependency the run discovered and the plan did not declare: the phase failed, an undeclared phase landed, and only then did it pass. The evidence is still ordering — a recorded gate result narrows the window to one gate and rules out an unrelated failure, but it does not prove the undeclared phase is what fixed it. Confirm the edge against the plan before adding it."
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
"wave_conflicts": {
|
|
162
|
+
"type": "array",
|
|
163
|
+
"items": {
|
|
164
|
+
"type": "object",
|
|
165
|
+
"properties": {
|
|
166
|
+
"wave": {
|
|
167
|
+
"type": "integer",
|
|
168
|
+
"minimum": 1,
|
|
169
|
+
"maximum": 9007199254740991,
|
|
170
|
+
"description": "The wave whose merge produced the conflict."
|
|
171
|
+
},
|
|
172
|
+
"nodes": {
|
|
173
|
+
"minItems": 2,
|
|
174
|
+
"type": "array",
|
|
175
|
+
"items": {
|
|
176
|
+
"type": "string",
|
|
177
|
+
"minLength": 1,
|
|
178
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
179
|
+
},
|
|
180
|
+
"description": "The phases that both own the contested paths."
|
|
181
|
+
},
|
|
182
|
+
"paths": {
|
|
183
|
+
"type": "array",
|
|
184
|
+
"items": {
|
|
185
|
+
"type": "string"
|
|
186
|
+
},
|
|
187
|
+
"description": "Repository paths that conflicted. Paths, never hunks."
|
|
188
|
+
},
|
|
189
|
+
"fix_rounds": {
|
|
190
|
+
"type": "integer",
|
|
191
|
+
"minimum": 0,
|
|
192
|
+
"maximum": 9007199254740991,
|
|
193
|
+
"description": "Conflict-fixer rounds the resolution took. High is a strong split signal."
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
"required": [
|
|
197
|
+
"wave",
|
|
198
|
+
"nodes",
|
|
199
|
+
"paths",
|
|
200
|
+
"fix_rounds"
|
|
201
|
+
],
|
|
202
|
+
"additionalProperties": false,
|
|
203
|
+
"description": "Two same-wave phases that actually fought over the same code at integration."
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
"duration_divergences": {
|
|
207
|
+
"type": "array",
|
|
208
|
+
"items": {
|
|
209
|
+
"type": "object",
|
|
210
|
+
"properties": {
|
|
211
|
+
"node": {
|
|
212
|
+
"type": "string",
|
|
213
|
+
"minLength": 1,
|
|
214
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
215
|
+
},
|
|
216
|
+
"wave": {
|
|
217
|
+
"type": "integer",
|
|
218
|
+
"minimum": 1,
|
|
219
|
+
"maximum": 9007199254740991
|
|
220
|
+
},
|
|
221
|
+
"span_ms": {
|
|
222
|
+
"type": "integer",
|
|
223
|
+
"minimum": -9007199254740991,
|
|
224
|
+
"maximum": 9007199254740991,
|
|
225
|
+
"description": "Dispatch to final settle, including fix rounds."
|
|
226
|
+
},
|
|
227
|
+
"wave_baseline_ms": {
|
|
228
|
+
"type": "integer",
|
|
229
|
+
"minimum": -9007199254740991,
|
|
230
|
+
"maximum": 9007199254740991,
|
|
231
|
+
"description": "Median span of the *other* dispatched phases in the same wave."
|
|
232
|
+
},
|
|
233
|
+
"ratio": {
|
|
234
|
+
"type": "number",
|
|
235
|
+
"description": "`span_ms / wave_baseline_ms`, rounded to two decimals."
|
|
236
|
+
},
|
|
237
|
+
"direction": {
|
|
238
|
+
"type": "string",
|
|
239
|
+
"enum": [
|
|
240
|
+
"longer",
|
|
241
|
+
"shorter"
|
|
242
|
+
],
|
|
243
|
+
"description": "`longer`: the phase set the wave’s wall clock on its own."
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
"required": [
|
|
247
|
+
"node",
|
|
248
|
+
"wave",
|
|
249
|
+
"span_ms",
|
|
250
|
+
"wave_baseline_ms",
|
|
251
|
+
"ratio",
|
|
252
|
+
"direction"
|
|
253
|
+
],
|
|
254
|
+
"additionalProperties": false,
|
|
255
|
+
"description": "A phase whose real duration was wildly out of line with its wave placement — which is exactly what makes the next plan’s parallelism estimate wrong."
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
"required": [
|
|
260
|
+
"unused_dependencies",
|
|
261
|
+
"missing_dependencies",
|
|
262
|
+
"wave_conflicts",
|
|
263
|
+
"duration_divergences"
|
|
264
|
+
],
|
|
265
|
+
"additionalProperties": false
|
|
266
|
+
},
|
|
267
|
+
"gaps": {
|
|
268
|
+
"type": "array",
|
|
269
|
+
"items": {
|
|
270
|
+
"type": "object",
|
|
271
|
+
"properties": {
|
|
272
|
+
"kind": {
|
|
273
|
+
"type": "string",
|
|
274
|
+
"enum": [
|
|
275
|
+
"dependency_use_unrecorded",
|
|
276
|
+
"gate_result_unrecorded",
|
|
277
|
+
"integration_record_unavailable"
|
|
278
|
+
]
|
|
279
|
+
},
|
|
280
|
+
"needs": {
|
|
281
|
+
"type": "string",
|
|
282
|
+
"description": "What would have to be recorded for the finding to exist."
|
|
283
|
+
},
|
|
284
|
+
"edges": {
|
|
285
|
+
"description": "The edges the gap applies to.",
|
|
286
|
+
"type": "array",
|
|
287
|
+
"items": {
|
|
288
|
+
"type": "object",
|
|
289
|
+
"properties": {
|
|
290
|
+
"node": {
|
|
291
|
+
"type": "string",
|
|
292
|
+
"minLength": 1,
|
|
293
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
294
|
+
"description": "The dependent phase."
|
|
295
|
+
},
|
|
296
|
+
"depends_on": {
|
|
297
|
+
"type": "string",
|
|
298
|
+
"minLength": 1,
|
|
299
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
300
|
+
"description": "The upstream phase the edge names."
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
"required": [
|
|
304
|
+
"node",
|
|
305
|
+
"depends_on"
|
|
306
|
+
],
|
|
307
|
+
"additionalProperties": false,
|
|
308
|
+
"description": "One dependency edge, by id. The plan’s own `artifact` prose is deliberately not carried: the reader has the plan, and this file must stay free of repository text."
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
"nodes": {
|
|
312
|
+
"description": "The phases the gap applies to.",
|
|
313
|
+
"type": "array",
|
|
314
|
+
"items": {
|
|
315
|
+
"type": "string",
|
|
316
|
+
"minLength": 1,
|
|
317
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
"required": [
|
|
322
|
+
"kind",
|
|
323
|
+
"needs"
|
|
324
|
+
],
|
|
325
|
+
"additionalProperties": false,
|
|
326
|
+
"description": "A finding this run could not produce, and why. Carried in the artifact rather than thrown or defaulted to an empty list: a reader that treats an empty finding as “nothing happened” has to reach past an explicit statement that nothing was recorded."
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"required": [
|
|
331
|
+
"schema_version",
|
|
332
|
+
"run_id",
|
|
333
|
+
"workflow_id",
|
|
334
|
+
"run",
|
|
335
|
+
"findings",
|
|
336
|
+
"gaps"
|
|
337
|
+
],
|
|
338
|
+
"additionalProperties": false
|
|
339
|
+
}
|
|
@@ -312,9 +312,21 @@
|
|
|
312
312
|
"default": false
|
|
313
313
|
},
|
|
314
314
|
"use_worktree": {
|
|
315
|
-
"description": "Default answer to Step 0 question (c) — whether `implement-plan` should provision
|
|
315
|
+
"description": "Default answer to Step 0 question (c) — whether `implement-plan` should provision isolated git worktrees (via `prepare-worktree`) and run phase subagents inside them. False = run in the current checkout. True = provision at the start of the plan run: one shared worktree for a sequential run, or one lane per concurrent phase plus an integration worktree when `parallel_phases` is on. Per-run prompt still asks; this is the suggested default shown.",
|
|
316
316
|
"type": "boolean",
|
|
317
317
|
"default": false
|
|
318
|
+
},
|
|
319
|
+
"parallel_phases": {
|
|
320
|
+
"description": "Default answer to Step 0 question (e) — whether `implement-plan` implements independent phases concurrently, one git worktree lane per in-flight phase. The plan's per-phase `**Depends on**:` lines define the graph; a phase starts as soon as every phase it depends on is green. True (default) = run in parallel whenever the graph has a wave wider than one phase. False = one phase at a time. Requires `foundation_skills.prepare-worktree` enabled and `use_worktree` resolving true — several agents cannot share one working tree — and `implement-plan` refuses rather than silently degrading when that is not the case. Per-run prompt still asks; this is the suggested default shown.",
|
|
321
|
+
"type": "boolean",
|
|
322
|
+
"default": true
|
|
323
|
+
},
|
|
324
|
+
"max_parallel_lanes": {
|
|
325
|
+
"description": "Upper bound on how many phases `implement-plan` keeps in flight at once, and therefore how many worktree lanes it provisions. Capped at runtime by the widest wave in the plan's dependency graph — a chain-shaped plan provisions one lane regardless. Each lane costs one runnable checkout (deps + forked dev/test DBs + its own compose project), so raise this only on machines with the disk and CPU for it. Ignored when `parallel_phases` is false.",
|
|
326
|
+
"type": "integer",
|
|
327
|
+
"minimum": 1,
|
|
328
|
+
"maximum": 8,
|
|
329
|
+
"default": 3
|
|
318
330
|
}
|
|
319
331
|
}
|
|
320
332
|
},
|