Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ on:
paths:
- 'dist/.claude/skills/**'
- 'dist/.codex/skills/**'
- 'dist/.agent/skills/**'
- 'dist/.qoder/skills/**'
- 'dist/.qwen/skills/**'
- 'cli/src/bin/gen_codex_skills.rs'
- 'cli/src/bin/gen_minimal_skills.rs'
- 'cli/tests/qoder_skills_test.rs'
- 'cli/tests/qwen_skills_test.rs'
- '.github/workflows/ci.yml'
Expand All @@ -16,9 +17,10 @@ on:
paths:
- 'dist/.claude/skills/**'
- 'dist/.codex/skills/**'
- 'dist/.agent/skills/**'
- 'dist/.qoder/skills/**'
- 'dist/.qwen/skills/**'
- 'cli/src/bin/gen_codex_skills.rs'
- 'cli/src/bin/gen_minimal_skills.rs'
- 'cli/tests/qoder_skills_test.rs'
- 'cli/tests/qwen_skills_test.rs'
- '.github/workflows/ci.yml'
Expand All @@ -30,8 +32,8 @@ env:
CARGO_TERM_COLOR: always

jobs:
codex-skills-sync:
name: Codex skills in sync with Claude source
minimal-skills-sync:
name: Codex + Antigravity skills generated from Claude source
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
Expand All @@ -42,13 +44,13 @@ jobs:
- name: Install OpenSSL (Linux)
run: sudo apt-get update && sudo apt-get install -y libssl-dev pkg-config

- name: Verify .codex/skills is regenerated from .claude/skills
- name: Verify .codex/skills and .agent/skills are regenerated from .claude/skills
working-directory: cli
run: |
# Fails if dist/.codex/skills/ drifted from what gen_codex_skills would
# Fails if dist/.codex/skills/ or dist/.agent/skills/ drifted from what gen_minimal_skills would
# produce from dist/.claude/skills/. Fix locally with:
# cd cli && cargo run --bin gen_codex_skills --features dev-tools
cargo run --quiet --bin gen_codex_skills --features dev-tools -- --check
# cd cli && cargo run --bin gen_minimal_skills --features dev-tools
cargo run --quiet --bin gen_minimal_skills --features dev-tools -- --check

skill-mirror-parity:
name: Qoder/Qwen skills mirror the Claude source
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
---
id: AILOG-2026-08-05-004
title: Antigravity CLI replaces Gemini CLI — two dead channels retired, GEMINI.md kept, and a retirement mechanism built to make it land
status: accepted
created: 2026-08-05
agent: claude-opus-5-v1.0
confidence: high
review_required: false
risk_level: medium
eu_ai_act_risk: not_applicable
nist_genai_risks: []
iso_42001_clause: []
lines_changed: 695
files_modified:
- dist/dist-manifest.yml
- dist/.agent/skills/
- dist/dist-templates/directives/GEMINI.md
- dist/.straymark/00-governance/AGENT-RULES.md
- dist/.claude/skills/
- cli/src/manifest.rs
- cli/src/commands/update_framework.rs
- cli/src/commands/repair.rs
- cli/src/commands/install_skills.rs
- cli/src/commands/charter/audit.rs
- cli/src/main.rs
- cli/src/bin/gen_minimal_skills.rs
- cli/tests/retired_paths_test.rs
- cli/tests/architecture_skill_test.rs
- cli/tests/audit_skill_test.rs
- .github/workflows/ci.yml
- README.md
- docs/adopters/
- website/
- CHANGELOG.md
observability_scope: none
tags: [multi-agent, antigravity, gemini-cli, deprecation, update-path, ci, i18n]
related:
- AIDEC-2026-08-05-002
- AILOG-2026-08-05-003
---

# AILOG: Antigravity CLI replaces Gemini CLI

## Summary

Gemini CLI was retired by Google in favour of Antigravity CLI (`agy`). Two of
StrayMark's Gemini-era surfaces turned out to be dead and are retired;
`GEMINI.md` turned out to be alive and is kept, re-framed. Along the way the
framework gained the piece that makes retiring a distributed path possible at
all — without it, "discontinuing" a channel would have meant new installations
stop getting it while every existing one keeps it forever.

## Context

The task looked like a straightforward deprecation. Checking the runtime first
changed the shape of it.

`agy` 1.1.10 is installed on this machine, and Google ships the authoritative
spec of its customization system *inside the binary* as a builtin skill
(`agy-customizations`). Reading it:

