Mechanical rename produced by scripts/msd-rename.cjs: gsd/Gsd/GSD -> msd/Msd/MSD across contents and paths, upstream package/repo coordinates -> @golem15/msd-core and golem15com/msd-core. Deep links into upstream history, sibling upstream packages, the GSD-2 import feature, CHANGELOG.md and .changeset/ are kept as-is. Hand edits on top: MSD block-letter banner and logos, LICENSE copyright line, package/plugin identity, regenerated lockfile, install-tree fixtures, derived registries and benchmark baseline; migration checksum baseline re-locked (MSD keeps its own install state, so no install had applied the old sums); sort-order and regex-escaped expectations in tests adjusted.
36 KiB
The Gemini → Antigravity migration: authoritative picture
Researched against primary sources only (source, capability manifests, ADRs, tests, git
history, CHANGELOG) on branch next at commit c0b2a05d2f. Every claim below is cited
file:line or a commit SHA.
1. Timeline / provenance
- 2026-06-18 — Google sunsets Gemini CLI for free/Pro/Ultra tiers. Cited throughout the
codebase, e.g.
GEMINI.md:1,bin/install.js:1075. - Removal commit:
8f2ebbe9bf—feat(#1928): remove sunset Gemini CLI runtime, redirect to Antigravity (#1996), authored 2026-07-04. Commit message (verbatim): "Remove the gemini runtime from the enum (16->15), aliases, labels, config-home fragment, install path, converters (convertClaudeToGemini{Markdown,Toml,Agent}, convertSlashCommandsToGeminiMentions), capability descriptor, gemini-extension.json, RULESET.GEMINI., and the interactive menu… Antigravity is preserved throughout: its GEMINI.md contextFileName, .gemini/antigravity config home, the shared convertGeminiToolName/claudeToGeminiTools tool vocabulary, and the 'gemini' hookEvents dialect it declares."* This is the single authoritative statement of intent for the whole migration — the taxonomy in §2 is a direct expansion of it.- Deleted in this commit (via
git log --diff-filter=D --name-only):capabilities/gemini/capability.json,gemini-extension.json,tests/gemini-namespacing.test.cjs,tests/issue-775-gemini-extension.test.cjs,tests/bug-2557-gemini-local-hook-paths.test.cjs,tests/bug-3037-gemini-duplicate-commands.test.cjs,tests/enh-776-install-gemini-hook-events.test.cjs,tests/fixtures/golden-install-parity/gemini.json. - Follow-up in the same PR: dropped Gemini CLI from
.github/ISSUE_TEMPLATE/bug_report.ymlandfeature_request.yml(review nit from @davesienkowski). - Changeset:
.changeset/vivid-foxes-click.md→ rendered atCHANGELOG.md:1012/CHANGELOG.md:1281(duplicated, both a "recent" and an older archival copy of the same line): "Removed the sunset Gemini CLI runtime — use Antigravity CLI instead… (#1928) (#1996)". GEMINI.mditself was repointed, not deleted, in the same commit (git log --oneline -- GEMINI.mdshows8f2ebbe9bfas the second-most-recent touch after the originala3aa0ae142"ship a gemini-extension.json extension package" (#775/#818)).
- Deleted in this commit (via
capabilities/gemini/capability.jsonwas re-created later, as a reviewer-lane-only manifest, by the reviewer-lane-declaration work:6a9babda69chore(#2798): declare the eleven reviewer lanes as manifest data (#2837), per ADR-2782 (docs/adr/2782-reviewer-lane-capability-surface.md). Confirmed live today:capabilities/gemini/capability.json:1-6—"role": "reviewer", description "cross-AI/msd-reviewreviewer lane only; not a MSD install target (no runtime body, no artifacts)". This is intentional, not a regression of #1928 — CHANGELOG.md:810 documents the same PR: "Five reviewers MSD never installs into (Gemini, CodeRabbit, Ollama, LM Studio, llama.cpp) become lane-only capabilities with no install surface."- Antigravity's own evolution as a runtime (separate from the Gemini removal, but
entangled with it because it shares the
.geminidialect):fbd62cd84ffeat(#1035): phase 5a — author 16 role:runtime capability descriptors (registry-only) (#1039)— Antigravity first declared as a capability descriptor.5695522d5ffeat(#2096): migrate Antigravity onto EoS declarative adapter + permission-writer + MCP companion (ADR-1239)— CHANGELOG.md:973 / :1240.3738/4274(per CHANGELOG.md:224/343) — Antigravity's global skills/agents home corrected from~/.gemini/antigravityto~/.gemini/config(the diragyactually scans), captured today asruntime.artifactLayout.global[].home=.gemini/configincapabilities/antigravity/capability.json:31,40; the retirement of the old spot is migrationsrc/installer-migrations/010-antigravity-retire-confighome-artifacts.cts, changeset text atdocs/installer-migrations.md:583.
- No ADR is dedicated solely to "retire Gemini runtime" — the decision is recorded as a
changeset + PR (#1928/#1996), not an ADR. The relevant ADRs (
docs/adr/1244-capability-ecosystem.md,docs/adr/2782-reviewer-lane-capability-surface.md,docs/adr/3660-runtime-artifact-layout-module.md,docs/adr/894-capability-declaration-format.md) describe the general capability/reviewer-lane machinery that both Gemini's reviewer lane and Antigravity's runtime lane now ride on, not the migration event itself. UNDETERMINED whether an ADR was ever intended for the removal decision specifically — none exists underdocs/adr/.
2. Taxonomy of gemini senses
(a) Gemini runtime / install target — RETIRED. Proven by:
bin/install.js:1073-1087—if (args.includes('--gemini'))prints the sunset notice and exits 1; no install path remains.bin/install.js:1075:'Gemini CLI was sunset by Google on 2026-06-18 and is no longer served for free/Pro/Ultra tiers.'- Guard test
tests/gemini-runtime-removed.test.cjs:1-19(docblock) states the contract explicitly: "Coverage: A. CLI redirect contract… B. Thegeminiruntime is gone from every runtime-name-policy surface. C. Antigravity is PRESERVED everywhere it shared surface with gemini (GEMINI.md instruction file + the shared convertGeminiToolName tool vocabulary)." Test body (:60-93) asserts--geminiexits 1, cites the sunset date, redirects to--antigravity, and creates no.geminidir. capabilities/antigravity/capability.json:1-6no longer has ageminisibling runtime descriptor;capabilities/gemini/capability.json:1-4explicitly has noruntimebody at all — onlyreviewer.
(b) Gemini CLI reviewer lane (capabilities/gemini/) — LIVE and INTENTIONAL.
capabilities/gemini/capability.json:1-40—role: "reviewer",reviewer.slug: "gemini", flags--gemini, spawn transportgemini -p - -m <model>. Still wired into the registry:msd-core/bin/lib/capability-registry.cjs:1793-1817(reviewer body),:4945-4947(config-key ownership),:8148("gemini": []— no requires).- Documented as a live reviewer flag in
docs/COMMANDS.md:269,757,1038,1810,1826,1834,1847-1851anddocs/CONFIGURATION.md:297,329,340,384,394,401,1464,1474,1476,1492, and indocs/reference/capability-matrix.md:125—| gemini | reviewer | full | >=1.8.0 | — | — | first-party |. - CHANGELOG.md:89 shows the lane still receiving fixes as recently as #3996/#4184. This is a maintained, first-party lane — not an oversight.
(c) Google Gemini directories/dialect that Antigravity legitimately reuses — MUST NOT be renamed. Confirmed exactly as the CRITICAL CONTEXT states, all still present and load-bearing:
capabilities/antigravity/capability.json:11-15—configHome.kind: "dot-home-nested",parent: ".gemini", nested under~/.gemini/antigravity.capabilities/antigravity/capability.json:31,40—artifactLayout.global[].home: ".gemini/config"(the diragyscans for machine-local discovery, per #3738).capabilities/antigravity/capability.json:56—hookEvents: "gemini"(hook-event dialect).capabilities/antigravity/capability.json:78—hostBehaviors.projectInstructionFile: "GEMINI.md".- Confirmed as deliberate, not incidental, in
src/runtime-name-policy.cts:105,117,127(doc comments: "antigravity: GEMINI.md is Antigravity CLI's contextFileName (the Gemini…)") and indocs/reference/host-integration-capability-matrix.md:342(EoS migration note:hostBehaviors.projectInstructionFilereads"GEMINI.md" — Antigravity CLI's contextFileName, successor to the sunset Gemini CLI per #1928). - Shared tool-name vocabulary:
bin/install.js:1628-1720—claudeToGeminiTools,convertGeminiToolName— still present and used by Antigravity's agent converter (convertClaudeAgentToAntigravityAgent, imported bytests/gemini-runtime-removed.test.cjs:53specifically to assert this survives). CHANGELOG.md:1455 confirms the shared vocabulary: "excluded from the Gemini and Gemini-backed Antigravity agenttools:frontmatter." docs/reference/host-integration-capability-matrix.md:315,317,322,330cite Google's own migration blog (developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli) as the evidentiary source for Antigravity inheriting the Gemini backend.
(d) Gemini models in the model catalog — legitimate product names.
msd-core/bin/shared/model-catalog.jsoncontainsgemini-*model IDs (not read directly here per the guard, but referenced in CHANGELOG.md:1561: "the gemini opus defaultgemini-3-pro→gemini-3.1-pro-preview").- Config docs:
docs/CONFIGURATION.md:297,1492("gemini": "gemini-2.5-pro"),docs/CLI-TOOLS.md:1426(review.models.gemini "gemini-2.5-pro"). All legitimate — naming the provider's model, not the retired runtime.
(e) Historical/archival references — immutable, must not be rewritten.
CHANGELOG.md(dozens of lines, e.g. :1012, :1281, :1455, :1456, :1557) — release history, must stay as-is per repo convention (CHANGELOG.md is Locked— CLAUDE.md §"CHANGESETS & RELEASE NOTES")..changeset/archived/fix-3344-gemini-agent-tool.md,.changeset/archived/fix-3362-windows-powershell-gemini.md,.changeset/archived/gemini-skip-local-when-global.md,.changeset/archived/213-antigravity-2-runtime-dirs.md,.changeset/archived/3608-antigravity-update-runtime.md,.changeset/archived/503-antigravity-agent-local-detection.md— archived fragments, immutable release-note history.docs/RELEASE-NOTES-LEGACY.md,docs/whats-new-1.7.0.md,.pr-body-3514.md,.pr-body-3515.md— point-in-time snapshots; PRESERVE.VERSIONING.md:133—`gemini-extension.json` — Gemini CLI extension manifest (issue #775)— this line documents a file that no longer exists (gemini-extension.jsonwas deleted in8f2ebbe9bf, confirmed viafind . -iname 'gemini-extension.json'returning nothing). This is borderline (e) vs. (f): it reads as changelog-style provenance for a retired artifact, but VERSIONING.md is not an archival/frozen document the way CHANGELOG.md is — it is an active reference doc (file inventory / what ships in which package). Verdict: MIGRATE or annotate — see §4.
(f) STALE references — treat Gemini as a live runtime/install target.
See the full inventory in §4. Headline finding: the four README translations and most of the
docs/{ja-JP,ko-KR,pt-BR,zh-CN}/ doc mirrors still describe "Gemini CLI" as a currently
supported, installable runtime alongside Claude Code/OpenCode/Kilo/Codex/Copilot/Antigravity —
while the English originals were scrubbed clean in 8f2ebbe9bf and have zero such language.
3. The GEMINI.md file at repo root
- What it is now: Antigravity's
contextFileName(inherited from the shared Gemini 3 backend) — the file Antigravity auto-reads for project context, analogous toCLAUDE.mdfor Claude Code orAGENTS.mdfor Codex/OpenCode. Confirmed by its own banner:GEMINI.md:1-6— "# MSD Core — Antigravity CLI context… this file is the context Antigravity reads automatically (itscontextFileNameisGEMINI.md, inherited from the shared Gemini 3 backend)." - Provenance: originally shipped as part of a Gemini CLI extension package
(
a3aa0ae142feat(#775): ship a gemini-extension.json extension package (#818)), then repointed to Antigravity in the removal commit8f2ebbe9bf(same commit that deleted the Gemini runtime). It is correctly an Antigravity artifact today, not a Gemini-runtime leftover — PRESERVE. - Who generates/consumes it for user projects (distinct from this repo's own root
GEMINI.md, which is MSD's self-description for AI agents working on MSD itself):getProjectInstructionFile(runtime)insrc/runtime-name-policy.cts:105-127mapsantigravity → GEMINI.md(alsogemini → GEMINI.mdper CHANGELOG.md:1488, though thegeminiruntime key itself no longer resolves to an installable runtime — the mapping table entry is vestigial/defensive, not reachable through--gemini). Compiled counterpart:msd-core/bin/lib/runtime-name-policy.cjs:118,130,140. Consumed by the new-project workflow andgenerate-claude-mdpath per CHANGELOG.md:1488: "A sharedgetProjectInstructionFile(runtime)policy… is now the single source of truth consumed by both the new-project workflow and the generate-claude-md path, with a parity test guarding drift." - Guard:
tests/project-instruction-file-parity.test.cjsexists (per the file inventory) and is the parity test CHANGELOG.md:1488 refers to.tests/product-name-purity.test.cjs:23-41(PRODUCTS,README_FILES,findProductParentheticals) is a different, narrower guard — it checks that product names aren't parenthetically mis-glossed in READMEs, not that Gemini-as-runtime language is absent. Neither test inspects the translated docs (§5). - Verdict: PRESERVE. The root
GEMINI.mdis correct and current.
4. Inventory of stale references (representative — not all ~400 hits)
grep -rliE gemini across the tree (excluding node_modules, .git, .changeset) returns
~280 files referencing gemini; the overwhelming majority are legitimate senses (b)–(e) —
reviewer-lane docs, model-catalog entries, ADR/CHANGELOG history, and the Antigravity dialect
notes in CONTEXT.md, docs/reference/host-integration-capability-matrix.md, and
docs/installer-migrations.md:446,583. The generated files (docs/FEATURES.md,
msd-core/bin/lib/capability-registry.cjs, msd-core/bin/lib/capability-validator.cjs) are
not hand-edited — docs/FEATURES.md is emitted by scripts/gen-features.cjs (registered
in scripts/docs-guard-registry.cjs), and the .cjs registry files under msd-core/bin/lib/
are the build output of the .cts sources under src/ (per CONTEXT.md:248, "NOT generated
from src/*.cts" applies only to bin/install.js itself — the msd-core/bin/lib/* modules
ARE generated). Do not hand-edit generated files; any fix belongs in the .cts source or the
capability .json and must be regenerated.
| File | Line | Current text (paraphrased) | Sense | Verdict | Why |
|---|---|---|---|---|---|
README.ja-JP.md |
9, 24, 46 | Lists "Gemini CLI" as a supported runtime alongside Claude Code/OpenCode/Kilo/Codex/Copilot/Cursor/Windsurf | (f) | MIGRATE | English README.md has zero gemini mentions (verified via grep); translation was never updated after 8f2ebbe9bf |
README.ko-KR.md |
9, 24, 46 | Same as above (Korean) | (f) | MIGRATE | Same |
README.zh-CN.md |
9, 24, 46 | Same as above (Chinese) | (f) | MIGRATE | Same |
README.pt-BR.md |
9, 24, 46 | Same as above (Portuguese) | (f) | MIGRATE | Same |
docs/ja-JP/ARCHITECTURE.md |
24, 115, 449, 561, 637 | Describes Gemini CLI as a live runtime with install paths (~/.gemini/), colon-form commands, and a runtime table row |
(f) | MIGRATE | docs/ARCHITECTURE.md (EN) has no such runtime-table row for gemini; only legitimate Antigravity .gemini/* path mentions (:708,995) |
docs/ko-KR/ARCHITECTURE.md |
24, 118, 487, 615 | Same (Korean) | (f) | MIGRATE | Same |
docs/ja-JP/COMMANDS.md |
10, 1241 | "Gemini CLI: /msd:command-name" colon-namespace install instructions; --gemini reviewer row mixed with stale namespace claim |
(f) partial | MIGRATE (namespace claim only) | EN docs/COMMANDS.md documents --gemini only as a reviewer flag (sense b, legitimate); the colon-namespace-install prose is runtime-install language that no longer applies |
docs/ko-KR/COMMANDS.md |
10, 1247 | Same | (f) partial | MIGRATE | Same |
docs/ja-JP/USER-GUIDE.md |
39, 674, 751 | "Gemini CLI-only" colon-form install flag, ~/.gemini config dir table row, non-Claude runtime list including Gemini CLI |
(f) | MIGRATE | EN docs/USER-GUIDE.md has zero gemini mentions |
docs/ko-KR/USER-GUIDE.md, docs/pt-BR/USER-GUIDE.md, docs/zh-CN/USER-GUIDE.md |
(equivalent) | Same pattern | (f) | MIGRATE | Same |
docs/ja-JP/FEATURES.md |
1016 | "REQ-RUNTIME-01: system must support Claude Code, OpenCode, Gemini CLI, Kilo, Codex, Copilot, Antigravity" | (f) | MIGRATE (or regenerate — see note) | EN docs/FEATURES.md is generated and does not list Gemini as a supported runtime requirement; translations of a generated doc need their own regeneration/translation pipeline, not hand-edits |
docs/ko-KR/FEATURES.md, docs/zh-CN/FEATURES.md |
(equivalent) | Same | (f) | MIGRATE | Same |
docs/ja-JP/how-to/set-up-cross-ai-review.md |
11, 18, 144 | Lists Gemini CLI as one of the review-lane CLIs (legitimate, sense b) but frames install/auth instructions in runtime-like terms | (b), mostly legitimate | VERIFY, likely PRESERVE | Reviewer-lane language is legitimate; flagged only because it needs a human check that no install-target framing leaked in — lower priority than the ARCHITECTURE/USER-GUIDE/README hits |
docs/ja-JP/how-to/install-on-your-runtime.md |
49, 55 | "### Gemini CLI" section header with its own install instructions (skills path ~/.gemini/, restart Gemini CLI) |
(f) | MIGRATE/DELETE | EN docs/how-to/install-on-your-runtime.md has no Gemini CLI section — only Antigravity's .gemini/antigravity* dialect notes (:443,448). The whole translated section describes a runtime that no longer installs |
docs/ko-KR/how-to/install-on-your-runtime.md, docs/pt-BR/..., docs/zh-CN/... |
(equivalent) | Same | (f) | MIGRATE/DELETE | Same |
docs/ja-JP/context-monitor.md, docs/ko-KR/context-monitor.md, docs/pt-BR/context-monitor.md, docs/zh-CN/context-monitor.md |
3, 65 | "Gemini CLI's hook is AfterTool" |
(c)-adjacent | VERIFY | This is describing the hook-event dialect (legitimate, sense c, since Antigravity inherits it) but phrased as "for Gemini CLI" rather than "for the Gemini-family hookEvents dialect (used by Antigravity)" — a wording/attribution nit, not a functional error; low priority |
VERSIONING.md |
133 | `gemini-extension.json` — Gemini CLI extension manifest (issue #775) |
(e)/(f) boundary | MIGRATE (annotate as removed) | The file was deleted in 8f2ebbe9bf; VERSIONING.md is an active reference doc (not a frozen changelog), so this line should either be removed or annotated "(removed #1928)" |
bin/install.js |
1628-1720 | claudeToGeminiTools / convertGeminiToolName |
(c) | PRESERVE — trap | Actively used by Antigravity's agent converter; explicitly guarded by tests/gemini-runtime-removed.test.cjs:53 Coverage C |
capabilities/gemini/capability.json |
whole file | Reviewer-lane-only manifest | (b) | PRESERVE — trap | Deliberately re-created post-removal; see §1, §2(b) |
capabilities/antigravity/capability.json |
11-15, 31, 40, 56, 78 | .gemini configHome/artifactLayout/hookEvents/GEMINI.md |
(c) | PRESERVE — trap | Antigravity's real on-disk contract; renaming breaks the actual IDE integration |
GEMINI.md (root) |
whole file | Antigravity context file | (c) | PRESERVE — trap | See §3 |
docs/CONFIGURATION.md, docs/COMMANDS.md, docs/CLI-TOOLS.md, docs/reference/capability-matrix.md (EN) |
many | review.models.gemini, --gemini reviewer flag, model IDs |
(b), (d) | PRESERVE | Reviewer lane + model catalog, both live and correct |
CHANGELOG.md |
many (e.g. 1012, 1281, 1455-1456) | Migration history | (e) | PRESERVE — locked | CHANGELOG.md is Locked per CLAUDE.md; never hand-edit |
.changeset/archived/*gemini*, .changeset/archived/*antigravity* |
whole files | Archived fragments | (e) | PRESERVE | Immutable release history |
Not checked exhaustively (out of budget for this pass, flagged for a follow-up sweep):
docs/pt-BR/COMMANDS.md, docs/pt-BR/CONFIGURATION.md, docs/pt-BR/CLI-TOOLS.md,
docs/zh-CN/COMMANDS.md, docs/zh-CN/CONFIGURATION.md, docs/zh-CN/CLI-TOOLS.md,
docs/{ja-JP,ko-KR,pt-BR,zh-CN}/how-to/{configure-model-profiles,execute-a-phase,set-up-cross-ai-review,spike-and-sketch,verify-and-ship}.md,
docs/{ja-JP,ko-KR,pt-BR,zh-CN}/INVENTORY.md, docs/{ja-JP,ko-KR,pt-BR,zh-CN}/CLI-TOOLS.md. Given
the pattern found in ARCHITECTURE.md/COMMANDS.md/USER-GUIDE.md/FEATURES.md/README across all
four locales, it is highly likely the same "Gemini CLI listed as a live runtime" pattern
recurs in most of these — UNDETERMINED exact count without a full per-file diff against the
EN originals; estimated 60-100 additional stale lines across the untranslated-drift set
(the raw grep -c 'Gemini CLI' across docs/pt-BR/ docs/zh-CN/ + the four translated READMEs
alone already returned 61 matches in this pass).
Estimated total stale (sense-f) reference count: at least 30 confirmed above, likely
100+ once the full ja-JP/ko-KR/pt-BR/zh-CN doc tree is diffed line-by-line against the EN
originals. This is overwhelmingly a translation-parity problem, not a scattered set of
independent bugs — one systemic gap (translations never re-synced after 8f2ebbe9bf)
accounts for nearly all of it.
5. Guards: what catches regressions, and what doesn't
tests/gemini-runtime-removed.test.cjs— scope is explicitly stated in its own docblock (:1-19): (A) the--geminiCLI redirect contract, (B)geminigone fromruntime-name-policysurfaces (canonicalizeRuntimeName,getRuntimeLabel,getGlobalConfigHomeFragment,getRuntimeNewProjectCommand,runtimeFlags,getProjectInstructionFile— all imported at:44-51), (C) Antigravity's shared surface (GEMINI.md,convertGeminiToolName) survives. It never reads any file underdocs/or anyREADME.*translation — it only spawns the installer and inspectsruntime-name-policy.cjs/capability-registry.cjs/install.jsexports. A stale "Gemini CLI is a supported runtime" sentence inREADME.ja-JP.mdcannot fail this test by construction.tests/product-name-purity.test.cjs:23-41— scoped toPRODUCTS/README_FILESandfindProductParentheticals: checks that product names aren't mis-glossed parenthetically (e.g. "Claude (Anthropic's coding agent)" drift), not that a named product is still a live install target. Different axis entirely.tests/project-instruction-file-parity.test.cjs— guards thatgetProjectInstructionFilestays consistent between the new-project workflow and the generate-claude-md path (CHANGELOG.md:1488). Code-level parity, not prose-level.tests/docs-parity-live-registry.test.cjs:43(LOCALESconstant) andtests/docs-state-md-locale-parity.test.cjs:30(LOCALESconstant) — these are the repo's translation-parity guards, but (per their names and thedocs-guard-registry.cjsregistration table) they check structural parity — that a live registry-derived table (reviewer flags, STATE.md field reference) is present and enumerated identically across locales — not that free-form prose describing "which runtimes MSD supports" is factually current. They would catch a missing row, not a stale but present row.- Missing guard: there is no test that asserts "no locale doc claims Gemini CLI is an
installable runtime" the way
tests/gemini-runtime-removed.test.cjsasserts it for the English surfaces and the installer itself. This is the specific gap that let ~30-100+ stale translated-doc references slip through three-plus release cycles since8f2ebbe9bf(2026-07-04) to today (2026-09-13). - Recommended shape for the missing guard (not implemented by this research task, which is
read-only): a locale-parity test that, for each
docs/<locale>/*.mdandREADME.<locale>.mdfile, asserts it contains no "Gemini CLI" occurrence outside a reviewer-lane-flag context (mirroring the EN original's own absence), OR a stronger structural fix — derive the runtime-list prose (docs/ARCHITECTURE.md's "Claude Code / OpenCode / Kilo / Codex / Copilot / Antigravity / Trae / Cline / Augment Code" enumeration) fromruntime-name-policy'sallRuntimesat doc-generation time instead of hand-authoring it in ten languages independently.
6. Ripple / bookkeeping requirements for any fix
Per this repo's own CLAUDE.md (project instructions) and repo conventions, a change that
touches the stale references identified in §4 must carry:
- Changeset required.
CLAUDE.md§"CHANGESETS & RELEASE NOTES": drop a fragment in.changeset/vianpm run changeset -- --type <T> --pr <NNN> --body "...". Type would beFixed(docs-only correction of stale claims) per the six allowed types (Added|Changed|Deprecated|Removed|Fixed|Security) — there is noDocumentationtype; a docs-only fix usesFixed. CHANGELOG.mdstays locked — never hand-edit; the changeset renders it.docs/INVENTORY.md+ manifest regen if any file is added/removed/renamed:node scripts/gen-inventory-manifest.cjs --write(CLAUDE.md "KNOWN DEFECTS" §"Inventory Drift"). A pure text edit inside existing translated.mdfiles likely does not trigger this, but deleting a stale section (e.g. the Gemini CLI subsection indocs/*/how-to/install-on-your-runtime.md) does not remove a file, so INVENTORY.md itself is probably unaffected — UNDETERMINED without running the generator.- Golden install-tree regeneration — not applicable here; these are prose docs, not
installer output fixtures (
tests/fixtures/install-tree/*.json,tests/fixtures/golden-install-parity/*.json). No golden fixture references were found to need regeneration for a docs-only fix. docs/FEATURES.md/ generated capability fragments — per this task's own note, these are generated byscripts/gen-features.cjsand the.cts→.cjsbuild; any fix to their translated counterparts (docs/{ja-JP,ko-KR,zh-CN}/FEATURES.md) needs to go through whatever translation/regeneration pipeline produces them (not located/verified in this pass — UNDETERMINED: nogen-features-<locale>.cjsor translation-sync script was found by name; the translated FEATURES.md files may be manually maintained mirrors, which would make them structurally prone to exactly this kind of drift).- Glossary gate —
CLAUDE.md"Repo conventions" citesmsd-context-md-glossary-is-a-pr-gate(per user memory index);CONTEXT.mditself mentions Gemini/Antigravity only in the legitimate installer/config-dir sense (CONTEXT.md:248) and does not need correction based on this pass. - Translation parity — no dedicated "translation must match EN" gate was found beyond the
narrow structural
LOCALES-based tests in §5; this is the actual missing-guard finding. - ADR requirement — a prose/docs correction of this kind (removing stale claims,
no behavior change) does not meet the bar for "every bug-fix and feature change requires
ADR" in the sense
docs/adr/uses (ADRs there are architectural decisions, not doc corrections); no new ADR is required for fixing the stale references themselves. An ADR would only be warranted if the fix itself introduced a new mechanism (e.g. a runtime-list-derived doc generator).
Scope note
This document is read-only research. No source file other than this one was modified. The
docs/{ja-JP,ko-KR,pt-BR,zh-CN} files listed as MIGRATE in §4 were identified but not
edited — remediation is a separate, subsequent change subject to the ripple requirements in
§6.
7. Addendum — the severest class the §4 sweep missed: live workflow behavior
§4 concluded the residue is "overwhelmingly a translation-parity problem". That is true by
count, but not by severity. Runtime-loaded workflow text under msd-core/workflows/ still
assigns and offers the retired gemini runtime id, and the name policy resolves that id to
Claude Code instead of failing loudly.
7.1 Measured: an unknown runtime id resolves to a safe-looking known
Executed against next@c0b2a05d2f:
canonicalizeRuntimeName('gemini') = null
getProjectInstructionFile('gemini') = "AGENTS.md"
getRuntimeLabel('gemini') = "Claude Code"
getGlobalConfigHomeFragment('gemini') = "'.claude'"
getGlobalConfigDir('gemini') = ~/.claude
getGlobalConfigDir('antigravity') = ~/.gemini/antigravity
gemini is correctly non-canonical, so tests/gemini-runtime-removed.test.cjs Coverage B
passes. But the other accessors do not reject it — they fall through to Claude Code defaults.
A stale RUNTIME="gemini" therefore produces a plausible wrong answer rather than an error:
the Claude config dir, the label "Claude Code", and AGENTS.md as the instruction file.
Note AGENTS.md also contradicts the workflow's own documented claim at
msd-core/workflows/new-project.md:1216 and :1238 ("GEMINI.md for gemini/antigravity").
The prose and the policy disagree about the same retired id.
7.2 The live assignment sites that reach it
| File | Line | Text | Verdict |
|---|---|---|---|
msd-core/workflows/new-project.md |
76 | Path contains `/.gemini/` → `RUNTIME=gemini` |
MIGRATE — ~/.gemini is Antigravity's parent; the only live child is ~/.gemini/antigravity |
msd-core/workflows/new-project.md |
84 | elif [ -n "$GEMINI_CONFIG_DIR" ]; then RUNTIME="gemini" |
MIGRATE — live shell branch minting a non-canonical id that silently resolves to Claude Code (§7.1) |
msd-core/workflows/new-project.md |
576 | "required for non-Claude runtimes: Codex, Gemini CLI, OpenCode…" | MIGRATE — names a sunset product as a supported runtime |
msd-core/workflows/new-project.md |
1216, 1238 | "GEMINI.md for gemini/antigravity" |
MIGRATE — drop gemini/; keep antigravity |
msd-core/workflows/settings-advanced.md |
412 | { label: "gemini", description: "Gemini CLI." } |
MIGRATE — a user-facing AskUserQuestion menu still offers Gemini CLI as a selectable runtime |
msd-core/workflows/settings-advanced.md |
393 | "Common runtimes: claude, codex, gemini, qwen" | MIGRATE |
msd-core/workflows/settings-advanced.md |
360 | model-profile table row keyed gemini (runtime axis) |
MIGRATE — the row key is the retired runtime; the gemini-* model IDs in it are legitimate (sense d) |
msd-core/workflows/settings-advanced.md |
510-512 | config-set runtime gemini, model_profile_overrides.gemini.* |
MIGRATE — documented examples that set a non-canonical runtime |
msd-core/workflows/settings-advanced.md |
673-675 | google provider rows |
PRESERVE — provider axis, not runtime |
msd-core/workflows/reapply-patches.md |
62-63, 91-92, 101 | probes $GEMINI_CONFIG_DIR and ~/.gemini/msd-local-patches; bare .gemini in the dir scan |
MIGRATE — same class as #4347 but hand-written, so npm run sync:launcher does not reach it |
msd-core/workflows/update.md |
77, 135, 276, 277, 315 | bare ~/.gemini/ / ./.gemini/ as a runtime config dir |
MIGRATE — the live dir is ~/.gemini/antigravity |
msd-core/workflows/update.md |
466 | dir scan list including bare .gemini |
MIGRATE |
msd-core/workflows/update.md |
17, 466 | .gemini/antigravity{,-ide,-cli} → antigravity |
PRESERVE |
These are not doc-only paths for gating purposes: pre-pr-gate.sh's DOC_ONLY_RE anchors
its *.md arm at repo root only, so msd-core/workflows/*.md is gated code.
7.3 Second, un-migrated launcher generation
commands/msd/graphify.md:83,100,125,144,164 and skills/msd-graphify/SKILL.md carry an
older launcher form (the long elif [ -f … ] chain) than the compact _msd_at form in
msd-core/workflows/_runtime-launcher.snippet.sh:1. Both generations carry the
${GEMINI_CONFIG_DIR:-$HOME/.gemini} arm. Any fix that only re-runs the launcher sync will
therefore miss the graphify copies — a generative-fix divergence hazard.
7.4 Consequence for the guard design
The missing guard proposed in §5 was scoped to locale prose. It must also cover code and runtime-loaded workflow text, and the cheapest durable form is to make the name policy fail loud on a non-canonical id rather than defaulting to Claude Code — which would have turned every site in §7.2 into a hard error on the day #1928 landed.
8. Addendum — 2026-09-14 (#4727): §2(c) narrowed, deliberately
Everything above §8 is pinned to next at c0b2a05d2f and is left byte-for-byte intact on
purpose: §1 quotes #1928's commit message verbatim and §2(a) quotes a test docblock verbatim, so
rewriting either to match a later tree would falsify a primary source. The delta is recorded here
instead.
This overturns a verdict recorded above. Saying so plainly.
§2(c) is headed "MUST NOT be renamed", and the §6 PRESERVE table files
claudeToGeminiTools / convertGeminiToolName under category (c) with the verdict
"PRESERVE — trap". #4727 renamed them anyway:
| before | after |
|---|---|
claudeToGeminiTools |
claudeToAntigravityTools |
convertGeminiToolName |
convertAntigravityToolName |
That is a narrowing of (c), not compliance with it, and the earlier verdict was too broad
rather than wrong. (c)'s real subject is the part of the Gemini surface that Google owns — the
directories, the hook dialect, GEMINI.md, the model ids, and, for these two symbols
specifically, the mapped values:
read_file write_file replace run_shell_command glob
search_file_content google_web_search web_fetch write_todos
Those are Gemini's built-in tool names, Antigravity genuinely speaks that dialect, and they remain byte-identical — the "trap" the table warned about is real and still stands for them. What (c) had swept in along with them were two MSD-chosen identifiers, which no external contract references. Renaming those breaks nothing and removes a name that had outlived its runtime by more than a year.
Superseded rows, named explicitly so a later reader is not misled: §2(c)'s
"Shared tool-name vocabulary" bullet (:55) and the §6 PRESERVE table row for bin/install.js
(:136) both cite bin/install.js:1628-1720 under the old identifiers. The cited line range is
still correct; only the two names are now the Antigravity-prefixed ones.
One citation above now reproduces superseded wording
§2(a) (~:40) quotes the tests/gemini-runtime-removed.test.cjs docblock verbatim, including the
phrase "the shared convertGeminiToolName tool vocabulary". #4727 reworded that docblock to name
the live symbol, so the quotation no longer matches its source. Disclosed rather than silently
edited, because editing the quote is precisely what this addendum exists to avoid. The docblock had
to move: leaving it would have made the repo's #1928 guard describe a symbol that no longer exists.
What was NOT renamed, and one coverage gap
Untouched: ~/.gemini/antigravity{,-ide,-cli} and ~/.gemini as their parent; ~/.gemini/config
(#3738); GEMINI.md as projectInstructionFile; hookEvents: "gemini"; every gemini-* /
google/gemini-* model id and providerPresets.google; the --gemini installer flag, which
remains #1928's sunset redirect; the GEMINI_CONFIG_DIR launcher arm (epic #4632). bin/install.js
still carries 36 gemini references after the rename, which is the correct number.
The symbol existed twice — the extracted copy in src/runtime-artifact-conversion.cts (and that
module's export = block, added by #1182 as a dependency closure) plus a working inline copy in
bin/install.js. CLAUDE.md labels that file "(generated)", but no package.json script emits it;
build:lib is tsc -p tsconfig.build.json and writes msd-core/bin/lib/** only. Both copies were
renamed, since renaming one would have left two names for one concept.
Known gap: the bin/install.js half is test-unprotected. That file exports none of the four
identifiers, and the export audit asserts installer[name] === undefined for both spellings, so
reverting that half would break no test — its behavior is covered, its naming is not. Closing that
requires the repo-wide drift guard (#4729), which is the last phase of this epic for exactly this
reason.