Say the same thing everywhere, and stop pointing at a CLI that died. Two halves. The fleet had
been quietly planning work around Gemini CLI since Google closed it to individual accounts on
2026-06-18 — the probe failed, the fallback swallowed it, and nothing ever looked broken; it now
runs on Antigravity (#615). And the four-block closing summary that v0.35.0 shipped as a renderer
nobody consumed is now attached to all seven typed commands, generated from that renderer so the
two cannot drift, with the docs-freshness gate finally checking more than the README (#493).
Fixed
-
The fleet was routing work to a Gemini CLI that can no longer authenticate (#615). Google
shut the "Sign in with Google" path for individual accounts on 2026-06-18:gemini -pnow
answersIneligibleTierError: UNSUPPORTED_CLIENTand points at Antigravity.Get-CliProbeStatus
read that asauthandResolve-LaunchClidegraded the issue to claude, so nothing crashed —
which is exactly why it went unnoticed. MeanwhileFleet-Plan.ps1advertisedgeminias the
FIRST choice for Docs and the second for Chore / size S–XS work: the two most common buckets on
the board were being planned around a CLI that could never run.The
geminiadapter is replaced by anantigravityone (agy), Google's official successor,
which authenticates with the same personal account — no API key, no billing. Its probe was
measured at ~7s, well inside the 30sInvoke-CliProbetimeout. Unlike the other adapters it is
pointed at the briefing file instead of receiving its content as an argument, because
PowerShell drops embedded quotes when passing an argument to a native.exeand a briefing is
full of backticks and quotes;--dangerously-skip-permissionsis mandatory, since without it
agysoft-denies its own file read in headless mode and the session would start blind.Two things the rename alone would have missed.
Find-FleetOrphansqueriedpwsh.exeand
node.exeonly — true while every CLI ran under node, butagy.exeis a Go binary, so an
escaped Antigravity session would have been invisible to the sweep and reported clean while it
kept running; the filter now includes it (no false-positive risk: the pure core only ever
considers a process whose command line names a fleet issue artifact). Andagydrops an
.antigravitycli/working directory into whatever repo it runs in, including a fleet worktree,
so that path is now gitignored.Each new test was verified by reintroducing the defect and watching it go red: dropping
agy.exefrom the filter, dropping the headless flag, and puttinggeminiback in the routing
table each fail their assertion. -
The docs-freshness CI gate only ever looked at the README (#493). It regenerated the derived
regions in place and then rangit diff --exit-code -- README.md. Scoped to that one file, the
step rewrote a driftedcommands/*.mdand then never compared it — so command-file drift passed
green. It now runsUpdate-Docs.ps1 -Check, which writes nothing and names whichever region
moved. Measured on a one-word drift in a command file: the new step exits 1, the old one exited 0.Found while reviewing this PR, against a changelog line of its own claiming the gate already
covered it. It did not.
Added
-
Every typed command now carries the four-block closing summary (#493). v0.35.0 shipped the
renderer (#492) and nothing consumed it: not one command file or script referenced it, so in
practice each flow still ended however its author felt like ending it. The contract is now
attached to all seven command surfaces (/board,/docs,/expert,/knowledge,/scan,
/skills,/tools) as a generated region, and the generator reads the four headings — and each
block's when-empty sentence — from the renderer itself, so the text an agent is told to write and
the text a script prints cannot drift apart.Hand-copying the same paragraph into seven prompts would have re-created the drift #200/#202
already fixed for the README, so this reuses that machinery instead:Update-Docs.ps1owns a
third derived region,<!-- BEGIN:closing-summary -->, and the docs-freshness CI gate now fails
when a command file drifts from the renderer (see Fixed below — it did not, until this PR). A
command file missing the region is a failure rather than a skip, and one whose region is
malformed says so specifically instead of reporting an absent marker — otherwise a newly added
command would ship with no closing contract and nothing would notice.Asserted rather than eyeballed, per the epic's Definition of Done:
CommandSurface.Tests.ps1
checks every command file for the region, all four headings and all four when-empty sentences,
reading the expected values from the renderer so the test can never become a stale second copy,
andGet-CommandRegionPlanunit-tests the generator's own decision (missing, malformed, stale,
idempotent, per-file newline). Verified by breaking it three ways — deleting one file's region
fails 3 tests and the gate; renaming one label in the renderer fails 7 tests and marks all seven
files stale; dropping the missing-file bookkeeping lets a region-less command pass silently and
turns 3 tests red.