- **`GEMINI.md` is a first-class Rules file**, listed alongside `AGENTS.md` and
`.agents/rules/*.md`. `~/.gemini/` is Antigravity's own global config
directory (the binary carries a `resolve_gemini_dir` symbol). The product was
retired; the on-disk contract was kept. **Deleting `GEMINI.md` would have
removed a rules source from the very CLI we were adding support for.**
- **`<project>/.gemini/skills/` is not a discovery location.** Workspace roots
are `.agents/`, `.agent/`, `_agents/`, `_agent/`; the global one is
`~/.gemini/config/`.
- **`<project>/.agent/workflows/` is read by nothing.** The root is valid but
the subdirectory Antigravity looks for is `skills/<name>/SKILL.md`; the binary
contains no `agent/workflows` string. That channel had been advertised in the
README as the Antigravity surface since before this release.

Which left the retirement problem: `update_files` only copies. See §Changes.

## Changes

**Framework**

- `dist/.agent/skills/` — 15 skills, `skills/<name>/SKILL.md`, minimal
frontmatter. Discovered from the project tree; no install step.
- `dist/.gemini/skills/` and `dist/.agent/workflows/` removed from `files:` and
declared under the new `retired:` key.
- `GEMINI.md` directive retitled to the Antigravity lineage, identity
`antigravity-v{version}`, plus a note explaining why the filename stays —
without it the next reader deletes the file as a leftover.
- Auditor-CLI prose moved to `agy` across the skills, governance docs and
templates. **Gemini model ids were deliberately left alone** (see §Decisions).

**CLI**

- `manifest.rs`: `retired: Vec<String>` with `#[serde(default)]` — load-bearing,
since every pre-4.42.0 `.straymark/dist-manifest.yml` lacks the key and
`repair`/`remove` re-read those copies.
- `update_framework.rs`: `prune_retired()`, provenance-gated. A file is deleted
only when its hash still matches `.checksums.json`. Operator-edited files and
files StrayMark never installed are kept and reported.
- `repair.rs`: same sweep, plus retired leftovers now count toward
`total_issues` — otherwise the early return on a healthy installation would
have skipped the sweep exactly where it was needed.
- `install-skills --agent gemini` → `--agent agy`.
- `gen_codex_skills` → `gen_minimal_skills`, emitting `.codex/skills/` **and**
`.agent/skills/` under the existing CI gate.

**Docs/website** — README, CLI-REFERENCE, ADOPTION-GUIDE, WORKFLOWS,
TRANSLATION-GUIDE, React components, features and `code.json` (EN/es/zh-CN).
"6 parallel forms" → 5. The zh-CN CLI-REFERENCE, two releases behind, resynced.

## Decisions

Recorded in full in [AIDEC-2026-08-05-002]. Two worth restating here because
they are the ones a reader will second-guess:

**Why `GEMINI.md` survives a "discontinue Gemini CLI" task.** Because the
runtime reads it. The name is stale; the file is not.

**Why Gemini *model* ids were not renamed.** The CLI product was retired; the
models were not, and `agy` serves them. The audit skills already state that
`auditor:` must name the backend model rather than the CLI, so `gemini-3-pro`
stays valid while `gemini-cli` as "a CLI to open" does not. Historical records —
Sentinel telemetry, the Charter-template rule justified by an observed
Gemini-auditor behavior across 2 cycles — were left exactly as written.
Rewriting the actor in a piece of evidence would falsify the evidence.

## Verification

- `cargo test`: **953 passed, 0 failed**.
- New: `retired_paths_test.rs` (the shipped manifest actually retires the dead
channels and does not distribute them simultaneously) plus four unit tests in
`update_framework::tests` covering the three provenance outcomes, full-subtree
cleanup, the no-op case, and the pre-4.42.0 manifest parse.
- Manual e2e on a simulated fw-4.41.0 installation: two pristine files pruned,
one operator-edited file kept and flagged as modified, one operator-authored
file kept and flagged as *not installed by StrayMark*, parent directories
cleaned only when empty.

The e2e caught two real defects before they shipped: `repair`'s early return
skipped the sweep on a healthy installation, and the first version of the report
told the operator they had "modified" files they had authored themselves. A unit
test also caught that only the retired root was being cleaned, leaving emptied
skill subdirectories behind.

## Risk

