vinta-ai-workflows 0.7.0-alpha11 → 0.7.0-alpha13
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 +113 -2
- package/package.json +1 -1
- package/schemas/workflow.v1.schema.json +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,8 @@ 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-alpha13 on 2026-09-16 -->
|
|
11
|
+
<!-- pre-release: 0.7.0-alpha12 on 2026-09-15 -->
|
|
10
12
|
<!-- pre-release: 0.7.0-alpha11 on 2026-09-15 -->
|
|
11
13
|
<!-- pre-release: 0.7.0-alpha10 on 2026-09-15 -->
|
|
12
14
|
<!-- pre-release: 0.7.0-alpha9 on 2026-09-14 -->
|
|
@@ -281,6 +283,28 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
281
283
|
**generated** from a zod source rather than hand-written — see
|
|
282
284
|
[`schemas/README.md`](schemas/README.md).
|
|
283
285
|
|
|
286
|
+
- **The monitor keeps thinking when you look away, and thinks out loud.**
|
|
287
|
+
Asking used to be one long HTTP request that produced the whole answer inside
|
|
288
|
+
it, which made the turn's lifetime the browser's connection: switching view,
|
|
289
|
+
reloading or letting a laptop sleep killed the monitor mid-thought and left a
|
|
290
|
+
question with no answer and no record that one had been attempted. The daemon
|
|
291
|
+
owns the turn now — `POST` answers `202`, and the monitor journals each
|
|
292
|
+
thought and each sentence as it produces them, so the conversation is
|
|
293
|
+
readable while it is being written and by any tab that opens it. The panel
|
|
294
|
+
renders through the same rows a phase's transcript uses, which is what the
|
|
295
|
+
API always claimed and the UI never did.
|
|
296
|
+
|
|
297
|
+
- **A phase's transcript says which agent wrote each line, and holds the gates.**
|
|
298
|
+
Every spawn on a node appends to one file whatever its role, so a phase that
|
|
299
|
+
took two fix rounds held five agents' output in one undifferentiated stream —
|
|
300
|
+
the role was in scope at the append and simply not written down. Each line now
|
|
301
|
+
carries the role and the session slot that produced it, the view bands the
|
|
302
|
+
list where one agent stops and the next starts, and gate runs are entries in
|
|
303
|
+
it rather than only in a log beside it. The operator's own steering stays the
|
|
304
|
+
operator's (§7), even though the adapter echoes it back on the agent's event
|
|
305
|
+
stream. Transcripts written before this render exactly as they did, with no
|
|
306
|
+
bands.
|
|
307
|
+
|
|
284
308
|
### Changed
|
|
285
309
|
|
|
286
310
|
- **Phase branches base on their dependencies, not on the previous phase.** A phase
|
|
@@ -319,8 +343,97 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
319
343
|
`plan/{plan-id}/lane-{phase-id}` branches, merged `--no-ff` into the single plan
|
|
320
344
|
branch at each wave boundary, so the unit commits survive.
|
|
321
345
|
|
|
346
|
+
- **`project.prepare_cmd`, for the shared servers a run depends on.** A project
|
|
347
|
+
whose databases are `delivery: external` and whose services point at one Redis
|
|
348
|
+
has no long-lived containers of its own — the shape these fields recommend —
|
|
349
|
+
and that makes some *other* stack a hard dependency of every run. Nothing in
|
|
350
|
+
the package could bring it up. `setup_cmd` looks like the place and is not: it
|
|
351
|
+
runs per lane, long after the template database was created on a server that
|
|
352
|
+
had to be up for `createdb` to work at all.
|
|
353
|
+
|
|
354
|
+
It runs in the repository root **before anything else a run does** — before
|
|
355
|
+
the preflight, before the templates, before the first worktree — and again
|
|
356
|
+
before every lane recycle, so a server that dies mid-run is restored at the
|
|
357
|
+
next hand-off rather than failing every phase after it. Failure aborts with
|
|
358
|
+
the exit code and a bounded stderr tail, and says what the failure means
|
|
359
|
+
rather than only that a command exited. It must be idempotent, and `--wait`
|
|
360
|
+
is only as good as the `healthcheck` a service declares: without one, compose
|
|
361
|
+
returns as soon as the container starts and `createdb` races the server.
|
|
362
|
+
|
|
322
363
|
### Fixed
|
|
323
364
|
|
|
365
|
+
- **The monitor's conversation could never be written on Windows.** It is kept
|
|
366
|
+
under a reserved node id that becomes a directory, and that id was
|
|
367
|
+
`monitor:conversation` — a colon, chosen because no phase id may contain one,
|
|
368
|
+
and the drive separator on Windows. `mkdir` failed with `ENOENT`, so every
|
|
369
|
+
question threw on its first append and the endpoint reported the monitor
|
|
370
|
+
unavailable. A colon is legal in a macOS or Linux filename, which is why no
|
|
371
|
+
machine the feature was built on ever saw it. The id is now
|
|
372
|
+
`_monitor-conversation`: still unrepresentable as a phase id, and legal
|
|
373
|
+
everywhere. Conversations recorded under the old id are not migrated.
|
|
374
|
+
|
|
375
|
+
- **An implementer was told both to commit and never to commit.** The prompt
|
|
376
|
+
carried "never commit while a gate is red" beside "the turn is not complete
|
|
377
|
+
until `git status --porcelain` is empty of your work" — a contradiction
|
|
378
|
+
whenever the gate could not be turned green inside the turn, which is most of
|
|
379
|
+
why fix rounds exist. Agents obeyed the `never`, and the reviewer one node
|
|
380
|
+
later raised the BLOCKER it is told to raise for uncommitted work, spending a
|
|
381
|
+
fix round re-implementing code that was already on disk. A red gate now
|
|
382
|
+
changes the report and never the decision to commit: commit, and report
|
|
383
|
+
FAILURE saying what is still red.
|
|
384
|
+
|
|
385
|
+
The reviewer's side was a false BLOCKER independently of that. Any unclean
|
|
386
|
+
tree was a finding, and a lane's tree is never clean — the pool copies
|
|
387
|
+
configuration in, links dependency trees, and the gates leave build output
|
|
388
|
+
behind, none of which the implementer is allowed to stage. It is scoped to
|
|
389
|
+
the failure it was written for now: work that is in the tree and missing from
|
|
390
|
+
the diff.
|
|
391
|
+
- **A live transcript stops following at entry sixty.** The effect that kept the
|
|
392
|
+
box on the newest row was keyed on how many rows were *shown*, which is
|
|
393
|
+
`min(entries, window)` — so it stopped changing the moment a transcript
|
|
394
|
+
outgrew one window, and the following died silently and permanently, including
|
|
395
|
+
after the operator scrolled back to the bottom to ask for it. Which is roughly
|
|
396
|
+
minute two of any real phase. It follows on the entry count now, growing the
|
|
397
|
+
window keeps the reader on the row they were reading instead of teleporting
|
|
398
|
+
them, and a **Jump to latest** button says so out loud rather than leaving a
|
|
399
|
+
60px band at the bottom of a scroller as the only way back in.
|
|
400
|
+
|
|
401
|
+
- **The transcript spends its space on the noisiest rows.** An agent's answer,
|
|
402
|
+
its private reasoning and four hundred characters of tool-call JSON all
|
|
403
|
+
rendered as the same two lines at the same weight. Thinking is now small and
|
|
404
|
+
quiet, and a streamed thought is one row rather than the dozen events it
|
|
405
|
+
arrived as; tool calls and their results fold to the argument that says what
|
|
406
|
+
they did — a command, a path — and open individually or a whole kind at a time
|
|
407
|
+
from the panel header. Prose is untouched and never folds.
|
|
408
|
+
|
|
409
|
+
- **A panel's expand control did nothing on the node view.** It expanded by
|
|
410
|
+
taking `col-span-full`, which on the run view bought a strip a third wider and
|
|
411
|
+
on the node view matched nothing at all — those panels sit in a flex column,
|
|
412
|
+
not a grid, so the only thing the button changed was the height of the
|
|
413
|
+
scroller inside it. It now opens the panel over the whole page through a
|
|
414
|
+
portal, so no scrolling ancestor can clip it, with Escape to leave and the
|
|
415
|
+
page behind it held still. A transcript that was following stays on its newest
|
|
416
|
+
row across the change.
|
|
417
|
+
|
|
418
|
+
- **`doctor` checks that the shared servers answer.** It verified that binaries
|
|
419
|
+
existed and disk fitted, and never looked at a `server_url` — so a project
|
|
420
|
+
whose Postgres lives in another checkout's compose stack passed the preflight
|
|
421
|
+
with that stack down and died on the first `createdb`, before a worktree
|
|
422
|
+
existed. Each external database's server and each service URL is now probed
|
|
423
|
+
with a TCP connect, and a failure names the address that did not answer. A
|
|
424
|
+
compose-delivered database is deliberately not probed: the lane starts it.
|
|
425
|
+
|
|
426
|
+
The order matters as much as the check. `prepare_cmd` runs *before* the
|
|
427
|
+
preflight, so the check reports the world that hook just made rather than the
|
|
428
|
+
one in front of it.
|
|
429
|
+
|
|
430
|
+
- **A service's `create_cmd` runs with the lane's environment.** `reset_cmd`
|
|
431
|
+
always had it and `create_cmd` did not, so a `create_cmd` that reached for
|
|
432
|
+
`docker compose` ran against the lane's own compose file with no project name
|
|
433
|
+
and no override — booting a stack on the project's fixed host ports, which is
|
|
434
|
+
the collision the override exists to prevent, caused by the step that sets a
|
|
435
|
+
lane up.
|
|
436
|
+
|
|
324
437
|
- **`vinta-ai-maestro with` waits for the lock instead of giving up on it.** Its
|
|
325
438
|
usage said it blocked until the resource was granted, and it did — for about
|
|
326
439
|
five minutes, which is where Node's own `fetch` stops waiting for a response.
|
|
@@ -1141,7 +1254,6 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
1141
1254
|
**Consumers**: re-sync to pick up the opt-in questions. E2E-disabled projects
|
|
1142
1255
|
are unaffected (the e2e regions strip out as before).
|
|
1143
1256
|
|
|
1144
|
-
|
|
1145
1257
|
<!-- pre-release: 0.2.0-alpha6 on 2026-07-13 -->
|
|
1146
1258
|
|
|
1147
1259
|
### Changed
|
|
@@ -1178,7 +1290,6 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
1178
1290
|
|
|
1179
1291
|
### Added
|
|
1180
1292
|
|
|
1181
|
-
|
|
1182
1293
|
- **`handoff` foundation skill — session-continuation handoff docs between
|
|
1183
1294
|
agents.** Write mode captures the current task (goal, verified-vs-unverified
|
|
1184
1295
|
state, decisions + rejected alternatives, landmines, single concrete next
|
package/package.json
CHANGED
|
@@ -331,6 +331,11 @@
|
|
|
331
331
|
"additionalProperties": false,
|
|
332
332
|
"description": "How a lane’s compose stack is isolated past `COMPOSE_PROJECT_NAME`."
|
|
333
333
|
},
|
|
334
|
+
"prepare_cmd": {
|
|
335
|
+
"description": "Run in the repository root **before anything else a run does** — before the preflight, before the template databases, before the first worktree. Its job is to make the shared servers this project’s lanes connect to reachable: `docker compose up -d --wait db redis` for a stack in the root checkout, `brew services start postgresql` for a host install, nothing at all for a project whose lanes boot their own. `setup_cmd` cannot do this — it runs per lane, long after the template database has been created on a server that had to be up already. MUST be idempotent: it runs again before every lane recycle, which is what restores a server that died mid-run. Note that `--wait` only waits for services that declare a `healthcheck`; without one it returns as soon as the container is started, and `createdb` races the server.",
|
|
336
|
+
"type": "string",
|
|
337
|
+
"minLength": 1
|
|
338
|
+
},
|
|
334
339
|
"setup_cmd": {
|
|
335
340
|
"description": "The project’s own lane-setup command, run inside each freshly provisioned lane with that lane’s environment applied. The escape hatch for whatever a project needs that no field here describes. It MUST be idempotent: it runs again every time the lane is recycled for another phase.",
|
|
336
341
|
"type": "string",
|