[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BVHTTDAY7CYFMFR0HZX1YJ":3,"skill-same:01M6BVHTTDAY7CYFMFR0HZX1YJ":107},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":6,"ownerHtmlUrl":59,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":60,"install":61,"resources":74},"01M6BVHTTDAY7CYFMFR0HZX1YJ","pr-review",null,"Claude-side pre-PR review gate. Resolves the branch's base ref (gh PR view or explicit --base), pins an authoritative diff packet, then launches the pr-review dynamic workflow (~\u002F.claude\u002Fworkflows\u002Fpr-review.js) which fans out up to 8 review specialists (code-reviewer, security-reviewer, adversarial-reviewer, pr-test-analyzer, comment-analyzer, silent-failure-hunter, type-design-analyzer, code-simplifier), fails closed on coverage, and verifies Critical\u002FImportant findings. Use before creating a pull request as a quality gate for thick changes — especially where the Codex CLI `$pr-review` skill is unavailable. Triggers: \"pre-PR review\", \"PR 前レビュー\", \"レビュー gate を回して\", \"run the pr-review gate\".","toku345\u002Fdotfiles","toku345","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F3142849?v=4","01M6BVHFC948X4EGTFPQF53G6Q","Fumitaka Tokumitsu","01M6BVHFGV7PA8A2QHR2H8YWMX",1,"MIT","https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_claude\u002Fskills\u002Fpr-review\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,5,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"review","pr review","pr","request","design","which","critical","up","coverage","branch","reviewer","gh pr","js","pull","code","run","pull request","quality gate","codex cli","workflows","test","workflow","security","codex","cli","2026-11-10 10:12:30",false,"---\nname: pr-review\ndescription: >\n  Claude-side pre-PR review gate. Resolves the branch's base ref (gh PR view or explicit\n  --base), pins an authoritative diff packet, then launches the pr-review dynamic workflow\n  (~\u002F.claude\u002Fworkflows\u002Fpr-review.js) which fans out up to 8 review specialists\n  (code-reviewer, security-reviewer, adversarial-reviewer, pr-test-analyzer,\n  comment-analyzer, silent-failure-hunter, type-design-analyzer, code-simplifier),\n  fails closed on coverage, and verifies Critical\u002FImportant findings. Use before creating\n  a pull request as a quality gate for thick changes — especially where the Codex CLI\n  `$pr-review` skill is unavailable. Triggers: \"pre-PR review\", \"PR 前レビュー\",\n  \"レビュー gate を回して\", \"run the pr-review gate\".\n---\n\n# pr-review (Claude-side)\n\n## Goal\n\nRun a comprehensive specialist review of the current branch's committed changes against its base, then render a single actionable report. This is the Claude Code counterpart of the Codex `$pr-review` skill for environments where Codex is unavailable; both share one gate policy (`references\u002Freview-criteria.md`) and one severity table (`references\u002Fseverity-rules.json`). Design: `docs\u002Fdesign\u002Fclaude-pr-review.md` (dotfiles repo), decision: ADR 0029.\n\n## Architecture note (read first)\n\n`gh` does NOT work inside workflow subagents (sandbox-pinned). Everything that needs `gh` or `dangerouslyDisableSandbox` happens HERE in the main session (Preconditions + Collect). The workflow receives all of it as `args` and uses only `git`. Do not move base resolution into the workflow.\n\n## Preconditions\n\nRun these in order. If any fails, abort with the indicated error; do not launch the workflow.\n\nDo not change repository or git state to make a failing precondition pass: no `git stash` or commit on the user's behalf, no `.gitignore` \u002F `.git\u002Finfo\u002Fexclude` \u002F `git update-index --assume-unchanged` \u002F `--skip-worktree` edits, no deleting untracked files. Report the failing state and stop; the user decides how to resolve it. The ref updates that **Base ref resolution** itself prescribes (`git fetch` writing `FETCH_HEAD`, `git remote set-head origin --auto`) are part of the procedure, not a workaround, and stay allowed.\n\n1. **Workflow tool available** — This gate runs entirely inside `~\u002F.claude\u002Fworkflows\u002Fpr-review.js`. Treat the `Workflow` tool as available if it is callable: it appears in your tool list, or `ToolSearch(\"select:Workflow\")` returns its schema. Abort only when neither holds:\n   > \"`Workflow` is not exposed in this session, so the gate cannot run. On the Pro plan dynamic workflows are off by default — turn them on from the **Dynamic workflows** row in `\u002Fconfig`, then start a new session (`disableWorkflows` in a settings file and `CLAUDE_CODE_DISABLE_WORKFLOWS` also switch them off). Otherwise run the Codex CLI `$pr-review` from a terminal (not from inside Claude Code — nested-bwrap). Do not substitute a manual `Agent` fan-out of the specialists: that drops the workflow's coverage echo gate and severity normalization, reintroducing exactly the partial-coverage-reported-as-full outcome this gate exists to prevent.\"\n\n   This check comes first because everything below it — `gh pr view` and `git fetch` under `dangerouslyDisableSandbox`, the diff packet, the reference sentinels — is wasted work on a run that cannot reach the workflow.\n\n   Second check — **no project-scoped workflow shadows the gate.** The Workflow tool resolves the name `pr-review` by each script's `meta.name`: it registers user scope `~\u002F.claude\u002Fworkflows\u002F` first, then lets any parseable project-scope `.claude\u002Fworkflows\u002F` script with the same name override it. A project copy would run in place of this gate, and the render-side `argsContract` check cannot tell them apart. The check matches the fixed string `pr-review` anywhere in any file under those directories. That catches the plain spellings (quoted key, backtick value, any extension, subdirectory, symlinked file), but a name written with string escapes such as `'pr\\x2dreview'` or assembled at runtime such as `'pr-' + 'review'` evades it. The check exists to catch an accidentally placed same-name workflow. It is not a defense against a hostile branch under review, which can also steer the specialists through the diff content itself. Run this block verbatim. It is glob-free, starts from the physical path because `git rev-parse --show-toplevel` resolves symlinks while `$PWD` does not, and fails closed when a directory or file cannot be read:\n\n   ```sh\n   top=$(git rev-parse --show-toplevel) || exit 1\n   d=$(pwd -P)\n   while :; do\n     if [ -d \"$d\u002F.claude\" ] && [ ! -x \"$d\u002F.claude\" ]; then\n       echo \"ABORT: cannot search $d\u002F.claude for project workflows\" >&2; exit 1\n     fi\n     if [ -e \"$d\u002F.claude\u002Fworkflows\" ]; then\n       find -L \"$d\u002F.claude\u002Fworkflows\" -type f -exec sh -c '\n         for f do\n           LC_ALL=C grep -qF pr-review \"$f\"\n           case $? in\n             0) echo \"$f\" ;;\n             1) ;;\n             *) echo \"ERROR: cannot read $f\" >&2; exit 2 ;;\n           esac\n         done\n       ' sh {} + || { echo \"ABORT: shadowing check failed under $d\u002F.claude\u002Fworkflows\" >&2; exit 1; }\n     fi\n     [ \"$d\" = \"$top\" ] && break\n     [ \"$d\" = \u002F ] && break\n     d=$(dirname \"$d\")\n   done\n   ```\n\n   If the block exits non-zero, abort with its stderr. If it prints any path, abort with:\n   > \"A project-scoped `.claude\u002Fworkflows\u002F` file mentions `pr-review` (\u003Cprinted paths>); a script declaring that name would override the user-scope gate. Remove, rename, or move it out of `.claude\u002Fworkflows\u002F`, then retry.\"\n\n2. **Clean worktree** — Run `git status --porcelain --untracked-files=normal`. If the command fails, abort with its output. If output is non-empty, abort with:\n   > \"Worktree has uncommitted changes: \u003Clist>. The review covers committed branch diff only; uncommitted changes would be silently excluded. Commit or stash first, then retry.\"\n\n   Sandbox caveat: in repos whose tracked names collide with sandbox baseline denies (e.g. a chezmoi source dir), sandboxed `git status` reports ghost char-special entries (`crw-rw-rw- nobody nogroup 1, 3` under `ls -la`) as untracked. Verify with `ls -la | grep '^c'` and re-run the status check outside the sandbox before trusting a non-empty result.\n\n3. **Base ref resolution** — Determine `$BASE` from one of three sources, in priority order:\n   - (a) **Explicit base** from the user prompt (e.g. `--base develop`, \"review against develop\"): use it verbatim and skip `gh`. If it matches a full 40-character hexadecimal commit OID (the same shape the workflow's args validation requires), set `$BASE_REF` to it. Otherwise validate it as a branch name (`git check-ref-format --branch \"$BASE\"`; reject leading `-`\u002F`+`, `:`, or other refspec separators), run `git fetch --quiet origin \"refs\u002Fheads\u002F$BASE\"` (abort on failure), set `$BASE_REF=FETCH_HEAD`, and resolve `$BASE_COMMIT` immediately.\n   - (b) **`--allow-no-pr`** in the prompt: skip `gh`. Run `git fetch --quiet origin` and `git remote set-head origin --auto` (abort if either fails), then `git symbolic-ref --quiet --short refs\u002Fremotes\u002Forigin\u002FHEAD` (abort if it fails or is empty). Strip `origin\u002F` for `$BASE`, keep the full `origin\u002F\u003Cbranch>` as `$BASE_REF`, and add a `**Degraded coverage**: no PR base, fell back to default branch` line to the final report.\n   - (c) **Open PR**: run `gh pr view --json baseRefName,baseRefOid --jq '[.baseRefName,.baseRefOid] | @tsv'`. `gh` typically needs `dangerouslyDisableSandbox: true` (macOS Seatbelt \u002F hosts.yml restrictions). If it fails with a real credential error, abort with \"Run `gh auth login` and retry.\" Only an explicit \"no pull request found\" result is the no-PR case; any other failure aborts loudly. On success: validate the branch name with the same rules as (a), `git fetch --quiet origin \"refs\u002Fheads\u002F$BASE\"` (abort on failure), verify `FETCH_HEAD^{commit}` equals the returned `baseRefOid` exactly (abort with both OIDs if not), then set `$BASE_REF=FETCH_HEAD`.\n\n   If none of (a)–(c) yields a base, abort with:\n   > \"No PR found for the current branch and no explicit base provided. Create a draft PR first (so the review pins the PR's base ref), provide an explicit base, or pass `--allow-no-pr` to fall back to the default branch (residual scope-divergence risk acknowledged).\"\n\n4. **Pin the base commit** — `BASE_COMMIT=$(git rev-parse --verify \"$BASE_REF^{commit}\")` immediately after assigning `$BASE_REF`; record the exact output. Abort on failure.\n\n## Collect (main session)\n\n1. `HEAD_REF=$(git rev-parse HEAD)` — record it.\n2. **Empty diff check + changed files**: run `git diff --name-only \"$BASE_COMMIT...$HEAD_REF\"` and record the output as `changedFiles` (one path per array element — this main-session list is the authoritative specialist-routing input; the workflow refuses to re-derive it from an agent echo). If empty, run the Final guard below, then report `No committed changes relative to \u003Cbase>; nothing to review.` and stop.\n3. **Diff packet**: `diff_packet=$(mktemp \"${TMPDIR:-\u002Ftmp}\u002Fpr-review-diff.XXXXXX\")` (suffix-free template — suffixed templates collide on BSD mktemp), then `git diff \"$BASE_COMMIT...$HEAD_REF\" > \"$diff_packet\"`. Record byte count (`wc -c`) and SHA-256 (`sha256sum` \u002F `shasum -a 256`). Abort if any step fails. The packet is authoritative for all specialists.\n4. **Deterministic routing flags** (grep floor — the workflow OR-composes these with the categorizer agent's semantic judgment, so an agent false negative can never narrow the specialist fan-out; grep false positives only widen it, which is the safe direction). The patterns live in a deployed script so they run identically every time and are covered by `tests\u002Fbats\u002Ftest_pr_review_routing_flags.bats`:\n\n   ```sh\n   sh ~\u002F.claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Frouting-flags.sh \"$BASE_COMMIT\" \"$HEAD_REF\"\n   ```\n\n   Require exit 0 and stdout exactly one line matching `commentChanges=(true|false) typeChanges=(true|false)`; record both booleans from it. Do not compute or guess the flags any other way. On any other outcome, abort with:\n   > \"Routing-flag script failed at ~\u002F.claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Frouting-flags.sh: \u003Cexit code, stdout, stderr verbatim>. If the file is missing or its output format differs, run `chezmoi apply -v`, then retry.\"\n\n5. **Shared references** (deploy-skew defense — file existence alone is not enough):\n   - Read `~\u002F.claude\u002Fskills\u002Fpr-review\u002Freferences\u002Freview-criteria.md` and verify it contains the sentinel `PR_REVIEW_CRITERIA_SHARED_V1`. Keep the full contents as `criteria`.\n   - Read `~\u002F.claude\u002Fskills\u002Fpr-review\u002Freferences\u002Fseverity-rules.json`, parse it as JSON, and verify `sentinel == \"PR_REVIEW_SEVERITY_RULES_V1\"` and `version == 1`. Keep the parsed object as `severityRules`.\n   - If either check fails, abort with:\n     > \"Shared gate policy missing or stale at ~\u002F.claude\u002Fskills\u002Fpr-review\u002Freferences\u002F. Run `chezmoi apply -v` to redeploy, then retry.\"\n   - Run `python3 ~\u002F.claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Fvalidate_finding_evidence.py --help`. If it does not exit 0, abort with:\n     > \"Evidence validator missing or not runnable at ~\u002F.claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Fvalidate_finding_evidence.py (needs python3). Run `chezmoi apply -v` to redeploy, then retry.\"\n\n     The gate cannot finish without it (see **Validate verifier evidence**), so a missing validator fails here instead of after a full review.\n\n## Launch the workflow\n\nInvoke the Workflow tool by the predefined workflow's `name` parameter. chezmoi deploys the script at `~\u002F.claude\u002Fworkflows\u002Fpr-review.js`, and the tool resolves it from its `meta.name`. Do not pass a script path: the tool's `scriptPath` parameter only accepts paths inside the working directory or an added directory, so the deployed file is rejected there (accepted on Claude Code 2.1.247, rejected from 2.1.259 on). Pass every value as real JSON (objects\u002Farrays, not JSON-encoded strings):\n\n```\nWorkflow({\n  name: \"pr-review\",\n  args: {\n    base: \"\u003C$BASE>\",\n    baseCommit: \"\u003C$BASE_COMMIT>\",\n    headRef: \"\u003C$HEAD_REF>\",\n    packetPath: \"\u003C$diff_packet>\",\n    packetBytes: \u003Cbyte count>,\n    packetSha: \"\u003Csha256>\",\n    changedFiles: [\"\u003Cpath>\", ...],\n    commentChanges: \u003Cboolean from the Collect grep floor>,\n    typeChanges: \u003Cboolean from the Collect grep floor>,\n    criteria: \"\u003Ccontents of review-criteria.md>\",\n    severityRules: \u003Cparsed severity-rules.json object>\n  }\n})\n```\n\nIf the Workflow tool itself refuses the call (the name does not resolve, or it reports a tool input error), abort with:\n> \"pr-review workflow launch was refused by the Workflow tool: \u003Ctool error verbatim>. If the error says the name is unknown or the script failed to load, run `chezmoi apply -v`, then retry. Otherwise the args built above are malformed; fix them and retry.\"\n\nDo not work around a refusal by copying the script elsewhere, launching it through the `scriptPath` parameter, adding a directory with `\u002Fadd-dir`, or fanning out the specialists with `Agent` by hand. Each of those runs something other than the deployed, reviewed gate.\n\nThe workflow validates args (including both sentinels) and fails closed on any coverage mismatch, so a thrown workflow error is a gate failure — report it verbatim and stop; never retry with weakened inputs or partial coverage.\n\nAmong those validations are two review size limits, one on the diff packet's byte count and one on the changed-file count; the thrown error names both the limit and the actual value, so the numbers live only in the workflow. They exist because `sha256sum` succeeds at any size while a specialist's own read of the packet truncates: an oversized packet would satisfy the coverage echo gate and silently return a partial review reported as full coverage. A refusal on either limit is a policy decision, not a bug — split the branch into smaller PRs or narrow the base. Do not work around it by trimming `changedFiles`, splitting the packet, or re-running with a subset; any of those reintroduces exactly the partial-coverage-reported-as-full outcome the limits prevent.\n\nThe workflow runs in the background; wait for its completion notification before rendering. Do not start other work that mutates this repository while it runs.\n\n## Final guard (after the workflow returns)\n\n1. Re-run `git status --porcelain --untracked-files=normal`. If non-empty, abort with:\n   > \"Review subagents or concurrent tooling changed the worktree: \u003Clist>. These changes were not part of the reviewed committed diff. Revert, commit, or stash them, then retry.\"\n2. Re-run `git rev-parse HEAD` and compare with the recorded `$HEAD_REF`. If it differs, abort with:\n   > \"HEAD changed during review: started at `\u003Cold>`, now `\u003Cnew>`. The completed specialist results do not cover the current commit. Re-run the review.\"\n3. Leave the diff packet in place. Do not delete it or any other temp file this skill creates under `${TMPDIR:-\u002Ftmp}`: an `rm` matches the `Bash(rm:*)` ask rule and stops the run for a permission prompt. The files are created with `mktemp` (owner-only), and the OS cleans up the temp directory; inside the Claude Code sandbox `$TMPDIR` is a per-user directory.\n\n## Result contract\n\nRead the result from the task output file named in the workflow's completion notification (`\u003Coutput-file>`). Parse the whole file as JSON and use its `result` field: the file wraps the workflow's return value with run metadata (`summary`, `logs`, `agentCount`, `totalTokens`, `totalToolCalls`, `workflowProgress`). Never parse the notification's inline `\u003Cresult>`, which can be truncated. If the file cannot be read, is not valid JSON, or has no `result` object, abort with:\n> \"pr-review workflow result is unreadable at \u003Coutput-file>: \u003Cerror verbatim>. The run's outcome is unknown; re-run the review.\"\n\nThe workflow returns a structured object (`argsContract`, `critical`, `important`\u002F`importantOverflow`\u002F`importantTotal`, `suggestions`\u002F`suggestionsOverflow`\u002F`suggestionsTotal`, `strengths`, `refuted`, `verifications`, `tally`, `specialists`, `stage2Ran`). Before using any of it, verify `argsContract` is exactly `PR_REVIEW_ARGS_V3`; if it is missing or different, a stale deployed workflow handled the run and returned no verifier evidence — abort with:\n\n> \"Stale ~\u002F.claude\u002Fworkflows\u002Fpr-review.js deployed (argsContract mismatch). Run `chezmoi apply -v`, then re-run the review.\"\n\n## Validate verifier evidence\n\nA verdict decides whether a finding stays in the fix queue, so every cited line must exist in the reviewed commit. The workflow checks only the shape of each citation; this step checks it against the `$HEAD_REF` tree. Never validate against the worktree.\n\n1. Verify `result.verifications.length` equals `result.tally.critical + result.tally.important + result.tally.refuted` (every verified finding, including refuted and capped-out ones). If it differs, abort with:\n   > \"Verifier evidence is incomplete: \u003Clength> verifications for \u003Csum> verified findings. Re-run the review.\"\n2. Create a temp directory outside the worktree: `evidence_dir=$(mktemp -d \"${TMPDIR:-\u002Ftmp}\u002Fpr-review-evidence.XXXXXX\")`.\n3. For each entry `v` in `result.verifications`, write the JSON object `{\"candidate_id\": v.candidateId, \"evidence\": v.evidence}` to `$evidence_dir\u002F\u003Cv.candidateId>.json` with the Write tool. Never pass evidence text through a shell command line.\n4. For each entry, run:\n   ```sh\n   python3 ~\u002F.claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Fvalidate_finding_evidence.py \\\n     --repo-root \"$(git rev-parse --show-toplevel)\" --head-ref \"$HEAD_REF\" \\\n     --result-file \"$evidence_dir\u002F\u003CcandidateId>.json\"\n   ```\n   Require exit 0 and stdout exactly `EVIDENCE_OK finding-verifier \u003CcandidateId> \u003C$HEAD_REF> \u003Cnumber of items in v.evidence>`. On any other exit code or output, abort with:\n   > \"Verifier evidence for \u003CcandidateId> ([\u003Cspecialist>] \u003Cfile>, verdict \u003Cverdict>) does not resolve at \u003C$HEAD_REF>: \u003Cvalidator stderr or stdout verbatim>. The verdict is unproven, so the gate result is not trustworthy. Re-run the review.\"\n5. Leave `$evidence_dir` in place (see Final guard step 3).\n\nDo not drop, edit, or re-verify a failing verdict to make this step pass: a citation that does not resolve means the verdict itself is unproven.\n\n## Render the result\n\nRender the validated result as:\n\n```\n# PR Review: \u003Cbranch> vs \u003Cbase>\n\n\u003C**Degraded coverage** line if --allow-no-pr was used>\n\nSpecialists: \u003Cresult.specialists, comma-separated> | scope `\u003Cresult.scope>` | packet `\u003Cfirst 12 chars of packetSha>`\n\n## Critical Issues (N found)\n- [\u003Cspecialist>] \u003Cwhy> [\u003Cfile>:\u003Cline>]\n  - Impact scope: \u003Cimpact_scope>\n  - Verified assumptions: \u003Cverified_assumptions>\n  - Unverified assumptions: \u003Cunverified_assumptions; should be empty for Critical>\n  - Verdict: \u003Cverdict>(\u003CverdictReasoning>)\n  - Evidence: \u003Cpath>:\u003Cline> — \u003Cobservation> (one line per evidence item)\n  - Suggested fix: \u003Cfix>\n\n## Important Issues (shown X of \u003CimportantTotal>, cap 5)\n- [\u003Cspecialist>] \u003Cwhy> [\u003Cfile>:\u003Cline>] — verdict: \u003Cverdict>\u003C, missing verification: ... if present>\n\n\u003Cif importantOverflow is non-empty:>\n### Beyond cap (verified but not prioritized)\n- [\u003Cspecialist>] \u003Cone-line summary of why> [\u003Cfile>:\u003Cline>] — verdict: \u003Cverdict>\n\n## Suggestions (shown X of \u003CsuggestionsTotal>, cap 3)\n- [\u003Cspecialist>] \u003Cwhy> [\u003Cfile>:\u003Cline>]\n\n## Refuted by verification (excluded from the fix queue)\n- [\u003Cspecialist>] \u003Cwhy> — \u003CverdictReasoning>\n  - Evidence: \u003Cpath>:\u003Cline> — \u003Cobservation> (one line per evidence item)\n\n## Strengths\n- [\u003Cspecialist>] \u003Cnote>\n\n## Recommended Action\n1. Fix Critical issues first\n2. Address Important issues\n3. Consider Suggestions\n4. Re-run this skill after fixes to verify prior Critical\u002FImportant findings\n5. Stop when Critical 0 \u002F Important 0; do not re-run for Suggestions only\n6. If this is the third or later pass and Critical\u002FImportant findings still churn, escalate to human judgment\n\n\u003C!-- pr-review-tally: \u003Cresult.tally as compact JSON> -->\n```\n\nEmit the trailing tally comment verbatim from `result.tally` — serialize the object as compact JSON, never recompute the counts from the rendered sections, which are capped and would disagree with it. The counts are pre-cap, so `important` there can legitimately exceed the 5 shown above; that gap is the standing measure of how much the caps suppress. `tally.bySpecialist` breaks the same counts down per specialist, with verifier outcomes, for deciding which specialists earn their cost. A CI step or a later pass can read the line with `grep -o 'pr-review-tally: .*[}]' | cut -d' ' -f2-`.\n\nOmit empty sections (except render `## Critical Issues (0 found)` explicitly — the absence of Criticals is the gate's headline). Findings with `verdict: needs-verification` and non-empty `missingVerification` stay in the fix queue as Important with their missing verification stated; never silently drop them, but do not render them as Critical until the missing proof exists. Other verdicts carrying `missingVerification`, or `needs-verification` without it, are invalid verifier outputs and must fail closed.\n\n## Re-review\n\nOn a re-run after fixes, prioritize confirming whether each prior Critical\u002FImportant finding was fixed, remains, or was intentionally rejected. Raise new findings only when they are clear merge blockers; do not extend the loop with new nits, style feedback, or optional refactors. If the result is Critical 0 \u002F Important 0, stop the gate loop. If only Suggestions remain, do not re-run the gate just to chase them. On the third and later pass, if Critical\u002FImportant findings keep appearing or changing without stable blocker evidence, call out possible review churn and return the decision to a human maintainer. (This guidance also reaches the specialists via the bundled criteria.)\n","# pr-review (Claude-side)\n\n## Goal\n\nRun a comprehensive specialist review of the current branch's committed changes against its base, then render a single actionable report. This is the Claude Code counterpart of the Codex `$pr-review` skill for environments where Codex is unavailable; both share one gate policy (`references\u002Freview-criteria.md`) and one severity table (`references\u002Fseverity-rules.json`). Design: `docs\u002Fdesign\u002Fclaude-pr-review.md` (dotfiles repo), decision: ADR 0029.\n\n## Architecture note (read first)\n\n`gh` does NOT work inside workflow subagents (sandbox-pinned). Everything that needs `gh` or `dangerouslyDisableSandbox` happens HERE in the main session (Preconditions + Collect). The workflow receives all of it as `args` and uses only `git`. Do not move base resolution into the workflow.\n\n## Preconditions\n\nRun these in order. If any fails, abort with the indicated error; do not launch the workflow.\n\nDo not change repository or git state to make a failing precondition pass: no `git stash` or commit on the user's behalf, no `.gitignore` \u002F `.git\u002Finfo\u002Fexclude` \u002F `git update-index --assume-unchanged` \u002F `--skip-worktree` edits, no deleting untracked files. Report the failing state and stop; the user decides how to resolve it. The ref updates that **Base ref resolution** itself prescribes (`git fetch` writing `FETCH_HEAD`, `git remote set-head origin --auto`) are part of the procedure, not a workaround, and stay allowed.\n\n1. **Workflow tool available** — This gate runs entirely inside `~\u002F.claude\u002Fworkflows\u002Fpr-review.js`. Treat the `Workflow` tool as available if it is callable: it appears in your tool list, or `ToolSearch(\"select:Workflow\")` returns its schema. Abort only when neither holds:\n   > \"`Workflow` is not exposed in this session, so the gate cannot run. On the Pro plan dynamic workflows are off by default — turn them on from the **Dynamic workflows** row in `\u002Fconfig`, then start a new session (`disableWorkflows` in a settings file and `CLAUDE_CODE_DISABLE_WORKFLOWS` also switch them off). Otherwise run the Codex CLI `$pr-review` from a terminal (not from inside Claude Code — nested-bwrap). Do not substitute a manual `Agent` fan-out of the specialists: that drops the workflow's coverage echo gate and severity normalization, reintroducing exactly the partial-coverage-reported-as-full outcome this gate exists to prevent.\"\n\n   This check comes first because everything below it — `gh pr view` and `git fetch` under `dangerouslyDisableSandbox`, the diff packet, the reference sentinels — is wasted work on a run that cannot reach the workflow.\n\n   Second check — **no project-scoped workflow shadows the gate.** The Workflow tool resolves the name `pr-review` by each script's `meta.name`: it registers user scope `~\u002F.claude\u002Fworkflows\u002F` first, then lets any parseable project-scope `.claude\u002Fworkflows\u002F` script with the same name override it. A project copy would run in place of this gate, and the render-side `argsContract` check cannot tell them apart. The check matches the fixed string `pr-review` anywhere in any file under those directories. That catches the plain spellings (quoted key, backtick value, any extension, subdirectory, symlinked file), but a name written with string escapes such as `'pr\\x2dreview'` or assembled at runtime such as `'pr-' + 'review'` evades it. The check exists to catch an accidentally placed same-name workflow. It is not a defense against a hostile branch under review, which can also steer the specialists through the diff content itself. Run this block verbatim. It is glob-free, starts from the physical path because `git rev-parse --show-toplevel` resolves symlinks while `$PWD` does not, and fails closed when a directory or file cannot be read:\n\n   ```sh\n   top=$(git rev-parse --show-toplevel) || exit 1\n   d=$(pwd -P)\n   while :; do\n     if [ -d \"$d\u002F.claude\" ] && [ ! -x \"$d\u002F.claude\" ]; then\n       echo \"ABORT: cannot search $d\u002F.claude for project workflows\" >&2; exit 1\n     fi\n     if [ -e \"$d\u002F.claude\u002Fworkflows\" ]; then\n       find -L \"$d\u002F.claude\u002Fworkflows\" -type f -exec sh -c '\n         for f do\n           LC_ALL=C grep -qF pr-review \"$f\"\n           case $? in\n             0) echo \"$f\" ;;\n             1) ;;\n             *) echo \"ERROR: cannot read $f\" >&2; exit 2 ;;\n           esac\n         done\n       ' sh {} + || { echo \"ABORT: shadowing check failed under $d\u002F.claude\u002Fworkflows\" >&2; exit 1; }\n     fi\n     [ \"$d\" = \"$top\" ] && break\n     [ \"$d\" = \u002F ] && break\n     d=$(dirname \"$d\")\n   done\n   ```\n\n   If the block exits non-zero, abort with its stderr. If it prints any path, abort with:\n   > \"A project-scoped `.claude\u002Fworkflows\u002F` file mentions `pr-review` (\u003Cprinted paths>); a script declaring that name would override the user-scope gate. Remove, rename, or move it out of `.claude\u002Fworkflows\u002F`, then retry.\"\n\n2. **Clean worktree** — Run `git status --porcelain --untracked-files=normal`. If the command fails, abort with its output. If output is non-empty, abort with:\n   > \"Worktree has uncommitted changes: \u003Clist>. The review covers committed branch diff only; uncommitted changes would be silently excluded. Commit or stash first, then retry.\"\n\n   Sandbox caveat: in repos whose tracked names collide with sandbox baseline denies (e.g. a chezmoi source dir), sandboxed `git status` reports ghost char-special entries (`crw-rw-rw- nobody nogroup 1, 3` under `ls -la`) as untracked. Verify with `ls -la | grep '^c'` and re-run the status check outside the sandbox before trusting a non-empty result.\n\n3. **Base ref resolution** — Determine `$BASE` from one of three sources, in priority order:\n   - (a) **Explicit base** from the user prompt (e.g. `--base develop`, \"review against develop\"): use it verbatim and skip `gh`. If it matches a full 40-character hexadecimal commit OID (the same shape the workflow's args validation requires), set `$BASE_REF` to it. Otherwise validate it as a branch name (`git check-ref-format --branch \"$BASE\"`; reject leading `-`\u002F`+`, `:`, or other refspec separators), run `git fetch --quiet origin \"refs\u002Fheads\u002F$BASE\"` (abort on failure), set `$BASE_REF=FETCH_HEAD`, and resolve `$BASE_COMMIT` immediately.\n   - (b) **`--allow-no-pr`** in the prompt: skip `gh`. Run `git fetch --quiet origin` and `git remote set-head origin --auto` (abort if either fails), then `git symbolic-ref --quiet --short refs\u002Fremotes\u002Forigin\u002FHEAD` (abort if it fails or is empty). Strip `origin\u002F` for `$BASE`, keep the full `origin\u002F\u003Cbranch>` as `$BASE_REF`, and add a `**Degraded coverage**: no PR base, fell back to default branch` line to the final report.\n   - (c) **Open PR**: run `gh pr view --json baseRefName,baseRefOid --jq '[.baseRefName,.baseRefOid] | @tsv'`. `gh` typically needs `dangerouslyDisableSandbox: true` (macOS Seatbelt \u002F hosts.yml restrictions). If it fails with a real credential error, abort with \"Run `gh auth login` and retry.\" Only an explicit \"no pull request found\" result is the no-PR case; any other failure aborts loudly. On success: validate the branch name with the same rules as (a), `git fetch --quiet origin \"refs\u002Fheads\u002F$BASE\"` (abort on failure), verify `FETCH_HEAD^{commit}` equals the returned `baseRefOid` exactly (abort with both OIDs if not), then set `$BASE_REF=FETCH_HEAD`.\n\n   If none of (a)–(c) yields a base, abort with:\n   > \"No PR found for the current branch and no explicit base provided. Create a draft PR first (so the review pins the PR's base ref), provide an explicit base, or pass `--allow-no-pr` to fall back to the default branch (residual scope-divergence risk acknowledged).\"\n\n4. **Pin the base commit** — `BASE_COMMIT=$(git rev-parse --verify \"$BASE_REF^{commit}\")` immediately after assigning `$BASE_REF`; record the exact output. Abort on failure.\n\n## Collect (main session)\n\n1. `HEAD_REF=$(git rev-parse HEAD)` — record it.\n2. **Empty diff check + changed files**: run `git diff --name-only \"$BASE_COMMIT...$HEAD_REF\"` and record the output as `changedFiles` (one path per array element — this main-session list is the authoritative specialist-routing input; the workflow refuses to re-derive it from an agent echo). If empty, run the Final guard below, then report `No committed changes relative to \u003Cbase>; nothing to review.` and stop.\n3. **Diff packet**: `diff_packet=$(mktemp \"${TMPDIR:-\u002Ftmp}\u002Fpr-review-diff.XXXXXX\")` (suffix-free template — suffixed templates collide on BSD mktemp), then `git diff \"$BASE_COMMIT...$HEAD_REF\" > \"$diff_packet\"`. Record byte count (`wc -c`) and SHA-256 (`sha256sum` \u002F `shasum -a 256`). Abort if any step fails. The packet is authoritative for all specialists.\n4. **Deterministic routing flags** (grep floor — the workflow OR-composes these with the categorizer agent's semantic judgment, so an agent false negative can never narrow the specialist fan-out; grep false positives only widen it, which is the safe direction). The patterns live in a deployed script so they run identically every time and are covered by `tests\u002Fbats\u002Ftest_pr_review_routing_flags.bats`:\n\n   ```sh\n   sh ~\u002F.claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Frouting-flags.sh \"$BASE_COMMIT\" \"$HEAD_REF\"\n   ```\n\n   Require exit 0 and stdout exactly one line matching `commentChanges=(true|false) typeChanges=(true|false)`; record both booleans from it. Do not compute or guess the flags any other way. On any other outcome, abort with:\n   > \"Routing-flag script failed at ~\u002F.claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Frouting-flags.sh: \u003Cexit code, stdout, stderr verbatim>. If the file is missing or its output format differs, run `chezmoi apply -v`, then retry.\"\n\n5. **Shared references** (deploy-skew defense — file existence alone is not enough):\n   - Read `~\u002F.claude\u002Fskills\u002Fpr-review\u002Freferences\u002Freview-criteria.md` and verify it contains the sentinel `PR_REVIEW_CRITERIA_SHARED_V1`. Keep the full contents as `criteria`.\n   - Read `~\u002F.claude\u002Fskills\u002Fpr-review\u002Freferences\u002Fseverity-rules.json`, parse it as JSON, and verify `sentinel == \"PR_REVIEW_SEVERITY_RULES_V1\"` and `version == 1`. Keep the parsed object as `severityRules`.\n   - If either check fails, abort with:\n     > \"Shared gate policy missing or stale at ~\u002F.claude\u002Fskills\u002Fpr-review\u002Freferences\u002F. Run `chezmoi apply -v` to redeploy, then retry.\"\n   - Run `python3 ~\u002F.claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Fvalidate_finding_evidence.py --help`. If it does not exit 0, abort with:\n     > \"Evidence validator missing or not runnable at ~\u002F.claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Fvalidate_finding_evidence.py (needs python3). Run `chezmoi apply -v` to redeploy, then retry.\"\n\n     The gate cannot finish without it (see **Validate verifier evidence**), so a missing validator fails here instead of after a full review.\n\n## Launch the workflow\n\nInvoke the Workflow tool by the predefined workflow's `name` parameter. chezmoi deploys the script at `~\u002F.claude\u002Fworkflows\u002Fpr-review.js`, and the tool resolves it from its `meta.name`. Do not pass a script path: the tool's `scriptPath` parameter only accepts paths inside the working directory or an added directory, so the deployed file is rejected there (accepted on Claude Code 2.1.247, rejected from 2.1.259 on). Pass every value as real JSON (objects\u002Farrays, not JSON-encoded strings):\n\n```\nWorkflow({\n  name: \"pr-review\",\n  args: {\n    base: \"\u003C$BASE>\",\n    baseCommit: \"\u003C$BASE_COMMIT>\",\n    headRef: \"\u003C$HEAD_REF>\",\n    packetPath: \"\u003C$diff_packet>\",\n    packetBytes: \u003Cbyte count>,\n    packetSha: \"\u003Csha256>\",\n    changedFiles: [\"\u003Cpath>\", ...],\n    commentChanges: \u003Cboolean from the Collect grep floor>,\n    typeChanges: \u003Cboolean from the Collect grep floor>,\n    criteria: \"\u003Ccontents of review-criteria.md>\",\n    severityRules: \u003Cparsed severity-rules.json object>\n  }\n})\n```\n\nIf the Workflow tool itself refuses the call (the name does not resolve, or it reports a tool input error), abort with:\n> \"pr-review workflow launch was refused by the Workflow tool: \u003Ctool error verbatim>. If the error says the name is unknown or the script failed to load, run `chezmoi apply -v`, then retry. Otherwise the args built above are malformed; fix them and retry.\"\n\nDo not work around a refusal by copying the script elsewhere, launching it through the `scriptPath` parameter, adding a directory with `\u002Fadd-dir`, or fanning out the specialists with `Agent` by hand. Each of those runs something other than the deployed, reviewed gate.\n\nThe workflow validates args (including both sentinels) and fails closed on any coverage mismatch, so a thrown workflow error is a gate failure — report it verbatim and stop; never retry with weakened inputs or partial coverage.\n\nAmong those validations are two review size limits, one on the diff packet's byte count and one on the changed-file count; the thrown error names both the limit and the actual value, so the numbers live only in the workflow. They exist because `sha256sum` succeeds at any size while a specialist's own read of the packet truncates: an oversized packet would satisfy the coverage echo gate and silently return a partial review reported as full coverage. A refusal on either limit is a policy decision, not a bug — split the branch into smaller PRs or narrow the base. Do not work around it by trimming `changedFiles`, splitting the packet, or re-running with a subset; any of those reintroduces exactly the partial-coverage-reported-as-full outcome the limits prevent.\n\nThe workflow runs in the background; wait for its completion notification before rendering. Do not start other work that mutates this repository while it runs.\n\n## Final guard (after the workflow returns)\n\n1. Re-run `git status --porcelain --untracked-files=normal`. If non-empty, abort with:\n   > \"Review subagents or concurrent tooling changed the worktree: \u003Clist>. These changes were not part of the reviewed committed diff. Revert, commit, or stash them, then retry.\"\n2. Re-run `git rev-parse HEAD` and compare with the recorded `$HEAD_REF`. If it differs, abort with:\n   > \"HEAD changed during review: started at `\u003Cold>`, now `\u003Cnew>`. The completed specialist results do not cover the current commit. Re-run the review.\"\n3. Leave the diff packet in place. Do not delete it or any other temp file this skill creates under `${TMPDIR:-\u002Ftmp}`: an `rm` matches the `Bash(rm:*)` ask rule and stops the run for a permission prompt. The files are created with `mktemp` (owner-only), and the OS cleans up the temp directory; inside the Claude Code sandbox `$TMPDIR` is a per-user directory.\n\n## Result contract\n\nRead the result from the task output file named in the workflow's completion notification (`\u003Coutput-file>`). Parse the whole file as JSON and use its `result` field: the file wraps the workflow's return value with run metadata (`summary`, `logs`, `agentCount`, `totalTokens`, `totalToolCalls`, `workflowProgress`). Never parse the notification's inline `\u003Cresult>`, which can be truncated. If the file cannot be read, is not valid JSON, or has no `result` object, abort with:\n> \"pr-review workflow result is unreadable at \u003Coutput-file>: \u003Cerror verbatim>. The run's outcome is unknown; re-run the review.\"\n\nThe workflow returns a structured object (`argsContract`, `critical`, `important`\u002F`importantOverflow`\u002F`importantTotal`, `suggestions`\u002F`suggestionsOverflow`\u002F`suggestionsTotal`, `strengths`, `refuted`, `verifications`, `tally`, `specialists`, `stage2Ran`). Before using any of it, verify `argsContract` is exactly `PR_REVIEW_ARGS_V3`; if it is missing or different, a stale deployed workflow handled the run and returned no verifier evidence — abort with:\n\n> \"Stale ~\u002F.claude\u002Fworkflows\u002Fpr-review.js deployed (argsContract mismatch). Run `chezmoi apply -v`, then re-run the review.\"\n\n## Validate verifier evidence\n\nA verdict decides whether a finding stays in the fix queue, so every cited line must exist in the reviewed commit. The workflow checks only the shape of each citation; this step checks it against the `$HEAD_REF` tree. Never validate against the worktree.\n\n1. Verify `result.verifications.length` equals `result.tally.critical + result.tally.important + result.tally.refuted` (every verified finding, including refuted and capped-out ones). If it differs, abort with:\n   > \"Verifier evidence is incomplete: \u003Clength> verifications for \u003Csum> verified findings. Re-run the review.\"\n2. Create a temp directory outside the worktree: `evidence_dir=$(mktemp -d \"${TMPDIR:-\u002Ftmp}\u002Fpr-review-evidence.XXXXXX\")`.\n3. For each entry `v` in `result.verifications`, write the JSON object `{\"candidate_id\": v.candidateId, \"evidence\": v.evidence}` to `$evidence_dir\u002F\u003Cv.candidateId>.json` with the Write tool. Never pass evidence text through a shell command line.\n4. For each entry, run:\n   ```sh\n   python3 ~\u002F.claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Fvalidate_finding_evidence.py \\\n     --repo-root \"$(git rev-parse --show-toplevel)\" --head-ref \"$HEAD_REF\" \\\n     --result-file \"$evidence_dir\u002F\u003CcandidateId>.json\"\n   ```\n   Require exit 0 and stdout exactly `EVIDENCE_OK finding-verifier \u003CcandidateId> \u003C$HEAD_REF> \u003Cnumber of items in v.evidence>`. On any other exit code or output, abort with:\n   > \"Verifier evidence for \u003CcandidateId> ([\u003Cspecialist>] \u003Cfile>, verdict \u003Cverdict>) does not resolve at \u003C$HEAD_REF>: \u003Cvalidator stderr or stdout verbatim>. The verdict is unproven, so the gate result is not trustworthy. Re-run the review.\"\n5. Leave `$evidence_dir` in place (see Final guard step 3).\n\nDo not drop, edit, or re-verify a failing verdict to make this step pass: a citation that does not resolve means the verdict itself is unproven.\n\n## Render the result\n\nRender the validated result as:\n\n```\n# PR Review: \u003Cbranch> vs \u003Cbase>\n\n\u003C**Degraded coverage** line if --allow-no-pr was used>\n\nSpecialists: \u003Cresult.specialists, comma-separated> | scope `\u003Cresult.scope>` | packet `\u003Cfirst 12 chars of packetSha>`\n\n## Critical Issues (N found)\n- [\u003Cspecialist>] \u003Cwhy> [\u003Cfile>:\u003Cline>]\n  - Impact scope: \u003Cimpact_scope>\n  - Verified assumptions: \u003Cverified_assumptions>\n  - Unverified assumptions: \u003Cunverified_assumptions; should be empty for Critical>\n  - Verdict: \u003Cverdict>(\u003CverdictReasoning>)\n  - Evidence: \u003Cpath>:\u003Cline> — \u003Cobservation> (one line per evidence item)\n  - Suggested fix: \u003Cfix>\n\n## Important Issues (shown X of \u003CimportantTotal>, cap 5)\n- [\u003Cspecialist>] \u003Cwhy> [\u003Cfile>:\u003Cline>] — verdict: \u003Cverdict>\u003C, missing verification: ... if present>\n\n\u003Cif importantOverflow is non-empty:>\n### Beyond cap (verified but not prioritized)\n- [\u003Cspecialist>] \u003Cone-line summary of why> [\u003Cfile>:\u003Cline>] — verdict: \u003Cverdict>\n\n## Suggestions (shown X of \u003CsuggestionsTotal>, cap 3)\n- [\u003Cspecialist>] \u003Cwhy> [\u003Cfile>:\u003Cline>]\n\n## Refuted by verification (excluded from the fix queue)\n- [\u003Cspecialist>] \u003Cwhy> — \u003CverdictReasoning>\n  - Evidence: \u003Cpath>:\u003Cline> — \u003Cobservation> (one line per evidence item)\n\n## Strengths\n- [\u003Cspecialist>] \u003Cnote>\n\n## Recommended Action\n1. Fix Critical issues first\n2. Address Important issues\n3. Consider Suggestions\n4. Re-run this skill after fixes to verify prior Critical\u002FImportant findings\n5. Stop when Critical 0 \u002F Important 0; do not re-run for Suggestions only\n6. If this is the third or later pass and Critical\u002FImportant findings still churn, escalate to human judgment\n\n\u003C!-- pr-review-tally: \u003Cresult.tally as compact JSON> -->\n```\n\nEmit the trailing tally comment verbatim from `result.tally` — serialize the object as compact JSON, never recompute the counts from the rendered sections, which are capped and would disagree with it. The counts are pre-cap, so `important` there can legitimately exceed the 5 shown above; that gap is the standing measure of how much the caps suppress. `tally.bySpecialist` breaks the same counts down per specialist, with verifier outcomes, for deciding which specialists earn their cost. A CI step or a later pass can read the line with `grep -o 'pr-review-tally: .*[}]' | cut -d' ' -f2-`.\n\nOmit empty sections (except render `## Critical Issues (0 found)` explicitly — the absence of Criticals is the gate's headline). Findings with `verdict: needs-verification` and non-empty `missingVerification` stay in the fix queue as Important with their missing verification stated; never silently drop them, but do not render them as Critical until the missing proof exists. Other verdicts carrying `missingVerification`, or `needs-verification` without it, are invalid verifier outputs and must fail closed.\n\n## Re-review\n\nOn a re-run after fixes, prioritize confirming whether each prior Critical\u002FImportant finding was fixed, remains, or was intentionally rejected. Raise new findings only when they are clear merge blockers; do not extend the loop with new nits, style feedback, or optional refactors. If the result is Critical 0 \u002F Important 0, stop the gate loop. If only Suggestions remain, do not re-run the gate just to chase them. On the third and later pass, if Critical\u002FImportant findings keep appearing or changing without stable blocker evidence, call out possible review churn and return the decision to a human maintainer. (This guidance also reaches the specialists via the bundled criteria.)\n",{"name":5,"description":7},"main","dad20ea2a4096fe9379fdbee5efcec3ef838ab9e","private_dot_claude\u002Fskills\u002Fpr-review",0,"https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles","https:\u002F\u002Fgithub.com\u002Ftoku345","2026-11-13 17:02:22",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add toku345\u002Fdotfiles --skill pr-review",{"tool":67,"command":68},"bunx","bunx skills add toku345\u002Fdotfiles --skill pr-review",{"tool":70,"command":71},"pnpm","pnpm dlx skills add toku345\u002Fdotfiles --skill pr-review","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_claude\u002Fskills\u002Fpr-review\u002FSKILL.md",true,[75,81,85,89,93,97,103],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Fcustom-plugins.md","REFERENCE","参考文档",11781,"https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002Fhermes\u002Fskills\u002Fmlops\u002Ftraining\u002Faccelerate\u002Freferences\u002Fcustom-plugins.md",{"path":82,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fmegatron-integration.md",11252,"https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002Fhermes\u002Fskills\u002Fmlops\u002Ftraining\u002Faccelerate\u002Freferences\u002Fmegatron-integration.md",{"path":86,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fperformance.md",12569,"https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002Fhermes\u002Fskills\u002Fmlops\u002Ftraining\u002Faccelerate\u002Freferences\u002Fperformance.md",{"path":90,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Freview-criteria.md.tmpl",300,"https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_claude\u002Fskills\u002Fpr-review\u002Freferences\u002Freview-criteria.md.tmpl",{"path":94,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Fseverity-rules.json.tmpl",83,"https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_claude\u002Fskills\u002Fpr-review\u002Freferences\u002Fseverity-rules.json.tmpl",{"path":98,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":101,"sourceHtmlUrl":102},"scripts\u002Frouting-flags.sh","SCRIPT","脚本",3623,"https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Frouting-flags.sh",{"path":104,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":105,"sourceHtmlUrl":106},"scripts\u002Fvalidate_finding_evidence.py.tmpl",89,"https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_claude\u002Fskills\u002Fpr-review\u002Fscripts\u002Fvalidate_finding_evidence.py.tmpl",[108,126,144,171,189,201],{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":112,"sourceHtmlUrl":113,"categories":114,"keywords":120,"publishedAt":49},"01M6BVHMWSZMNVE2HDN10GFDQ8","teach","Explain code, changes, and subsystems by investigating how they work and why they were designed that way, then teach at the user's pace. Use for explicit teach requests, teach me this, help me understand this implementation, この実装を教えて, 仕組みと設計背景を知りたい, and understanding before review or modification. Do not trigger for every factual question or primarily implementation requests.","https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fdot_agents\u002Fskills\u002Fteach\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fdot_agents\u002Fskills\u002Fteach\u002FSKILL.md",[115],{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[110,24,121,122,123,124,125,38],"teach me","why","how","explain code","help",{"skillNo":127,"name":5,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":49},"01M6BVJ23D24K530S7WK257HHK","Comprehensive pre-PR review orchestrator. Runs named specialist subagents on the current branch's committed diff, conditionally checks simplification, verifies each normalized Critical\u002FImportant candidate with a dedicated finding-verifier, then synthesizes Critical \u002F Important \u002F Suggestions \u002F Strengths using the bundled `references\u002Freview-criteria.md` gate policy. Use before creating a pull request as a heavy quality gate. Intended successor to the legacy bash `triple-review` orchestrator.","https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_codex\u002Fskills\u002Fpr-review\u002FSKILL.md",[],[24,25,26,132,133,30,134,135,136,137,138,139,140,141,142,143,33,41,40,37],"with","as","verifier","candidate","Bash","simplification","references","Legacy","diff","use","policy","orchestrator",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":49},"01M6BVHZNFQBVQPV3NA8DA373N","pr-review-coach","Japanese-only PR understanding coach. Use when the user wants to prepare their own review, understand a branch diff, identify questions to ask, or build review judgment before running a merge gate. Requires an explicit --base \u003Cref-or-commit> for the first turn, then resumes from local state on answer turns. Asks at most one question at a time and stores resumable local state outside the target worktree. Single-agent only; does not spawn specialist reviewers, does not produce Critical\u002FImportant\u002FSuggestions gate findings, and does not decide merge readiness.","https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_codex\u002Fskills\u002Fpr-review-coach\u002FSKILL.md",[],[151,152,26,25,24,30,153,154,155,156,157,140,141,158,159,160,161,162,163,164,165,166,167,168,169,170,33],"pr review coach","coach","local","time","japanese","answer","only","question","decide","for","single","running","merge gate","first","worktree","produce","state","prepare","merge","commit",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":183,"publishedAt":49},"01M6BVHXZYDT858V8GQEJHKMPC","writing-proofreader","日本語ブログ・技術記事の校正スキル。Fumitakaの文体ガイドラインに基づいて表現・構成・トーンをチェックし、改善提案を行う。「校正して」「レビューして」「文章チェックして」「書いた記事を見て」「ブログ見てもらえる？」「おかしいところない？」「公開前に確認して」「この記事どう思う？」など、記事やブログの品質チェックに関するリクエスト全般で使う。Markdownやテキストの文章校正を依頼されたら必ずこのスキルを参照する。記事の「推敲」「添削」「赤入れ」といった表現でも発動すること。","https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_claude\u002Fskills\u002Fwriting-proofreader\u002FSKILL.md",[177,180],{"categoryNo":178,"categoryName":179,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":181,"categoryName":182,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000036","内容创作者",[184,185,186,187,188],"proofreader","writing proofreader","writing","文章","提案",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":195,"publishedAt":49},"01M6BVHRPQ77P9BF94T0VQ871E","codex-usage","Codex CLI による実装計画レビューの条件と手順、および `\u002Fcodex:adversarial-review` \u002F `\u002Fcodex:rescue` の使い分け。厚い変更の計画完成時や、調査委譲・別案試行・バックグラウンド実行を検討するときに参照する。","https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_claude\u002Fskills\u002Fcodex-usage\u002FSKILL.md",[],[196,197,47,198,199,200,42,48,24],"usage","codex usage","adversarial","adversarial-review","rescue",{"skillNo":202,"name":203,"nameZh":6,"description":204,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":205,"sourceHtmlUrl":206,"categories":207,"keywords":208,"publishedAt":49},"01M6BVHQ1QDEZJN8FFZ62X5PSV","brainstorming","ソクラテス式対話で要件と設計を詰めてから実装方針を固めるブレインストーミングスキル。「ブレスト」「設計を考えたい」「どう実装すべきか」「アーキテクチャを相談したい」「設計相談」「実装の前に整理したい」「方針を決めたい」などのリクエストで発動する。Triggers Socratic-dialogue design refinement before implementation; surfaces 2-3 approaches and records key decisions as ADRs.","https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_claude\u002Fskills\u002Fbrainstorming\u002FLICENSE.superpowers","https:\u002F\u002Fgithub.com\u002Ftoku345\u002Fdotfiles\u002Fblob\u002Fmain\u002Fprivate_dot_claude\u002Fskills\u002Fbrainstorming\u002FSKILL.md",[],[203,209,210,211,212,133,213,214,215,216,217,28],"decisions","refinement","整理","records","triggers","dialogue","surfaces","implementation","socratic"]