vinta-ai-workflows 0.7.0-alpha33 → 0.7.0-alpha34

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 CHANGED
@@ -7,6 +7,7 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  ## [0.7.0] — YYYY-MM-DD
9
9
 
10
+ <!-- pre-release: 0.7.0-alpha34 on 2026-10-16 -->
10
11
  <!-- pre-release: 0.7.0-alpha33 on 2026-10-16 -->
11
12
  <!-- pre-release: 0.7.0-alpha31 on 2026-10-09 -->
12
13
  <!-- pre-release: 0.7.0-alpha30 on 2026-10-09 -->
@@ -33,6 +34,34 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
33
34
 
34
35
  ### Added
35
36
 
37
+ - **`vinta-ai-maestro`: `accept` on an unapproved review.** The review-budget
38
+ question offered `continue` or `stop`, and operators answered `stop` meaning
39
+ "take it as it is" — which fails the attempt and, under `--on-failure
40
+ retry`, starts the phase over. It now offers `continue`, `accept` and `stop`
41
+ and says what each does. `accept` ends the review loop and keeps the work:
42
+ the polish chores, the gates and integration still run, and the answer is
43
+ journalled. The unattended answer is unchanged (`continue` once, then
44
+ `stop`); the coordinator cannot answer `accept`.
45
+ - **`vinta-ai-maestro validate` warns about parallel phases adding migrations
46
+ to one app**, and `plan-feature` treats them as real overlap. Two phases
47
+ that neither depends on the other, each adding a migration under the same
48
+ directory (Django `<app>/migrations/`, Alembic `…/versions/`, Rails
49
+ `db/migrate/`, Prisma `prisma/migrations/`), start from the same latest
50
+ migration; merged, the graph has two leaves and every gate on the merged
51
+ tree fails. Their Touch Lists name different files, so nothing flagged it.
52
+ `validate --json` gains a `warnings` list, printed as `warning:` lines in
53
+ text mode, and the review page shows them in their own panel; neither
54
+ changes the exit code or `valid`. `plan-feature` now says to add the edge,
55
+ or to name the phase whose integration writes the merge migration.
56
+ - **`vinta-ai-maestro node resume <run> <phase>`**, the undo of `node pause`:
57
+ it withdraws a pause not yet taken, releases a phase parked on the pause, or
58
+ gives a held phase its `--retry-after` timer back. It used to take
59
+ answering an undocumented "The operator paused this node. Resume it?"
60
+ question, or answering a held phase's question by hand.
61
+ - **`vinta-ai-maestro status` shows the question each phase is asking**, with
62
+ its choices, and `status --json` carries it per node as `question`
63
+ (`effectId`, `question`, `kind`, `choices`, `askedAt`). `asking: true` alone
64
+ sent operators into `flow.db` to read it.
36
65
  - **`vinta-ai-maestro`: ways past a stale gate verdict.** `gate <id>
37
66
  --no-cache` runs a gate past its cached result and keeps the new one in its
