Environment
- Claude Code 2.1.209, macOS (behaviour observed across 2.1.206–2.1.209 in live telemetry)
- OTEL metrics enabled via managed settings, exported OTLP → Grafana Cloud
What happens
On the claude_code.token.usage and claude_code.cost.usage metrics, the skill.name attribute is reported inconsistently depending on where the skill is installed from:
| Skill source |
skill.name on metrics |
Built-in / official marketplace (anthropics/claude-plugins-official) |
verbatim |
User skills (~/.claude/skills) and project skills (repo .claude/skills) |
verbatim |
| Any other plugin marketplace — including one the team publishes itself |
the literal string "third-party" |
The related attributes are masked on the same series, so the bucket cannot be split downstream: plugin_name is also "third-party", and MCP attribution is masked to "custom".
There is no control that changes this. OTEL_LOG_TOOL_DETAILS=1 unmasks skill names on skill_activated events only; no environment variable or managed setting affects the metrics-side mask.
Why this matters
Plugin marketplaces are the recommended way to distribute a team's shared skills. A team that follows that recommendation loses exactly the telemetry that skill.name exists to provide: every one of their skills collapses into a single "third-party" series. In our live capture, a 30-day window shows ~97% of all skill-attributed tokens (~147M of ~152M) in the one "third-party" bucket, because our own plugins (published from our own GitHub repos, installed via our own marketplace) are treated identically to genuinely third-party code.
The same skill copied into ~/.claude/skills reports verbatim — so the masking rule keys on the distribution channel, not on anything about the skill itself.
The mask is not protective
As documented in #76957 (event-side masking regression, filed with OTLP captures), api_request events in the same default export already carry skill.name verbatim. Masking the metrics therefore breaks analytics without hiding the names.
Steps to reproduce
- Publish a minimal plugin marketplace repo containing one skill; install and enable it.
- Enable OTEL metrics export (any backend; a local OTLP dump listener suffices).
- Invoke the skill; observe
claude_code.token.usage reports skill.name="third-party", plugin_name="third-party".
- Copy the same skill folder into
~/.claude/skills; invoke it; observe skill.name verbatim.
Ask
Either:
- Report plugin skill names verbatim on cost/token metrics (matching user/project/official skills), or
- Provide a managed-settings control — e.g. an allowlist of trusted marketplaces or plugins whose skills report verbatim — so organisations can opt their own plugins into the telemetry they already operate.
Related
Environment
What happens
On the
claude_code.token.usageandclaude_code.cost.usagemetrics, theskill.nameattribute is reported inconsistently depending on where the skill is installed from:skill.nameon metricsanthropics/claude-plugins-official)~/.claude/skills) and project skills (repo.claude/skills)"third-party"The related attributes are masked on the same series, so the bucket cannot be split downstream:
plugin_nameis also"third-party", and MCP attribution is masked to"custom".There is no control that changes this.
OTEL_LOG_TOOL_DETAILS=1unmasks skill names onskill_activatedevents only; no environment variable or managed setting affects the metrics-side mask.Why this matters
Plugin marketplaces are the recommended way to distribute a team's shared skills. A team that follows that recommendation loses exactly the telemetry that
skill.nameexists to provide: every one of their skills collapses into a single"third-party"series. In our live capture, a 30-day window shows ~97% of all skill-attributed tokens (~147M of ~152M) in the one"third-party"bucket, because our own plugins (published from our own GitHub repos, installed via our own marketplace) are treated identically to genuinely third-party code.The same skill copied into
~/.claude/skillsreports verbatim — so the masking rule keys on the distribution channel, not on anything about the skill itself.The mask is not protective
As documented in #76957 (event-side masking regression, filed with OTLP captures),
api_requestevents in the same default export already carryskill.nameverbatim. Masking the metrics therefore breaks analytics without hiding the names.Steps to reproduce
claude_code.token.usagereportsskill.name="third-party",plugin_name="third-party".~/.claude/skills; invoke it; observeskill.nameverbatim.Ask
Either:
Related
skill_activatedevents maskskill.nameto"custom_skill"whileapi_requestevents and metrics export it verbatim (regression since ~2.1.126)