Skip to content

Release 2.1.16 (2026-06-07)

Bug fixes

  • replace FETCH_HEAD-dependent pull with fetch + ff-merge of remote-tracking ref (#1503) git fetch writes FETCH_HEAD with a non-atomic truncate-then-append, so a 'pull --ff-only' racing a concurrent fetch in the same worktree can see two merge candidates and abort with 'Cannot fast-forward to multiple branches' (exit 128). This killed the back-merge-bump stage of the 2.1.15 release under parallel-agent load.

Replace both FETCH_HEAD-dependent pulls (release bump back-merge sync and finalize-pr cleanup) with an explicit fetch followed by 'merge --ff-only origin/'. The remote-tracking ref is updated atomically via the ref store, making the sync immune to interleaved fetches.

Chores

  • ignore .claude/scheduled_tasks.lock runtime lock (#1504) The Claude Code scheduled-tasks subsystem writes a per-session runtime lock at .claude/scheduled_tasks.lock (session id, pid, process start, acquisition timestamp). It is rewritten every session and was perpetually showing up as an untracked file in git status. Ignore the lock file specifically; .claude/settings.json and .claude/hooks/ remain tracked. Ref #1501

Features

  • add --finalize flag to chain straight into wait-and-merge (#1500) After creating the PR, --finalize hands off to the vrg-finalize-pr wait-and-merge flow from the main worktree root, folding the manual two-command sequence into one step for merge-on-green decisions made at submit time.

The chain runs only after the PR exists, so a submit failure leaves no half-finalized state; a finalize failure reports the created PR and the recovery command. The agent identity gate is unchanged — it runs before either mode. The /vergil:pr-watch handoff line is suppressed under --finalize because the local audit loop is being consciously bypassed.

  • add --all to vrg-vm update for bulk fail-deferred updates (#1502) Add an --all flag to 'vrg-vm update' that updates vergil-tooling in every existing VM owned by a configured identity, instead of a single resolved instance.

Semantics (per issue #1492): - Fail-deferred, never fail-fast: every VM in the list is attempted even after one fails; per-VM outcomes are collected and a summary is printed at the end naming each failed VM and why; any failure yields a non-zero exit code only after all attempts complete. - Non-running VMs are skipped and reported in the summary rather than hard-erroring as the single-instance path does. - Per-VM tag resolution is preserved: each identity resolves its own fallback tag via resolve_vergil_version; an explicit --tag is a temporary override applied to every VM, unpersisted as before. - Enumeration matches base VMs by exact vm_instance and dedicated VMs by the identity tier of the instance name; orphaned dedicated VMs are included, and Lima instances owned by no configured identity are ignored. - --all rejects combination with a workspace argument or --identity.