38
67
  place; a cached red now says so. `gate-cache invalidate <run-id> <gate-id>
@@ -957,6 +986,51 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
957
986
 
958
987
  ### Fixed
959
988
 
989
+ - **`vinta-ai-maestro`: a claude-code turn the CLI calls "blocked" no longer
990
+ fails unless a tool was refused in it.** The CLI's own turn summary marks a
991
+ turn `blocked` whenever its last message names a next step for a person —
992
+ a review ending "Nothing was pushed." over `VERDICT: pass`, an implementer
993
+ listing an open point — and each such turn was recorded as failed
994
+ ("claude-code: the turn ended blocked"), an approving review included. One
995
+ observed phase had 43 of them. The summary now fails a turn only alongside a
996
+ `permission_denied` in the same turn, the case it was added for; whether
997
+ the rest did their job is for verdicts, gates and the agent's questions. A
998
+ turn's errors no longer outlive it in a session held open for background
999
+ work.
1000
+ - **`vinta-ai-maestro`: a merge git stopped with nothing unmerged no longer
1001
+ starts a fixer.** `rerere.autoupdate` replaying a recorded resolution, or a
1002
+ `pre-merge-commit` / `commit-msg` hook refusing the merged code, leaves
1003
+ `git merge` non-zero with no unmerged path, and the integrator handed the
1004
+ conflict fixer an empty file list — nineteen rounds in one observed phase,
1005
+ each told to resolve nothing. With no conflict markers left, the merge now
1006
+ goes to `verify` and is committed, recorded as resolved in 0 rounds; a hook
1007
+ that refuses that commit gets the refused-commit question (commit, commit
1008
+ past the hooks, or abort), worded for a clean merge. Only a red gate sends it
1009
+ to the fixer. A merge git refused before merging anything (an untracked file
1010
+ in the way) fails with git's own error.
1011
+ - **`vinta-ai-maestro`: a merge finished by hand survives the next attempt.**
1012
+ A conflict the fixer could not settle fails the phase with "finish the merge
1013
+ by hand … and commit it", and the next attempt's `mergeWave` cut
1014
+ `wave-<N>` again from `wave-<N-1>` and re-merged every member, throwing the
1015
+ resolution away and hitting the same conflict on every attempt. A wave or
1016
+ `integ-<id>` branch that still contains its starting point, and whose merges
1017
+ all brought in work still in the members' current tips, is now kept, and only
1018
+ the members it lacks are merged. A member redone after it was merged still
1019
+ forces a rebuild. The error now says the branch is kept.
1020
+ - **`vinta-ai-maestro`: a merged tree that fails its gates is no longer
1021
+ reported as an unresolved conflict with no paths.** Two sibling phases that
1022
+ each added a Django migration on the same parent merged cleanly and failed
1023
+ `verify` together, and the phase failed "unresolved conflict: p4a both
1024
+ changed , …". Each fix round is now told which gate the merged tree failed
1025
+ and where its log is, and the rounds end in `IntegrationVerifyError`, naming
1026
+ the gate and its log path (`nodes/_integration/gates/<gate>.log`).
1027
+ - **`vinta-ai-maestro`: `exec` accepts a lane's short name or its phase, and
1028
+ `with` / `gate` work inside it.** `exec <run> crew-3-tier2-2` and
1029
+ `exec <run> p1` were refused `unknown_target`; only the full
1030
+ `<run-id>-crew-3-tier2-2` worked. Both now resolve, and a refusal lists the
1031
+ run's targets. Inside `exec`, `with test-suite -- make test` said "no live
1032
+ run is available" while the run was live: the command now holds leases as the
1033
+ phase running in the lane, or as itself on an idle one, until it exits.
960
1034
  - **`vinta-ai-maestro`: a fix loop that changes nothing now stops and asks.**
961
1035
  A typecheck red because of ignored files left in a lane kept coming back
962
1036
  from the gate cache after they were gone, and twenty fixers in a row found
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vinta-ai-workflows",
3
- "version": "0.7.0-alpha33",
3
+ "version": "0.7.0-alpha34",
4
4
  "description": "Bootstrap AI tooling (AGENTS.md, skills, sub-agents) across Claude Code, Codex, Cursor, and VS Code + GitHub Copilot.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -254,6 +254,7 @@ Before publishing the plan, cross-check the **Touch List**: for every pair of ph
254
254
 
255
255
  - **Trivial overlap** (a shared `__init__.py`, a settings registry, a route table) — fine. Note it under the graph table so the reviewer isn't surprised.
256
256
  - **Real overlap** (the same use case, the same serializer, the same view) — **add the dependency edge** and let one phase build on the other. A serialized pair that merges cleanly beats a parallel pair that needs a human to untangle.
257
+ - **Migrations in one app count as real overlap, even in different files.** Two phases that run in parallel and each add a migration to the same app both start from the same latest migration. Each is green alone; merged, the migration graph has two leaves (Django) or two heads (Alembic), and every gate on the merged tree fails. Their Touch Lists name two different new files, so path overlap never shows it. Prefer the edge — usually by folding both schema changes into the foundation phase — or, when the two must stay parallel, say in the later phase's body that the integration step writes the merge migration. `vinta-ai-maestro validate` warns about such a pair; put the migrations directory in each phase's Touch List so it can.
257
258
 
258
259
  ### Design *for* parallelism when it's cheap
259
260
 
@@ -1071,6 +1072,8 @@ Fix each issue by its `source`:
1071
1072
  - **`workflow`**: the document's shape or graph, such as an unknown node, a cycle, an undeclared pool, a crew member that cannot take its phase, a gate entry with neither `cmd` nor `type`, a phase with no gates, or an id that does not match the filename. Re-derive the field from the plan. A gate `"has no cmd"` is an override that forgot its `"type"`. A phase that `"has no gates"` is a node carrying `"gates": []` — remove the key so it takes `defaults.gates`, name its gates, or, for a plan whose phases genuinely have nothing to run, set `defaults.allow_ungated_phases: true`. If the plan itself is wrong (a cycle in its `**Depends on**:` lines), fix the plan first.
1072
1073
  - **`config`**: `.vinta-ai-workflows.yaml` does not parse. That file is the project's, not the plan's. Do not edit it to make the plan pass. Tell the human what is wrong and where.
1073
1074
 
1075
+ **`warnings` do not change the exit code, and each still gets an answer.** Today the one warning is two phases that run in parallel and both add migrations to the same app (see "Same-wave phases must not fight over the same files"). Add the dependency edge, or keep the pair parallel and say in the later phase's body that the merge migration is written at integration. Either way, name the choice when you hand the plan over. An older maestro prints no `warnings` key.
1076
+
1074
1077
  ## Review the plan with the human
1075
1078
 
1076
1079
  A plan is cheapest to change before anything runs. Once both files are written and the workflow validates, hand the plan over for review. Ask with `AskUserQuestion`: header `Review`, question "The plan and its workflow are written — `<plan path>` and `<workflow path>`. How do you want to review it?"