[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71J49JM5ESHTPD1Q6HDR1C1":3,"skill-same:01M71J49JM5ESHTPD1Q6HDR1C1":87},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":27,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":13,"repositoryHtmlUrl":54,"repositoryHomepageUrl":6,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":56,"install":57,"resources":70},"01M71J49JM5ESHTPD1Q6HDR1C1","skill-observability",null,"Defines the skill observability event contract (event.schema.json) and emit substrate (obs-emit.mjs). The SSOT for the measurement layer of the skill improvement loop. Referenced by other skills and hooks.","ozzy-labs\u002Fskills","ozzy-labs","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F246109093?v=4","01M6H0M2K2PZXHWNHJJTWY20FY","01M71J2B6FZ5KPEXPR5VS1TX7Z",0,"MIT","https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fskill-observability\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"skill observability","observability","claude-code","layer","improvement loop","json","substrate","code","false","loop","schema","contract","hooks","event","for","skill improvement","improvement","measurement","2026-11-10 10:12:30",false,"---\nname: skill-observability\ndescription: Defines the skill observability event contract (event.schema.json) and emit substrate (obs-emit.mjs). The SSOT for the measurement layer of the skill improvement loop. Referenced by other skills and hooks.\nadapters: claude-code\nuser-invocable: false\n---\n\n# skill-observability - Measurement event contract and emit substrate\n\nA referenced companion that defines the contract and tools underpinning the **measurement layer** of the skill improvement loop (install → use → reflect). Provides the **SSOT for the shape of events (schema) and the convention for writing them (emit)**, along with the **trace-derivation hook (obs-derive.mjs)** that derives invocations after the fact from the transcript. Aggregation (`\u002Fskill-metrics`) and reflection are built separately on top of this contract.\n\n## Principles\n\n- **Trace derivation as the main axis**: Measurement is derived after the fact, as much as possible, from `gh`\u002F`git` ground truth and transcript traces (avoiding self-report bias). Inline emit from within a skill prompt is secondary, limited to semantic signals that don't show up in traces (fallback, HITL rejection, loop cap reached, etc.).\n- **fail-open**: A failed emit must not stop the skill being measured. `obs-emit.mjs` never throws — whether absent, failing, or hitting a validation error — it prints a warning to stderr and exits 0.\n- **privacy (strictest mode)**: Events are metadata only. `event.schema.json`'s `additionalProperties: false` **mechanically rejects** unknown fields such as payload \u002F diff \u002F token \u002F path. Repo identifiers are never stored raw — only a hash (`repo_hash`). Sending (reflection) is always explicit opt-in \u002F HITL (this skill has no send path of its own).\n- **Count-based reasoning**: Because a single author's low-frequency data volume doesn't reach statistical significance, this contract does not force rates or confidence intervals. The aggregation side is built primarily around counts + notable events.\n\n## Event log\n\n```text\n~\u002F.agents\u002Fobservability\u002Fevents.jsonl   # append-only, 1 line per event, self-contained without OTel dependency\n```\n\nHOME-anchored (outside the skills dir). Survives a dogfood mirror rebuild. Readable by any consumer \u002F hook.\n\n## Event contract (event.schema.json is the SSOT)\n\n`event.schema.json` (a sibling of this skill) is the sole SSOT. Both `obs-emit.mjs` and the tests validate by **reading this file**, so doc and code never drift apart. Field names lean toward the **shape** of the OpenTelemetry GenAI semantic conventions (`skill`≈`gen_ai.agent.name` \u002F `operation`≈`gen_ai.operation.name`). Since the conventions are experimental, this skill does not couple tightly to them.\n\nRequired fields: `schema_version`(=1) \u002F `ts`(ISO 8601) \u002F `adapter` \u002F `session_id` \u002F `skill` \u002F `event`.\n\nTypes of `event`:\n\n| event | Purpose | Additional required field |\n| --- | --- | --- |\n| `start` | Skill invocation | — |\n| `phase` | Phase transition (implement \u002F ship \u002F review, etc.) | — |\n| `outcome` | End state | `status` ∈ {completed, aborted, fallback} |\n| `signal` | Semantic counter (a transition that doesn't show up in traces) | `name` (fixed vocabulary) |\n| `heartbeat` | Records that \"observation ran\" (prevents misreading absent data as success) | — |\n\nFixed vocabulary (initial) for `signal.name`: `review.loop_iter` \u002F `review.deep_to_quick_fallback` \u002F `usage_guard.fail_open` \u002F `hitl.rejected` \u002F `loop.hit_cap`.\n\nprivacy: `repo_hash` is 12-digit hex (a sha256 prefix) only. The contract makes it impossible to write raw repo names, cwd, or raw PR numbers (`additionalProperties: false`).\n\n## Emit substrate (obs-emit.mjs)\n\n`obs-emit.mjs` (sibling, a CLI that runs on all adapters) is the build→validate→append write primitive. Both the trace-derivation hook and inline emit ultimately go through this to append a single event.\n\n```bash\n# Examples\nnode obs-emit.mjs --skill=drive  --event=outcome --status=completed\nnode obs-emit.mjs --skill=review --event=signal  --name=review.loop_iter --value=2\nnode obs-emit.mjs --skill=drive  --event=heartbeat\nnode obs-emit.mjs --skill=drive  --event=outcome --status=merged --repo=\"$(git rev-parse --show-toplevel)\"\n```\n\nArguments: `--skill` \u002F `--event` (effectively required), `--status` \u002F `--name` \u002F `--value` \u002F `--phase` \u002F `--operation` \u002F `--reason` \u002F `--run` (optional), `--repo` (hashed and stored in `repo_hash`), `--adapter` \u002F `--session` (resolved from env by default).\n\nAny event that fails validation, and any other failure, is **not appended — it warns and exits 0** (fail-open). Does not break callers chained with `&&`.\n\n## Trace-derivation hook (obs-derive.mjs)\n\n`obs-derive.mjs` (sibling, a SessionEnd hook) is the **primary capture path**. After a session ends, it reads the transcript, derives after the fact **which skill fired**, and records it via the obs-emit substrate. Because it reconstructs from traces rather than asking the model for a mid-run self-report, it avoids **self-report bias** (the worst-case runs that abort being exactly the ones that drop the emit).\n\nThe reliable core it derives:\n\n- One `heartbeat` per session (a record that \"observation ran.\" Makes an empty window distinguishable between \"zero invocations\" and \"the hook didn't fire\").\n- One `start` per skill invocation found in the transcript. 2 channels:\n  - A model-invoked `Skill` tool_use → `operation: invoke_agent`\n  - A user-entered `\u002Fslash-command` → `operation: slash_command` (**only for skills that actually exist**. Built-in commands with no sibling skill dir, such as `\u002Fclear` `\u002Fcompact`, are excluded to prevent data contamination)\n\nThe skill's arguments (which may be sensitive) are **not recorded** (only the skill name and channel).\n\n**Deferred (not derived by this hook)**: the merge\u002Fabort **outcome**. The merge state at session end is not yet settled — it requires session→PR linkage plus deferred re-evaluation, and abort inference (\"ended without a PR\") is hard to distinguish from a human interruption or an idempotent resume, and is noisy. To keep things reliable and low-noise, this is split off into a separate increment.\n\n### Enabling the SessionEnd hook (manual opt-in)\n\nThis repo does not distribute settings\u002Fhooks (same policy as the usage-guard hook). Add a SessionEnd entry to `~\u002F.claude\u002Fsettings.json` (or `settings.local.json`). `command` must be the **absolute path** to `obs-derive.mjs` (differs between user-scope `~\u002F.claude\u002Fskills\u002Fskill-observability\u002F...` and dogfood `\u003Crepo>\u002F.claude\u002Fskills\u002Fskill-observability\u002F...` — fill in your own path):\n\n```json\n{\n  \"hooks\": {\n    \"SessionEnd\": [\n      {\n        \"hooks\": [\n          { \"type\": \"command\", \"command\": \"node \u002Fhome\u002F\u003Cyou>\u002F.claude\u002Fskills\u002Fskill-observability\u002Fobs-derive.mjs\" }\n        ]\n      }\n    ]\n  }\n}\n```\n\nReceives the SessionEnd JSON on stdin (`session_id` \u002F `transcript_path` \u002F `cwd` \u002F `reason`), always exits 0, and stays lightweight (lines are pre-filtered by substring before `JSON.parse`).\n\n## Scope of application\n\nThis skill provides the **contract + emit substrate + trace-derivation hook (invocation capture)**. Layers built on top of this contract (capture → aggregate → reflect → consume):\n\n- **`\u002Fskill-metrics`** (aggregation, shipped): read-only aggregation of events.jsonl into counts + notable events.\n- **Reflection channel** (reflection, shipped): the metrics-primed version of `lessons-triage`. Privacy-cleansed rollups are reflected into a backlog-pointer issue via HITL (sending is opt-in).\n- **`backlog`** (consumption, shipped): passes that issue to `drive` as a priority index.\n- **outcome derivation** (separate PR, pending): folds merge\u002Fabort state into the rollup using `gh`\u002F`git` merge ground truth + session→PR linkage (the next increment of the trace-derivation hook).\n\n## Notes\n\n- Does not read `.env` files.\n- Events must not include verbatim logs, secrets, or raw private repo names\u002Fpaths\u002FPR values (the schema mechanically rejects these).\n","# skill-observability - Measurement event contract and emit substrate\n\nA referenced companion that defines the contract and tools underpinning the **measurement layer** of the skill improvement loop (install → use → reflect). Provides the **SSOT for the shape of events (schema) and the convention for writing them (emit)**, along with the **trace-derivation hook (obs-derive.mjs)** that derives invocations after the fact from the transcript. Aggregation (`\u002Fskill-metrics`) and reflection are built separately on top of this contract.\n\n## Principles\n\n- **Trace derivation as the main axis**: Measurement is derived after the fact, as much as possible, from `gh`\u002F`git` ground truth and transcript traces (avoiding self-report bias). Inline emit from within a skill prompt is secondary, limited to semantic signals that don't show up in traces (fallback, HITL rejection, loop cap reached, etc.).\n- **fail-open**: A failed emit must not stop the skill being measured. `obs-emit.mjs` never throws — whether absent, failing, or hitting a validation error — it prints a warning to stderr and exits 0.\n- **privacy (strictest mode)**: Events are metadata only. `event.schema.json`'s `additionalProperties: false` **mechanically rejects** unknown fields such as payload \u002F diff \u002F token \u002F path. Repo identifiers are never stored raw — only a hash (`repo_hash`). Sending (reflection) is always explicit opt-in \u002F HITL (this skill has no send path of its own).\n- **Count-based reasoning**: Because a single author's low-frequency data volume doesn't reach statistical significance, this contract does not force rates or confidence intervals. The aggregation side is built primarily around counts + notable events.\n\n## Event log\n\n```text\n~\u002F.agents\u002Fobservability\u002Fevents.jsonl   # append-only, 1 line per event, self-contained without OTel dependency\n```\n\nHOME-anchored (outside the skills dir). Survives a dogfood mirror rebuild. Readable by any consumer \u002F hook.\n\n## Event contract (event.schema.json is the SSOT)\n\n`event.schema.json` (a sibling of this skill) is the sole SSOT. Both `obs-emit.mjs` and the tests validate by **reading this file**, so doc and code never drift apart. Field names lean toward the **shape** of the OpenTelemetry GenAI semantic conventions (`skill`≈`gen_ai.agent.name` \u002F `operation`≈`gen_ai.operation.name`). Since the conventions are experimental, this skill does not couple tightly to them.\n\nRequired fields: `schema_version`(=1) \u002F `ts`(ISO 8601) \u002F `adapter` \u002F `session_id` \u002F `skill` \u002F `event`.\n\nTypes of `event`:\n\n| event | Purpose | Additional required field |\n| --- | --- | --- |\n| `start` | Skill invocation | — |\n| `phase` | Phase transition (implement \u002F ship \u002F review, etc.) | — |\n| `outcome` | End state | `status` ∈ {completed, aborted, fallback} |\n| `signal` | Semantic counter (a transition that doesn't show up in traces) | `name` (fixed vocabulary) |\n| `heartbeat` | Records that \"observation ran\" (prevents misreading absent data as success) | — |\n\nFixed vocabulary (initial) for `signal.name`: `review.loop_iter` \u002F `review.deep_to_quick_fallback` \u002F `usage_guard.fail_open` \u002F `hitl.rejected` \u002F `loop.hit_cap`.\n\nprivacy: `repo_hash` is 12-digit hex (a sha256 prefix) only. The contract makes it impossible to write raw repo names, cwd, or raw PR numbers (`additionalProperties: false`).\n\n## Emit substrate (obs-emit.mjs)\n\n`obs-emit.mjs` (sibling, a CLI that runs on all adapters) is the build→validate→append write primitive. Both the trace-derivation hook and inline emit ultimately go through this to append a single event.\n\n```bash\n# Examples\nnode obs-emit.mjs --skill=drive  --event=outcome --status=completed\nnode obs-emit.mjs --skill=review --event=signal  --name=review.loop_iter --value=2\nnode obs-emit.mjs --skill=drive  --event=heartbeat\nnode obs-emit.mjs --skill=drive  --event=outcome --status=merged --repo=\"$(git rev-parse --show-toplevel)\"\n```\n\nArguments: `--skill` \u002F `--event` (effectively required), `--status` \u002F `--name` \u002F `--value` \u002F `--phase` \u002F `--operation` \u002F `--reason` \u002F `--run` (optional), `--repo` (hashed and stored in `repo_hash`), `--adapter` \u002F `--session` (resolved from env by default).\n\nAny event that fails validation, and any other failure, is **not appended — it warns and exits 0** (fail-open). Does not break callers chained with `&&`.\n\n## Trace-derivation hook (obs-derive.mjs)\n\n`obs-derive.mjs` (sibling, a SessionEnd hook) is the **primary capture path**. After a session ends, it reads the transcript, derives after the fact **which skill fired**, and records it via the obs-emit substrate. Because it reconstructs from traces rather than asking the model for a mid-run self-report, it avoids **self-report bias** (the worst-case runs that abort being exactly the ones that drop the emit).\n\nThe reliable core it derives:\n\n- One `heartbeat` per session (a record that \"observation ran.\" Makes an empty window distinguishable between \"zero invocations\" and \"the hook didn't fire\").\n- One `start` per skill invocation found in the transcript. 2 channels:\n  - A model-invoked `Skill` tool_use → `operation: invoke_agent`\n  - A user-entered `\u002Fslash-command` → `operation: slash_command` (**only for skills that actually exist**. Built-in commands with no sibling skill dir, such as `\u002Fclear` `\u002Fcompact`, are excluded to prevent data contamination)\n\nThe skill's arguments (which may be sensitive) are **not recorded** (only the skill name and channel).\n\n**Deferred (not derived by this hook)**: the merge\u002Fabort **outcome**. The merge state at session end is not yet settled — it requires session→PR linkage plus deferred re-evaluation, and abort inference (\"ended without a PR\") is hard to distinguish from a human interruption or an idempotent resume, and is noisy. To keep things reliable and low-noise, this is split off into a separate increment.\n\n### Enabling the SessionEnd hook (manual opt-in)\n\nThis repo does not distribute settings\u002Fhooks (same policy as the usage-guard hook). Add a SessionEnd entry to `~\u002F.claude\u002Fsettings.json` (or `settings.local.json`). `command` must be the **absolute path** to `obs-derive.mjs` (differs between user-scope `~\u002F.claude\u002Fskills\u002Fskill-observability\u002F...` and dogfood `\u003Crepo>\u002F.claude\u002Fskills\u002Fskill-observability\u002F...` — fill in your own path):\n\n```json\n{\n  \"hooks\": {\n    \"SessionEnd\": [\n      {\n        \"hooks\": [\n          { \"type\": \"command\", \"command\": \"node \u002Fhome\u002F\u003Cyou>\u002F.claude\u002Fskills\u002Fskill-observability\u002Fobs-derive.mjs\" }\n        ]\n      }\n    ]\n  }\n}\n```\n\nReceives the SessionEnd JSON on stdin (`session_id` \u002F `transcript_path` \u002F `cwd` \u002F `reason`), always exits 0, and stays lightweight (lines are pre-filtered by substring before `JSON.parse`).\n\n## Scope of application\n\nThis skill provides the **contract + emit substrate + trace-derivation hook (invocation capture)**. Layers built on top of this contract (capture → aggregate → reflect → consume):\n\n- **`\u002Fskill-metrics`** (aggregation, shipped): read-only aggregation of events.jsonl into counts + notable events.\n- **Reflection channel** (reflection, shipped): the metrics-primed version of `lessons-triage`. Privacy-cleansed rollups are reflected into a backlog-pointer issue via HITL (sending is opt-in).\n- **`backlog`** (consumption, shipped): passes that issue to `drive` as a priority index.\n- **outcome derivation** (separate PR, pending): folds merge\u002Fabort state into the rollup using `gh`\u002F`git` merge ground truth + session→PR linkage (the next increment of the trace-derivation hook).\n\n## Notes\n\n- Does not read `.env` files.\n- Events must not include verbatim logs, secrets, or raw private repo names\u002Fpaths\u002FPR values (the schema mechanically rejects these).\n",{"name":5,"adapters":30,"description":7,"user-invocable":47},"main","db212a47efe751fa1c42bd76e61dbfd8328e5b10",".agents\u002Fskills\u002Fskill-observability","https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills","https:\u002F\u002Fgithub.com\u002Fozzy-labs","2026-07-13 06:49:42",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add ozzy-labs\u002Fskills --skill skill-observability",{"tool":63,"command":64},"bunx","bunx skills add ozzy-labs\u002Fskills --skill skill-observability",{"tool":66,"command":67},"pnpm","pnpm dlx skills add ozzy-labs\u002Fskills --skill skill-observability","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fskill-observability\u002FSKILL.md",true,[71,77,83],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"event.schema.json","REFERENCE","参考文档",3360,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fskill-observability\u002Fevent.schema.json",{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"obs-derive.mjs","SCRIPT","脚本",8789,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fskill-observability\u002Fobs-derive.mjs",{"path":84,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":86},"obs-emit.mjs",10935,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fskill-observability\u002Fobs-emit.mjs",[88,114,139,160,167,189],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":46},"01M71J6R63H4E6ZE6KMDM4CT85","verify","An integrated skill that runs the combined validation of build \u002F typecheck \u002F test \u002F lint in one shot. The `verify.mjs` engine auto-discovers validation commands via a discovery chain (AGENTS.md's 「検証」 section → package.json scripts → justfile\u002FMakefile\u002Flefthook → language heuristics), executes them serially with their source attached, and returns a result summary. If a higher-priority stage produces a hit, only that stage is executed (no crossing stages).","https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fverify\u002FSKILL.md",[],[90,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113],"combined","heuristics","chain","repo","discovery","section","lefthook","only","auto","package","stage","Bash","one","lint","dry","engine","with","test","typecheck",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":46},"01M71J6JW7SAY9PDKAWHG3SJCR","usage-guard","Monitors Claude Code's Usage Limit (5-hour = Current \u002F weekly = Weekly), pauses work when it exceeds 95%, and automatically resumes once the reset restores headroom. Bundles an engine form that a caller such as drive Reads at a checkpoint, and a standalone form, `\u002Fusage-guard \"\u003Ccontinuation command>\"`, that guards arbitrary work. Claude-only (depends on the OAuth usage-rate endpoint + ScheduleWakeup).","https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fusage-guard\u002FSKILL.md",[],[121,122,123,124,125,102,126,127,35,128,129,130,131,132,133,134,135,136,137,138],"usage","usage guard","guard","weekly","standalone","guards","when","reset","work","command","at","rate","status","endpoint","as","continuation","form","limit",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":46},"01M71J6FRG119REA1G0S99Q4GZ","topics","Selects GitHub topic candidates by having the `topics.mjs` engine perform constraint validation, popularity measurement, broad+narrow \u002F singular-plural comparison, and hardcoded ozzy-labs conventions, then applies them via `gh repo edit --add-topic` following the policy's `externally-visible` gate (default batch-confirm). Scope is limited to use within ozzy-labs.","https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftopics\u002FSKILL.md",[],[141,45,146,98,147,148,149,150,151,152,153,106,154,155,156,109,110,157,158,159],"scope","policy","default","true","gh","plural","use","comparison","apply","candidate","batch","candidates","github","via",{"skillNo":161,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":166,"publishedAt":46},"01M71J6DC27P4FDSP10SDT2PSN","https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fskill-observability\u002FSKILL.md",[164,165],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},[29,28,45,44,43,42,41,40,39,38,37,36,34,33,32,31],{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":174,"publishedAt":46},"01M71J6AYECH1J94RAZ49QZ19Y","skill-metrics","Aggregates the local observability event log (~\u002F.agents\u002Fobservability\u002Fevents.jsonl) and presents, read-only, per-skill invocation counts and notable events (fallback \u002F HITL rejection \u002F loop cap reached \u002F abort). Fires on \"show me the skill metrics,\" \"aggregate the observability results,\" \"which skills get used the most?\" Does not send anything.","https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fskill-metrics\u002FSKILL.md",[173],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[175,176,29,177,178,179,180,181,41,182,183,184,185,149,102,37,186,106,187,188],"skill metrics","metrics","event log","which","show","get","read-only","iso","aggregates","send","local","show me","log","jsonl",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":195,"publishedAt":46},"01M71J68TD0QFATGW3BBZVCWA2","ship","Runs verification, commit, and PR creation all at once. An integrated pipeline that runs verify (build + type + test + lint) → commit → PR creation in sequence against the changes.","https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fship\u002FSKILL.md",[],[191,196,197,112,198,199,90,200,201,202,131,203,204,205,149,206,106,207,108],"type","verification","changes","pr","creation","build","pipeline","read","sequence","grep","pr creation","commit"]