Antigravity Plan Mode Ingest Gap#
When Antigravity CLI 1.1.22 is invoked with --mode=plan, the agent reads files, runs tests, and writes a plan artifact — then enters agent_state: reviewing while awaiting human approval or rejection. Decant's sidecar-based capture mechanism is gated on the agent returning to idle, so no accounting sidecar is written during the review window and the session is absent from ingest until the review completes.
Two downstream effects follow from this gap:
- Missing session data during review. The in-flight transcript already contains the conversation ID, canonical transcript path, model, and cumulative token totals, but Decant never sees it until idle is reached.
- Title corruption after approval. The synthetic
[Approved] <artifact>user event injected by the CLI can become the session's display title instead of the original/planprompt.
How the Sidecar Gate Works#
Decant ingests Claude-compatible sessions by reading a .meta.json companion file alongside each .jsonl transcript. This sidecar is written by the Antigravity/Claude CLI only when the conversation reaches idle. The reader is readClaudeSidecarMeta() in src/ingest.ts, which looks for <session>.meta.json next to the .jsonl path; if the file is absent, ingest treats the session as incomplete and skips it.
The Claude session parser receives sidecar content via ClaudeParseOptions.sidecarMeta. Operational journal keys that encode runtime agent state — including "mode" — are explicitly discarded in IGNORED_JOURNAL_META. This means even if reviewing appeared in the transcript journal, Decant would not act on it; the gate is at the sidecar-write level, which is external to Decant.
Plan Mode Lifecycle and the Ingest Window#
/plan prompt
│
▼
agent reads files, runs tests, writes plan artifact
│
▼
agent_state: "reviewing" ◄── Decant cannot see session here (no sidecar)
│
├── Approve → implementation begins → eventually idle → sidecar written → ingestible
│
└── Reject → edit discarded → returns to idle → sidecar written → ingestible
The ingest gap spans the entire review window. The payload at this stage already carries everything Decant needs (conversation ID, transcript path, model, cumulative input/output totals), but is unreachable until idle is signalled.
Title Corruption: The [Approved] <artifact> Event#
After the user approves a plan, the Antigravity CLI appends a synthetic user event with the text [Approved] <artifact> to the conversation transcript. Decant's Claude parser derives the session title with a three-tier precedence:
customTitle— fromcustom-titlejournal records when the user renames a session (highest priority)promptTitle— from the first user message with a text block (middle priority)metadataTitle— fromai-titleorsummaryjournal records (lowest priority)
The final title is customTitle ?? promptTitle ?? metadataTitle. If a user has renamed their Claude session (via custom-title records), that name always wins, even if the approval event or AI-generated title exists. When multiple renames occur, the latest custom-title record takes precedence.
When no user-provided custom title exists, the approval event can interfere with title resolution. If the original /plan prompt is part of the same JSONL file, promptTitle will be set correctly from it and the [Approved] event has no effect on the title. However, if the plan run and the approval land in separate transcript segments — or if the parser encounters the synthetic event before the original prompt due to ordering — the [Approved] <artifact> string wins as promptTitle, becoming the display title for the session in Decant's UI and ls output.
The fallback path is metadataTitle, sourced from ai-title or summary journal records . Neither is guaranteed to be present in plan-mode sessions before idle.
Current State and Workarounds#
Decant has no Antigravity-specific parser; plan-mode sessions are processed through the existing Claude session parser (src/sources/claude.ts). As of 2026-09-05, there are no open issues or PRs targeting this behavior — the gap is structural and tied to when the CLI writes its sidecar.
Immediate workarounds:
- Run
decant syncmanually after a plan review completes (approve or reject) to capture the session once the sidecar exists. - If the title is wrong, use
decant show <id>to inspect the full transcript and identify the actual originating prompt.
The gap affects cost accounting, full-text search, and session listing for any plan run currently under review. Sessions are not lost — the JSONL transcript is preserved on disk — they are simply not yet visible to Decant until the sidecar materializes at idle.