| Id | Risk | Handling |
|----|------|----------|
| R1 | ~~The `.agent/` vs `.agents/` root is not empirically confirmed.~~ **Closed 2026-08-06.** | Three headless `agy -p` probes could not settle it — workspace customizations did not surface in print mode at all, even in a trusted directory with a git root, so the probe could not distinguish the roots rather than showing one failing. The operator ran an interactive `agy` session against a probe project carrying one skill under each root: it listed **both** `straymark-probe-alias` and `straymark-probe-canonical`. `.agent/` is a real alias; the shipped channel needs no change. Durable lesson: `agy -p` does not exercise workspace customization discovery — use an interactive session for that class of question. |
| R2 | `prune_retired` is the first code path that deletes adopter files outside `straymark remove`. | Provenance-gated on the checksum store, conservative by default (when in doubt, keep), and every kept file is named in the report. |
| R3 (new, not in Charter) | `.gemini/skills/` had drifted behind `.claude/skills/` in 7 of 15 skills, undetected, because nothing regenerated or gated it — while the generated `.codex/` channel was byte-perfect. | Fixed by construction: the replacement channel is generated, not hand-mirrored, and CI gates it. The general lesson — a hand-maintained mirror without a gate *will* drift — is why `.qoder/` and `.qwen/` got their own CI job last release. |
| R4 (new, not in Charter) | Attempting the probe required touching `~/.gemini/trustedFolders.json`; the write was blocked and I asked instead of forcing it. | Correct outcome, noted because it will recur: verifying agent-runtime behavior often needs config the agent should not silently grant itself. |

## Follow-ups

- After the tag: verify on a real `straymark update` from fw-4.41.0 that both
retired directories disappear and the summary names anything kept — chained
with the `QWEN.md` init/update verification still pending from
[AILOG-2026-08-05-003].
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
---
id: AIDEC-2026-08-05-002
title: Antigravity CLI succeeds Gemini CLI — retire the channels, keep GEMINI.md, and build a retirement mechanism
status: accepted
created: 2026-08-05
agent: claude-opus-5-v1.0
confidence: high
review_required: false
risk_level: medium
eu_ai_act_risk: not_applicable
nist_genai_risks: []
iso_42001_clause: []
tags: [multi-agent, antigravity, gemini-cli, deprecation, dist-manifest, update-path]
related:
- AILOG-2026-08-05-004
- AIDEC-2026-08-05-001
---

# AIDEC: Antigravity CLI succeeds Gemini CLI

## Context

Google retired Gemini CLI. The operator asked to discontinue StrayMark's support
for it and prepare support for its successor, **Antigravity CLI** (`agy`).

The obvious reading of "discontinue Gemini CLI support" — delete `GEMINI.md`,
delete `.gemini/skills/` — turns out to be half wrong. Verified against `agy`
1.1.10 installed on this machine and against `agy-customizations`, the skill
Google ships *inside the binary* as the authoritative spec of its customization
system:

| Surface | What Antigravity actually does |
|---|---|
| `GEMINI.md` | **Reads it.** Listed as a first-class Rules file alongside `AGENTS.md` and `.agents/rules/*.md`. |
| `~/.gemini/` | **Its own global config directory.** The binary contains a `resolve_gemini_dir` symbol; `~/.gemini/skills/`, `~/.gemini/settings.json` and `~/.gemini/GEMINI.md` are live. |
| `<project>/.gemini/skills/` | **Not a discovery location.** Workspace roots are `.agents/`, `.agent/`, `_agents/`, `_agent/`; the global one is `~/.gemini/config/`. |
| `<project>/.agent/workflows/` | **Not read.** The root is valid, but the subdirectory it looks for is `skills/<name>/SKILL.md`. The binary contains no `agent/workflows` string. |

So the product was retired while the on-disk contract was kept. Two of
StrayMark's four Gemini-era surfaces were dead; one was alive and mis-labeled;
and the fourth — `.agent/workflows/` — had been advertised in the README as the
Antigravity channel while being read by nothing at all.

## Problem

Three decisions, and one of them turns out to gate the others.

1. **`GEMINI.md`**: retire it with the product, or keep it?
2. **The skills channel**: where does the Antigravity-readable channel live, and
what happens to the two dead ones?
3. **How does a retirement reach anyone?** `update_files` only ever copies.
Dropping a directory from `files:` leaves it in every existing installation
until someone runs `straymark remove`. Without solving this, "discontinuing"
a channel means new installations stop getting it while every existing
installation keeps it forever — the worst of both.

## Alternatives Considered

### Alternative 1: Delete `GEMINI.md` along with the product

**Pros**: Consistent with the headline ("discontinue Gemini CLI"); one fewer
file in the adopter's project root.

**Cons**: Directly contradicted by the runtime. Antigravity loads `GEMINI.md`
as Rules; deleting it removes a governance source from the very CLI we are
adding support for. The name is stale, the file is not.

### Alternative 2: Keep `GEMINI.md`, re-framed to the Antigravity lineage

