What is collected
Every run of the action, every CLI command (validate, migrate, check-commit, dry-run, plan settings and sync) and every MCP tool call is one invocation, and each is recorded from start to finish, whether it succeeds or fails, even when it fails before any repository is read.
Events
Each event also carriessurface (action, cli or mcp) and smartcloud_version. The events and their properties are defined, with a schema for each, in one module, packages/runtime/src/analytics.ts, so nothing else can send an event under another name or with another shape.
Evaluating a feature flag also records PostHog’s standard
$feature_flag_called event.
Rule ids are sent as smartcloud’s code names them. Policy ids such as DCO, AI-02, SYNC and REVIEW are sent as they are; a feature’s own rules keep only the part smartcloud writes (settings.environment:production becomes settings.environment); every convention rule, which the repository names, becomes conventions.custom; and anything else becomes other.
The repository’s PostHog person has two properties, set with every event: smartcloud_version and last_surface. Its organization group has two more, set when a config is read: features_enabled and uses_house_preset.
Earlier v2 builds sent smartcloud run, smartcloud settings plan and smartcloud sync render; command run and feature run replace them.
Errors, logs, traces and metrics
- Errors for error tracking: one
$exceptionfor each invocation that fails, with the surface, the command, the outcome,error_tagandexpected, and its message and stack trace; and one for each feature that fails while the run completes. Stack traces from a release are resolved to the TypeScript sources by the source maps uploaded when it is released (see Releasing). - Logs: a line for each invocation and each run with its outcome, and the diagnostic logs smartcloud writes while it runs, from debug level up: what each feature decided, as counts (such as
labels: 3 to create, 1 to rename), the rule id of each finding, and the outcome of each GitHub API call. Logs go to PostHog only, never to your terminal, whatever path the invocation takes; with telemetry off they are dropped. - Traces: a span for the invocation (
smartcloud.command), holding everything it does, including the GitHub reads that build a dry run’s event, with child spans for the run (smartcloud.run), resolving the config (smartcloud.config.resolve), evaluating feature flags, running the features (smartcloud.engine.runFeatures), each feature (smartcloud.feature.<name>), loading pull request details, publishing the report (smartcloud.reporting.publish) and each GitHub API call (smartcloud.github.<operation>), with their durations, outcomes, counts and, for GitHub calls, the HTTP status. - Metrics: invocations by command and outcome (
smartcloud.commands) and their durations (smartcloud.command.duration_ms); runs by operation and outcome, and their durations; findings by level and feature (smartcloud.findings); feature durations by feature and outcome (smartcloud.feature.duration_ms); and GitHub API calls by operation and outcome (smartcloud.github.requests), with their durations (smartcloud.github.duration_ms).
Identity
The repository is identified only by a hash: the SHA-256 of its lower-casedowner/repo is the PostHog person, and the SHA-256 of its lower-cased owner is an organization group. Logs and the invocation’s span carry the same hash as posthogDistinctId, so they link to the repository’s person in PostHog. An invocation that names no repository, such as validating a local file, is anonymous: its events carry a random id and create no person. GeoIP lookups are turned off.
What is never collected
- Repository, organisation or user names, and logins.
- Pull request and issue titles, descriptions, comments and code.
- Tokens and credentials.
- File paths, branch names, the values of options and inputs, and the ids of rules a repository names itself.
- Preset names: a preset is only ever
houseorother.
ghp_, gho_, ghu_, ghs_, ghr_ and github_pat_), bearer credentials, email addresses, the value of GITHUB_TOKEN (the environment variable and the action input), the repository’s owner/repo, as parsed and as it was typed, and your home and working directories, wherever they appear, including inside error messages and stack traces. Anything it cannot inspect is not sent.
Telemetry never slows down or fails a run. Requests time out after five seconds, a failure to send is logged only at debug level, and what is queued is flushed when the run ends, within three seconds.
Turning it off
We ask you not to: telemetry holds no repository data, and without it we cannot see when smartcloud breaks for you. If you must, any one of these turns it off.SMARTCLOUD_POSTHOG_KEY and SMARTCLOUD_POSTHOG_HOST send telemetry to a different PostHog project instead.
Feature flags
Each feature has a flag in PostHog, namedsmartcloud-<feature>, that can turn it off for every repository, or for some, without a release:
Flags are evaluated through OpenFeature, with PostHog as the provider, for the repository’s hashed identity and its organisation group. A feature whose flag is off is listed as skipped, with the reason
turned off by feature flag smartcloud-<feature>.
When telemetry is off, PostHog cannot be reached, or a flag does not exist, every flag keeps its default, which is the behaviour smartcloud has without flags. Turning telemetry off therefore never changes what smartcloud does. The flags are temporary: each is removed once its v2 feature has been stable for 30 days.