[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KWWJCF0JWM3EE0KH7RYBT1":3,"skill-same:01M6KWWJCF0JWM3EE0KH7RYBT1":106},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6KWWJCF0JWM3EE0KH7RYBT1","open-pr",null,"Opens a pull request for the current feature branch and sees it through: validate, self-review, simplify, organize commits, push, create the PR, wait for CI, run an independent agent review and fix its findings, then answer any outside (Copilot or human) review. Use when implementation is complete and ready for review, when the user asks to open, raise, or submit a PR, and when the harness-issue skill hands off in PR mode. Also use when asked to work through or consolidate several dependency PRs.","dougborg\u002Fharness-kit","dougborg","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1261222?v=4","01M6KWS4PB51EYD4ZDJJSGNGB2","Doug Borg","01M6KWS4T8ZZW6SX5QZS9B5BN2",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fclaude-skills\u002Fopen-pr\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"pr","open pr","open","wait for","mode","checkout","submit","reset","log","ready","fix","branch","gh pr","review","Bash","simplify","api","ci","copilot","commit","2026-11-10 10:12:30",false,"---\nname: open-pr\ndescription: >-\n  Opens a pull request for the current feature branch and sees it through:\n  validate, self-review, simplify, organize commits, push, create the PR, wait\n  for CI, run an independent agent review and fix its findings, then answer\n  any outside (Copilot or human) review. Use when implementation is complete\n  and ready for review, when the user asks to open, raise, or submit a PR, and\n  when the harness-issue skill hands off in PR mode. Also use when asked to\n  work through or consolidate several dependency PRs.\nargument-hint: \"[base branch]\"\nallowed-tools: Bash(gh pr *), Bash(gh api *), Bash(gh run *), Bash(git status), Bash(git diff *), Bash(git log *), Bash(git add *), Bash(git commit *), Bash(git push *), Bash(git branch *), Bash(git stash *), Bash(git checkout *), Bash(git reset *), Bash(git rev-list *), Bash(git rev-parse *), Bash(${CLAUDE_SKILL_DIR}\u002F*), Bash(${CLAUDE_SKILL_DIR}\u002F*), Read\n---\n\n# Open PR\n\nTake the current feature branch from \"implementation done\" to \"PR open, CI\ngreen, reviewed, findings addressed.\"\n\nThese hold for every step:\n\n- **Verification passes before `gh pr create`**, so you never push broken\n  code.\n- **Self-review every change yourself**; reviewers are a second reader, not\n  the first.\n- **Every review finding gets an outcome:** fixed, deferred to a tracked\n  issue (searched for first, and added to an existing one when it already\n  covers the work), or discussed with the reviewer. Review concerns are the point of\n  review, so \"not blocking\", \"acceptable\", or \"good for future refinement\" is\n  not an outcome, and green CI or passing tests do not override a finding.\n  Merge only when every comment is resolved.\n- **Fix checks at the cause.** Commit hooks, type checkers, and linters run\n  every time; `--no-verify`, `noqa`, and `type: ignore` are not fixes.\n- **Stage specific files by name**, never `git add -A` or `git add .`, so\n  secrets, scratch files, and unrelated changes stay out.\n- **Pass commit messages and PR bodies through a HEREDOC.**\n- **Read review state with the polling scripts.** `gh pr view --json` returns\n  only top-level PR comments and misses inline review threads.\n- **Give every long poll a way to outlive the Bash tool.** Its default 120s\n  timeout silently kills `poll-ci.sh`, `poll-review.sh`, and\n  `gh pr checks --watch`, leaving truncated output that looks like a status\n  report, and no notification follows. Pass an explicit Bash `timeout` well\n  above the script's own, or run it with `run_in_background: true`.\n- **Delegate review to the review-pr skill**, both the agent review and\n  outside comments, rather than duplicating either workflow here.\n\n## 1. Pre-flight\n\nSeveral dependency PRs requested: decide whether to consolidate before\nvalidating each one. See [dependency-batches.md](dependency-batches.md).\n\n1. Make sure you're on a feature branch:\n\n   ```bash\n   branch=$(${CLAUDE_SKILL_DIR}\u002Fensure-feature-branch.sh)\n   ```\n\n   On `main`\u002F`master` (or a Claude Code `worktree-*` branch) it derives a\n   branch: unpushed commits on main get a branch named from the commit and\n   main is reset; staged or unstaged changes are stashed, moved to a new\n   branch, and popped; a clean state exits 1 (\"No changes to create a PR\n   from.\").\n\n2. The base branch is `$ARGUMENTS` if given, otherwise `main`.\n\n3. Discover the verification command, then run the command it prints as a\n   **separate** Bash call; `eval` in the same call defeats `allowed-tools`\n   matching and prompts every time:\n\n   ```bash\n   ${CLAUDE_SKILL_DIR}\u002Fdiscover-verification-cmd.sh\n   ```\n\n4. Check for an existing PR:\n\n   ```bash\n   gh pr view --json number,url,state\n   ```\n\n   If one is already open, call the Skill tool with \"review-pr\" for it rather\n   than stopping to tell the user. Name no mode: review-pr picks the agent\n   review or addressing feedback from the PR's reviews and unresolved threads.\n\nDone when you're on a feature branch, verification passes in full, and either\nno PR is open for it or the open one is in the review-pr skill's hands.\n\n## 2. Self-review\n\nRead every change, committed and not:\n\n```bash\ngit diff \u003Cbase>...HEAD\ngit diff\ngit diff --cached\n```\n\nLook for bugs and unhandled edge cases, missing error handling, security\nproblems (secrets, injection, unsafe deserialization), missing tests, leftover\ndebug code (`print()`, `console.log`, `TODO`\u002F`FIXME` without an issue ref),\nand naming drift. Fix what you find and re-run verification. For each\nout-of-scope problem, call the Skill tool with \"issue-create\" before opening\nthe PR: it searches the backlog first, and adding your findings to an\nexisting issue beats filing a near-duplicate. It shows the user each draft\nbefore posting, so the flow pauses there; a declined draft leaves the finding\nopen, to fix or discuss. Done when you have read the\nwhole diff and every finding is fixed, filed, or commented onto the issue\nthat already tracks it.\n\n## 3. Simplify\n\nCall the Skill tool with \"minimal-change\" and hold the diff against its\nladder: could each addition be deleted, or replaced by existing code, the\nstandard library, a native platform feature, or an installed dependency?\nApply the cuts, keep everything under the skill's \"Always keep\", and mark any\ndeliberate shortcut in the skill's `shortcut:` format. Re-run verification\nafter any change. Done when every addition in the diff has been checked\nagainst the ladder.\n\n## 4. Organize commits\n\nLook at what you have:\n\n```bash\ngit log \u003Cbase>..HEAD --oneline\ngit status\n```\n\nGroup uncommitted work into logical commits (feature apart from tests,\nrefactoring apart from new behaviour), not one giant squash. If the existing\ncommits are already well organized, commit only what remains; if they are\nmessy (WIP, fixup), clean them up. Create each commit by calling the Skill\ntool with \"commit\": it owns intentional staging, the uv.lock drift check for\nPython+uv projects, the conventional message, and HEREDOC creation. Skip its\nverification step unless code changed since step 1. Done when `git status` is\nclean and every commit is a coherent unit.\n\n## 5. Push and create the PR\n\n```bash\ngit push -u origin \u003Cbranch>\n```\n\nCall the Skill tool with \"pr-body\" for the body's shape (a visual summary,\nbefore-and-after evidence, merge danger, test plan). Link the issue the branch\nimplements with `Closes #\u003Cissue>`, or `Refs #\u003Cissue>` when it only partly\naddresses it: the agent review's spec pass checks the diff against the closing\nissues, and without one it has only the PR description.\n\n```bash\ngh pr create --base \u003Cbase> --title \"feat(scope): short description\" --body \"$(cat \u003C\u003C'EOF'\n\u003Cbody in the pr-body shape, ending with the Closes line>\n\n? Generated with [Claude Code](https:\u002F\u002Fclaude.com\u002Fclaude-code)\nEOF\n)\"\n```\n\nDone when the PR exists and you have printed its URL.\n\n## 6. Wait for CI\n\n```bash\n${CLAUDE_SKILL_DIR}\u002Fpoll-ci.sh \u003Cnumber> [timeout-seconds]\n```\n\nIt waits up to 300s by default. Run it with Bash `timeout: 600000`, or\n`timeout: 900000` with `poll-ci.sh \u003Cnumber> 720` for slow CI, so the script\nand not the Bash tool decides when to give up and a timeout always produces\nan explicit exit 2. Or run it with `run_in_background: true`: the Bash call\nreturns at once and you are re-invoked when the poll completes; read the\nfinal output then.\n\n| Exit | Meaning | Next |\n| --- | --- | --- |\n| 0 | All checks passed | Step 7 |\n| 1 | A check failed or was cancelled | `gh run view \u003Crun-id> --log-failed`, fix, verify locally, commit specific files, push, re-poll |\n| 2 | Script timeout: CI is still running or hasn't started (a queued run, a required check that hasn't reported, or a PR head GitHub hasn't updated after a push; the TIMEOUT line names which) | Re-poll; for a stale PR head, close and reopen the PR to resync it |\n| 3 | The PR couldn't be read | Check the number and `gh auth status` |\n| 4 | CI hasn't finished and the PR conflicts with its base, so GitHub won't run it (finished CI keeps its pass or fail) | Rebase onto the base, resolve, verify locally, push, re-poll; closing and reopening won't help |\n\nEvery terminal outcome ends with a `CI RESULT:` line. Output that ends on a\n`CI POLL:` heartbeat means the process was killed mid-wait and CI state is\nunknown: re-poll rather than reporting \"waiting for the monitor\" and\nstopping. Fix failing CI in place on this PR rather than closing and reopening\nit; close and reopen only to resync a stale PR head.\n\nIf you return from a scheduled wakeup or a task notification, follow\n[resuming.md](resuming.md) before trusting anything the wakeup prompt says.\n\nDone when the latest poll ends `CI RESULT:` with exit 0.\n\n## 7. Agent review\n\nOur own review is the gate. Outside reviewers are not guaranteed: many repos\nhave no required reviewers, and Copilot review is often requested by hand.\nStep 2 was the implementer checking its own work; this step adds an\nindependent reader with a fresh context.\n\nCall the Skill tool with \"review-pr\", passing the PR number and asking for\nthe agent review. On a PR you authored it acts as a self-review gate: the\n`code-reviewer` agent runs a standards pass and a spec pass (against the\nPR's linked issues) on `\u003Cbase>...HEAD`, you fix the findings, and the outcome\nis posted to the PR. When the fixes are pushed, wait for CI again (step 6) so\nthe summary reports CI for the reviewed code.\n\nDone when the latest agent review has no BLOCKING findings, every finding has\nan outcome, CI is green on the final push, and the PR carries an\n`## Agent review` comment listing each finding and its outcome.\n\n## 8. Outside reviews\n\n```bash\n${CLAUDE_SKILL_DIR}\u002Fpoll-review.sh \u003Cnumber> [timeout-seconds]\n```\n\nIt queries review threads and review states through GraphQL, and waits only\nwhen a review is actually expected: someone is in the PR's pending review\nrequests (up to its timeout), or Copilot reviews this repo's PRs\nautomatically (until Copilot lands, at most `POLL_REVIEW_COPILOT_WAIT`\nseconds after the PR opened). Otherwise it returns `none` at once. When it\nwaits, give it an explicit Bash `timeout` above its own or run it in the\nbackground, as in step 6, and on a wakeup or notification follow\n[resuming.md](resuming.md). It shares `poll-ci.sh`'s output contract: a\n`REVIEW POLL:` heartbeat while it waits, and one final\n`REVIEW RESULT: \u003Cstate> …` line. Output that ends on a heartbeat means the\npoll was killed mid-wait, so re-poll. The state:\n\n| State | Exit | Next |\n| --- | --- | --- |\n| `none` | 0 | Nothing from outside reviewers to act on: nobody was expected, or Copilot already reviewed and its threads are handled. Go to step 9 |\n| `comments` \u002F `changes-requested` | 0 | Call the Skill tool with \"review-pr\", asking it to address the feedback |\n| `summary-only` | 0 | A COMMENTED review with no inline comments (common for Copilot follow-ups). Read the body, surface it, and act only on what the user agrees needs action |\n| `approved` | 0 | Report it and go to step 9 |\n| `timeout` | 2 | An expected reviewer (requested, or automatic Copilot) hasn't arrived. Report that the agent review is done and outside review is pending |\n| `error` | 3 | The PR couldn't be read, or the GitHub API kept failing; stderr has the details. Fix auth or the PR reference and re-run |\n| (usage) | 64 | A bad argument or `POLL_REVIEW_EXPECT` value; no RESULT line. Fix the call |\n\nRead a `summary-only` body with this, run from the PR's repo:\n\n```bash\ngh api \"repos\u002F{owner}\u002F{repo}\u002Fpulls\u002F\u003Cnumber>\u002Freviews\" \\\n  --jq '[.[] | select(.state == \"COMMENTED\" and .body != \"\")] | last | .body'\n```\n\nDone when the state is `none`, `approved`, or `timeout`; or it is\n`summary-only` and the body has been surfaced and any agreed action taken;\nor every outside comment has been answered through the review-pr skill; or\nit is `error` and a re-run after fixing auth or the PR reference gave one of\nthose.\n\n## 9. Summary\n\nReport the PR URL, the number of commits, CI status, the agent review's\nfindings by severity with their outcomes, the outside-review state and any\ncomments addressed, and the current PR state. Done when the report is\nprinted.\n\nIf the authorized task also includes merging to a branch that deploys\nautomatically, follow [deployment-closeout.md](deployment-closeout.md).\nOpening a PR does not authorize merging or deploying it.\n\n## Related\n\n- `\u002Freview-pr` — the agent review and addressing review feedback\n- `\u002Fcommit` — quality-gated conventional commits\n- `\u002Fminimal-change` — the ladder step 3 applies\n- `\u002Fpr-body` — the PR description shape step 5 uses\n","# Open PR\n\nTake the current feature branch from \"implementation done\" to \"PR open, CI\ngreen, reviewed, findings addressed.\"\n\nThese hold for every step:\n\n- **Verification passes before `gh pr create`**, so you never push broken\n  code.\n- **Self-review every change yourself**; reviewers are a second reader, not\n  the first.\n- **Every review finding gets an outcome:** fixed, deferred to a tracked\n  issue (searched for first, and added to an existing one when it already\n  covers the work), or discussed with the reviewer. Review concerns are the point of\n  review, so \"not blocking\", \"acceptable\", or \"good for future refinement\" is\n  not an outcome, and green CI or passing tests do not override a finding.\n  Merge only when every comment is resolved.\n- **Fix checks at the cause.** Commit hooks, type checkers, and linters run\n  every time; `--no-verify`, `noqa`, and `type: ignore` are not fixes.\n- **Stage specific files by name**, never `git add -A` or `git add .`, so\n  secrets, scratch files, and unrelated changes stay out.\n- **Pass commit messages and PR bodies through a HEREDOC.**\n- **Read review state with the polling scripts.** `gh pr view --json` returns\n  only top-level PR comments and misses inline review threads.\n- **Give every long poll a way to outlive the Bash tool.** Its default 120s\n  timeout silently kills `poll-ci.sh`, `poll-review.sh`, and\n  `gh pr checks --watch`, leaving truncated output that looks like a status\n  report, and no notification follows. Pass an explicit Bash `timeout` well\n  above the script's own, or run it with `run_in_background: true`.\n- **Delegate review to the review-pr skill**, both the agent review and\n  outside comments, rather than duplicating either workflow here.\n\n## 1. Pre-flight\n\nSeveral dependency PRs requested: decide whether to consolidate before\nvalidating each one. See [dependency-batches.md](dependency-batches.md).\n\n1. Make sure you're on a feature branch:\n\n   ```bash\n   branch=$(${CLAUDE_SKILL_DIR}\u002Fensure-feature-branch.sh)\n   ```\n\n   On `main`\u002F`master` (or a Claude Code `worktree-*` branch) it derives a\n   branch: unpushed commits on main get a branch named from the commit and\n   main is reset; staged or unstaged changes are stashed, moved to a new\n   branch, and popped; a clean state exits 1 (\"No changes to create a PR\n   from.\").\n\n2. The base branch is `$ARGUMENTS` if given, otherwise `main`.\n\n3. Discover the verification command, then run the command it prints as a\n   **separate** Bash call; `eval` in the same call defeats `allowed-tools`\n   matching and prompts every time:\n\n   ```bash\n   ${CLAUDE_SKILL_DIR}\u002Fdiscover-verification-cmd.sh\n   ```\n\n4. Check for an existing PR:\n\n   ```bash\n   gh pr view --json number,url,state\n   ```\n\n   If one is already open, call the Skill tool with \"review-pr\" for it rather\n   than stopping to tell the user. Name no mode: review-pr picks the agent\n   review or addressing feedback from the PR's reviews and unresolved threads.\n\nDone when you're on a feature branch, verification passes in full, and either\nno PR is open for it or the open one is in the review-pr skill's hands.\n\n## 2. Self-review\n\nRead every change, committed and not:\n\n```bash\ngit diff \u003Cbase>...HEAD\ngit diff\ngit diff --cached\n```\n\nLook for bugs and unhandled edge cases, missing error handling, security\nproblems (secrets, injection, unsafe deserialization), missing tests, leftover\ndebug code (`print()`, `console.log`, `TODO`\u002F`FIXME` without an issue ref),\nand naming drift. Fix what you find and re-run verification. For each\nout-of-scope problem, call the Skill tool with \"issue-create\" before opening\nthe PR: it searches the backlog first, and adding your findings to an\nexisting issue beats filing a near-duplicate. It shows the user each draft\nbefore posting, so the flow pauses there; a declined draft leaves the finding\nopen, to fix or discuss. Done when you have read the\nwhole diff and every finding is fixed, filed, or commented onto the issue\nthat already tracks it.\n\n## 3. Simplify\n\nCall the Skill tool with \"minimal-change\" and hold the diff against its\nladder: could each addition be deleted, or replaced by existing code, the\nstandard library, a native platform feature, or an installed dependency?\nApply the cuts, keep everything under the skill's \"Always keep\", and mark any\ndeliberate shortcut in the skill's `shortcut:` format. Re-run verification\nafter any change. Done when every addition in the diff has been checked\nagainst the ladder.\n\n## 4. Organize commits\n\nLook at what you have:\n\n```bash\ngit log \u003Cbase>..HEAD --oneline\ngit status\n```\n\nGroup uncommitted work into logical commits (feature apart from tests,\nrefactoring apart from new behaviour), not one giant squash. If the existing\ncommits are already well organized, commit only what remains; if they are\nmessy (WIP, fixup), clean them up. Create each commit by calling the Skill\ntool with \"commit\": it owns intentional staging, the uv.lock drift check for\nPython+uv projects, the conventional message, and HEREDOC creation. Skip its\nverification step unless code changed since step 1. Done when `git status` is\nclean and every commit is a coherent unit.\n\n## 5. Push and create the PR\n\n```bash\ngit push -u origin \u003Cbranch>\n```\n\nCall the Skill tool with \"pr-body\" for the body's shape (a visual summary,\nbefore-and-after evidence, merge danger, test plan). Link the issue the branch\nimplements with `Closes #\u003Cissue>`, or `Refs #\u003Cissue>` when it only partly\naddresses it: the agent review's spec pass checks the diff against the closing\nissues, and without one it has only the PR description.\n\n```bash\ngh pr create --base \u003Cbase> --title \"feat(scope): short description\" --body \"$(cat \u003C\u003C'EOF'\n\u003Cbody in the pr-body shape, ending with the Closes line>\n\n? Generated with [Claude Code](https:\u002F\u002Fclaude.com\u002Fclaude-code)\nEOF\n)\"\n```\n\nDone when the PR exists and you have printed its URL.\n\n## 6. Wait for CI\n\n```bash\n${CLAUDE_SKILL_DIR}\u002Fpoll-ci.sh \u003Cnumber> [timeout-seconds]\n```\n\nIt waits up to 300s by default. Run it with Bash `timeout: 600000`, or\n`timeout: 900000` with `poll-ci.sh \u003Cnumber> 720` for slow CI, so the script\nand not the Bash tool decides when to give up and a timeout always produces\nan explicit exit 2. Or run it with `run_in_background: true`: the Bash call\nreturns at once and you are re-invoked when the poll completes; read the\nfinal output then.\n\n| Exit | Meaning | Next |\n| --- | --- | --- |\n| 0 | All checks passed | Step 7 |\n| 1 | A check failed or was cancelled | `gh run view \u003Crun-id> --log-failed`, fix, verify locally, commit specific files, push, re-poll |\n| 2 | Script timeout: CI is still running or hasn't started (a queued run, a required check that hasn't reported, or a PR head GitHub hasn't updated after a push; the TIMEOUT line names which) | Re-poll; for a stale PR head, close and reopen the PR to resync it |\n| 3 | The PR couldn't be read | Check the number and `gh auth status` |\n| 4 | CI hasn't finished and the PR conflicts with its base, so GitHub won't run it (finished CI keeps its pass or fail) | Rebase onto the base, resolve, verify locally, push, re-poll; closing and reopening won't help |\n\nEvery terminal outcome ends with a `CI RESULT:` line. Output that ends on a\n`CI POLL:` heartbeat means the process was killed mid-wait and CI state is\nunknown: re-poll rather than reporting \"waiting for the monitor\" and\nstopping. Fix failing CI in place on this PR rather than closing and reopening\nit; close and reopen only to resync a stale PR head.\n\nIf you return from a scheduled wakeup or a task notification, follow\n[resuming.md](resuming.md) before trusting anything the wakeup prompt says.\n\nDone when the latest poll ends `CI RESULT:` with exit 0.\n\n## 7. Agent review\n\nOur own review is the gate. Outside reviewers are not guaranteed: many repos\nhave no required reviewers, and Copilot review is often requested by hand.\nStep 2 was the implementer checking its own work; this step adds an\nindependent reader with a fresh context.\n\nCall the Skill tool with \"review-pr\", passing the PR number and asking for\nthe agent review. On a PR you authored it acts as a self-review gate: the\n`code-reviewer` agent runs a standards pass and a spec pass (against the\nPR's linked issues) on `\u003Cbase>...HEAD`, you fix the findings, and the outcome\nis posted to the PR. When the fixes are pushed, wait for CI again (step 6) so\nthe summary reports CI for the reviewed code.\n\nDone when the latest agent review has no BLOCKING findings, every finding has\nan outcome, CI is green on the final push, and the PR carries an\n`## Agent review` comment listing each finding and its outcome.\n\n## 8. Outside reviews\n\n```bash\n${CLAUDE_SKILL_DIR}\u002Fpoll-review.sh \u003Cnumber> [timeout-seconds]\n```\n\nIt queries review threads and review states through GraphQL, and waits only\nwhen a review is actually expected: someone is in the PR's pending review\nrequests (up to its timeout), or Copilot reviews this repo's PRs\nautomatically (until Copilot lands, at most `POLL_REVIEW_COPILOT_WAIT`\nseconds after the PR opened). Otherwise it returns `none` at once. When it\nwaits, give it an explicit Bash `timeout` above its own or run it in the\nbackground, as in step 6, and on a wakeup or notification follow\n[resuming.md](resuming.md). It shares `poll-ci.sh`'s output contract: a\n`REVIEW POLL:` heartbeat while it waits, and one final\n`REVIEW RESULT: \u003Cstate> …` line. Output that ends on a heartbeat means the\npoll was killed mid-wait, so re-poll. The state:\n\n| State | Exit | Next |\n| --- | --- | --- |\n| `none` | 0 | Nothing from outside reviewers to act on: nobody was expected, or Copilot already reviewed and its threads are handled. Go to step 9 |\n| `comments` \u002F `changes-requested` | 0 | Call the Skill tool with \"review-pr\", asking it to address the feedback |\n| `summary-only` | 0 | A COMMENTED review with no inline comments (common for Copilot follow-ups). Read the body, surface it, and act only on what the user agrees needs action |\n| `approved` | 0 | Report it and go to step 9 |\n| `timeout` | 2 | An expected reviewer (requested, or automatic Copilot) hasn't arrived. Report that the agent review is done and outside review is pending |\n| `error` | 3 | The PR couldn't be read, or the GitHub API kept failing; stderr has the details. Fix auth or the PR reference and re-run |\n| (usage) | 64 | A bad argument or `POLL_REVIEW_EXPECT` value; no RESULT line. Fix the call |\n\nRead a `summary-only` body with this, run from the PR's repo:\n\n```bash\ngh api \"repos\u002F{owner}\u002F{repo}\u002Fpulls\u002F\u003Cnumber>\u002Freviews\" \\\n  --jq '[.[] | select(.state == \"COMMENTED\" and .body != \"\")] | last | .body'\n```\n\nDone when the state is `none`, `approved`, or `timeout`; or it is\n`summary-only` and the body has been surfaced and any agreed action taken;\nor every outside comment has been answered through the review-pr skill; or\nit is `error` and a re-run after fixing auth or the PR reference gave one of\nthose.\n\n## 9. Summary\n\nReport the PR URL, the number of commits, CI status, the agent review's\nfindings by severity with their outcomes, the outside-review state and any\ncomments addressed, and the current PR state. Done when the report is\nprinted.\n\nIf the authorized task also includes merging to a branch that deploys\nautomatically, follow [deployment-closeout.md](deployment-closeout.md).\nOpening a PR does not authorize merging or deploying it.\n\n## Related\n\n- `\u002Freview-pr` — the agent review and addressing review feedback\n- `\u002Fcommit` — quality-gated conventional commits\n- `\u002Fminimal-change` — the ladder step 3 applies\n- `\u002Fpr-body` — the PR description shape step 5 uses\n",{"name":5,"description":7,"allowed-tools":49,"argument-hint":50},"Bash(gh pr *), Bash(gh api *), Bash(gh run *), Bash(git status), Bash(git diff *), Bash(git log *), Bash(git add *), Bash(git commit *), Bash(git push *), Bash(git branch *), Bash(git stash *), Bash(git checkout *), Bash(git reset *), Bash(git rev-list *), Bash(git rev-parse *), Bash(${CLAUDE_SKILL_DIR}\u002F*), Bash(${CLAUDE_SKILL_DIR}\u002F*), Read","[base branch]","main","023b01bfb4a86fbf1e38a749f1044cce3e5da67d","claude-skills\u002Fopen-pr",1,"https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit","https:\u002F\u002Fgithub.com\u002Fdougborg","http:\u002F\u002Fdougborg.org","Platforms and Infrastructure Software Engineer","2026-11-13 07:43:37",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add dougborg\u002Fharness-kit --skill open-pr",{"tool":66,"command":67},"bunx","bunx skills add dougborg\u002Fharness-kit --skill open-pr",{"tool":69,"command":70},"pnpm","pnpm dlx skills add dougborg\u002Fharness-kit --skill open-pr","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fclaude-skills\u002Fopen-pr\u002FSKILL.md",true,[74,80,84,90,94,98,102],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"dependency-batches.md","REFERENCE","参考文档",2134,"https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fclaude-skills\u002Fopen-pr\u002Fdependency-batches.md",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"deployment-closeout.md",1152,"https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fclaude-skills\u002Fopen-pr\u002Fdeployment-closeout.md",{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"discover-verification-cmd.sh","SCRIPT","脚本",6687,"https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fclaude-skills\u002Fopen-pr\u002Fdiscover-verification-cmd.sh",{"path":91,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":92,"sourceHtmlUrl":93},"ensure-feature-branch.sh",3386,"https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fclaude-skills\u002Fopen-pr\u002Fensure-feature-branch.sh",{"path":95,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":96,"sourceHtmlUrl":97},"poll-ci.sh",6664,"https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fclaude-skills\u002Fopen-pr\u002Fpoll-ci.sh",{"path":99,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":100,"sourceHtmlUrl":101},"poll-review.sh",12070,"https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fclaude-skills\u002Fopen-pr\u002Fpoll-review.sh",{"path":103,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":104,"sourceHtmlUrl":105},"resuming.md",1309,"https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fclaude-skills\u002Fopen-pr\u002Fresuming.md",[107,126,145,178,201,218],{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":118,"publishedAt":44},"01M6KX4J65S5FZKMSN5DQNPSZM","teach","Teach yourself a topic over several sessions, with lessons, references, and a record of what you've learned.","https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fskills\u002Fwriting\u002Fteach\u002FSKILL.md",[113],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[109,119,120,121,122,123,124,125],"lessons","you","with","learned","record","references","sessions",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":135,"publishedAt":44},"01M6KX4FSSG7MHF00JDT5QT0BQ","svg-logo-designer","Generate SVG logos with multiple concepts, layouts, and color variations.","https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fskills\u002Fwriting\u002Fsvg-logo-designer\u002FSKILL.md",[132],{"categoryNo":133,"categoryName":134,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[136,137,138,139,140,141,121,142,143,144],"logo","designer","svg logo designer","SVG","color","concepts","write","read","generate",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":157,"publishedAt":44},"01M6KX4BD3J9MZPPSH4MENH7FP","documentation-writer","Writes and revises human-facing documentation — READMEs, contributor and setup guides, reference pages, architecture notes, CLAUDE.md, and changelog entries. Covers picking the right document type for the question being asked, structuring for skimming, writing examples that actually run, and keeping docs from going stale. Use when creating or rewriting docs, when a README has drifted from the code, or when deciding where a piece of information belongs. For SKILL.md and agent files, use \u002Fskill-writer instead.","https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fskills\u002Fwriting\u002Fdocumentation-writer\u002FSKILL.md",[151,154],{"categoryNo":152,"categoryName":153,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":155,"categoryName":156,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000036","内容创作者",[158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177],"writer","documentation writer","documentation","entries","changelog","architecture","document","files","use","question","README","notes","code","examples","pages","for","information","guides","type","writing",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":184,"publishedAt":44},"01M6KX47ZJ4ZWHDN3MY8SYAWZZ","adhd-mode","Shapes every response for a reader with ADHD: the next action first, numbered steps, progress restated each turn, tangents held back, concrete time estimates, wins made visible. Stays on for the rest of the session until the reader says \"stop adhd mode\". On Claude Code, the harness-kit:adhd output style does the same without invoking this skill.","https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fskills\u002Fwriting\u002Fadhd-mode\u002FSKILL.md",[],[185,28,186,187,173,188,189,121,190,191,192,193,194,195,196,197,198,199,200,170],"adhd","adhd mode","next","action","kit","output","style","progress","time","back","stop","session","reader","first","REST","harness",{"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":6,"sourceHtmlUrl":205,"categories":206,"keywords":207,"publishedAt":44},"01M6KX463Z6E18EPDW873GDHKB","wait-what","That last message didn't land: re-explain it with the missing context.","https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fskills\u002Fthinking\u002Fwait-what\u002FSKILL.md",[],[208,209,210,121,211,212,213,214,215,216,217],"wait","wait what","re","it","missing","message","context","explain","land","last",{"skillNo":219,"name":220,"nameZh":6,"description":221,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":222,"categories":223,"keywords":224,"publishedAt":44},"01M6KX43NE1NB0Y2HECY515730","to-questionnaire","Turn a decision you can't make alone into a questionnaire for the one person who can answer it, filled in async or together in a meeting.","https:\u002F\u002Fgithub.com\u002Fdougborg\u002Fharness-kit\u002Fblob\u002Fmain\u002Fskills\u002Fthinking\u002Fto-questionnaire\u002FSKILL.md",[],[225,226,173,227,228,229,230,120,231,211,232,233],"to questionnaire","questionnaire","person","can","answer","meeting","make","async","decision"]