**Pros**: No regression. The template retitles to Antigravity, the identity
becomes `antigravity-v{version}`, and a short note explains *why* the file keeps
the `GEMINI.md` name — which matters, because the next person to read the tree
will otherwise conclude it is a leftover and delete it.

**Cons**: A file named after a retired product persists. Accepted: the filename
is Google's contract, not ours.

### Alternative 3: Add `ANTIGRAVITY.md` next to it

**Cons**: Verified against the binary — no `ANTIGRAVITY.md` or `AGY.md` string
exists. It would be a file nothing reads. Rejected on evidence.

### Alternative 4 (channel): `.agents/skills/` (canonical) vs `.agent/skills/` (alias)

Google's shipped doc names both: *"Path: `.agents/` (or `.agent/`, `_agents/`,
`_agent/`)"*. The binary's error templates hardcode `.agents/` only, which left
open whether the alias was implemented or aspirational.

**Settled empirically (2026-08-06).** A probe project carrying one skill under
each root was opened in an interactive `agy` session: it listed *both*
`straymark-probe-alias` (`.agent/`) and `straymark-probe-canonical` (`.agents/`)
among its available skills. `.agent/` is a real alias, so the channel keeps the
root StrayMark already ships and no migration is needed.

### Alternative 5 (retirement): document `straymark repair` instead of building a mechanism

**Pros**: No new code.

**Cons**: Makes every future retirement depend on adopters reading a release
note and running a second command. The failure is silent — the dead directory
just sits there. And this is the second release in a row where the update path
turned out to be the thing standing between a decision and the adopters
(see [[AIDEC-2026-08-05-001]], where `update-framework` refused to create new
injection targets). Fixing the shape once beats documenting around it twice.

## Decision

**Chosen**: keep `GEMINI.md` re-framed (Alt 2); move the skills channel to
`.agent/skills/` generated from the Claude source; retire `.gemini/skills/` and
`.agent/workflows/` through a new declarative `retired:` mechanism (rejecting
Alt 5).

**Justification**: The runtime evidence settles (1) and (2) with no room for
preference — one surface is alive, two are dead. For (3), the mechanism is
small, declarative, and provenance-gated: a file is deleted only when its hash
still matches what `.checksums.json` recorded, so a retirement notice from
upstream never becomes a licence to delete work the operator did inside the
path. Files the operator edited and files StrayMark never installed are kept
*and reported separately*, because telling someone they "modified" a file they
wrote themselves is wrong in a way that erodes trust in the tool's reports.

A secondary finding pushed the channel from hand-mirrored to generated:
`.gemini/skills/` had **drifted behind `.claude/skills/` in 7 of 15 skills**,
precisely because nothing regenerated or gated it — while `.codex/skills/`,
which is generated and CI-checked, was byte-perfect. So `gen_codex_skills`
became `gen_minimal_skills` and now emits both minimal-frontmatter channels
under the existing CI gate. A `git mv` would have imported the stale files.

## Consequences

### Positive
- Antigravity users get the skills from the project tree with no install step,
plus `GEMINI.md` and `AGENTS.md` as Rules.
- The framework can now retire *any* distributed path and have it actually
disappear from existing installations — reusable, not a one-off.
- One less hand-maintained channel; the new one cannot drift.
- StrayMark stops advertising Antigravity support via a directory Antigravity
does not read.

### Negative
- A file named `GEMINI.md` persists after the product's death, which will look
wrong to every reader until they hit the note explaining it.
- `.agent/` is now described as an Antigravity customization root rather than a
vendor-agnostic standard. That claim was aspirational anyway — the channel it
described was read by nothing — but the README loses a tidy story.

### Risks
- **R1 — RESOLVED (2026-08-06).** The `.agent/` vs `.agents/` root was the one
assumption the code could not settle. Three headless `agy -p` probes failed:
workspace customizations did not surface in print mode at all, even in a
trusted directory with a git root, so the probe could not distinguish the two
roots rather than showing one failing. The operator ran it interactively
instead and `agy` listed **both** probe skills, confirming `.agent/` as a real
alias. No change required. *Durable lesson: `agy -p` is not a substitute for
an interactive session when the question is customization discovery.*
- **R2 — pruning deletes files.** Gated on hash provenance and reported in full,
but it is the first code path in StrayMark that removes adopter files outside
`straymark remove`. The conservative default is deliberate: when in doubt, keep.
- **R3 (new, not in Charter) — `AGENTS.md` remains the fallback for both.**
If Antigravity ever drops `GEMINI.md`, adopters degrade to `AGENTS.md` rather
than to nothing. No action needed; noted so the coupling is visible.
Loading