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
|
@@ -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?"
|