Skip to main content

AI Usage > Surface Ref

Written by Tom Williams

Dataset: AI Usage

Entity: AI Usage Measurement

Field ID: surface_ref

Type: Select list

Description: The normalised surface the usage happened on, using a closed vocabulary shared across providers so they can be compared. Possible values are:

  • IDE_COMPLETION inline code completion.

  • IDE_CHAT chat in the IDE.

  • IDE_AGENT agent mode in the IDE.

  • CLI command line.

  • CLOUD_AGENT a remote or cloud agent run.

  • CODE_REVIEW pull request review.

  • WEB_CHAT web chat.

  • DESKTOP_APP desktop application.

  • AUTOMATION a third-party automation.

  • UNATTRIBUTED reported by the provider without a surface type.

Note: Empty on TOTAL and CLIENT records, which cover several surfaces at once.

Source: Calculated

Transformation logic: Each provider's own surface vocabulary is mapped onto this shared list. The provider's raw value is always preserved in surface_name, which is the other half of the same field.

App Mapping

GitHub Copilot

Calculated: mapped from the feature dimension, plus dedicated values for the agent app, code review and the cloud agent

Anthropic Claude (coming soon)

Calculated: mapped from terminal_type and is_remote. Remote work is CLOUD_AGENT, known IDE hosts are IDE_AGENT, everything else is CLI

Cursor (coming soon)

Calculated: mapped from the counter a record comes from, or from the event kind

OpenAI Platform (coming soon)

Calculated: AUTOMATION by default, since this is API traffic

OpenAI Codex (coming soon)

Calculated: mapped from client_id. Web is CLOUD_AGENT, CLI clients are CLI, IDE clients are IDE_AGENT

Reporting Use Cases

The Surface Ref field is what makes AI usage comparable across providers. It answers where the AI was used, in the same vocabulary whatever tool produced the record.

  • Where AI is actually used: Filter to breakdown = SURFACE and group by surface_ref to see the split between completions, chat, agents, the command line and code review.

  • Measuring the shift to agents: Tracking IDE_AGENT and CLOUD_AGENT as a share of all interactions over time is the clearest signal of a team moving from autocomplete to agentic work.

  • Comparing tools fairly: Because the vocabulary is shared, chat usage in Copilot and chat usage in Cursor land on the same value and can be charted side by side.

  • Interpreting UNATTRIBUTED: This is not an error. The provider reported usage without saying where it came from, and it is kept rather than dropped.

  • When it is too coarse: Several provider surfaces map onto one value. Use surface_name when you need the provider's own distinction.

Did this answer your question?