fix(analytics): address review findings on activation-funnel events
- app_opened now also fires on the consent-grant transition (modal Allow /
Settings toggle), not just cold start with prior consent — the true first
session was emitting nothing and session 2 got mislabeled is_first_open.
trackAppOpened() is guarded once-per-JS-session so revoke->regrant cannot
double-count.
- testConnection() takes a source ('onboarding' | 'edit_test') carried on
connection_attempted/succeeded/failed so the funnel can filter out the
edit screen's repeat-tester noise.
- Aborted runs no longer count: abortedSessions set (in sessions.ts, read by
events.ts which already imports it — no new import cycle), marked after a
successful abort call, cleared on busy, and checked on busy->idle for BOTH
response_received and recordSuccessfulSession().
- Consent revocation now DROPS buffered events instead of flushing them:
PostHog's optOut() only blocks new captures and shutdown() drains the queue
over the network, so ConsentGatedPostHog overrides the public fetch()
transport to answer with a synthetic 200 post-revoke — shutdown clears the
persisted queue and timers with zero bytes leaving the device. Re-grant
calls optIn() to clear the persisted SDK opt-out flag.
- classifyConnectionError extracted to pure analytics-classify.ts with
node --test coverage (same pattern as store-review-policy).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NJKAQ6HAikWGQK7PGZ5Y4E
This commit is contained in:
@@ -23,7 +23,7 @@
|
||||
|
||||
import * as SecureStore from "expo-secure-store"
|
||||
import { disableSentry, initSentry, sentryEnabled } from "./sentry"
|
||||
import { initAnalytics, shutdownAnalytics, analyticsEnabled } from "./analytics"
|
||||
import { initAnalytics, shutdownAnalytics, analyticsEnabled, trackAppOpened } from "./analytics"
|
||||
|
||||
const CONSENT_KEY = "opencode_telemetry_consent"
|
||||
|
||||
@@ -82,6 +82,13 @@ async function applyTelemetryConsent(granted: boolean): Promise<void> {
|
||||
_resolved = true
|
||||
if (!sentryEnabled()) initSentry()
|
||||
if (!analyticsEnabled()) initAnalytics()
|
||||
// First-ever session reaches here via the consent modal's "Allow" (app
|
||||
// start skipped init because consent was still unknown), so app_opened
|
||||
// must also fire on the grant transition — otherwise the true first
|
||||
// session emits nothing and session 2 gets mislabeled is_first_open.
|
||||
// trackAppOpened() is internally once-per-session, so a mid-session
|
||||
// revoke -> re-grant cannot double-count.
|
||||
void trackAppOpened()
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user