Skip to content

fix(antigravity): stamp mtime fallback at emission, tighten path classification#612

Open
Battiatus wants to merge 2 commits into
getagentseal:mainfrom
Battiatus:feat/antigravity-ide-timestamps
Open

fix(antigravity): stamp mtime fallback at emission, tighten path classification#612
Battiatus wants to merge 2 commits into
getagentseal:mainfrom
Battiatus:feat/antigravity-ide-timestamps

Conversation

@Battiatus

@Battiatus Battiatus commented Jul 3, 2026

Copy link
Copy Markdown

Summary

  • Adds support for detecting Antigravity IDE usage on Windows from VSCode-style storage
  • Extends provider to scan %APPDATA%\Antigravity IDE\User\globalStorage\state.vscdb
  • Improves path classification to distinguish IDE vs CLI sessions
  • Handles missing per-call timestamps by using file mtime as fallback source

Resolves: CodeBurn reporting zero usage when Antigravity IDE is actively used

Issue id: #411 (comment)

Changes

  • antigravity.ts: Add APPDATA IDE storage root; refine antigravityAppDataDirFromSourcePath() to classify IDE dirs; add stampFallbackTimestamp() helper for missing timestamps across all emission paths; bump CACHE_VERSION to 4
  • session-cache.ts: Update parser fingerprint to worktree-project-grouping-v5
  • main.ts: Clarify CLI install message that IDE sessions are auto-detected
  • docs: Clarify that state.vscdb stores trajectory metadata only
  • tests: Add helper withTempAntigravityHome(); add coverage for IDE path detection and timestamp fallback

Test Plan

  • All 27 antigravity provider tests pass
  • TypeScript compilation clean (tsc)
  • Manual: Run `npx tsx src/cli.ts` today with Antigravity IDE usage and verify sessions are detected without --provider flag
  • Manual: Run `npx tsx src/cli.ts` a second time and verify cache hit (no reparse)

CodeBurn previously only detected Antigravity CLI usage (.pb files under
.gemini/antigravity/). Antigravity IDE on Windows stores session state in
VSCode-style storage at %APPDATA%\Antigravity IDE\User\globalStorage\state.vscdb,
which was not detected.

Add support for reading Antigravity IDE sessions from the VSCode-style storage:
- Extend CONVERSATION_ROOTS to include APPDATA Antigravity IDE path
- Refine path classification to properly identify IDE vs CLI sessions
- Handle missing per-call timestamps by stamping file mtime as fallback
- Bump CACHE_VERSION to 4 for cache invalidation

Fixes: CodeBurn reports zero usage when Antigravity IDE is actively used.
@Battiatus Battiatus marked this pull request as draft July 3, 2026 13:45
@Battiatus Battiatus marked this pull request as ready for review July 3, 2026 13:47

@ozymandiashh ozymandiashh left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this — the underlying problem it targets (SQLite gen_metadata calls with no per-call timestamp being silently dropped by the date-range filters) is real and worth fixing. A few things to resolve before it can merge:

1. Scope/title is stale vs main. Antigravity IDE discovery already landed in #418 (35a8518): ~/.gemini/antigravity-ide/conversations (+ implicit) are in CONVERSATION_ROOTS on main today. This PR does not add a new storage root, so "add support for Antigravity IDE storage" / "previously only detected Antigravity CLI" no longer describe the change. Please retitle to what it actually does (timestamp fallback + path classification).

2. The new APPDATA classifier branch is unreachable. antigravityAppDataDirFromSourcePath's if (lower.includes('/antigravity ide/')) (src/providers/antigravity.ts:471) can't fire in normal operation: discoverAntigravitySessionSources only walks the ~/.gemini/... roots, so no discovered source.path is ever an APPDATA path — and your own doc note says the %APPDATA%\...\state.vscdb DB holds trajectory metadata, "not token usage". As written it is dead code. Either wire APPDATA discovery for real, or drop the branch.

