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.
Files changed (25) hide show
  1. package/CHANGELOG.md +288 -0
  2. package/README.md +21 -13
  3. package/package.json +2 -1
  4. package/schemas/README.md +5 -1
  5. package/schemas/postmortem.v1.schema.json +339 -0
  6. package/schemas/vinta-ai-workflows-config.v1.schema.json +13 -1
  7. package/schemas/workflow.v1.schema.json +833 -0
  8. package/skills/vinta-bootstrap-ai-tools/SKILL.md +9 -1
  9. package/skills/vinta-derive-skills/SKILL.md +6 -2
  10. package/skills/vinta-derive-skills/resources/foundation-skills/plan-feature/SKILL.md +622 -32
  11. package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/SKILL.md +24 -2
  12. package/skills/vinta-derive-skills/resources/plan-execution/README.md +21 -4
  13. package/skills/vinta-derive-skills/resources/plan-execution/partials/agent-models.md +30 -3
  14. package/skills/vinta-derive-skills/resources/plan-execution/partials/commit-strategy/modular.md +27 -14
  15. package/skills/vinta-derive-skills/resources/plan-execution/partials/commit-strategy/stacked.md +12 -18
  16. package/skills/vinta-derive-skills/resources/plan-execution/partials/implementer-prompt.md +19 -9
  17. package/skills/vinta-derive-skills/resources/plan-execution/partials/model-pick.md +25 -9
  18. package/skills/vinta-derive-skills/resources/plan-execution/partials/parallel-lanes.md +240 -0
  19. package/skills/vinta-derive-skills/resources/plan-execution/partials/review-layers.md +56 -5
  20. package/skills/vinta-derive-skills/resources/plan-execution/partials/worktree-seam.md +13 -6
  21. package/skills/vinta-derive-skills/resources/plan-execution/shell/amend-plan-template.md +17 -12
  22. package/skills/vinta-derive-skills/resources/plan-execution/shell/implement-phase-template.md +5 -3
  23. package/skills/vinta-derive-skills/resources/plan-execution/shell/implement-plan-template.md +94 -57
  24. package/skills/vinta-derive-skills/resources/plan-execution/shell/integrate-phase-template.md +2 -1
  25. 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 an isolated git worktree (via `prepare-worktree`) and run every phase's subagent inside it. False = run in the current checkout. True = create one shared worktree at the start of the plan run; all phase branches stack inside it. Per-run prompt still asks; this is the suggested default shown.",
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
  },