[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71J40JSJ7R8FNBBDA5DNAZZ":3,"skill-same:01M71J40JSJ7R8FNBBDA5DNAZZ":122},{"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":17,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":13,"repositoryHtmlUrl":45,"repositoryHomepageUrl":6,"ownerHtmlUrl":46,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":47,"install":48,"resources":61},"01M71J40JSJ7R8FNBBDA5DNAZZ","review",null,"Reviews code changes or PRs across 11 perspectives, reporting via JSON structured output plus a human-readable report. Supports switching between quick and deep modes. Takes a PR number or working-tree diff as input.","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\u002Freview\u002FSKILL.md",[],[5,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"as","prs","modes","tree","number","reviews","quick","output","input","structured output","switching","deep","across","human","diff","perspectives","reporting","code","pr","2026-11-10 10:12:30",false,"---\nname: review\ndescription: Reviews code changes or PRs across 11 perspectives, reporting via JSON structured output plus a human-readable report. Supports switching between quick and deep modes. Takes a PR number or working-tree diff as input.\n---\n\n# review - Multi-perspective code review\n\nReviews the diff across 11 perspectives, classifies findings into Critical \u002F Warning \u002F Info, and reports them as JSON plus a human-readable report. It adopts the hybrid approach from [ADR-0025](https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fhandbook\u002Fblob\u002Fmain\u002Fadr\u002F0025-skills-review-multi-perspective.md) (quick: single agent \u002F deep: parallel per-perspective subagents).\n\nThe deterministic logic (perspective selection, duplicate merging, separating cross-perspective conflicts, grouping, generating the human-readable report + embedding `\u003C!-- review-json:v1 -->`) is handled by the bundled **`review.mjs` engine** ([ADR-0028](https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fhandbook\u002Fblob\u002Fmain\u002Fadr\u002F0028-skills-architecture-engine-judgment-policy-catalog.md) R1, prior examples `health-check.mjs` \u002F `usage-check.mjs` \u002F `skill-metrics.mjs`). This SKILL.md is limited to the judgment layer — **deciding perspectives from changed files (`review.mjs select`), producing findings per perspective (LLM judgment), and formatting + posting JSON + report via `review.mjs render`**. The perspective definitions (`perspectives\u002F\u003Caxis>.md`) and review-json Schema v1 are invariant.\n\n## Principles\n\n- **Only finding generation is LLM judgment:** the LLM that reads the code decides \"which perspective has what issue.\" The engine handles only the deterministic parts: selection (which perspectives to run) and aggregation\u002Fformatting (how to compile and present the findings).\n- **Internal representation is always JSON:** all findings are held as JSON; PR comments and stdout are converted to human-readable format via the engine's renderer.\n- **The engine never overrides severity:** severity determination follows the severity guide in the corresponding `perspectives\u002F\u003Caxis>.md`. Do not arbitrarily raise or lower severity across perspectives.\n\n## Input\n\n- **When a PR number is given** (`#N` or a bare number):\n  - Fetch the diff with `gh pr diff \u003CN>`, and the list of changed files with `gh pr diff \u003CN> --name-only`\n  - Fetch the PR description with `gh pr view \u003CN>`\n- **When no arguments are given:**\n  - Fetch working-tree changes with `git diff` (list of changed files via `git diff --name-only`)\n  - If there are no changes, fetch the branch diff with `git diff main...HEAD` (changed files via `git diff --name-only main...HEAD`)\n  - If there are still no changes, report that there is nothing to review and exit\n\n## Options\n\n- `--axes=\u003Caxis,...>`: Explicitly specify which perspectives to apply (overrides automatic selection; perspectives with `default_enabled: false` are only enabled when specified explicitly)\n- `--deep`: Run in deep mode (launches subagents in parallel per perspective. Claude Code environment only; other adapters fall back to quick)\n\n## Perspectives (11 axes)\n\nPerspective definitions use `perspectives\u002F\u003Caxis>.md` as the SSOT. The frontmatter declares `category` \u002F `applies_when` \u002F `skip_when` \u002F `default_enabled` \u002F inspection items \u002F severity guide \u002F `exit_criteria.drive_loop`.\n\n| category | axis | default |\n| --- | --- | --- |\n| required | correctness, security, conventions | Always applied |\n| design | architecture, compatibility, maintainability | When applies_when matches |\n| quality | testing, performance, observability | When applies_when matches |\n| ux | usability, documentation | When applies_when matches |\n\nThe perspective selection logic (`category: required` is always applied \u002F `default_enabled: false` is applied only when specified explicitly via `--axes` \u002F `skip_when.diff_only_in` is the highest-priority skip condition \u002F applied on an OR match of `applies_when`) is implemented in `review.mjs`, which deterministically returns the applicable perspectives given the frontmatter as input. The only key `skip_when` supports is `diff_only_in` (undefined keys are ignored, for forward-compat).\n\n## Procedure\n\n### 1. Determine applicable perspectives\n\nPass the list of changed files to `review.mjs select` and let it determine the applicable perspectives. The engine lives in **the same directory as this SKILL.md** (in Claude Code: `~\u002F.claude\u002Fskills\u002Freview\u002Freview.mjs`; for dogfooding: `\u003Crepo>\u002F.claude\u002Fskills\u002Freview\u002Freview.mjs`):\n\n```bash\n# 変更ファイル一覧（1 行 1 パス）を stdin で渡す\ngit diff --name-only | node \u003Cこの skill のディレクトリ>\u002Freview.mjs select [--axes=\u003Ca,b>]\n```\n\nThe engine formats and prints an `適用観点 (n\u002F11):` block to stdout. **Present that output as-is** (do not reformat it). If you need a machine-readable perspective list, use `--json` (`{ axesApplied, byCategory, unknownAxes, total }`). Passing `--axes` overrides the selection and applies only those perspectives (including ones with `default_enabled: false`).\n\n### 2. Generate findings (LLM judgment)\n\nFor each applicable perspective, review the diff according to the inspection items and severity guide in the corresponding `perspectives\u002F\u003Caxis>.md`, and produce findings. **Only this step is LLM judgment**; it is not scripted.\n\nPush each finding into the internal JSON in the following shape: `{ axis, severity (\"critical\"|\"warning\"|\"info\"), file, line, issue, why, suggestion }`. Fundamental trade-offs (e.g. security ↔ DX, observability ↔ performance) are not recorded as findings; push them into the `conflicts` array (`{ axes, file, line, description }`) instead (without a severity, leaving the decision to the reader).\n\n#### quick mode (default)\n\nA single agent scans the applicable perspectives in order, adding findings to the internal JSON buffer per perspective.\n\n#### deep mode (`--deep`)\n\nLaunch an independent worker (a unit of parallel execution) for each perspective; each worker reads the corresponding `perspectives\u002F\u003Caxis>.md` and returns findings as JSON. On hosts that cannot run in parallel, evaluating each perspective independently in series produces an equivalent result. Input format for the worker:\n\n```text\naxis: \u003Caxis-name>\nmode: deep\ncontext:\n  base: \u003Cbase-ref>\n  head: \u003Chead-ref>\n  pr_number: \u003CN (optional)>\n\n\u003Cdiff>\n```\n\nThe worker should be self-contained — reading the perspective MD and producing JSON output only (it does not call other skills). The mechanism for launching deep mode in parallel is host-dependent (Claude Code: see \"Parallel launch in deep mode\" in `SKILL.claude-code.md`). Adapters without a parallel execution mechanism fall back to quick. As described below, aggregation happens **in the engine after the worker returns** (do not add an aggregation agent inside the workflow).\n\n### 3. Aggregation + report output\n\nAssemble the generated findings (and conflicts) into JSON of the shape `{ mode, axes_applied, findings, conflicts }`, and pass it to `review.mjs render`. The engine performs duplicate merging (merging identical `file:line:issue` entries into one and noting `axes_merged`), summary calculation (by_axis \u002F total), grouping by perspective → severity → file, human-readable report generation, and embedding `\u003C!-- review-json:v1 -->`:\n\n```bash\n# findings JSON を stdin で渡す（--input=\u003Cfile> でも可）\nprintf '%s' \"$FINDINGS_JSON\" | node \u003Cこの skill のディレクトリ>\u002Freview.mjs render\n```\n\nPresent and post the engine's stdout (the human-readable report plus the trailing JSON embed) **as-is**. For a PR review, comment on the PR with `gh pr comment \u003CN> --body \"\u003Creport>\"`. Use `--json` to extract only the embedded Schema v1 JSON.\n\n## review-json Schema v1 (contract, invariant)\n\nThe JSON the engine embeds has the following shape ([ADR-0025](https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fhandbook\u002Fblob\u002Fmain\u002Fadr\u002F0025-skills-review-multi-perspective.md) Schema v1; drive re-reads this to evaluate the per-perspective `exit_criteria.drive_loop`):\n\n```json\n{\n  \"version\": \"1\",\n  \"mode\": \"quick\",\n  \"axes_applied\": [\"security\", \"correctness\", \"...\"],\n  \"findings\": [\n    {\n      \"axis\": \"security\",\n      \"severity\": \"warning\",\n      \"file\": \"src\u002Fx.ts\",\n      \"line\": 42,\n      \"issue\": \"...\",\n      \"why\": \"...\",\n      \"suggestion\": \"...\",\n      \"axes_merged\": [\"security\", \"correctness\"]\n    }\n  ],\n  \"conflicts\": [\n    { \"axes\": [\"security\", \"usability\"], \"file\": \"src\u002Fy.ts\", \"line\": 10, \"description\": \"...\" }\n  ],\n  \"summary\": {\n    \"by_axis\": { \"security\": { \"critical\": 0, \"warning\": 1, \"info\": 0 } },\n    \"total\": { \"critical\": 0, \"warning\": 1, \"info\": 3 }\n  }\n}\n```\n\n`axes_merged` and `conflicts` are optional fields (the engine adds them only when there is duplicate merging or a cross-perspective conflict).\n\n### Version migration policy\n\n- `version` is a monotonically increasing integer (as a string). This ADR establishes `\"1\"`\n- The reader side (e.g. drive) performs machine judgment only when `version` matches the current code's supported upper bound\n- An unsupported version fails soft as `unknown_review_version`, ignoring the JSON and handling only the human-readable part\n- Breaking changes bump `version`, and readers keep an implementation that can read at least down to N-1. **When changing Schema v1, revise the engine (`review.mjs`), this SKILL.md, and drive's re-read logic together**\n\n## Compatibility with past PR comments (resume)\n\nComments drive posted in the past may not have a JSON embed. The reader handles these as follows:\n\n- A comment containing `\u003C!-- review-json:v1 ... -->` → parse the JSON and do machine judgment\n- A comment with no JSON → treated as a **legacy comment** and ignored as a trigger for a new review pass (past comments are not deleted)\n- `\u003C!-- review-json:v\u003Cunknown> ... -->` → ignored as `unknown_review_version` (fail-soft)\n\n## Notes\n\n- When reporting even a single `Critical`, show clear grounds for adverse impact (a bug, vulnerability, etc.)\n- Severity determination for a perspective follows the severity guide in the corresponding `perspectives\u002F\u003Caxis>.md`. Do not arbitrarily raise or lower severity across perspectives\n- deep mode consumes tokens proportional to (number of perspectives × parallelism). In drive's orchestration mode, it forcibly falls back to quick (cost management)\n- `Info` is suggestion-only. drive's review loop does not treat `Info` as something to fix\n","# review - Multi-perspective code review\n\nReviews the diff across 11 perspectives, classifies findings into Critical \u002F Warning \u002F Info, and reports them as JSON plus a human-readable report. It adopts the hybrid approach from [ADR-0025](https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fhandbook\u002Fblob\u002Fmain\u002Fadr\u002F0025-skills-review-multi-perspective.md) (quick: single agent \u002F deep: parallel per-perspective subagents).\n\nThe deterministic logic (perspective selection, duplicate merging, separating cross-perspective conflicts, grouping, generating the human-readable report + embedding `\u003C!-- review-json:v1 -->`) is handled by the bundled **`review.mjs` engine** ([ADR-0028](https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fhandbook\u002Fblob\u002Fmain\u002Fadr\u002F0028-skills-architecture-engine-judgment-policy-catalog.md) R1, prior examples `health-check.mjs` \u002F `usage-check.mjs` \u002F `skill-metrics.mjs`). This SKILL.md is limited to the judgment layer — **deciding perspectives from changed files (`review.mjs select`), producing findings per perspective (LLM judgment), and formatting + posting JSON + report via `review.mjs render`**. The perspective definitions (`perspectives\u002F\u003Caxis>.md`) and review-json Schema v1 are invariant.\n\n## Principles\n\n- **Only finding generation is LLM judgment:** the LLM that reads the code decides \"which perspective has what issue.\" The engine handles only the deterministic parts: selection (which perspectives to run) and aggregation\u002Fformatting (how to compile and present the findings).\n- **Internal representation is always JSON:** all findings are held as JSON; PR comments and stdout are converted to human-readable format via the engine's renderer.\n- **The engine never overrides severity:** severity determination follows the severity guide in the corresponding `perspectives\u002F\u003Caxis>.md`. Do not arbitrarily raise or lower severity across perspectives.\n\n## Input\n\n- **When a PR number is given** (`#N` or a bare number):\n  - Fetch the diff with `gh pr diff \u003CN>`, and the list of changed files with `gh pr diff \u003CN> --name-only`\n  - Fetch the PR description with `gh pr view \u003CN>`\n- **When no arguments are given:**\n  - Fetch working-tree changes with `git diff` (list of changed files via `git diff --name-only`)\n  - If there are no changes, fetch the branch diff with `git diff main...HEAD` (changed files via `git diff --name-only main...HEAD`)\n  - If there are still no changes, report that there is nothing to review and exit\n\n## Options\n\n- `--axes=\u003Caxis,...>`: Explicitly specify which perspectives to apply (overrides automatic selection; perspectives with `default_enabled: false` are only enabled when specified explicitly)\n- `--deep`: Run in deep mode (launches subagents in parallel per perspective. Claude Code environment only; other adapters fall back to quick)\n\n## Perspectives (11 axes)\n\nPerspective definitions use `perspectives\u002F\u003Caxis>.md` as the SSOT. The frontmatter declares `category` \u002F `applies_when` \u002F `skip_when` \u002F `default_enabled` \u002F inspection items \u002F severity guide \u002F `exit_criteria.drive_loop`.\n\n| category | axis | default |\n| --- | --- | --- |\n| required | correctness, security, conventions | Always applied |\n| design | architecture, compatibility, maintainability | When applies_when matches |\n| quality | testing, performance, observability | When applies_when matches |\n| ux | usability, documentation | When applies_when matches |\n\nThe perspective selection logic (`category: required` is always applied \u002F `default_enabled: false` is applied only when specified explicitly via `--axes` \u002F `skip_when.diff_only_in` is the highest-priority skip condition \u002F applied on an OR match of `applies_when`) is implemented in `review.mjs`, which deterministically returns the applicable perspectives given the frontmatter as input. The only key `skip_when` supports is `diff_only_in` (undefined keys are ignored, for forward-compat).\n\n## Procedure\n\n### 1. Determine applicable perspectives\n\nPass the list of changed files to `review.mjs select` and let it determine the applicable perspectives. The engine lives in **the same directory as this SKILL.md** (in Claude Code: `~\u002F.claude\u002Fskills\u002Freview\u002Freview.mjs`; for dogfooding: `\u003Crepo>\u002F.claude\u002Fskills\u002Freview\u002Freview.mjs`):\n\n```bash\n# 変更ファイル一覧（1 行 1 パス）を stdin で渡す\ngit diff --name-only | node \u003Cこの skill のディレクトリ>\u002Freview.mjs select [--axes=\u003Ca,b>]\n```\n\nThe engine formats and prints an `適用観点 (n\u002F11):` block to stdout. **Present that output as-is** (do not reformat it). If you need a machine-readable perspective list, use `--json` (`{ axesApplied, byCategory, unknownAxes, total }`). Passing `--axes` overrides the selection and applies only those perspectives (including ones with `default_enabled: false`).\n\n### 2. Generate findings (LLM judgment)\n\nFor each applicable perspective, review the diff according to the inspection items and severity guide in the corresponding `perspectives\u002F\u003Caxis>.md`, and produce findings. **Only this step is LLM judgment**; it is not scripted.\n\nPush each finding into the internal JSON in the following shape: `{ axis, severity (\"critical\"|\"warning\"|\"info\"), file, line, issue, why, suggestion }`. Fundamental trade-offs (e.g. security ↔ DX, observability ↔ performance) are not recorded as findings; push them into the `conflicts` array (`{ axes, file, line, description }`) instead (without a severity, leaving the decision to the reader).\n\n#### quick mode (default)\n\nA single agent scans the applicable perspectives in order, adding findings to the internal JSON buffer per perspective.\n\n#### deep mode (`--deep`)\n\nLaunch an independent worker (a unit of parallel execution) for each perspective; each worker reads the corresponding `perspectives\u002F\u003Caxis>.md` and returns findings as JSON. On hosts that cannot run in parallel, evaluating each perspective independently in series produces an equivalent result. Input format for the worker:\n\n```text\naxis: \u003Caxis-name>\nmode: deep\ncontext:\n  base: \u003Cbase-ref>\n  head: \u003Chead-ref>\n  pr_number: \u003CN (optional)>\n\n\u003Cdiff>\n```\n\nThe worker should be self-contained — reading the perspective MD and producing JSON output only (it does not call other skills). The mechanism for launching deep mode in parallel is host-dependent (Claude Code: see \"Parallel launch in deep mode\" in `SKILL.claude-code.md`). Adapters without a parallel execution mechanism fall back to quick. As described below, aggregation happens **in the engine after the worker returns** (do not add an aggregation agent inside the workflow).\n\n### 3. Aggregation + report output\n\nAssemble the generated findings (and conflicts) into JSON of the shape `{ mode, axes_applied, findings, conflicts }`, and pass it to `review.mjs render`. The engine performs duplicate merging (merging identical `file:line:issue` entries into one and noting `axes_merged`), summary calculation (by_axis \u002F total), grouping by perspective → severity → file, human-readable report generation, and embedding `\u003C!-- review-json:v1 -->`:\n\n```bash\n# findings JSON を stdin で渡す（--input=\u003Cfile> でも可）\nprintf '%s' \"$FINDINGS_JSON\" | node \u003Cこの skill のディレクトリ>\u002Freview.mjs render\n```\n\nPresent and post the engine's stdout (the human-readable report plus the trailing JSON embed) **as-is**. For a PR review, comment on the PR with `gh pr comment \u003CN> --body \"\u003Creport>\"`. Use `--json` to extract only the embedded Schema v1 JSON.\n\n## review-json Schema v1 (contract, invariant)\n\nThe JSON the engine embeds has the following shape ([ADR-0025](https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fhandbook\u002Fblob\u002Fmain\u002Fadr\u002F0025-skills-review-multi-perspective.md) Schema v1; drive re-reads this to evaluate the per-perspective `exit_criteria.drive_loop`):\n\n```json\n{\n  \"version\": \"1\",\n  \"mode\": \"quick\",\n  \"axes_applied\": [\"security\", \"correctness\", \"...\"],\n  \"findings\": [\n    {\n      \"axis\": \"security\",\n      \"severity\": \"warning\",\n      \"file\": \"src\u002Fx.ts\",\n      \"line\": 42,\n      \"issue\": \"...\",\n      \"why\": \"...\",\n      \"suggestion\": \"...\",\n      \"axes_merged\": [\"security\", \"correctness\"]\n    }\n  ],\n  \"conflicts\": [\n    { \"axes\": [\"security\", \"usability\"], \"file\": \"src\u002Fy.ts\", \"line\": 10, \"description\": \"...\" }\n  ],\n  \"summary\": {\n    \"by_axis\": { \"security\": { \"critical\": 0, \"warning\": 1, \"info\": 0 } },\n    \"total\": { \"critical\": 0, \"warning\": 1, \"info\": 3 }\n  }\n}\n```\n\n`axes_merged` and `conflicts` are optional fields (the engine adds them only when there is duplicate merging or a cross-perspective conflict).\n\n### Version migration policy\n\n- `version` is a monotonically increasing integer (as a string). This ADR establishes `\"1\"`\n- The reader side (e.g. drive) performs machine judgment only when `version` matches the current code's supported upper bound\n- An unsupported version fails soft as `unknown_review_version`, ignoring the JSON and handling only the human-readable part\n- Breaking changes bump `version`, and readers keep an implementation that can read at least down to N-1. **When changing Schema v1, revise the engine (`review.mjs`), this SKILL.md, and drive's re-read logic together**\n\n## Compatibility with past PR comments (resume)\n\nComments drive posted in the past may not have a JSON embed. The reader handles these as follows:\n\n- A comment containing `\u003C!-- review-json:v1 ... -->` → parse the JSON and do machine judgment\n- A comment with no JSON → treated as a **legacy comment** and ignored as a trigger for a new review pass (past comments are not deleted)\n- `\u003C!-- review-json:v\u003Cunknown> ... -->` → ignored as `unknown_review_version` (fail-soft)\n\n## Notes\n\n- When reporting even a single `Critical`, show clear grounds for adverse impact (a bug, vulnerability, etc.)\n- Severity determination for a perspective follows the severity guide in the corresponding `perspectives\u002F\u003Caxis>.md`. Do not arbitrarily raise or lower severity across perspectives\n- deep mode consumes tokens proportional to (number of perspectives × parallelism). In drive's orchestration mode, it forcibly falls back to quick (cost management)\n- `Info` is suggestion-only. drive's review loop does not treat `Info` as something to fix\n",{"name":5,"description":7},"main","db212a47efe751fa1c42bd76e61dbfd8328e5b10",".agents\u002Fskills\u002Freview","https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills","https:\u002F\u002Fgithub.com\u002Fozzy-labs","2026-07-13 06:49:42",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add ozzy-labs\u002Fskills --skill review",{"tool":54,"command":55},"bunx","bunx skills add ozzy-labs\u002Fskills --skill review",{"tool":57,"command":58},"pnpm","pnpm dlx skills add ozzy-labs\u002Fskills --skill review","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002FSKILL.md",true,[62,68,72,76,80,84,88,92,96,100,104,108,112,118],{"path":63,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":66,"sourceHtmlUrl":67},"perspectives\u002Farchitecture.md","REFERENCE","参考文档",2348,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Farchitecture.md",{"path":69,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":70,"sourceHtmlUrl":71},"perspectives\u002Fcompatibility.md",2209,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Fcompatibility.md",{"path":73,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":74,"sourceHtmlUrl":75},"perspectives\u002Fconventions.md",2030,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Fconventions.md",{"path":77,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":78,"sourceHtmlUrl":79},"perspectives\u002Fcorrectness.md",1900,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Fcorrectness.md",{"path":81,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":82,"sourceHtmlUrl":83},"perspectives\u002Fdocumentation.md",2190,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Fdocumentation.md",{"path":85,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":86,"sourceHtmlUrl":87},"perspectives\u002Fmaintainability.md",2081,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Fmaintainability.md",{"path":89,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":90,"sourceHtmlUrl":91},"perspectives\u002Fobservability.md",2131,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Fobservability.md",{"path":93,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":94,"sourceHtmlUrl":95},"perspectives\u002Fperformance.md",2089,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Fperformance.md",{"path":97,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":98,"sourceHtmlUrl":99},"perspectives\u002FREADME.md",3650,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002FREADME.md",{"path":101,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":102,"sourceHtmlUrl":103},"perspectives\u002Fsecurity.md",2084,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Fsecurity.md",{"path":105,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":106,"sourceHtmlUrl":107},"perspectives\u002Ftesting.md",2171,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Ftesting.md",{"path":109,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":110,"sourceHtmlUrl":111},"perspectives\u002Fusability.md",2279,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Fperspectives\u002Fusability.md",{"path":113,"resourceType":114,"resourceTypeDesc":115,"sizeBytes":116,"sourceHtmlUrl":117},"review.mjs","SCRIPT","脚本",18926,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002Freview.mjs",{"path":119,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":120,"sourceHtmlUrl":121},"SKILL.claude-code.md",3176,"https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview\u002FSKILL.claude-code.md",[123,149,173,195,227,249],{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":37},"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",[],[125,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"combined","heuristics","chain","repo","discovery","section","lefthook","only","auto","package","stage","Bash","one","lint","dry","engine","with","test","typecheck",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":37},"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",[],[156,157,158,159,160,137,161,162,35,163,164,165,166,167,168,169,18,170,171,172],"usage","usage guard","guard","weekly","standalone","guards","when","reset","work","command","at","rate","status","endpoint","continuation","form","limit",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":179,"publishedAt":37},"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",[],[175,180,181,133,182,183,184,185,186,187,188,141,189,190,191,144,145,192,193,194],"measurement","scope","policy","default","true","gh","plural","use","comparison","apply","candidate","batch","candidates","github","via",{"skillNo":196,"name":197,"nameZh":6,"description":198,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":211,"publishedAt":37},"01M71J6DC27P4FDSP10SDT2PSN","skill-observability","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.","https:\u002F\u002Fgithub.com\u002Fozzy-labs\u002Fskills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fskill-observability\u002FSKILL.md",[201,206],{"categoryNo":202,"categoryName":203,"taxonomyType":204,"taxonomyTypeDesc":205},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":207,"categoryName":208,"taxonomyType":209,"taxonomyTypeDesc":210},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[212,213,180,214,215,216,217,218,219,220,221,222,223,224,225,226],"observability","skill observability","improvement","skill improvement","for","event","hooks","contract","schema","loop","false","substrate","json","improvement loop","layer",{"skillNo":228,"name":229,"nameZh":6,"description":230,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":231,"categories":232,"keywords":234,"publishedAt":37},"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",[233],{"categoryNo":202,"categoryName":203,"taxonomyType":204,"taxonomyTypeDesc":205},[235,236,212,237,238,239,240,241,217,242,243,244,245,184,137,221,246,141,247,248],"skill metrics","metrics","event log","which","show","get","read-only","iso","aggregates","send","local","show me","log","jsonl",{"skillNo":250,"name":251,"nameZh":6,"description":252,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":253,"categories":254,"keywords":255,"publishedAt":37},"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",[],[251,256,257,147,258,36,125,259,260,261,166,262,263,264,184,265,141,266,143],"type","verification","changes","creation","build","pipeline","read","sequence","grep","pr creation","commit"]