3. If kept, that classifier misroutes a real case. It is a broad substring match checked after the .gemini/antigravity-{ide,cli}/ cases, so a base-app path under a folder literally named "Antigravity IDE" — e.g. C:\Users\Antigravity IDE\.gemini\antigravity\conversations\x.db — classifies as antigravity-ide, and detectServer then targets the wrong server. Guard the base path first: if (lower.includes('/.gemini/antigravity/')) return 'antigravity' before the APPDATA line. No test covers this; the added test only checks the .gemini/antigravity-cli/ precedence case.

4. mtime-as-timestamp misattributes cost across date ranges. stampFallbackTimestamp assigns the same new Date(s.mtimeMs) to every timeless call and persists it into the cache. Consequences: (a) an entire multi-turn session's cost buckets onto the day the .db was last written, so today/week/month views are wrong for older sessions; (b) any later file rewrite shifts all historical calls forward to the new mtime. Antigravity already exposes real per-entry times (RPC chatStartMetadata.createdAt, and the state.vscdb trajectory metadata you documented), so prefer those over a shared file mtime. At minimum, don't persist a synthesized mtime into the cache, so a re-write can't retro-date history.

CI is green and types are clean, so none of this is blocking on CI — but 2-4 are correctness issues. Happy to re-review once addressed.

…sification

- Apply the mtime fallback to a copy at emission instead of mutating and
  persisting it into the cache, so a later file rewrite can't retro-date a
  session's history to the new mtime. SQLite gen_metadata rows have no real
  per-call time; the RPC path still uses chatStartMetadata.createdAt.
- Drop the unreachable APPDATA classifier branch (discovery only walks the
  ~/.gemini roots; APPDATA state.vscdb holds no token usage). This also removes
  the misroute of base-antigravity paths under an "Antigravity IDE" profile dir.
- Bump CACHE_VERSION to invalidate caches that persisted a synthesized mtime.
@Battiatus Battiatus changed the title feat(antigravity): add support for Antigravity IDE storage on Windows fix(antigravity): stamp mtime fallback at emission, tighten path classification Jul 12, 2026
@Battiatus

Copy link
Copy Markdown
Author

Good catches. All three are fixed and pushed.

For 2 and 3 I just deleted the APPDATA branch outright. Discovery never walks anything outside ~/.gemini, so that path couldn't actually reach the classifier, and per the doc note the vscdb has no usage data anyway — not worth wiring up. Dropping it also removes the misrouting case, since there's no longer a broad substring match to trip on. Added a test for the base-antigravity-under-"Antigravity IDE" path.

On 4 — yeah, persisting the mtime was the actual bug. Now the fallback is only applied to a copy right before the call is yielded, and the cached entry keeps its empty timestamp, so a rewrite can't drag old calls forward. I kept the mtime as the fallback itself since the SQLite rows genuinely have no per-call time (the RPC path already uses createdAt where it has one). Bumped the cache version so anything that already stored a synthesized time gets dropped.

I also renamed the PR.

Thanks

@ozymandiashh

Copy link
Copy Markdown
Collaborator

Thanks — points 2 and 3 are fixed, but point 4 is still merge-blocking.

withFallbackTimestamp() avoids mutating the Antigravity-specific cache, but the emitted copy is persisted by the generic session-cache.json path in parser.ts. I reproduced this at head e7f5659: parsing the same SQLite DB with mtime 2026-01-02T03:04:05Z persisted that timestamp; after changing only the DB mtime to 2026-06-07T08:09:10Z, the same historical call with the same deduplication key was emitted and persisted as June 7.

On a source fingerprint change, parser.ts clears and reparses the non-durable source, so every historical row without a timestamp receives the latest file mtime again. The statement that a later file rewrite can no longer drag old calls forward is therefore not true at the system level; the change only prevents persistence in the Antigravity-specific cache.

Please add an integration test through the generic parser/cache covering:

  1. first parse;
  2. cache hit;
  3. DB mtime rewrite;
  4. today / date-range behavior.

Existing deduplication keys must retain a real or stable timestamp across rewrites. Before falling back to mtime, please decode chatModel.#9.#4 (ChatStartMetadata.created_at) when present; for rows without it, use a stable per-session/per-dedup fallback rather than the current file mtime.

The PR description is also still stale: it says this change adds APPDATA / state.vscdb discovery, while the current diff explicitly removes that path. Please update the description as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants