[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E5PC414PC10SMDMWHH1E5M":3,"skill-same:01M6E5PC414PC10SMDMWHH1E5M":58},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":13,"repositoryHtmlUrl":41,"repositoryHomepageUrl":6,"ownerHtmlUrl":42,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":43,"install":44,"resources":57},"01M6E5PC414PC10SMDMWHH1E5M","close-stale-issues",null,"Audit and close issues resolved by merged PRs — body-reference + branch-pattern matching, 4-category classification, approval-gated closures","parametrization\u002F2real-team-framework","parametrization","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1111097?v=4","01M6E5MC117M94CEXKX3C96PPX","01M6E5MC7YWG5N3VV4792VFK85",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fframework\u002Fassets\u002Fskills\u002Fclose-stale-issues\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31],"issues","stale","close","close stale issues","audit","classification","branch","repo","approval","reference","gated","pattern","matching","pattern matching","2026-11-10 10:12:30",false,"---\nname: close-stale-issues\ndescription: Audit and close issues resolved by merged PRs — body-reference + branch-pattern matching, 4-category classification, approval-gated closures\nargs: repo (optional, defaults to current repo)\n---\n\nAudit all open issues against merged PRs and close orphans that were resolved but never\nauto-closed. **Config-driven and fail-open:** every project-specific value (branch grammar,\nlabels, repo set) is read from `.claude\u002Fframework.config.json`; a missing key falls back to\nthe documented default, and a missing config file just means all-defaults.\n\n**No issue is ever closed without explicit user approval** — Step 6 is a hard gate with no\nbypass.\n\n## Instructions\n\n### 0. Resolve config\n\n```bash\nREPO_ROOT=\"$(git rev-parse --show-toplevel 2>\u002Fdev\u002Fnull || pwd)\"\nCFG=\"$REPO_ROOT\u002F.claude\u002Fframework.config.json\"\nget() { jq -r \"$1 \u002F\u002F empty\" \"$CFG\" 2>\u002Fdev\u002Fnull; }   # fail-open dotted read\n\nFEATURE_TPL=\"$(get '.branch.feature')\"; FEATURE_TPL=\"${FEATURE_TPL:-{initials}\u002F{issue}-{slug}}\"\nTD_LABEL=\"$(get '.labels.tech_debt')\";  TD_LABEL=\"${TD_LABEL:-tech-debt}\"\nMODEL=\"$(get '.project.model')\";        MODEL=\"${MODEL:-single-repo}\"\n```\n\nFor a `meta-and-children` project, run Steps 1–7 once per repo in `project.repos`\n(bare names qualified under `scm.owner`) and aggregate a single report; a single-repo\nproject runs on the current repo only.\n\n### 1. List all open issues\n\n```bash\ngh issue list --state open --limit 500 --json number,title,labels,body,createdAt\n```\n\n### 2. List all merged PRs (last 90 days)\n\n```bash\ngh pr list --state merged --limit 500 --json number,title,body,headRefName,mergedAt\n```\n\n### 3. Build the resolution map — two independent signals\n\nFor each merged PR, extract issue references two ways:\n\n1. **Body references:** `Closes #N` \u002F `Fixes #N` \u002F `Resolves #N` (case-insensitive).\n2. **Branch-name pattern:** the configured `branch.feature` grammar (default\n   `{initials}\u002F{issue}-{slug}`) places the issue number between the first `\u002F` and the\n   next `-`. Extract it from `headRefName` with `^[^\u002F]+\u002F0*([0-9]+)-` — the `0*` strips\n   zero-padding, so a head like `j.doe\u002F0086-fix-stale-audit` resolves to issue `86`.\n   If the project overrides `branch.feature` with a different shape, adapt the extraction\n   to that template rather than assuming the default.\n\nBuild a map: `{issue_number → [{pr_number, pr_title, mergedAt, signal}]}` where `signal`\nis `direct` (body reference) or `branch` (pattern match). A body reference always\noutranks a branch match for the same issue.\n\n### 4. Classify every open issue\n\n| Category | Criteria | Proposed action |\n|----------|----------|-----------------|\n| **Resolved (direct)** | A merged PR body references it (`Closes\u002FFixes\u002FResolves #N`) | Close with comment |\n| **Resolved (branch)** | A merged PR head branch matches the issue number via `branch.feature` | Close with comment (note: inferred match) |\n| **Stale tracker** | Tracker issue whose sub-issues \u002F checkboxes are all closed or checked | Close with comment |\n| **No match** | No implementing PR found by either signal | Keep open |\n\n### 5. Check tracker issues\n\nFor issues labeled with the configured tech-debt label (`$TD_LABEL`) — or any issue whose\nbody contains a task list — check whether every referenced sub-issue is resolved:\n\n```bash\ngh issue view {NUMBER} --json body\n```\n\nParse `- [x] #N` and `- [ ] #N` patterns. If all checkboxes are checked, or every\nreferenced issue is closed, classify the tracker as **Stale tracker**.\n\n### 6. MANDATORY approval gate — present findings, then STOP\n\n**Do NOT close any issue yet.** Present the full classification and wait:\n\n```\n**Stale Issue Audit**\n\n| Issue | Title | Category | Implementing PR | Proposed action |\n|-------|-------|----------|-----------------|-----------------|\n| #123  | ...   | Resolved (direct) | PR #456 (merged 2026-04-01) | Close |\n| #789  | ...   | Resolved (branch) | PR #790 (branch `x.y\u002F0789-...`) | Close (inferred) |\n| #100  | ...   | Stale tracker | 3\u002F3 sub-issues closed | Close |\n| #200  | ...   | No match | — | Keep open |\n\n**Summary:** {close_count} issues to close, {keep_count} to keep open.\nReply with approval (all, or a subset by number) to proceed.\n```\n\nOnly issues the user explicitly approves move to Step 7. No approval, no closures.\n\n### 7. Close approved issues — cite the resolving PR\n\nResolved by a PR:\n\n```bash\ngh issue close {NUMBER} --comment \"$(cat \u003C\u003C'COMMENT'\nClosed by stale-issue audit. Resolved by PR #{PR_NUMBER} (\"{PR_TITLE}\"), merged {MERGED_DATE}.\nMatch signal: {direct reference | branch-name pattern (inferred)}.\n\nIf this issue is not actually resolved, please reopen it.\nCOMMENT\n)\"\n```\n\nStale tracker:\n\n```bash\ngh issue close {NUMBER} --comment \"$(cat \u003C\u003C'COMMENT'\nClosed by stale-issue audit. All tracked sub-issues are resolved: {#N1, #N2, ...}.\n\nIf tracked work remains, please reopen with the outstanding items unchecked.\nCOMMENT\n)\"\n```\n\n### 8. Report summary\n\n```\n**Audit complete:**\n- Issues closed (direct reference): {count}\n- Issues closed (branch-matched, inferred): {count}\n- Tracker issues closed: {count}\n- Kept open (no implementing PR): {count}\n- Total open issues after audit: {count}\n```\n\n## What remains manual\n\n- The Step-6 approval gate: the user approves every closure, individually or as a batch.\n- \"No match\" issues require human triage.\n- The audit trusts references and branch naming — it does not verify that a PR actually\n  implemented the issue. Branch-matched closures are labeled as inferred for exactly this\n  reason.\n","Audit all open issues against merged PRs and close orphans that were resolved but never\nauto-closed. **Config-driven and fail-open:** every project-specific value (branch grammar,\nlabels, repo set) is read from `.claude\u002Fframework.config.json`; a missing key falls back to\nthe documented default, and a missing config file just means all-defaults.\n\n**No issue is ever closed without explicit user approval** — Step 6 is a hard gate with no\nbypass.\n\n## Instructions\n\n### 0. Resolve config\n\n```bash\nREPO_ROOT=\"$(git rev-parse --show-toplevel 2>\u002Fdev\u002Fnull || pwd)\"\nCFG=\"$REPO_ROOT\u002F.claude\u002Fframework.config.json\"\nget() { jq -r \"$1 \u002F\u002F empty\" \"$CFG\" 2>\u002Fdev\u002Fnull; }   # fail-open dotted read\n\nFEATURE_TPL=\"$(get '.branch.feature')\"; FEATURE_TPL=\"${FEATURE_TPL:-{initials}\u002F{issue}-{slug}}\"\nTD_LABEL=\"$(get '.labels.tech_debt')\";  TD_LABEL=\"${TD_LABEL:-tech-debt}\"\nMODEL=\"$(get '.project.model')\";        MODEL=\"${MODEL:-single-repo}\"\n```\n\nFor a `meta-and-children` project, run Steps 1–7 once per repo in `project.repos`\n(bare names qualified under `scm.owner`) and aggregate a single report; a single-repo\nproject runs on the current repo only.\n\n### 1. List all open issues\n\n```bash\ngh issue list --state open --limit 500 --json number,title,labels,body,createdAt\n```\n\n### 2. List all merged PRs (last 90 days)\n\n```bash\ngh pr list --state merged --limit 500 --json number,title,body,headRefName,mergedAt\n```\n\n### 3. Build the resolution map — two independent signals\n\nFor each merged PR, extract issue references two ways:\n\n1. **Body references:** `Closes #N` \u002F `Fixes #N` \u002F `Resolves #N` (case-insensitive).\n2. **Branch-name pattern:** the configured `branch.feature` grammar (default\n   `{initials}\u002F{issue}-{slug}`) places the issue number between the first `\u002F` and the\n   next `-`. Extract it from `headRefName` with `^[^\u002F]+\u002F0*([0-9]+)-` — the `0*` strips\n   zero-padding, so a head like `j.doe\u002F0086-fix-stale-audit` resolves to issue `86`.\n   If the project overrides `branch.feature` with a different shape, adapt the extraction\n   to that template rather than assuming the default.\n\nBuild a map: `{issue_number → [{pr_number, pr_title, mergedAt, signal}]}` where `signal`\nis `direct` (body reference) or `branch` (pattern match). A body reference always\noutranks a branch match for the same issue.\n\n### 4. Classify every open issue\n\n| Category | Criteria | Proposed action |\n|----------|----------|-----------------|\n| **Resolved (direct)** | A merged PR body references it (`Closes\u002FFixes\u002FResolves #N`) | Close with comment |\n| **Resolved (branch)** | A merged PR head branch matches the issue number via `branch.feature` | Close with comment (note: inferred match) |\n| **Stale tracker** | Tracker issue whose sub-issues \u002F checkboxes are all closed or checked | Close with comment |\n| **No match** | No implementing PR found by either signal | Keep open |\n\n### 5. Check tracker issues\n\nFor issues labeled with the configured tech-debt label (`$TD_LABEL`) — or any issue whose\nbody contains a task list — check whether every referenced sub-issue is resolved:\n\n```bash\ngh issue view {NUMBER} --json body\n```\n\nParse `- [x] #N` and `- [ ] #N` patterns. If all checkboxes are checked, or every\nreferenced issue is closed, classify the tracker as **Stale tracker**.\n\n### 6. MANDATORY approval gate — present findings, then STOP\n\n**Do NOT close any issue yet.** Present the full classification and wait:\n\n```\n**Stale Issue Audit**\n\n| Issue | Title | Category | Implementing PR | Proposed action |\n|-------|-------|----------|-----------------|-----------------|\n| #123  | ...   | Resolved (direct) | PR #456 (merged 2026-04-01) | Close |\n| #789  | ...   | Resolved (branch) | PR #790 (branch `x.y\u002F0789-...`) | Close (inferred) |\n| #100  | ...   | Stale tracker | 3\u002F3 sub-issues closed | Close |\n| #200  | ...   | No match | — | Keep open |\n\n**Summary:** {close_count} issues to close, {keep_count} to keep open.\nReply with approval (all, or a subset by number) to proceed.\n```\n\nOnly issues the user explicitly approves move to Step 7. No approval, no closures.\n\n### 7. Close approved issues — cite the resolving PR\n\nResolved by a PR:\n\n```bash\ngh issue close {NUMBER} --comment \"$(cat \u003C\u003C'COMMENT'\nClosed by stale-issue audit. Resolved by PR #{PR_NUMBER} (\"{PR_TITLE}\"), merged {MERGED_DATE}.\nMatch signal: {direct reference | branch-name pattern (inferred)}.\n\nIf this issue is not actually resolved, please reopen it.\nCOMMENT\n)\"\n```\n\nStale tracker:\n\n```bash\ngh issue close {NUMBER} --comment \"$(cat \u003C\u003C'COMMENT'\nClosed by stale-issue audit. All tracked sub-issues are resolved: {#N1, #N2, ...}.\n\nIf tracked work remains, please reopen with the outstanding items unchecked.\nCOMMENT\n)\"\n```\n\n### 8. Report summary\n\n```\n**Audit complete:**\n- Issues closed (direct reference): {count}\n- Issues closed (branch-matched, inferred): {count}\n- Tracker issues closed: {count}\n- Kept open (no implementing PR): {count}\n- Total open issues after audit: {count}\n```\n\n## What remains manual\n\n- The Step-6 approval gate: the user approves every closure, individually or as a batch.\n- \"No match\" issues require human triage.\n- The audit trusts references and branch naming — it does not verify that a PR actually\n  implemented the issue. Branch-matched closures are labeled as inferred for exactly this\n  reason.\n",{"args":37,"name":5,"description":7},"repo (optional, defaults to current repo)","main","53ec1032b93d41533a48603e8fae7a92f56cc66c","framework\u002Fassets\u002Fskills\u002Fclose-stale-issues","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework","https:\u002F\u002Fgithub.com\u002Fparametrization","2026-09-21 01:06:30",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add parametrization\u002F2real-team-framework --skill close-stale-issues",{"tool":50,"command":51},"bunx","bunx skills add parametrization\u002F2real-team-framework --skill close-stale-issues",{"tool":53,"command":54},"pnpm","pnpm dlx skills add parametrization\u002F2real-team-framework --skill close-stale-issues","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fframework\u002Fassets\u002Fskills\u002Fclose-stale-issues\u002FSKILL.md",true,[],[59,81,97,113,128,141],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":32},"01M6E5VG1R7FF1025BZAV6BDTS","wave-wrapup","Finalize a wave — PR review, merge sequencing, issue cleanup, worktree cleanup, and handoff to retro","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-wrapup\u002FSKILL.md",[],[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],"wave wrapup","wrapup","review","handoff","merge","pr review","pr","cleanup","worktree","retro","team","issue","worktree cleanup","name","sequencing",{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":32},"01M6E5V9GDF75GV4YD2WPSH912","wave-start","Initialize a new wave — worktree cleanup, branch creation, label setup, status file update","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-start\u002FSKILL.md",[],[88,89,90,73,91,74,92,76,24,93,94,78,95,79,96],"wave start","start","setup","update","file","file update","initialize","creation","status",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":32},"01M6E5V4VXEJ39V87VHN1A3AW9","wave-scope","Reconcile declared-vs-labeled wave scope between \u002Fwave-retro and \u002Fwave-kickoff — collect dispositions, fold in retro carry-forwards and memory must-includes, and refresh the meta-issue","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-scope\u002FSKILL.md",[],[104,105,106,107,108,75,109,110,111,77,112],"wave scope","scope","memory","collect","Meta","refresh","reconcile","Fold","kickoff",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":32},"01M6E5TZNPGG5EXZEN1FKJJT6K","wave-retro","Automated wave retrospective — PR analysis, assessments, trust matrix updates, feedback log, charter change proposals","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-retro\u002FSKILL.md",[],[120,75,121,122,72,123,124,76,125,126,127,79],"wave retro","log","change","retrospective","analysis","feedback","proposals","trust",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":32},"01M6E5TR8XB3Z10A9SD4ZYNV45","wave-kickoff","Automated wave planning — branch creation, label management, issue labeling, kickoff comments, and execution plan","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-kickoff\u002FSKILL.md",[],[135,112,136,77,95,79,137,76,138,24,139,140],"wave kickoff","management","plan","execution","planning","execution plan",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":32},"01M6E5TMZAFB6MTVYT750FZDVY","wave-audit","Audit open issues against merged PRs — find and close orphaned issues with proper comments","https:\u002F\u002Fgithub.com\u002Fparametrization\u002F2real-team-framework\u002Fblob\u002Fmain\u002Fintake\u002Fnoorinalabs-2026-06\u002Fcandidates\u002Fskills\u002Fwave-audit\u002FSKILL.md",[],[22,148,20,149,150,18],"wave audit","find","open"]