Repository navigation
0.7.0
[0.7.0] — 2026-11-03
Added
-
vinta-ai-maestro: aplan-featureplan runs itself, phases in parallel,
with you steering from a terminal or a browser. A new workspace package,
packages/vinta-ai-maestro/, published as its own npm package under the same
version number asvinta-ai-workflowsand run withnpx vinta-ai-maestro
(Node ≥ 22). It is not part of thevinta-ai-workflowstarball: what reaches
the skills package is the generated schemas below and the skill changes that
produce and consume them. SPEC.md is the
authority and the package README is the operator's manual.- A run.
run <workflow.json>starts the plan's.workflow.jsonas a
background job and returns; closing the terminal changes nothing
(--foregroundkeeps it in the process, for CI). The run works on a plan
branch,plan/<workflow-id>/base, cut frombase_branch. Each phase gets a
crew member, a lane — a git worktree with its own copy of the dependency
dirs, forkeddev/testdatabases, an isolated compose project, a
namespace in each shared service, the declaredenv_filesand a
setup_cmd— and thestandard-phasepipeline: implement, gates, review,
polish chores, verify, integrate (merge, gates on the merged tree, push,
PR),after_prchores. A phase with one dependency branches from it, one
with several from aninteg-<id>merge; each wave merges into
plan/<id>/wave-<N>, and the last wave opens the plan PR, the one PR that
lands the plan.run --resume <run-id>picks a paused, interrupted or
failed run back up with the policy it was started with. Policy flags:
--on-failure retry|ask|stop(defaultretry: one cold attempt, then a
question),--retries,--retry-after <15m>(an unanswered failure
question answers itself, backing off when attempts fail fast),
--agent-answer-after(how long an agent's own question waits before the
recommended options are taken),--permission ask|auto|full|judged
(defaultauto),--harness-profile <name>(a named binary and
environment — a second account, say — from
~/.config/vinta-ai-maestro/profiles.yaml),--system-one <config.json>,
--no-coordinatorand--coordinator-authority full. - Harnesses. claude-code, codex (
codex app-server, codex-cli ≥ 0.147.0)
and opencode, behind one adapter contract: spawn, resume, inject a message
into a running turn, wait for background work, compact. A quota, rate-limit
or concurrency refusal parks the harness, not the phase, until the reset
time the vendor stated;defaults.model_fallbacksand
defaults.harness_fallbacksmove the refused spawn to a fallback instead;
a provider outage re-runs the phase when the harness answers, charging
nothing to its attempts; a logged-out CLI asks you to log in. Sessions
start one at a time per harness, and the ceiling a run discovers is kept
for the next one. - The crew. A plan staffs a team, the Crew table
plan-featurewrites:
one member per agent with a tier, a model and a harness, and every phase
assigned to one of them. A member keeps its worktree and its session across
the phases it takes, so what it learned in phase 1 is still there in
phase 4. A busy member is covered by the cheapest qualified free peer or by
a spare in its image (defaults.max_spare_crew, default 2); a phase is
never handed below its tier (defaults.substitution, default
up_one_tier); a phase its review keeps rejecting moves up a tier
(defaults.escalate_after_rejections, default 3); a merge conflict goes to
the most senior member who wrote one of its sides. - Gates. A gate is a shell command, by type (
test,lint,typecheck,
e2e, taking the project'scommands.*) or by a project-wide id
(maestro.gates.<id>), or a judge question put to a System One classifier.
Phase gates run ascoped_cmd({changed_files}/{touches}) until the
review approves;verifythen runs the fullcmdon the phase branch, and
the full suite runs on every merged base and wave (verify_gates,
base_gates,wave_gates, all full by default). Results are cached per
gate, command and tree.fresh_cmdandfresh_whenrun a gate from a
fresh test database when the tree moved under it;cold_cmdand
scope_cachecover a lane with no test cache;timeout_s,
queue_timeout_sandtuning.allowed_flagsbound and retune a gate.
Resource pools (resources,scope: run | host) serialise the heavy ones
across lanes, and across every maestro run on the machine. Agents run a
gate withvinta-ai-maestro gate <id>and take a pool with
vinta-ai-maestro with <resource> -- <cmd>; on claude-code aPreToolUse
gate guard refuses the bare command, and--permission judgedasks a
classifier about each shell call.codegensteps regenerate generated
files rather than merging them,append_onlyfiles merge as a union,
post_mergeruns a formatter over what git merged, andci_onlyrecords
the CI checks deliberately left to CI. - Review and chores. Once a phase's gates are green, the implementer's
own session runs thereviewchore,thermo-nuclear-review-loop: one
reviewer sub-agent, each finding verified and fixed or rejected with
counter-evidence, until the reviewer explicitly approves. A phase's
decisions — answered questions, operator context, rejected findings — are
kept and carried into every later prompt, so nothing is asked twice.
deslopand the project's otherafter_reviewchores run before verify;
after_prchores (a review canvas, say) run once the PR is open. A chore
reportingStatus: FAILUREis recorded as failed.max_fix_roundsis
unset by default, which means no limit; set it to be asked. - Integration. A conflict goes to a conflict fixer in the integration
worktree, with a time limit per round and its resolution gated by the union
of both phases' gates; what a round left is kept under
refs/vinta-ai-maestro/across attempts. A resolution that undoes a
phase's deletion is flagged. A merge git or a hook refuses goes to you.
Every phase and integration PR carries a Landing section pointing at
the plan PR;land <run>says how a finished run lands and closes the PRs
whose work is already in the base;propagate <run> <phase>carries a late
fix into everyinteg-andwave-branch;sync-base <run>brings a moved
base_branchinto a live plan. - Steering.
status,logs [-f],logs --failures <gate-log>,pause,
stop,node context|redirect|pause|resume|abort|retry|fresh|answer,
node interrupt|reassign|step(take a phase over at its step without
failing it),switch-harness,fixer interrupt|reassign,workflow,
amend(a live run takes an edited workflow, rebasing the done phases the
change reaches),exec <run> <lane|integration> -- <cmd>(a command with
the lane's environment, holding the integration worktree while it runs),
gate-cache invalidate,purge [--lanes --branches](never the only copy
of work),doctor(every check a run depends on, from disk and servers to
env files, compose-T, gate scope and the CI jobs no gate covers),
validate,simulateandjudge calibrate. Every acting request takes a
reason, journalled with what it explains. - The run coordinator. One agent per run, woken when a phase fails, an
attempt errors, a phase waits on the integration worktree or a gate crosses
its cost threshold, at most 24 times a run. It reads the journal and the
repository and acts through the same API as you: steer, pause, retry,
answer the questions a timer could answer, amend the live run, run a
command. It may change how the run executes, never what it builds, and
never weakens a check. Everything decided without you — by it or by a
timer — is listed instatus, the run view, the plan PR and the
post-mortem. - The browser UI.
uiserves every run in the project and hosts none,
so closing it interrupts nothing. A run view with the plan graph, the
roster, the integration worktree's record, resource pools, sessions and
cost, what was decided without you, a notifications inbox and the
coordinator as a sidebar; a phase view with the transcript rendered the way
the harnesses render it, the phase's running processes and gates, its
changes as a diff, its integration timeline, its PR, and steering as a chat
input; an analytics page while the run goes and the post-mortem as a report
after; a Logs view over the daemon's own log; a workflow editor that saves
only what you changed; Pause, Stop, Retry and Resume. Every page fits a
phone, in light and dark. - The record. Everything lands under
.vinta-ai-maestro/(gitignored):
the run's journal, each phase's transcript with the role that wrote each
line, gate logs, the daemon's own log (logs/daemon.ndjson, identifiers
only, enforced), and once the run ends a post-mortem (postmortem.v1):
dependencies declared but unused or discovered at gate time, conflicts,
the critical path, idle capacity, gate costs, failure causes, crew
substitutions, failed chores and unattended decisions.plan-featurereads
it before planning the next feature in the same repository. - Security. The daemon binds loopback and every API request carries a
token. Agents hold a token of their own that reaches only their leases,
gates and hooks; the coordinator has one of its own; a run's job keeps its
token in a0600file thatuinever prints. Nothing in the journal or
the log holds repository contents, and every token is redacted from both.
The only API key the package ever uses is the one a--system-one
classifier config names; the harnesses run on your logged-in CLIs. - Platforms. macOS, Linux and Windows, each in CI.
- A run.
-
vinta-design-systemandvinta-dag-editor, two more workspace
packages maestro's UI is built on: oklch tokens in three layers, six
run-status tones (waiting is amber and failure is red, never the same hue),
shadcn/ui components on Tailwind CSS v4 and a light/dark/system theme; and
the framework-agnostic Web Component that draws and edits plan DAGs —
arrowed edges, dependencies drawn by dragging, phase ids on the cards, a
details strip, keyboard zoom, full screen. They publish on their own cadence
as dependencies ofvinta-ai-maestro; nothing in either reaches
npx vinta-ai-workflows install. -
Plan review: a page for a plan before it runs, and a chat with the agent
that wrote it.vinta-ai-maestro review open <workflow.json>serves the
plan's graph with every phase's real prompts, the plan's markdown, a phase ×
gate matrix, the projected schedule and whatvalidatereports. You comment
on the plan, a phase, a prompt or a gate and send the batch; the agent answers
throughreview waitandreview reply, edits the plan, and Approve plan
ends the loop. The review is committed beside the plan as
ai-plans/<id>.review.json(plan-review.v1, see
packages/vinta-ai-maestro/SPEC.md § 19).
When maestro is installed,plan-featurerunsvalidate --jsonon every
workflow it writes and asks whether to review on the page, in chat, or later. -
The browser interview. A decision-heavy interview —
create-spec's
Step 0 first — can run as a full-screen browser form instead of a chat
exchange: one decision per screen with the context the agent already knows,
Markdown, Mermaid or HTML explainers, option cards that state each option's
consequences with the recommended default marked, and a question panel for
asking the agent. Round-based and file-based, so it works the same under
every harness: the agent writes
.vinta-ai-workflows/interviews/<slug>/rounds/round-NN.json
(interview-round.v1), blocks onvinta-ai-maestro interview wait, and
resumes when the page submitsanswers/round-NN.json
(interview-answers.v1). The page is maestro's
(interview start|wait|status|stop --dir <dir>,
SPEC.md § 20), rendered with the design
system; the server binds loopback, carries a token in the printed URL,
serves documents only from the interview'sdocs/and accepts a round's
answers once. Opt in with the newinterview-uifoundation skill (bootstrap
Optional foundation skills question 7,foundation_skills.interview-ui
in the config schema); it shipsSKILL.mdand an example round, and needs
vinta-ai-maestrorunnable from the project (npx --no-install vinta-ai-maestrowhen it is a devDependency,npx vinta-ai-maestro
otherwise).create-specasks once per interview whether to decide in the
browser or in chat; projects without the skill see no change. -
thermo-nuclear-review-loopfoundation skill. A review-and-fix loop
over a change: the agent running it spawns one reviewer sub-agent, checks
each finding against the code, fixes the justified ones and answers the rest,
until the reviewer explicitly approves under a strict code-quality standard.
Questions only a person can settle — unreachable scenarios, requirement
ambiguity, destructive operations — go to them instead of being assumed.
Always shipped (foundation_skills.thermo-nuclear-review-loop), because
review-phaseruns it and every maestro workflow names it in itsreview
chore; also invokable on its own. -
plan-featureemits an executable workflow and staffs a crew.
ai-plans/YYYY-MM-DD-<feature-kebab>.workflow.jsonlands beside every plan,
unconditionally — a project with no orchestrator carries a file nothing
reads, and one that adopts maestro later finds its plans already executable.
It is the same phase graph in the form a run loads: one node per phase,
depends_onfrom each phase's**Depends on**:line, its Touch List, gates,
pools and crew member, validated byworkflow.v1. The plan opens Phased
Rollout with a Crew table and an Execution graph table, and every
phase carries**Assigned to**:and**Depends on**:lines; they replace
**Suggested AI model**:, which old plans may keep. The skill asks what a
phase lane needs its own copy of and writes the workflow'sprojectblock,
emits the codegen steps and append-only files it detects in the project,
writes the crew's model fallbacks, puts a contract test for any interface two
parallel phases share into the foundation phase, and reads the post-mortems
of earlier runs before drawing the next graph. -
implement-planruns independent phases in parallel on the skills path
too, with no maestro. The plan carries a dependency graph and the conductor
schedules against it: a phase starts as soon as every phase it depends on is
green and a worktree lane is free. A chain-shaped plan behaves exactly as
before. Lanes are a pool of worktrees, branches base on their dependencies
(integ-<id>for several,plan/<id>/wave-<N>per wave), tracking is a
directory with one file per phase so wave merges never conflict on it, a
sibling-lane write guard covers the pool, andmodular-commitskeeps its
atomic units on lane branches. Two new config fields:
run_options.implement-plan.parallel_phases(defaulttrue) and
max_parallel_lanes(default3). The skill refuses rather than degrading
when parallel execution is asked for and worktrees are unavailable. -
Provision worktrees with your own script instead of the
prepare-worktree
skill. Setcommands.worktree_prepare(and optionally
commands.worktree_teardown) in.vinta-ai-workflows.yaml;implement-plan
and maestro run that command for every lane and the integration worktree,
withVINTA_WORKTREE_NAME,_PATH,_BRANCH,_BASE_REF,_KIND,
VINTA_MAIN_CHECKOUT,VINTA_PLAN_PATHandVINTA_WORKTREE_SUMMARYset,
and check the result with git rather than trusting the exit code. The
bootstrap offers existing worktree scriptsvinta-analyze-codebasefound,
and can write the scripts for you —prepare.sh,teardown.shandlib.sh
underscripts/worktree/, from templates that carry the contract, dry runs,
rollback, compose isolation and a teardown that refuses a dirty worktree. -
Agents stop for input with clickable questions instead of prose. Every
skill and sub-agent asks through the harness's structured question tool
(Claude Code'sAskUserQuestion, OpenCode'squestion, Codex's
request_user_input, Cursor'sAskQuestion, Copilot'saskQuestions,
Gemini CLI'sask_user): 2–4 options with descriptions, the recommended one
first.AGENTS.mdgains an Asking the human section, copied verbatim
from
vinta-write-agents-md/resources/asking-the-human.md.
Sub-agents, which cannot ask, returnstatus: NEEDS_INPUTwith the question
in the tool's shape, and the newplan-execution/partials/relay-questions.md
turns it into a question, records the answer and continues the same agent.
Every prose stop point across the plan-execution unit, the foundation skills
and the bootstrap skills became such a question.vinta-sync-ai-toolsadds
a one-time migration for existing projects. -
PR Review Canvas integration (
integrations.pr-review-canvas). The
bootstrap offers PR Review Canvas
as its first integration: an external tool that installs its own skill,
nothing of which is bundled here. A new optional top-levelintegrations
object in the config schema records the opt-in (interview group D.2, asked
whencode_hostis GitHub or GitLab andpr_creationisagents-create).
When enabled,vinta-install-ai-tools-setuprunspr-review install-skill
(the CLI is never auto-installed; the install command is printed), the
integrate-phasePR step runs/pr-review-canvas <n>afteropen-pr.sh
publishes, andplan-featureadds anafter_prreview-canvaschore to the
workflow it writes. The analysis, derive and update skills treat an
integration-owned skill as the tool's and never edit it. -
Model fallbacks for models that run out of quota.
ai-models.yaml
entries takefallback:(the shipped table sets
claude-fable-5-1 → claude-opus-5-5andgpt-6-astra → gpt-5.6-sol),
ai-models.v1.schema.jsongains the optional field, the nightly
check-ai-modelsjob checks fallback ids for staleness,plan-feature
writes the map into each workflow'sdefaults.model_fallbacks, and the
plan-execution skills follow the same rule when maestro is not running them. -
Five generated JSON Schemas, and the schemas are checked.
workflow.v1(the executable plan),
postmortem.v1,
plan-review.v1,
interview-round.v1and
interview-answers.v1are
generated from zod sources invinta-ai-maestroand byte-compared in its
tests; seeschemas/README.md.npm run validate-schemas(part ofnpm test) compiles every schema underschemas/
with Ajv in strict Draft 2020-12 mode and checks the fixtures in
tests/schema-fixtures/:valid/must pass,invalid/must fail. -
Config schema (
vinta-ai-workflows-config.v1), all additive. Amaestro
section holding what every plan used to repeat — gates by type and by id,
resources (withscope), chores,defaults(gates, harness, pipeline,
gate_scope,verify_gates,base_gates,wave_gates,
pull_requests: phase | plan,max_spare_crew,substitution,
escalate_after_rejections,model_fallbacks,harness_fallbacks), the
projectblock (databases, services,env_files,setup_cmd,
prepare_cmd,reset_cmd,recycle_keep,hooks,lane_seed),codegen,
append_only,ci_onlyandpost_merge— which maestro layers each plan
over (commands.*, thenmaestro.*, then the plan, then the run's own
amendments). Alsointegrations,foundation_skills.interview-ui,
foundation_skills.thermo-nuclear-review-loop,commands.worktree_prepare
/worktree_teardown,commands.worktree_candidates,commands.lint_scoped
andrun_options.implement-plan.parallel_phases/max_parallel_lanes. The
bootstrap interview asks for each (maestro defaults are group C.11, with
follow-ups onenv_files, the test gate in lanes, a fresh-database form,
when the full suite runs, CI checks with no gate, and test-tool caches
missing from.gitignore), andvinta-sync-ai-toolsoffers them to
existing projects.prs-context-frontmatter.v1gains an optionalkind
(phase | integration | plan).
Changed
-
plan-feature: plans have fewer, longer phases. The phase size ceiling
rises from 1500 to 4000 LoC, tests included, and the sub-phase trigger moves
to that same ceiling; the Step 0 Phase granularity default flips to
bundling closely-related use-cases into one phase, with one use-case per
phase as the opt-in answer. A phase of a few hundred lines has to justify
standing alone. A plan drawn before the change is still valid as written.
The skill also tells the author to read the CI config and give every locally
runnable CI job a gate (and to record the rest underci_only), treats two
parallel phases adding migrations to the same app as file overlap, treats a
rename of a shared symbol as an interface change, names the enum for
same-named choice fields two phases expose, lists the usual append-only
registries, tells authors to declare the gitignored files a lane needs under
project.env_files, and states thatgates: []means none. Its AI model
tiers cite the latest OpenAI, Anthropic and Google releases
(claude-sonnet-5-5,gpt-6.1-sol,gemini-3.1-pro-preview); tier
placement is unchanged. Re-derive the skill to pick these up. -
implement-planand its sub-skills follow what maestro learned from real
runs. Implementers commit when a gate stays red and reportFAILURE
naming the gate; an uncommitted file does not exist as far as the run is
concerned. They run every command in the foreground, never hand-edit a
generated file, and list every gate they ran and its result; the conductor
reviews only aSUCCESSreport whose gates are all green. Every spawn of a
phase carries the decisions already made in it, and a resumed implementer
checks the branch for committed work first. Every merged tree runs the full
gate, whatever thefull_test_suiteanswer is, and the Quick test scope
means scoped tests until the review approves and the full suite once before
integration. The merge fixer keeps what a side deleted, stages by name,
verifies narrowly, and confirms a resolution by scanning the files for
markers, never by asking git; a merge refused by a hook or by git goes to
the human. A member moved to its next phase is told first that its objective
changed; a continuation that fails is retried cold with the full brief; an
outage or an expired login asksWait and retry/Switch model/Stop the runrather than escalating the tier. Lanes are recycled fully between
phases, leftovers saved to arefs/wip/ref first. A dispatched phase agent
does the work itself: every composed implementer prompt and a guard at the
top of each conductor refuse to hand a phase to a sub-agent. The plan PR is
the one PR that lands the plan, and every phase and integration PR says so.
Re-derive the skills to pick this up; plans and tracking directories written
before the change still work. -
review-phaseruns the thermo-nuclear review loop. Each phase is
reviewed bythermo-nuclear-review-loop, hosted by the conductor because a
sub-agent cannot spawn sub-agents of its own: one reviewer one tier above the
phase's implementer (a Tier 4 phase is reviewed at Tier 4), each round of
findings handed to the phase's own implementer, which verifies, fixes or
rejects with counter-evidence and commits the round. A reviewer pass with no
verdict is continued once and never counts as approval; a finding re-raised
without new evidence is rejected on the spot; after 3 rejecting passes a
fresh implementer one tier up takes over; after 20 passes that still return
blockers the conductor asks whether to continue, stop the phase unapproved,
Accept as is (integrated with its open blockers recorded) or amend the
plan. After approval the implementer runsdeslop-commentsover the
comments the phase added. -
amend-plancascades along the dependency graph, and amends a live
maestro run. A rewrite touches the amended phase's dependent closure
instead of "every phase with a higher number", rebases in topological order,
rebuildsinteg-bases first, refuses to run while a phase is in flight, and
gains adependency-changeamendment kind. When a maestro run of the plan is
running, paused, interrupted or failed, the skill asks whether to amend it,
edits the plan and the run's own workflow copy, commits both on the plan
branch and applies them withvinta-ai-maestro amend; it also carries the
operator recipes for a live run (switch-harness,node reassign,node interrupt,--harness-profile,propagate,sync-base). -
prepare-worktree: worktrees get their own copy of the dependency dirs,
never a symlink. A symlinkednode_modules/vendor//venv/sent
writes back into the main checkout and made parallel worktrees race on one
tree. The skill copies every dependency dir with a copy-on-write clone
(cp -acon macOS,cp -a --reflink=autoon Linux) and reinstalls
virtualenvs and yarn PnP;skills.prepare-worktree.deps_strategynow
defaults tocopy. The skill also documents provisioning a pool of lanes for
one plan with areset_cmdper forked database, and its summary's|
alternatives are closed sets read by machine. Consumers: re-sync to pick
up the new body; worktrees that already exist keep their links until they
are re-provisioned. -
create-specoffers a browser surface for its Step 0 interview when
ai-tools/skills/interview-ui/exists (see The browser interview above).
The question bank, clarity loop, read-back and exit conditions are
unchanged. -
write-unit-test: time-independent tests and deterministic generated
output. Rule 8 requires a frozen clock and an explicit timezone on any test
touching dates, and host-independent schema or client generation. The Django
pack and stack notes spell outfreezegun/time-machinewith
override_settings(TIME_ZONE=...)andtzdata-sourced timezone choices. -
Django stack notes cover database reuse and testmon in lanes, keeping
the virtual environment out of a bind-mounted worktree, registries every
phase appends to, drf-spectacularENUM_NAME_OVERRIDESfor new choice
fields, and the CI-mirroring checks a plan's gates should carry
(manage.py check --deploy --fail-level WARNING,makemigrations --check,
a regenerate-and-diff gate for a schema or client). -
The bootstrap and sync skills.
vinta-bootstrap-ai-toolsasks the new
questions listed under Config schema above, no longer offerssymlink
for dependency dirs, and no longer asks for a reviewer tier; the Optional
foundation skills group grows to eight questions (interview-uiis 7,
handoff-to-clientmoves to 8).vinta-analyze-codebaserecords existing
worktree scripts and integration-owned skills.vinta-sync-ai-toolscarries
the asking-the-human migration, offers the PR Review Canvas integration to
existing projects as anopt-in-offer, and re-renders the plan-execution
skills together. Every generated skill now carries
disable-model-invocation: true. -
agent_models.fixernow sets only the merge-conflict fixer's tier. The
phase's own implementer fixes review findings at its own tier, so a project
that setfixercheap to save money is saving it on fewer rounds.
Deprecated
-
agent_models.revieweris ignored. The review runs one tier above the
phase's implementer, so no configured tier is read. The key stays in the v1
config schema so existing configs still validate; drop it at your next edit. -
skills.prepare-worktree.deps_strategy: symlinkstays in the schema
enum so existing configs validate, but is deprecated and read ascopy.
Change it tocopy(orreinstall) in.vinta-ai-workflows.yamlto stop
the interview default from being re-emitted.
Removed
-
The three-layer phase review.
review-phaseno longer runs the
mechanical checks (including the review-time secret scan, dependency-license
check and co-author trailer check), the plan-compliance walkthrough
(including the comment-hygiene check), the crew reviewer, or a separate
fixer per finding; the thermo-nuclear review loop replaces them. The
implementer's own install-time license check and co-author rules are
unchanged. -
Reviewers on the plan.
plan-feature's Crew table has noRolecolumn
and no reviewer rows, and phases have no**Review models**:line.
Migration: plans written with them still run;implement-planignores
them.
Fixed
-
open-pr.shposts inline comments on macOS and reports why a comment
failed. Four bugs in theopen-pr-from-contextscript, all seen while
publishing a stacked plan from a Mac: a GNU-onlysedidiom that BSDsed
rejected, so trailing blank lines were never trimmed; a lowercase
side: rightthat GitHub answered with "422 Validation Failed", now
upper-cased;gh apiandglab apistderr thrown away, so a failed comment
gave no reason; and a multi-lineawk -vthat BSDawkrejected when
adding to a## Publish logsection. Projects that patched their own copy
can re-sync withvinta-sync-ai-tools. -
check-ai-modelsno longer mistakes sibling models for snapshots of a
cited id. The matcher used substrings, soclaude-sonnet-5matched
claude-sonnet-5-5and hid the newer release, andgemini-3-promatched
gemini-3-pro-imageso a retired model still looked available. It accepts
only exact ids, dated or-vNsnapshot suffixes, and provider prefixes. -
implement-plan's final report no longer suggestsdocker compose down -v
to tear down a lane.down -valso deletes the compose volumes a worktree
deliberately shares with the main checkout. The report prints the sequence
prepare-worktreedocuments:docker compose -p <project> down, then
docker volume rmfor each forked volume, then removal of the generated
compose override. -
prepare-worktreeserialisesgit worktree add, not only the database
template. Git rewrites.git/worktrees/metadata on every add, and
concurrent adds against one repository clobber each other's entries.
Worktrees are added one at a time; the per-lane work around them still
overlaps.