{
  "schemaVersion": 1,
  "updatedAt": "2026-10-15",
  "contracts": [
    {
      "harness": "claude-code",
      "variant": "2.1.292-installed-bundle",
      "default": false,
      "verifiedAt": "2026-10-08",
      "support": {
        "accountReports": "unknown",
        "persistedCounters": "native",
        "invocationTelemetry": "native",
        "exactInvocationTotals": "partial",
        "successfulCompletion": "partial"
      },
      "evidence": ["skill-usage-local-inspection", "claude-2-1-292-bundle"],
      "references": [],
      "conditions": [
        "Internal implementation observation, not a stable analytics API.",
        "Dispatch or injection does not establish workflow completion.",
        "Historical implementation snapshot; later reader answers are recorded separately."
      ],
      "unknowns": [
        "No authenticated model requests or controlled invocation experiment.",
        "No complete invocation coverage, successful completion, reset/migration/concurrency semantics, or telemetry delivery/retention established.",
        "No private configuration, personal inventory, or bundle code copied into repository."
      ],
      "details": {
        "clientVersion": "2.1.292",
        "bundleSha256": "97a01e5bc74a199e67189435d0331ea3a24eac2e07db4b76d9148c5b0386138f",
        "liveConfig": "~/.claude.json",
        "backupPattern": "~/.claude/backups/.claude.json.backup.*",
        "shape": {
          "skillUsage": "map keyed by skill/command name",
          "usageCount": "integer",
          "lastUsedAt": "Unix milliseconds"
        },
        "bundleMarkers": ["A2t", "skillUsageLastWriteAt", "lFo=60000", "myt"],
        "observations": [
          "Recorder increments count and uses Date.now().",
          "Repeated writes for one skill key within 60000 ms in the same session state are skipped.",
          "Call sites include Skill dispatch and prompt slash-command handling.",
          "Ranking uses count times seven-day half-life decay with a 0.1 floor."
        ],
        "provenance": "Live shape and bundle rechecked in this work; backup presence and local skill-doctor search supplied by originating Arc work inspection."
      },
      "observedVersion": "2.1.292"
    },
    {
      "harness": "codex",
      "variant": "0.160.1-source",
      "default": false,
      "verifiedAt": "2026-10-08",
      "support": {
        "accountReports": "unknown",
        "persistedCounters": "unsupported",
        "invocationTelemetry": "native",
        "exactInvocationTotals": "partial",
        "successfulCompletion": "partial"
      },
      "evidence": [
        "skill-usage-local-inspection",
        "skill-usage-codex-rs-core-src-skills-rs",
        "skill-usage-codex-rs-ext-skills-src-invocation-rs",
        "skill-usage-codex-rs-analytics-src-analytics_capture-rs",
        "skill-usage-codex-rs-analytics-src-client-rs",
        "skill-usage-codex-rs-analytics-src-events-rs",
        "skill-usage-codex-rs-analytics-src-reducer-rs",
        "skill-usage-codex-rs-app-server-src-analytics_utils-rs",
        "skill-usage-codex-rs-config-defaults-toml",
        "skill-usage-codex-rs-config-src-types-rs",
        "skill-usage-codex-rs-core-src-otel_init-rs",
        "skill-usage-codex-rs-core-src-session-session-rs",
        "skill-usage-codex-rs-core-src-thread_manager-rs",
        "skill-usage-codex-rs-otel-src-config-rs"
      ],
      "references": [
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/core/src/skills.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/ext/skills/src/invocation.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/analytics/src/analytics_capture.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/analytics/src/client.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/analytics/src/events.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/analytics/src/reducer.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/app-server/src/analytics_utils.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/config/defaults.toml",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/config/src/types.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/core/src/otel_init.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/core/src/session/session.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/core/src/thread_manager.rs",
        "https://github.com/openai/codex/blob/d27764b82f7118f674371e6d6e76271d9d606edb/codex-rs/otel/src/config.rs"
      ],
      "conditions": [
        "Internal implementation observation, not a stable analytics API.",
        "Dispatch or injection does not establish workflow completion.",
        "Historical implementation snapshot; later reader answers are recorded separately."
      ],
      "unknowns": [
        "No authenticated model requests or controlled invocation experiment.",
        "No complete invocation coverage, successful completion, reset/migration/concurrency semantics, or telemetry delivery/retention established.",
        "No private configuration, personal inventory, or bundle code copied into repository."
      ],
      "details": {
        "clientVersion": "0.160.1",
        "tag": "rust-v0.160.1",
        "sourceRevision": "d27764b82f7118f674371e6d6e76271d9d606edb",
        "sourceFiles": [
          {
            "path": "codex-rs/core/src/skills.rs",
            "sha256": "984e9e4de3deb02013a3857c290076471ed8411a21d1180399115db59825cbf3"
          },
          {
            "path": "codex-rs/ext/skills/src/invocation.rs",
            "sha256": "d21fdaec0aa1ad30db81150ae81b4d9e59301892200ecbaf6d9eec34e32f70fc"
          },
          {
            "path": "codex-rs/analytics/src/analytics_capture.rs",
            "sha256": "784327cd5d12ba876c3849ba495a63616a8b737678b241319f327979f1f9a2d0"
          },
          {
            "path": "codex-rs/analytics/src/client.rs",
            "sha256": "371cb5c52f08057b3091b2b9087b5ba13ebad676c7d66d8e3105722428476591"
          },
          {
            "path": "codex-rs/analytics/src/events.rs",
            "sha256": "97434c1d2f8ea6741823b203d45c9765292e4bea2f7204d518d18c57c403961b"
          },
          {
            "path": "codex-rs/analytics/src/reducer.rs",
            "sha256": "88530e964108d2569645ea7474d058ac56f93fae5546bc41dbb5557b278feaad"
          },
          {
            "path": "codex-rs/app-server/src/analytics_utils.rs",
            "sha256": "1467215f959bb4a5d8b8b9676679ca272668b61c85ac040ab8b390f3cf12d858"
          },
          {
            "path": "codex-rs/config/defaults.toml",
            "sha256": "c669759d7422f378c724256737eda9613b4b4a6760c59a1715ed6e7813bf7214"
          },
          {
            "path": "codex-rs/config/src/types.rs",
            "sha256": "951d5b6a7ff5c7dd667039f1f0c44fe1028a2d8ab372d45632b60d325464631d"
          },
          {
            "path": "codex-rs/core/src/otel_init.rs",
            "sha256": "157c6b7f54f0a0351a9e93b52379949e7e3ba3d4e79cab638c4b45157fc10e19"
          },
          {
            "path": "codex-rs/core/src/session/session.rs",
            "sha256": "2da4c0288596269fbb6df6d9a04a389e8ce0184be77ee2bcce765521e63702a5"
          },
          {
            "path": "codex-rs/core/src/thread_manager.rs",
            "sha256": "1c356242684633729042aaac6350295b759a8fe1fc05eff28b78895f6ff2fa9d"
          },
          {
            "path": "codex-rs/otel/src/config.rs",
            "sha256": "53a9bd419c8f86fa8da64266fb5cce04808acc5e916d0eeb0c4560c03bf32d75"
          }
        ],
        "originatingLocalInspection": {
          "sqliteSchemas": [
            "state_5",
            "thread_history_1",
            "logs_2",
            "memories_1",
            "queue_1",
            "goals_1"
          ],
          "desktopFile": ".codex-global-state.json",
          "result": "No skill-specific schema fields or comparable desktop counters found; generic record contents and other storage are not excluded."
        },
        "observations": [
          "Explicit and recognized implicit invocations emit telemetry and analytics.",
          "Implicit detections deduplicate per skill identity per turn.",
          "No equivalent user-readable persisted counter established."
        ],
        "transport": {
          "metrics": {
            "defaultExporter": "Statsig",
            "defaultEndpoint": "https://ab.chatgpt.com/otlp/v1/metrics",
            "configuration": "otel.metrics_exporter",
            "gate": "analytics.enabled, falling back to caller default",
            "debugBuild": "Built-in Statsig exporter disabled."
          },
          "analytics": {
            "defaultEndpoint": "https://chatgpt.com/backend-api/codex/analytics-events/events",
            "configuration": "chatgpt_base_url plus /codex/analytics-events/events",
            "gate": "analytics.enabled = false disables client; missing or unsupported auth skips sending",
            "apiKeyAuth": "Only plugin-attributed skill events permitted.",
            "payloadFields": [
              "skill_id",
              "skill_name",
              "thread_id",
              "turn_id",
              "voice_session_id",
              "invoke_type",
              "model_slug",
              "product_client_id",
              "skill_scope",
              "plugin_id",
              "remote_plugin_id"
            ],
            "buffer": "Bounded in-memory queue; failed enqueue drops events.",
            "debugCapture": "CODEX_ANALYTICS_EVENTS_CAPTURE_FILE redirects request batches to JSONL instead of network; ignored in release builds."
          },
          "verificationBoundary": "Source wiring verified; no packet capture, effective client config audit, server retention, or user-queryable analytics endpoint verified."
        }
      },
      "observedVersion": "0.160.1"
    },
    {
      "harness": "codex",
      "variant": "a9b08151-account-reports-source",
      "default": false,
      "verifiedAt": "2026-10-12",
      "method": "source-inspection",
      "surface": "tui-and-backend",
      "sourceRevision": "a9b0815167c27ab13719dd12d13b63e02b70d221",
      "evidence": [
        "skill-usage-account-report-source-1",
        "skill-usage-account-report-source-2",
        "skill-usage-account-report-source-3",
        "skill-usage-account-report-source-4",
        "skill-usage-account-report-source-5",
        "skill-usage-account-report-source-6",
        "skill-usage-account-report-source-7",
        "skill-usage-account-report-source-8",
        "skill-usage-account-report-source-9",
        "skill-usage-account-report-source-10",
        "skill-usage-account-report-source-11",
        "skill-usage-account-report-source-12"
      ],
      "references": [
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/core/src/skills.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/skills/src/invocation.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/ext/skills/src/tools/mod.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/analytics/src/client.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/analytics/src/reducer.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/tui/src/chatwidget/usage.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/tui/src/analytics/client.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/tui/src/analytics/normalize.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/tui/src/analytics/report_data.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/backend-client/src/client/analytics.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/codex-backend-openapi-models/src/models/analytics.rs",
        "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/otel/README.md"
      ],
      "support": {
        "persistedCounters": "unknown",
        "invocationTelemetry": "native",
        "exactInvocationTotals": "unknown",
        "successfulCompletion": "unknown",
        "accountReports": "native"
      },
      "conditions": [
        "Internal source observation; not a public analytics API or a released-client guarantee.",
        "Bounded upload queue can drop events; reports are top-limited and grouped by display name."
      ],
      "unknowns": [
        "No authenticated report request or packet capture performed.",
        "Server aggregation, retention, completeness, and ingestion-to-report reconciliation are not established by client source.",
        "Pinned checkout does not establish behavior of every released or proprietary client."
      ],
      "details": {},
      "accountReports": {
        "verifiedAt": "2026-10-12",
        "sourceRevision": "a9b0815167c27ab13719dd12d13b63e02b70d221",
        "evidence": [
          "skill-usage-account-report-source-1",
          "skill-usage-account-report-source-2",
          "skill-usage-account-report-source-3",
          "skill-usage-account-report-source-4",
          "skill-usage-account-report-source-5",
          "skill-usage-account-report-source-6",
          "skill-usage-account-report-source-7",
          "skill-usage-account-report-source-8",
          "skill-usage-account-report-source-9",
          "skill-usage-account-report-source-10",
          "skill-usage-account-report-source-11",
          "skill-usage-account-report-source-12"
        ],
        "references": [
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/core/src/skills.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/skills/src/invocation.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/ext/skills/src/tools/mod.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/analytics/src/client.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/analytics/src/reducer.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/tui/src/chatwidget/usage.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/tui/src/analytics/client.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/tui/src/analytics/normalize.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/tui/src/analytics/report_data.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/backend-client/src/client/analytics.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/codex-backend-openapi-models/src/models/analytics.rs",
          "https://github.com/openai/codex/blob/a9b0815167c27ab13719dd12d13b63e02b70d221/codex-rs/otel/README.md"
        ],
        "command": "/usage",
        "storage": "authenticated-backend",
        "route": "analytics/daily-skill-usage-metrics",
        "method": "GET",
        "dateRange": "inclusive-utc",
        "parameters": ["start_date", "end_date", "workspace_user=true", "top_skill_limit"],
        "enterpriseTopSkillLimit": 6,
        "otherTopSkillLimit": 10,
        "responseFields": ["skill_name", "display_name", "skill_ids", "invocation_counts"],
        "aggregation": "TUI sums returned invocation_counts by display_name.",
        "scansLocalTranscripts": false,
        "authenticatedRequestVerified": false,
        "completeness": "unknown"
      }
    },
    {
      "harness": "cursor-agent",
      "variant": "current",
      "default": true,
      "verifiedAt": "2026-10-15",
      "method": "documentation",
      "surface": "cli",
      "evidence": ["skills-cursor-agent-cursor-com-docs-skills-b6da61"],
      "references": ["https://cursor.com/docs/skills#how-skills-work"],
      "conditions": ["Documentation and source review; no live session probe."],
      "unknowns": ["No live session was run."],
      "details": {},
      "support": {
        "accountReports": "native",
        "persistedCounters": "unsupported",
        "invocationTelemetry": "native",
        "exactInvocationTotals": "partial",
        "successfulCompletion": "unsupported"
      },
      "answers": {
        "session": {
          "status": "partial",
          "answer": "There is no skill-specific session view or hook. `/skills` lists the skills the CLI discovered, and you invoke one by hand with `/skill-name`. When the agent applies a skill itself, it reads that skill's `SKILL.md`. That read shows up as a `readToolCall` in `--print --output-format stream-json`, and a `preToolUse`/`postToolUse` hook with matcher `Read` (or a `beforeReadFile` hook) can catch it by checking the path.",
          "reference": "https://cursor.com/docs/skills#how-skills-work",
          "evidence": [
            "skills-cursor-agent-cursor-com-docs-skills",
            "transcripts-cursor-agent-cursor-com-docs-cli-reference-output-format",
            "cursor-hooks-docs"
          ],
          "notes": [
            "The hook matchers cover tool types (`Shell`, `Read`, `Write`, `Task`, `MCP:<tool>`). None of them is for skills.",
            "On Enterprise teams, OpenTelemetry Export's `cursor.skill.activated` log carries `cursor.conversation.id`, so you can list the skills each session used."
          ]
        },
        "counts": {
          "status": "unsupported",
          "answer": "The CLI does not keep per-skill usage counts on disk. `~/.cursor/cli-config.json`, `~/.cursor/agent-cli-state.json` and the per-chat `store.db` files under `~/.cursor/chats/` have no skill counter. Usage is counted only on Cursor's servers, through the team Analytics API and OpenTelemetry Export.",
          "reference": "https://cursor.com/docs/skills#how-skills-work",
          "evidence": ["skills-cursor-agent-cursor-com-docs-skills"],
          "notes": [
            "To count locally, have a `postToolUse` hook append each `Read` of a `SKILL.md` to a file you own."
          ]
        },
        "reports": {
          "status": "supported",
          "answer": "Enterprise teams can call the Analytics API endpoints `GET https://api.cursor.com/analytics/team/skills` and `GET /analytics/by-user/skills` with an admin API key. Both return daily `usage` counts per `skill_name`, the second broken down by user. The Usage Analytics dashboard has no skills chart, and other plans have no skill report.",
          "reference": "https://cursor.com/docs/account/teams/analytics-api#skills-adoption",
          "evidence": ["usage-cursor-agent-cursor-com-docs-account-teams-analytics-api"],
          "notes": [
            "The Analytics API is for Enterprise teams only and needs an `admin:*` API key.",
            "Dates default to the last 7 days. Use `startDate`/`endDate` for other ranges."
          ]
        },
        "telemetry": {
          "status": "supported",
          "answer": "Enterprise admins can turn on OpenTelemetry Export in Team Settings > OpenTelemetry Export. Cursor's servers then send a `cursor.skill.activated` log (family `skills_hooks_plugins`, on by default) over OTLP/HTTP to a collector you run. Each log carries `cursor.skill.name`, `cursor.skill.trigger` (`agent_read`, `manually_attached` or `skill_name_in_prompt`), `cursor.skill.source` and `cursor.conversation.id`.",
          "reference": "https://cursor.com/docs/enterprise/opentelemetry-export/wire#cursorskillactivated",
          "evidence": [
            "usage-cursor-agent-cursor-com-docs-enterprise-opentelemetry-export-wire",
            "usage-cursor-agent-cursor-com-docs-enterprise-opentelemetry-export"
          ],
          "notes": [
            "The export runs from Cursor's servers. The CLI has no local OTLP setting.",
            "Delivery is at-least-once, so dedupe on `cursor.event.id`. Nothing from before the destination was set up is sent."
          ]
        },
        "outcome": {
          "status": "unsupported",
          "answer": "No. `cursor.skill.activated` and the Analytics API skill counts record only that a skill was used. Neither says whether it succeeded or failed. The closest signals are the `postToolUseFailure` hook and the stream-json `result` event (`is_error`), which cover single tool calls and the whole turn, not one skill.",
          "reference": "https://cursor.com/docs/enterprise/opentelemetry-export/wire#cursorskillactivated",
          "evidence": [
            "usage-cursor-agent-cursor-com-docs-enterprise-opentelemetry-export-wire",
            "cursor-hooks-docs"
          ]
        }
      },
      "observedVersion": "2026.10.12-d47ca18"
    },
    {
      "harness": "opencode",
      "variant": "1.x",
      "default": false,
      "verifiedAt": "2026-10-15",
      "method": "documentation",
      "surface": "cli",
      "evidence": ["skills-opencode-packages-opencode-src-tool-skill-ts-ac2e21"],
      "references": [
        "https://github.com/anomalyco/opencode/blob/733b2c627e5aec39cb33cc22373bdce33053ef2c/packages/opencode/src/tool/skill.ts#L45-L66"
      ],
      "conditions": ["Documentation and source review; no live session probe."],
      "unknowns": ["No live session was run."],
      "details": {},
      "support": {
        "accountReports": "unsupported",
        "persistedCounters": "partial",
        "invocationTelemetry": "partial",
        "exactInvocationTotals": "partial",
        "successfulCompletion": "partial"
      },
      "answers": {
        "session": {
          "status": "supported",
          "answer": "Each model-driven skill load is a `skill` tool call with input `{ name }`, shown in the TUI and `opencode run` as `Skill \"<name>\"` and saved as a tool part titled `Loaded skill: <name>` with `metadata.name` and `metadata.dir`. `opencode export <sessionID>` dumps those parts as JSON, and plugins see each call via `tool.execute.before` / `tool.execute.after` with `tool === \"skill\"`. Skills exposed as slash commands (`metadata[\"opencode/slash\"]`) run as commands instead and surface as the `command.executed` event.",
          "reference": "https://github.com/anomalyco/opencode/blob/733b2c627e5aec39cb33cc22373bdce33053ef2c/packages/opencode/src/tool/skill.ts#L45-L66",
          "evidence": [
            "skills-opencode-packages-opencode-src-tool-skill-ts",
            "usage-opencode-opencode-ai-docs-skills",
            "usage-opencode-opencode-ai-docs-plugins",
            "usage-opencode-opencode-ai-docs-cli",
            "usage-opencode-packages-opencode-src-cli-cmd-run-tool-ts",
            "steering-opencode-packages-opencode-src-session-prompt-ts"
          ],
          "notes": [
            "Slash-command skill runs do not create a `skill` tool part; look for `command.executed` with the skill name instead."
          ]
        },
        "counts": {
          "status": "partial",
          "answer": "There is no per-skill counter. `opencode stats` reads sessions from the local database (`opencode.db` in the data dir) and its TOOL USAGE table counts all `skill` tool calls together as one row. Per-skill totals need a query over the stored tool parts' `name` input or an `opencode export`.",
          "reference": "https://github.com/anomalyco/opencode/blob/733b2c627e5aec39cb33cc22373bdce33053ef2c/packages/opencode/src/cli/cmd/stats.ts#L204-L208",
          "evidence": [
            "usage-opencode-packages-opencode-src-cli-cmd-stats-ts",
            "usage-opencode-opencode-ai-docs-cli",
            "transcripts-opencode-packages-core-src-database-database-ts"
          ]
        },
        "reports": {
          "status": "unsupported",
          "answer": "OpenCode has no account, team or admin report of skill usage. The only built-in summary is the local `opencode stats` command.",
          "reference": "https://opencode.ai/docs/cli#stats",
          "evidence": ["usage-opencode-opencode-ai-docs-cli"]
        },
        "telemetry": {
          "status": "partial",
          "answer": "Set `OTEL_EXPORTER_OTLP_ENDPOINT` and every tool run exports a `Tool.execute` span with `tool.name`, `session.id` and `tool.call_id`. A skill load shows up as `tool.name=skill`, but the span has no skill-name attribute. Setting `experimental.openTelemetry: true` also adds AI SDK spans, whose tool-call arguments include the skill `name`.",
          "reference": "https://github.com/anomalyco/opencode/blob/733b2c627e5aec39cb33cc22373bdce33053ef2c/packages/opencode/src/tool/tool.ts#L113-L145",
          "evidence": [
            "usage-opencode-packages-opencode-src-tool-tool-ts",
            "usage-opencode-packages-core-src-observability-otlp-ts",
            "mcp-opencode-packages-core-src-v1-config-config-ts",
            "usage-opencode-packages-opencode-src-session-llm-ts",
            "usage-opencode-opencode-ai-docs-plugins"
          ],
          "notes": [
            "`experimental.openTelemetry` is not documented on the config page and is labelled experimental.",
            "A plugin on `tool.execute.after` can forward `args.name` to your own collector."
          ]
        },
        "outcome": {
          "status": "partial",
          "answer": "The saved `skill` tool part ends with `state.status` set to `completed` or `error`, for example when the skill is unknown or permission is denied. That tells you whether the skill loaded, not whether the work it guided succeeded. `tool.execute.after` fires only on the success path.",
          "reference": "https://github.com/anomalyco/opencode/blob/733b2c627e5aec39cb33cc22373bdce33053ef2c/packages/schema/src/v1/session.ts#L277-L301",
          "evidence": [
            "transcripts-opencode-packages-schema-src-v1-session-ts",
            "mcp-opencode-packages-opencode-src-session-tools-ts"
          ]
        }
      },
      "observedVersion": "1.19.0"
    },
    {
      "harness": "opencode",
      "variant": "2.x",
      "default": true,
      "verifiedAt": "2026-10-15",
      "method": "documentation",
      "surface": "cli",
      "evidence": ["usage-opencode-packages-schema-src-session-event-ts-fa1da5"],
      "references": [
        "https://github.com/anomalyco/opencode/blob/042d0832f5f3a73eaa039a58a7d565776f6d4290/packages/schema/src/session-event.ts#L291-L302"
      ],
      "conditions": ["Documentation and source review; no live session probe."],
      "unknowns": ["No live session was run."],
      "details": {},
      "support": {
        "accountReports": "unsupported",
        "persistedCounters": "partial",
        "invocationTelemetry": "partial",
        "exactInvocationTotals": "partial",
        "successfulCompletion": "partial"
      },
      "answers": {
        "session": {
          "status": "supported",
          "answer": "When the model loads a skill, it is a `skill` tool call with input `{ id }`, emitted as `session.tool.called` and then `session.tool.success` or `session.tool.failed` (`metadata.name`, `metadata.directory`). When you load a skill yourself with `@skill-id`, it is recorded as a `skill` message and a durable `session.skill.activated` event. Plugins can follow both through `ctx.tool.hook(\"execute.after\")` and `ctx.event.subscribe()`, and `opencode session export` dumps the transcript.",
          "reference": "https://github.com/anomalyco/opencode/blob/042d0832f5f3a73eaa039a58a7d565776f6d4290/packages/schema/src/session-event.ts#L291-L302",
          "evidence": [
            "usage-opencode-packages-schema-src-session-event-ts",
            "skills-opencode-opencode-ai-v2-docs-skills",
            "skills-opencode-packages-core-src-tool-plugin-skill-ts",
            "transcripts-opencode-packages-schema-src-session-message-ts",
            "opencode-v2-plugins-docs"
          ]
        },
        "counts": {
          "status": "partial",
          "answer": "There is no per-skill counter. `opencode stats --tools` shows a TOOL RELIABILITY table per tool name (calls, error rate, p50 duration), built from the local session database, and all skill loads fall under the single `skill` row. `@skill` activations are not counted there.",
          "reference": "https://github.com/anomalyco/opencode/blob/042d0832f5f3a73eaa039a58a7d565776f6d4290/packages/core/src/session/stats.ts#L234-L272",
          "evidence": [
            "usage-opencode-packages-core-src-session-stats-ts",
            "opencode-2-0-29-source"
          ]
        },
        "reports": {
          "status": "unsupported",
          "answer": "OpenCode 2.x has no account, team or admin report of skill usage. `opencode stats` is local only.",
          "reference": "https://github.com/anomalyco/opencode/blob/042d0832f5f3a73eaa039a58a7d565776f6d4290/packages/cli/src/commands/commands.ts#L309-L311",
          "evidence": ["opencode-2-0-29-source"]
        },
        "telemetry": {
          "status": "partial",
          "answer": "The V1 `experimental.openTelemetry` option is accepted but unsupported in 2.x. With `OTEL_EXPORTER_OTLP_ENDPOINT` set, OpenCode exports a `Tool.execute` span that carries no tool or skill name. To collect skill invocations, use a plugin on `ctx.tool.hook(\"execute.after\")` (check `event.tool === \"skill\"` and `event.input.id`) or the server event stream (`session.tool.*`, `session.skill.activated`).",
          "reference": "https://opencode.ai/v2/docs/migrate-v1/#accepted-but-unsupported-fields",
          "evidence": [
            "instructions-opencode-opencode-ai-v2-docs-migrate-v1",
            "compaction-opencode-packages-core-src-config-normalize-ts",
            "usage-opencode-packages-util-src-observability-ts",
            "image-input-opencode-packages-core-src-tool-ts",
            "opencode-v2-plugins-docs"
          ]
        },
        "outcome": {
          "status": "partial",
          "answer": "Each `skill` tool call ends in `session.tool.success` or `session.tool.failed` (for example `Unable to load skill <id>`), and plugin `execute.after` receives `status: \"completed\"` or `\"error\"`. `opencode stats --tools` reports the error rate for the `skill` tool as a whole. That tells you whether the skill loaded, not whether the work it guided succeeded.",
          "reference": "https://github.com/anomalyco/opencode/blob/042d0832f5f3a73eaa039a58a7d565776f6d4290/packages/plugin/src/effect/tool.ts#L29-L45",
          "evidence": [
            "usage-opencode-packages-plugin-src-effect-tool-ts",
            "usage-opencode-packages-schema-src-session-event-ts",
            "opencode-v2-plugins-docs"
          ]
        }
      },
      "observedVersion": "2.0.29"
    },
    {
      "harness": "pi",
      "variant": "current",
      "default": true,
      "verifiedAt": "2026-10-15",
      "method": "documentation",
      "surface": "cli",
      "evidence": ["steering-pi-packages-coding-agent-src-core-agent-session-ts-39272e"],
      "references": [
        "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/src/core/agent-session.ts#L2172-L2195"
      ],
      "conditions": ["Documentation and source review; no live session probe."],
      "unknowns": ["No live session was run."],
      "details": {},
      "support": {
        "accountReports": "unsupported",
        "persistedCounters": "unsupported",
        "invocationTelemetry": "partial",
        "exactInvocationTotals": "unsupported",
        "successfulCompletion": "partial"
      },
      "answers": {
        "session": {
          "status": "partial",
          "answer": "A `/skill:name` command is expanded into a user message wrapped in `<skill name=\"...\" location=\"...\">`, which the TUI shows as a collapsible skill block and HTML exports label as `skill:`; it is saved in the session JSONL as a normal `message` entry. When the model picks a skill on its own it just calls the `read` tool on that `SKILL.md`, so you only see it as a `read` tool call and `toolResult` on the skill's path.",
          "reference": "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/src/core/agent-session.ts#L2172-L2195",
          "evidence": [
            "steering-pi-packages-coding-agent-src-core-agent-session-ts",
            "instructions-pi-packages-coding-agent-docs-skills-md",
            "steering-pi-kages-coding-agent-src-modes-interactive-interactive-mode-ts",
            "skills-pi-packages-coding-agent-src-core-skills-ts",
            "transcripts-pi-packages-coding-agent-docs-session-format-md"
          ],
          "notes": [
            "There is no dedicated skill entry type or skill event; extensions can watch `input` (raw `/skill:` text, before expansion) and `tool_call` for `read` on a `SKILL.md` path."
          ]
        },
        "counts": {
          "status": "unsupported",
          "answer": "Pi keeps no per-skill usage counter on disk. The only record is the session JSONL files, which you would have to scan yourself for `<skill name=...>` user messages and `read` calls on `SKILL.md` files.",
          "reference": "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/docs/session-format.md#entry-types",
          "evidence": ["transcripts-pi-packages-coding-agent-docs-session-format-md"],
          "notes": [
            "`/session` shows session statistics such as messages and tokens, not skill use."
          ]
        },
        "reports": {
          "status": "unsupported",
          "answer": "Pi has no account, team or admin report of skill usage. The Radius gateway from Earendil Works offers organization-level analytics on model traffic, but nothing in Pi reports skill use to it.",
          "reference": "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/docs/providers.md#radius",
          "evidence": ["usage-pi-packages-coding-agent-docs-providers-md"]
        },
        "telemetry": {
          "status": "partial",
          "answer": "Pi has no OpenTelemetry export and no skill event; its built-in telemetry is limited to anonymous install/update reporting (`enableInstallTelemetry`, `PI_TELEMETRY`) and an opt-in `enableAnalytics` flag used only by the experimental first-run setup. To collect skill use yourself, write an extension that listens to `input` (for `/skill:name`) and `tool_call`/`tool_result` (for `read` on `SKILL.md`), or parse `tool_execution_start`/`tool_execution_end` from `pi --mode json`.",
          "reference": "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/docs/extensions.md#events-and-concurrency",
          "evidence": [
            "steering-pi-packages-coding-agent-docs-extensions-md",
            "steering-pi-packages-coding-agent-docs-settings-md",
            "usage-pi-packages-coding-agent-src-core-telemetry-ts",
            "steering-pi-packages-coding-agent-docs-json-md"
          ]
        },
        "outcome": {
          "status": "partial",
          "answer": "Pi records no success or failure for a skill run as a whole. You can see whether loading it worked: a model-initiated load is a `read` tool result with `isError`, and if a `/skill:name` file cannot be read pi reports a `skill_expansion` error and sends the raw text unexpanded. Whether the task the skill guided succeeded has to be judged from the rest of the transcript.",
          "reference": "https://github.com/earendil-works/pi/blob/06a466935536f8c9bcacb2d5efc0fc021be1bdff/packages/coding-agent/src/core/agent-session.ts#L2187-L2194",
          "evidence": [
            "steering-pi-packages-coding-agent-src-core-agent-session-ts",
            "steering-pi-packages-coding-agent-docs-json-md"
          ]
        }
      },
      "observedVersion": "1.2.0"
    },
    {
      "harness": "claude-code",
      "variant": "2.1.300-reader-answers",
      "default": true,
      "verifiedAt": "2026-10-15",
      "support": {
        "accountReports": "native",
        "persistedCounters": "native",
        "invocationTelemetry": "native",
        "exactInvocationTotals": "partial",
        "successfulCompletion": "partial"
      },
      "evidence": [
        "claude-hooks-docs",
        "transcripts-claude-code-code-claude-com-docs-en-claude-directory",
        "claude-skills-docs",
        "claude-costs-docs",
        "usage-claude-code-platform-claude-com-docs-en-api-admin-analytics",
        "usage-claude-code-code-claude-com-docs-en-analytics",
        "usage-claude-code-code-claude-com-docs-en-monitoring-usage"
      ],
      "references": [
        "https://code.claude.com/docs/en/hooks",
        "https://code.claude.com/docs/en/claude-directory",
        "https://code.claude.com/docs/en/skills",
        "https://code.claude.com/docs/en/costs",
        "https://platform.claude.com/docs/en/api/admin/analytics",
        "https://code.claude.com/docs/en/analytics",
        "https://code.claude.com/docs/en/monitoring-usage"
      ],
      "conditions": [
        "Internal implementation observation, not a stable analytics API.",
        "Dispatch or injection does not establish workflow completion.",
        "Reader answers carry their own documentation/source references; older implementation details remain in the separate historical variant.",
        "Local counts are throttled; emitted activation events do not establish exact delivered or account totals."
      ],
      "unknowns": [
        "No authenticated model requests or controlled invocation experiment.",
        "No complete invocation coverage, successful completion, reset/migration/concurrency semantics, or telemetry delivery/retention established.",
        "No private configuration, personal inventory, or bundle code copied into repository."
      ],
      "details": {},
      "answers": {
        "session": {
          "status": "supported",
          "answer": "Each session's transcript at `~/.claude/projects/<project>/<session>.jsonl` records every tool call, so skills Claude loaded appear as `Skill` tool calls and ones you typed appear as `/name` prompts. To capture them live, add a `PreToolUse` or `PostToolUse` hook with matcher `Skill` for Claude-initiated skills plus a `UserPromptExpansion` hook, which fires with `command_name` when you type `/skillname` and bypasses `PreToolUse`.",
          "reference": "https://code.claude.com/docs/en/hooks#userpromptexpansion",
          "evidence": [
            "claude-hooks-docs",
            "transcripts-claude-code-code-claude-com-docs-en-claude-directory"
          ],
          "notes": [
            "Transcripts are deleted after `cleanupPeriodDays`, so they are not a permanent usage log."
          ]
        },
        "counts": {
          "status": "supported",
          "answer": "Claude Code keeps a `skillUsage` map in `~/.claude.json`, keyed by skill or command name, with `usageCount` and `lastUsedAt` (Unix milliseconds) for each entry. `/skill-doctor` (v2.1.252+) turns this into a report of how often each skill is used and what it costs in context, and flags skills that have never been invoked. The report opens in the `/plugin` manager's Stats tab, or prints as text with `-p`.",
          "reference": "https://code.claude.com/docs/en/skills#find-unused-skills",
          "evidence": ["claude-skills-docs", "claude-costs-docs"],
          "notes": [
            "The counter is approximate: repeated uses of the same skill within 60 seconds in one session are counted once.",
            "Nested skills may be recorded under either `<dir>:<name>` or the bare `<name>` key.",
            "`/skill-doctor` needs feature-flag fetching and doesn't work over Remote Control."
          ]
        },
        "reports": {
          "status": "supported",
          "answer": "On the Enterprise plan, `GET /v1/organizations/analytics/skills` in the Claude Enterprise Analytics API returns daily per-skill rows. Filtered to product `claude_code`, they include `invocation_count`, `distinct_session_skill_used_count`, `distinct_user_count` and attributed spend. A Primary Owner creates the `read:analytics` key at claude.ai/analytics/api-keys. The claude.ai/analytics/claude-code dashboard and the Console Claude Code dashboard show no per-skill breakdown.",
          "reference": "https://platform.claude.com/docs/en/api/admin/analytics#beta_analytics_skill_activity",
          "evidence": [
            "usage-claude-code-platform-claude-com-docs-en-api-admin-analytics",
            "usage-claude-code-code-claude-com-docs-en-analytics"
          ],
          "notes": [
            "Not available on the Team plan. `invocation_count` is null when invocation reporting isn't enabled for the organization.",
            "Names of members' private skills are withheld or shown as opaque ids.",
            "For individuals, `/usage` on Pro, Max, Team or Enterprise shows the share of recent usage attributed to each skill, computed from local history on that machine."
          ]
        },
        "telemetry": {
          "status": "supported",
          "answer": "With `CLAUDE_CODE_ENABLE_TELEMETRY=1` and an OTLP exporter, every invocation emits a `claude_code.skill_activated` event. The event carries `skill.name`, `skill.source`, and `invocation_trigger` (`user-slash`, `claude-proactive` or `nested-skill`), so slash-typed and model-initiated uses are both covered. The `claude_code.cost.usage` and `claude_code.token.usage` metrics also carry a `skill.name` attribute, and `claude_code.tool_result` events for the Skill tool include `skill_name` in `tool_parameters`.",
          "reference": "https://code.claude.com/docs/en/monitoring-usage#skill-activated-event",
          "evidence": ["usage-claude-code-code-claude-com-docs-en-monitoring-usage"],
          "notes": [
            "Names of user-defined and third-party plugin skills are redacted (`custom_skill` or `third-party`) unless you set `OTEL_LOG_TOOL_DETAILS=1`."
          ]
        },
        "outcome": {
          "status": "partial",
          "answer": "When Claude calls the `Skill` tool, the `claude_code.tool_result` event reports `success` and `error_type`, and a `PostToolUseFailure` hook with matcher `Skill` fires if loading the skill fails. Those signals only show whether the skill was loaded. Nothing reports whether the work the skill describes was finished, and `/name` invocations you type don't go through the tool at all.",
          "reference": "https://code.claude.com/docs/en/monitoring-usage#tool-result-event",
          "evidence": [
            "usage-claude-code-code-claude-com-docs-en-monitoring-usage",
            "claude-hooks-docs"
          ],
          "notes": ["`skill_activated` has no success or outcome attribute."]
        }
      },
      "observedVersion": "2.1.300",
      "method": "documentation-and-source-reader-answers"
    },
    {
      "harness": "codex",
      "variant": "0.162.1-reader-answers",
      "default": true,
      "verifiedAt": "2026-10-15",
      "support": {
        "accountReports": "native",
        "persistedCounters": "unsupported",
        "invocationTelemetry": "native",
        "exactInvocationTotals": "partial",
        "successfulCompletion": "partial"
      },
      "evidence": [
        "skills-codex-codex-rs-ext-skills-src-fragments-rs",
        "usage-codex-codex-rs-ext-skills-src-lib-rs",
        "usage-codex-codex-rs-backend-client-src-client-analytics-rs",
        "usage-codex-learn-chatgpt-com-docs-enterprise-usage-insights",
        "codex-usage-source-0-162-1",
        "usage-codex-codex-rs-tui-src-analytics-client-rs",
        "usage-codex-odex-rs-codex-backend-openapi-models-src-models-analytics-rs",
        "usage-codex-codex-rs-otel-readme-md",
        "usage-codex-codex-rs-otel-src-skill-invocation-rs",
        "usage-codex-codex-rs-core-src-skills-rs",
        "instructions-codex-learn-chatgpt-com-docs-config-file-config-advanced",
        "usage-codex-codex-rs-ext-skills-src-telemetry-rs"
      ],
      "references": [
        "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/ext/skills/src/fragments.rs",
        "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/ext/skills/src/lib.rs",
        "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/backend-client/src/client/analytics.rs",
        "https://learn.chatgpt.com/docs/enterprise/usage-insights",
        "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/tui/src/chatwidget/usage.rs",
        "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/tui/src/analytics/client.rs",
        "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/codex-backend-openapi-models/src/models/analytics.rs",
        "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/otel/README.md",
        "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/otel/src/skill_invocation.rs",
        "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/core/src/skills.rs",
        "https://learn.chatgpt.com/docs/config-file/config-advanced",
        "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/ext/skills/src/telemetry.rs"
      ],
      "conditions": [
        "Internal implementation observation, not a stable analytics API.",
        "Dispatch or injection does not establish workflow completion.",
        "Reader answers carry their own documentation/source references; older implementation details remain in the separate historical variant."
      ],
      "unknowns": [
        "No authenticated model requests or controlled invocation experiment.",
        "No complete invocation coverage, successful completion, reset/migration/concurrency semantics, or telemetry delivery/retention established.",
        "No private configuration, personal inventory, or bundle code copied into repository."
      ],
      "details": {},
      "answers": {
        "session": {
          "status": "partial",
          "answer": "There is no per-session skills list in the TUI. When you invoke a skill explicitly (`$skill` or the skill picker), its instructions are injected as a user message wrapped in `<skill><name>...</name><path>...</path>` and saved with the session in `~/.codex/sessions`, so you can find explicit uses by searching the transcript. Implicit uses show up only as the commands or `skills` tool calls that read the skill. No hook event is specific to skills, but `PreToolUse` and `PostToolUse` see those tool calls.",
          "reference": "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/ext/skills/src/fragments.rs#L75-L109",
          "evidence": [
            "skills-codex-codex-rs-ext-skills-src-fragments-rs",
            "usage-codex-codex-rs-ext-skills-src-lib-rs"
          ],
          "notes": [
            "If you export OpenTelemetry logs, the `codex.skill_invocation` events carry `conversation.id` and `turn.id`, which gives you a cleaner per-session list."
          ]
        },
        "counts": {
          "status": "unsupported",
          "answer": "Codex keeps no per-skill usage counter on disk. None of the local SQLite stores in `~/.codex` (`state_5`, `thread_history_1`, `logs_2`, `memories_1`, `queue_1`, `goals_1`) has a skill table. The counts shown under `/usage` are fetched from your ChatGPT account and are not stored locally.",
          "reference": "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/backend-client/src/client/analytics.rs#L40-L56",
          "evidence": ["usage-codex-codex-rs-backend-client-src-client-analytics-rs"]
        },
        "reports": {
          "status": "supported",
          "answer": "In the TUI, open `/usage` and choose `View analytics`. The Skills section shows your own daily skill invocation counts (top 10, or top 6 on Enterprise), fetched from `analytics/daily-skill-usage-metrics` with `workspace_user=true`; you must be signed in with ChatGPT. Workspace admins can see plugin and skill invocation counts in the Admin Console under Analytics > Insights, in a category's details.",
          "reference": "https://learn.chatgpt.com/docs/enterprise/usage-insights#category-details",
          "evidence": [
            "usage-codex-learn-chatgpt-com-docs-enterprise-usage-insights",
            "codex-usage-source-0-162-1",
            "usage-codex-codex-rs-tui-src-analytics-client-rs",
            "usage-codex-codex-rs-backend-client-src-client-analytics-rs",
            "usage-codex-odex-rs-codex-backend-openapi-models-src-models-analytics-rs"
          ],
          "notes": [
            "The `/usage` Skills view sums counts by display name and shows only the top skills.",
            "Invocations aren't the same as messages or completed tasks, and plugin and skill allocations overlap, so don't add them together."
          ]
        },
        "telemetry": {
          "status": "supported",
          "answer": "Yes. Point `[otel] exporter` at an OTLP HTTP or gRPC collector and Codex sends a `codex.skill_invocation` log event for every explicit injection and every detected implicit use. The event carries `skill.name`, `skill.invocation_type`, `skill.scope`, `skill.plugin_id`, `conversation.id`, `turn.id`, the model and user/account IDs, but never skill contents or paths. Codex also records a `codex.skill.injected` counter metric, tagged with `skill`, `status` and `invoke_type`.",
          "reference": "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/otel/README.md#L99-L123",
          "evidence": [
            "usage-codex-codex-rs-otel-readme-md",
            "usage-codex-codex-rs-otel-src-skill-invocation-rs",
            "usage-codex-codex-rs-core-src-skills-rs",
            "instructions-codex-learn-chatgpt-com-docs-config-file-config-advanced"
          ],
          "notes": [
            "The default `otel.exporter = \"none\"` exports nothing.",
            "Implicit detection from shell commands is best effort and counted at most once per skill per turn.",
            "Setting `[analytics] enabled = false` also turns off custom OTLP metrics exporters."
          ]
        },
        "outcome": {
          "status": "partial",
          "answer": "Codex records only whether a skill was loaded, not whether its task worked. On `codex.skill.injected`, `status=\"error\"` means an explicitly mentioned skill could not be injected. The `codex.skill.turn.duration_seconds` histogram tags the whole turn as `completed`, `error` or `aborted`, but per plugin rather than per skill.",
          "reference": "https://github.com/openai/codex/blob/092d3acd6bec3e3a14bdc7e7a2810ab628ab759d/codex-rs/ext/skills/src/telemetry.rs#L54-L91",
          "evidence": [
            "usage-codex-codex-rs-ext-skills-src-telemetry-rs",
            "usage-codex-codex-rs-core-src-skills-rs",
            "usage-codex-codex-rs-otel-readme-md"
          ],
          "notes": [
            "A `codex.skill_invocation` event shows that a skill was used, not that the task succeeded."
          ]
        }
      },
      "observedVersion": "0.162.1",
      "method": "documentation-and-source-reader-answers"
    }
  ],
  "dimensions": [
    "accountReports",
    "persistedCounters",
    "invocationTelemetry",
    "exactInvocationTotals",
    "successfulCompletion"
  ]
}
