Tech DebtsCLIM4 Trust Telemetry Lifecycle
PR #6 Telemetry Review Findings
PR #6 Telemetry Review Findings
Initial Debt
Codex PR review found telemetry/reporting issues after M4 delivery:
cli.artifact.pull.completedemitted only for control-plane baseline materialization, so the default GitHub stable-baseline fallback path undercounted successful artifact pulls.- cached stable-baseline reuse also emitted
cli.artifact.pull.completed, so repeated scaffold/update runs against the same cached artifact could overcount adoption. punks reportawaited best-effort telemetry after the report had already been submitted, so a stalled telemetry call could make a successful report command appear stuck.- telemetry/report timestamps were modeled as plain strings, so invalid datetime values could pass contract validation and fail later or persist inconsistently.
- loopback control-plane URLs such as
127.0.0.1and::1were classified asnormaltelemetry instead oflocal-dev, so local testing could be counted as adoption traffic. - API telemetry persistence was gated on full Better Auth configuration, so CLI-token deployments with
DATABASE_URLstill used in-memory telemetry and lost adoption data across restarts. - database telemetry dedupe used a pre-read before insert, so concurrent retries with the same
eventIdcould race on the unique index and reject instead of returning accepted/not-counted. @punks/dbstill imported the full server env contract, so CLI-token-only database persistence could fail when Better Auth variables were intentionally absent.- artifact-pull telemetry did not receive the target repository cwd, so scaffold/update runs using
--inputcould attribute pulls to the launcher directory. - telemetry/report datetime validation accepted impossible calendar dates because JavaScript date parsing normalizes values like February 31 instead of rejecting them.
0.0.0.0control-plane URLs were classified asnormal, so common local API configurations could be counted as adoption traffic.- telemetry without explicit project usage or repository remote metadata derived
ProjectUsagefrom per-event ids, fragmenting adoption into one project per event. - reports without explicit project usage or repository remote metadata derived
ProjectUsagefrom titles, merging unrelated reports with similar names. - CLI telemetry still probed git repository metadata before discovering telemetry transport was disabled, adding avoidable latency in large repositories.
- telemetry database outages were mapped to 400-level
TelemetryEventRejected, misclassifying server persistence failures as client input errors. - report database outages were mapped to 400-level
HarnessReportRejected, misclassifying server persistence failures as client input errors. - CLI telemetry read plain git config for
user.nameanduser.email, allowing global git identity to leak into telemetry outside safe repo-local context.
Resolution
- Centralized artifact-pull telemetry and emitted it for successful remote baseline materialization from both control-plane and GitHub stable-release paths.
- Stopped emitting artifact-pull telemetry when reusing cached control-plane or GitHub stable baselines.
- Restored
punks reporttelemetry to best-effort fire-and-forget after successful report submission. - Added
IsoDateTimeStringcontract validation for telemetryoccurredAtand reportcreatedAt. - Classified localhost,
.localhost, IPv4 loopback, and IPv6 loopback control-plane URLs aslocal-dev. - Decoupled API database persistence selection from Better Auth environment readiness;
DATABASE_URLplus non-memory storage now selects durable telemetry/report persistence while Better Auth remains an auth-provider gate. - Made database telemetry insertion idempotent through insert conflict handling, returning accepted/not-counted when an event id already exists.
- Removed the hidden Better Auth env dependency from
@punks/dbbootstrap; database creation now requires onlyDATABASE_URL. - Threaded target repository cwd through stable baseline resolution so artifact-pull telemetry uses the scaffold/update target repository.
- Tightened ISO datetime validation to reject impossible calendar dates before telemetry/report persistence.
- Classified
0.0.0.0control-plane URLs aslocal-dev. - Stopped manufacturing
ProjectUsagerecords when telemetry or reports lack both explicitprojectUsageIdand repository remote identity; events/reports remain persisted with nullable project linkage instead. - Skipped CLI event construction and repository probing when telemetry transport is disabled.
- Added
TelemetryPersistenceUnavailableas a 503 contract error for telemetry persistence outages while keepingTelemetryEventRejectedfor 400-level input rejection. - Added
HarnessReportPersistenceUnavailableas a 503 contract error for report persistence outages while keepingHarnessReportRejectedfor 400-level input rejection. - Restricted telemetry git identity collection to repo-local git config.
- Added regression tests for GitHub fallback artifact telemetry, cached baseline reuse, target-repo artifact telemetry attribution, disabled-transport telemetry short-circuiting, repo-local git identity boundaries, loopback telemetry source classification,
0.0.0.0local-dev classification, database persistence selection, database retry idempotency, remote-less project linkage, telemetry/report persistence outage mapping, database bootstrap env independence, and invalid telemetry/report timestamps.
Validation
bun run test --filter=@punks/contract --filter=@punks/cli: passed.bun run check-types --filter=@punks/contract --filter=@punks/cli: passed.bun run test --filter=@punks/cli: passed after follow-up review fixes.git diff --check: passed after follow-up review fixes.bun run check: passed after follow-up review fixes.bun run check-types: passed after follow-up review fixes.bun run test --filter=@punks/api: passed after API persistence follow-up review fixes.bun run check-types --filter=@punks/api: passed after API persistence follow-up review fixes.bun run check-types: passed after API persistence follow-up review fixes.bun run test --filter=@punks/cli: passed after target-repository artifact telemetry follow-up review fixes.bun run test --filter=@punks/db: passed after database env-independence follow-up review fixes.bun run test --filter=@punks/api: passed after database env-independence follow-up review fixes.bun run check-types --filter=@punks/db --filter=@punks/api --filter=@punks/cli: passed after latest follow-up review fixes.bun run check: passed after latest follow-up review fixes.bun run check-types: passed after latest follow-up review fixes.bun run test --filter=@punks/contract: passed after datetime validation follow-up review fixes.bun run test --filter=@punks/cli: passed after0.0.0.0local-dev follow-up review fixes.bun run check-types --filter=@punks/contract --filter=@punks/cli: passed after latest follow-up review fixes.git diff --check: passed after latest follow-up review fixes.bun run check: passed after latest follow-up review fixes.bun run check-types: passed after latest follow-up review fixes.bun run test --filter=@punks/api: passed after remote-less project linkage follow-up review fixes.bun run check-types --filter=@punks/api: passed after remote-less project linkage follow-up review fixes.git diff --check: passed after remote-less project linkage follow-up review fixes.bun run check: passed after remote-less project linkage follow-up review fixes.bun run check-types: passed after remote-less project linkage follow-up review fixes.bun run test --filter=@punks/contract: passed after disabled-transport/persistence-outage follow-up review fixes.bun run test --filter=@punks/api: passed after disabled-transport/persistence-outage follow-up review fixes.bun run test --filter=@punks/cli: passed after disabled-transport/persistence-outage follow-up review fixes.bun run check-types --filter=@punks/contract --filter=@punks/api --filter=@punks/cli: passed after disabled-transport/persistence-outage follow-up review fixes.git diff --check: passed after disabled-transport/persistence-outage follow-up review fixes.bun run check: passed after disabled-transport/persistence-outage follow-up review fixes.bun run check-types: passed after disabled-transport/persistence-outage follow-up review fixes.bun run test --filter=@punks/contract: passed after report-persistence/git-identity follow-up review fixes.bun run test --filter=@punks/api: passed after report-persistence/git-identity follow-up review fixes.bun run test --filter=@punks/cli: passed after report-persistence/git-identity follow-up review fixes.bun run check-types --filter=@punks/contract --filter=@punks/api --filter=@punks/cli: passed after report-persistence/git-identity follow-up review fixes.git diff --check: passed after report-persistence/git-identity follow-up review fixes.bun run check: passed after report-persistence/git-identity follow-up review fixes.bun run check-types: passed after report-persistence/git-identity follow-up review fixes.
Implementation Notes
apps/wiki/specs/cli/IP-105-runtime-telemetry/IMPLEMENTATION-NOTES.mdapps/wiki/specs/cli/IP-106-cli-harness-reporting/IMPLEMENTATION-NOTES.md