feat: add telemetry intelligence signals for debugging and improvements#564
feat: add telemetry intelligence signals for debugging and improvements#564anandgupta42 merged 16 commits intomainfrom
Conversation
Add `task_outcome_signal` event that maps agent outcomes to behavioral signals (accepted/error/abandoned/cancelled). Emitted alongside `agent_outcome` at session end with zero user cost — pure client-side computation from data already in memory. - New event type with `signal`, `tool_count`, `step_count`, `duration_ms`, `last_tool_category` fields - Exported `deriveQualitySignal()` for testable outcome→signal mapping - MCP tool detection via `mcp__` prefix for accurate categorization - 8 unit tests covering all signal derivations and event shape Closes AI-6028 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add `task_classified` event emitted at session start with keyword/regex classification of the first user message. Categories: debug_dbt, write_sql, optimize_query, build_model, analyze_lineage, explore_schema, migrate_sql, manage_warehouse, finops, general. - `classifyTaskIntent()` — pure regex matcher, zero LLM cost, <1ms - Includes warehouse type from fingerprint cache - Strong/weak confidence levels (1.0 vs 0.5) - 15 unit tests covering all intent categories + edge cases Closes AI-6029 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add `tool_chain_outcome` event that captures the ordered tool sequence, error count, recovery count, and final outcome at session end. Only emitted when tools were actually used (non-empty chain). - Tracks up to 50 tool names in execution order - Detects error→success recovery patterns for auto-fix insights - Aggregates existing per-tool-call data — near-zero additional cost - 3 unit tests for event shape and error/recovery tracking Closes AI-6030 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add `error_fingerprint` event emitted per unique error at session end. SHA256-hashes normalized error messages for anonymous grouping, links each error to its recovery tool (if the next tool succeeded). - `hashError()` — 16-char hex hash of masked error messages - Tracks error→recovery pairs during tool chain execution - Capped at 20 fingerprints per session to bound telemetry volume - 4 unit tests for hashing, event shape, and recovery tracking Closes AI-6031 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add `sql_fingerprint` event emitted after successful SQL execution via `sql_execute`. Uses `extractMetadata()` + `getStatementTypes()` from altimate-core NAPI — local parsing, no API calls, ~1-5ms. - Captures: statement types, categories, table/function count, subqueries, aggregation, window functions, AST node count - No table/column names or SQL content — PII-safe by design - Wrapped in try/catch so fingerprinting never breaks query execution - `computeSqlFingerprint()` exported from sql-classify for reuse - 6 unit tests including PII safety verification Closes AI-6032 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add optional dbt project metrics to the existing `environment_census` event: snapshot/seed count buckets, materialization distribution (table/view/incremental/ephemeral counts). Data already parsed at startup — just extracts more fields from the same manifest parse. - Backward compatible — new fields are optional - No extra file reads or API calls Closes AI-6033 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add `schema_complexity` event emitted alongside `warehouse_introspection` after successful schema indexing. Uses data already computed during introspection — no extra warehouse queries. - Bucketed table/column/schema counts + avg columns per table - Division-by-zero guard for empty warehouses - Emitted inside existing try/catch — never breaks introspection Closes AI-6034 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Claude Code Review
This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.
Tip: disable this comment in your organization's Code Review settings.
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughThis PR introduces seven new PII-safe telemetry events and helper functions to improve product intelligence: task intent classification, outcome quality signals, tool chain effectiveness, error fingerprinting, SQL structure analysis, schema complexity metrics, and expanded dbt fingerprinting. It integrates emission logic across session, tool, and schema flows with comprehensive test coverage. Changes
Sequence Diagram(s)sequenceDiagram
participant Session as Session<br/>(prompt.ts)
participant Telemetry as Telemetry<br/>(index.ts)
participant Tools as Tools<br/>(sql-execute,<br/>project-scan,<br/>schema.index)
participant Core as Core<br/>(`@altimateai/`<br/>altimate-core)
Session->>Session: Step 1: Extract user text
activate Session
Session->>Telemetry: classifyTaskIntent(user_text)
activate Telemetry
Telemetry->>Core: regex/keyword matching
Telemetry-->>Session: {intent, confidence}
deactivate Telemetry
Session->>Telemetry: track(task_classified)
deactivate Session
Session->>Tools: Execute tool calls
activate Tools
Tools->>Core: sql parse/classify
Core-->>Tools: fingerprint data
Tools->>Telemetry: track(sql_fingerprint)
Tools->>Telemetry: track(schema_complexity)
Tools->>Telemetry: track(environment_census)
deactivate Tools
Session->>Session: Track errors & recovery
activate Session
Session->>Telemetry: hashError(masked_error)
activate Telemetry
Telemetry-->>Session: error_hash
deactivate Telemetry
deactivate Session
Session->>Telemetry: Session ends
activate Telemetry
Telemetry->>Telemetry: deriveQualitySignal(outcome)
Telemetry->>Telemetry: track(task_outcome_signal)
Telemetry->>Telemetry: track(tool_chain_outcome)
Telemetry->>Telemetry: track(error_fingerprint[])
deactivate Telemetry
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Add task_outcome_signal, task_classified, tool_chain_outcome, error_fingerprint, sql_fingerprint, schema_complexity to the event catalog. Update environment_census description for new dbt fields. Update naming convention section. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…y-signal # Conflicts: # .github/meta/commit.txt
Add 38 integration tests that verify all 7 telemetry signals fire through real code paths with spy on Telemetry.track(): - Signal 1: quality signal derivation + error/abandoned/cancelled cases - Signal 2: intent classifier with 10 real DE prompts + PII safety - Signal 3: tool chain collection with error recovery state machine - Signal 4: error fingerprint hashing + consecutive error flush - Signal 5: SQL fingerprint via altimate-core (aggregation, CTE, DDL) - Signal 6: environment_census expansion + backward compatibility - Signal 7: schema complexity bucketing + zero-table edge case - Full E2E: complete session simulation with all 7 signals in order Also fixes regex patterns for natural language flexibility: - dbt debug: allows words between "dbt" and error keywords - migrate: allows words between "to/from" and warehouse name Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Verify computeSqlFingerprint resilience when altimate-core NAPI: - throws (segfault, OOM) — returns null, never leaks exception - returns undefined — uses safe defaults (empty arrays, 0 counts) - returns garbage data — handled gracefully via ?? fallbacks Also verifies sql-execute.ts code structure ensures fingerprinting runs AFTER query result and is wrapped in isolated try/catch. Tests crash-resistant SQL inputs (control chars, empty, incomplete, very wide queries) and deterministic output. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixes from 5-stakeholder review (architect, privacy, perf, markers, tests): - Marker fix: remove nested altimate_change start/end, fold new variables into existing session telemetry tracking block - Performance: cap errorRecords at 200 entries (prevent unbounded growth) - Performance: slice intent classifier input to 2000 chars (bound regex) - Architecture: fix import path in sql-execute.ts (../telemetry not ../../altimate/telemetry) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…y-signal # Conflicts: # packages/opencode/src/altimate/telemetry/index.ts
e5fe9f0 to
82f6a2b
Compare
Picks up extractMetadata fixes: - Aggregate function names (COUNT, SUM, AVG, etc.) now in functions array - IN (SELECT ...) and EXISTS (SELECT ...) subquery detection - Any/All quantified comparison subquery detection (guarded) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…y-signal # Conflicts: # packages/opencode/src/altimate/tools/sql-execute.ts
|
| GitGuardian id | GitGuardian status | Secret | Commit | Filename | |
|---|---|---|---|---|---|
| 29326785 | Triggered | Generic Password | 85cfe70 | packages/opencode/test/altimate/connections.test.ts | View secret |
| 29327894 | Triggered | Generic Database Assignment | 85cfe70 | packages/opencode/test/altimate/connections.test.ts | View secret |
| 29327588 | Triggered | Generic Password | 85cfe70 | packages/opencode/test/altimate/connections.test.ts | View secret |
🛠 Guidelines to remediate hardcoded secrets
- Understand the implications of revoking this secret by investigating where it is used in your code.
- Replace and store your secrets safely. Learn here the best practices.
- Revoke and rotate these secrets.
- If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.
To avoid such incidents in the future consider
- following these best practices for managing and storing secrets including API keys and other credentials
- install secret detection on pre-commit to catch secret before it leaves your machine and ease remediation.
🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
…ts (#564) * feat: add implicit quality signal telemetry event Add `task_outcome_signal` event that maps agent outcomes to behavioral signals (accepted/error/abandoned/cancelled). Emitted alongside `agent_outcome` at session end with zero user cost — pure client-side computation from data already in memory. - New event type with `signal`, `tool_count`, `step_count`, `duration_ms`, `last_tool_category` fields - Exported `deriveQualitySignal()` for testable outcome→signal mapping - MCP tool detection via `mcp__` prefix for accurate categorization - 8 unit tests covering all signal derivations and event shape Closes AI-6028 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add task intent classification telemetry event Add `task_classified` event emitted at session start with keyword/regex classification of the first user message. Categories: debug_dbt, write_sql, optimize_query, build_model, analyze_lineage, explore_schema, migrate_sql, manage_warehouse, finops, general. - `classifyTaskIntent()` — pure regex matcher, zero LLM cost, <1ms - Includes warehouse type from fingerprint cache - Strong/weak confidence levels (1.0 vs 0.5) - 15 unit tests covering all intent categories + edge cases Closes AI-6029 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: emit aggregated tool chain outcome at session end Add `tool_chain_outcome` event that captures the ordered tool sequence, error count, recovery count, and final outcome at session end. Only emitted when tools were actually used (non-empty chain). - Tracks up to 50 tool names in execution order - Detects error→success recovery patterns for auto-fix insights - Aggregates existing per-tool-call data — near-zero additional cost - 3 unit tests for event shape and error/recovery tracking Closes AI-6030 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: link error-recovery pairs with hashed fingerprint Add `error_fingerprint` event emitted per unique error at session end. SHA256-hashes normalized error messages for anonymous grouping, links each error to its recovery tool (if the next tool succeeded). - `hashError()` — 16-char hex hash of masked error messages - Tracks error→recovery pairs during tool chain execution - Capped at 20 fingerprints per session to bound telemetry volume - 4 unit tests for hashing, event shape, and recovery tracking Closes AI-6031 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: emit SQL structure fingerprint using altimate-core Add `sql_fingerprint` event emitted after successful SQL execution via `sql_execute`. Uses `extractMetadata()` + `getStatementTypes()` from altimate-core NAPI — local parsing, no API calls, ~1-5ms. - Captures: statement types, categories, table/function count, subqueries, aggregation, window functions, AST node count - No table/column names or SQL content — PII-safe by design - Wrapped in try/catch so fingerprinting never breaks query execution - `computeSqlFingerprint()` exported from sql-classify for reuse - 6 unit tests including PII safety verification Closes AI-6032 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: expand environment_census with dbt project fingerprint Add optional dbt project metrics to the existing `environment_census` event: snapshot/seed count buckets, materialization distribution (table/view/incremental/ephemeral counts). Data already parsed at startup — just extracts more fields from the same manifest parse. - Backward compatible — new fields are optional - No extra file reads or API calls Closes AI-6033 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: emit schema complexity signal during warehouse introspection Add `schema_complexity` event emitted alongside `warehouse_introspection` after successful schema indexing. Uses data already computed during introspection — no extra warehouse queries. - Bucketed table/column/schema counts + avg columns per table - Division-by-zero guard for empty warehouses - Emitted inside existing try/catch — never breaks introspection Closes AI-6034 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: update telemetry reference with 7 new intelligence signals Add task_outcome_signal, task_classified, tool_chain_outcome, error_fingerprint, sql_fingerprint, schema_complexity to the event catalog. Update environment_census description for new dbt fields. Update naming convention section. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: add comprehensive integration tests for telemetry signals Add 38 integration tests that verify all 7 telemetry signals fire through real code paths with spy on Telemetry.track(): - Signal 1: quality signal derivation + error/abandoned/cancelled cases - Signal 2: intent classifier with 10 real DE prompts + PII safety - Signal 3: tool chain collection with error recovery state machine - Signal 4: error fingerprint hashing + consecutive error flush - Signal 5: SQL fingerprint via altimate-core (aggregation, CTE, DDL) - Signal 6: environment_census expansion + backward compatibility - Signal 7: schema complexity bucketing + zero-table edge case - Full E2E: complete session simulation with all 7 signals in order Also fixes regex patterns for natural language flexibility: - dbt debug: allows words between "dbt" and error keywords - migrate: allows words between "to/from" and warehouse name Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: add altimate-core failure isolation tests Verify computeSqlFingerprint resilience when altimate-core NAPI: - throws (segfault, OOM) — returns null, never leaks exception - returns undefined — uses safe defaults (empty arrays, 0 counts) - returns garbage data — handled gracefully via ?? fallbacks Also verifies sql-execute.ts code structure ensures fingerprinting runs AFTER query result and is wrapped in isolated try/catch. Tests crash-resistant SQL inputs (control chars, empty, incomplete, very wide queries) and deterministic output. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address stakeholder review findings Fixes from 5-stakeholder review (architect, privacy, perf, markers, tests): - Marker fix: remove nested altimate_change start/end, fold new variables into existing session telemetry tracking block - Performance: cap errorRecords at 200 entries (prevent unbounded growth) - Performance: slice intent classifier input to 2000 chars (bound regex) - Architecture: fix import path in sql-execute.ts (../telemetry not ../../altimate/telemetry) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: bump altimate-core to 0.2.6 Picks up extractMetadata fixes: - Aggregate function names (COUNT, SUM, AVG, etc.) now in functions array - IN (SELECT ...) and EXISTS (SELECT ...) subquery detection - Any/All quantified comparison subquery detection (guarded) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ccess retry (#571) * fix: defensive null guards in tool formatters and DuckDB concurrent access retry (#570) - Add null/undefined guards across 8 tool formatters to prevent literal `undefined` in user-facing output (sql-analyze, schema-inspect, sql-translate, dbt-manifest, finops-analyze-credits, warehouse-list, altimate-core-check, altimate-core-rewrite) - Add `error: msg` to catch block metadata in schema-inspect, dbt-manifest, warehouse-list so telemetry can classify exceptions - DuckDB driver: auto-retry in `READ_ONLY` mode on `database is locked` errors, with clear actionable error message - Add simulation suite (839 mock + 346 real E2E scenarios) covering 10 personas x 11 dialects x 14 use-case categories Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add telemetry intelligence signals for debugging and improvements (#564) * feat: add implicit quality signal telemetry event Add `task_outcome_signal` event that maps agent outcomes to behavioral signals (accepted/error/abandoned/cancelled). Emitted alongside `agent_outcome` at session end with zero user cost — pure client-side computation from data already in memory. - New event type with `signal`, `tool_count`, `step_count`, `duration_ms`, `last_tool_category` fields - Exported `deriveQualitySignal()` for testable outcome→signal mapping - MCP tool detection via `mcp__` prefix for accurate categorization - 8 unit tests covering all signal derivations and event shape Closes AI-6028 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add task intent classification telemetry event Add `task_classified` event emitted at session start with keyword/regex classification of the first user message. Categories: debug_dbt, write_sql, optimize_query, build_model, analyze_lineage, explore_schema, migrate_sql, manage_warehouse, finops, general. - `classifyTaskIntent()` — pure regex matcher, zero LLM cost, <1ms - Includes warehouse type from fingerprint cache - Strong/weak confidence levels (1.0 vs 0.5) - 15 unit tests covering all intent categories + edge cases Closes AI-6029 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: emit aggregated tool chain outcome at session end Add `tool_chain_outcome` event that captures the ordered tool sequence, error count, recovery count, and final outcome at session end. Only emitted when tools were actually used (non-empty chain). - Tracks up to 50 tool names in execution order - Detects error→success recovery patterns for auto-fix insights - Aggregates existing per-tool-call data — near-zero additional cost - 3 unit tests for event shape and error/recovery tracking Closes AI-6030 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: link error-recovery pairs with hashed fingerprint Add `error_fingerprint` event emitted per unique error at session end. SHA256-hashes normalized error messages for anonymous grouping, links each error to its recovery tool (if the next tool succeeded). - `hashError()` — 16-char hex hash of masked error messages - Tracks error→recovery pairs during tool chain execution - Capped at 20 fingerprints per session to bound telemetry volume - 4 unit tests for hashing, event shape, and recovery tracking Closes AI-6031 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: emit SQL structure fingerprint using altimate-core Add `sql_fingerprint` event emitted after successful SQL execution via `sql_execute`. Uses `extractMetadata()` + `getStatementTypes()` from altimate-core NAPI — local parsing, no API calls, ~1-5ms. - Captures: statement types, categories, table/function count, subqueries, aggregation, window functions, AST node count - No table/column names or SQL content — PII-safe by design - Wrapped in try/catch so fingerprinting never breaks query execution - `computeSqlFingerprint()` exported from sql-classify for reuse - 6 unit tests including PII safety verification Closes AI-6032 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: expand environment_census with dbt project fingerprint Add optional dbt project metrics to the existing `environment_census` event: snapshot/seed count buckets, materialization distribution (table/view/incremental/ephemeral counts). Data already parsed at startup — just extracts more fields from the same manifest parse. - Backward compatible — new fields are optional - No extra file reads or API calls Closes AI-6033 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: emit schema complexity signal during warehouse introspection Add `schema_complexity` event emitted alongside `warehouse_introspection` after successful schema indexing. Uses data already computed during introspection — no extra warehouse queries. - Bucketed table/column/schema counts + avg columns per table - Division-by-zero guard for empty warehouses - Emitted inside existing try/catch — never breaks introspection Closes AI-6034 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: update telemetry reference with 7 new intelligence signals Add task_outcome_signal, task_classified, tool_chain_outcome, error_fingerprint, sql_fingerprint, schema_complexity to the event catalog. Update environment_census description for new dbt fields. Update naming convention section. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: add comprehensive integration tests for telemetry signals Add 38 integration tests that verify all 7 telemetry signals fire through real code paths with spy on Telemetry.track(): - Signal 1: quality signal derivation + error/abandoned/cancelled cases - Signal 2: intent classifier with 10 real DE prompts + PII safety - Signal 3: tool chain collection with error recovery state machine - Signal 4: error fingerprint hashing + consecutive error flush - Signal 5: SQL fingerprint via altimate-core (aggregation, CTE, DDL) - Signal 6: environment_census expansion + backward compatibility - Signal 7: schema complexity bucketing + zero-table edge case - Full E2E: complete session simulation with all 7 signals in order Also fixes regex patterns for natural language flexibility: - dbt debug: allows words between "dbt" and error keywords - migrate: allows words between "to/from" and warehouse name Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: add altimate-core failure isolation tests Verify computeSqlFingerprint resilience when altimate-core NAPI: - throws (segfault, OOM) — returns null, never leaks exception - returns undefined — uses safe defaults (empty arrays, 0 counts) - returns garbage data — handled gracefully via ?? fallbacks Also verifies sql-execute.ts code structure ensures fingerprinting runs AFTER query result and is wrapped in isolated try/catch. Tests crash-resistant SQL inputs (control chars, empty, incomplete, very wide queries) and deterministic output. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address stakeholder review findings Fixes from 5-stakeholder review (architect, privacy, perf, markers, tests): - Marker fix: remove nested altimate_change start/end, fold new variables into existing session telemetry tracking block - Performance: cap errorRecords at 200 entries (prevent unbounded growth) - Performance: slice intent classifier input to 2000 chars (bound regex) - Architecture: fix import path in sql-execute.ts (../telemetry not ../../altimate/telemetry) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: bump altimate-core to 0.2.6 Picks up extractMetadata fixes: - Aggregate function names (COUNT, SUM, AVG, etc.) now in functions array - IN (SELECT ...) and EXISTS (SELECT ...) subquery detection - Any/All quantified comparison subquery detection (guarded) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: resolve all 5 Verdaccio sanity test failures (#572) - altimate-core NAPI binding: set `NODE_PATH` to global npm root so `require('@altimateai/altimate-core')` resolves after `npm install -g` - upstream branding: replace "opencode" with "altimate-code" in user-facing `describe` strings (uninstall, tui, pr commands, config, server API docs) - driver resolvability: set `NODE_PATH` in driver check loop and install `duckdb` alongside the main package so at least one peer dep is present - hardcoded CI paths: restrict grep to JS/JSON files only — compiled Bun binaries embed build-machine paths in debug info which is unavoidable - NAPI module exports: already had correct `NODE_PATH` in extended test; root cause was the base test (fix 1) which is now resolved Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
What does this PR do?
Adds 7 new PII-safe telemetry events to improve product debugging and understanding of how users interact with the CLI:
All signals computed locally from data already in memory — zero extra API calls, zero extra warehouse queries, <5ms overhead per session.
Type of change
Issue for this PR
Closes #563
How did you verify your code works?
Checklist
Summary by CodeRabbit
New Features
Documentation