[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CHRB54XCC994VHPZR1D91H":3,"skill-same:01M6CHRB54XCC994VHPZR1D91H":77},{"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":51,"linkOnly":52,"markdownContent":53,"markdownBody":54,"frontMatter":55,"refName":33,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":6,"ownerHtmlUrl":60,"ownerBlogUrl":61,"ownerDescription":6,"updatedAt":62,"install":63,"resources":76},"01M6CHRB54XCC994VHPZR1D91H","issue-handler",null,"Own a GitHub issue end-to-end in strike-cli — worktree, implement, test, PR, spawn review agents that comment on the PR, address feedback in a loop, CI, merge. Use when asked to handle\u002Ffix\u002Fclose an issue, ship a PR from an issue, or babysit issue work through merge to main.","dayvidpham\u002Faura-plugins","dayvidpham","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22456875?v=4","01M6CHR0F6J2M4QEHFR85XRNSR","David Huu Pham","01M6CHR0KQJ4DK5KSZ9TRTP7DW",2,"MIT","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fissue-handler\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,44,45,46,47,48,49,50],"handler","issue handler","issue","fix","when","address feedback","close","end","merge to main","main","github issue","strike","use","spawn","review","work","feedback","babysit","loop","ci","worktree","pr","merge","test","implement","github","cli","2026-11-10 10:12:30",false,"---\nname: issue-handler\ndescription: Own a GitHub issue end-to-end in strike-cli — worktree, implement, test, PR, spawn review agents that comment on the PR, address feedback in a loop, CI, merge. Use when asked to handle\u002Ffix\u002Fclose an issue, ship a PR from an issue, or babysit issue work through merge to main.\n---\n\n# Issue handler (strike-cli)\n\nOwn the issue end-to-end with due diligence on research, testing, and validation. Shipping is ownership: commit → push → PR → **review-agent loop** → CI green → merge → cleanup. All code edits happen inside a **git worktree**, never the primary checkout.\n\nFor agents developing strike. Authoring skills\u002Fdocs may use this pipeline; apply when the user frames work as an issue (or asks you to own issue→main).\n\n## Preconditions\n- `gh auth status` ok; git repo; network; issue number\u002FURL known.\n- **Stop-and-ask:** no write access; `gh` missing; issue already has an open PR you did not create (attach or ask — no duplicate). Dirty primary is fine for `git worktree add` from `origin\u002Fmain` — do not clean\u002Fstash primary WIP.\n\n## Workflow\n0. **Orient** — `gh issue view N` (+ comments). Read `AGENTS.md` + `docs\u002FARCHITECTURE.md` for boundaries. Note issue headers (`wave`\u002F`depends`\u002F`conflicts`\u002F`priority`) if present.\n1. **Research** — map issue→packages; read code + nearest tests. Optional local `.plan\u002Ffeatures.md` \u002F `FEATURES_STATUS.md` **if present** (never block if missing). State acceptance criteria bullets. Stop-and-ask if ambiguous.\n2. **Worktree** — create\u002Fenter; confirm `pwd` + branch before edits.\n3. **Plan** — smallest correct change; no drive-by refactors. Assign **risk tier A\u002FB\u002FC** (see Verification tiers).\n4. **Implement** — worktree only; load sibling skills when domain matches.\n5. **Test** — load `write-go-tests` when behavior changes.\n6. **Validate** — load `test-and-validate` for the **tier gate**; smoke when applicable.\n7. **Sync main** — if the PR will be open >~1h or `origin\u002Fmain` moved, `git fetch origin main && git merge origin\u002Fmain` then re-run tier gate before\u002Fat push.\n8. **Ship** — commit, push `origin\u002F\u003Cbranch>`, PR with `Fixes #N`.\n9. **Review loop** — tier-scaled (below); post findings; address; re-review until merge-ready.\n10. **Babysit CI** — fix branch-related failures; re-push; re-enter review loop after material code changes.\n11. **Merge** — only when merge gates pass (below).\n12. **Cleanup** — remove worktree after merge; leave cwd outside deleted tree.\n\n## Worktree setup\n```sh\nMAIN_ROOT=$(dirname \"$(git rev-parse --path-format=absolute --git-common-dir)\")\nWT_PARENT=\"$(dirname \"$MAIN_ROOT\")\u002Fstrike-cli-worktrees\"\nBRANCH=\"worktree-\u003Cslug>\"   # e.g. worktree-24-model-prefix; 2–4 kebab words; include issue # if helpful\nmkdir -p \"$WT_PARENT\"\ngit fetch origin main\n# Resume if yours; else create. Never delete others' worktrees.\nif [ -d \"$WT_PARENT\u002F$BRANCH\" ] && git worktree list | grep -q \"$WT_PARENT\u002F$BRANCH\"; then\n  # On $BRANCH and yours (clean or only your WIP): cd and continue.\n  # Stop-and-ask: foreign worktree, unexpected dirty state you don't own, or ambiguous collision.\n  cd \"$WT_PARENT\u002F$BRANCH\"\nelse\n  git worktree add -b \"$BRANCH\" \"$WT_PARENT\u002F$BRANCH\" origin\u002Fmain\n  cd \"$WT_PARENT\u002F$BRANCH\"\nfi\n```\nBefore every edit session:\n```sh\npwd   # must be $WT_PARENT\u002F$BRANCH\ngit rev-parse --abbrev-ref HEAD   # must be $BRANCH\n```\nRefuse Write\u002FEdit under primary checkout for issue implementation.\n\n## Verification tiers (local ship gate)\n\nSource of truth: root `AGENTS.md` *Verification tiers*. Summary:\n\n| Tier | When | Local gate |\n|---|---|---|\n| **A** | Docs\u002Fskills\u002Fmarkdown only | gofmt if any `.go`; no full test suite |\n| **B** | Normal code (default) | gofmt → TUI generate if `_src` → `web-check` if `web\u002F` → `make test && make vet && make build` |\n| **C** | tool \u002F permission \u002F auth \u002F session \u002F engine concurrency \u002F protocol wire \u002F sandbox | Tier B + `go test -race .\u002F... -count=1` + focused package tests |\n\nCI runs `go test -race .\u002F...` on every PR — do **not** always re-run full local race on A\u002FB.\n\n**Smoke:** load skill `smoke` when the diff touches `cmd\u002F`, `internal\u002Fengine`, TUI input\u002Fkeymap\u002Fapp, `session`, or `auth`.\n\n**Contract freeze:** default keybind or config-schema changes must update `docs\u002Fkeybinds.md` \u002F `docs\u002Fconfig.md` and call out migration in the PR body.\n\n**Flakes:** see `test-and-validate` flake policy — do not block unrelated merges on known env-only flakes; file `wave: 0` bugs.\n\nLoad `test-and-validate` for report format. Never weaken\u002Fdelete tests for green.\n\n## Commit and push\n```sh\ngit status && git diff && git log --oneline -10\ngit add \u003Cintended paths only>\ngit commit -m \"$(cat \u003C\u003C'EOF'\ntype(scope): concise summary\n\nFixes #\u003CN>\nEOF\n)\"\ngit push -u origin HEAD\n```\nConventional commits: `feat`\u002F`fix`\u002F`docs`\u002F`refactor`\u002F`test`\u002F`chore`. No secrets. No force-push main. No hook skips. Prefer new commits over amend\u002Fforce on shared PR branch.\n\n## Open PR\n```sh\ngh pr create --base main --head \"$BRANCH\" --title \"type(scope): summary\" --body \"$(cat \u003C\u003C'EOF'\n## Summary\n- …\n\n## Issue\nFixes #\u003CN>\n\n## Tier\nA | B | C\n\n## Verification\n- \u003Cexact commands from tier gate>\n- smoke: ran | skipped (reason)\nEOF\n)\"\n```\nFocused PR; no AI wall of text. If PR exists: `gh pr view`.\n\n## Review-agent loop (required for B\u002FC; optional for A)\n\nAfter the PR exists, **do not merge until the tier’s review bar is met**. You own dispatching reviewers, posting findings on the PR, fixing code, and repeating.\n\n### Pass budget (risk-scaled)\n\n| Tier | Review passes | Merge bar |\n|---|---|---|\n| **A** | 0–1 optional | Owner judgment; no blocking findings if a pass ran |\n| **B** | **1** clean pass on current HEAD | 0 **blocking**; should-fix fixed or explicitly deferred with reason on the PR |\n| **C** | **1–2** passes on current HEAD | 0 **blocking** and 0 **should-fix** |\n\nStall ceiling: **5** passes max — if still dirty, stop-and-ask (do not merge). Five is a cap, not a target.\n\n### When to run\n- Tier B\u002FC: once after first push + PR open (may run in parallel with CI).\n- Again after **any** push that changes production, test, skill, agent, workflow, or other merge-bound files — including review\u002FCI fixes.\n- Skip re-review only for pure changelog typos that cannot affect behavior or process — when unsure, re-review.\n- A clean review on an **older** SHA does **not** satisfy merge gates after a new push.\n\n### Resolve PR identity\n```sh\nPR=$(gh pr view --json number -q .number)\nHEAD_SHA=$(gh pr view --json headRefOid -q .headRefOid)\nREPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)\n```\n\n### Spawn reviewers\n**Preferred:** dispatch a read-only reviewer subagent:\n- Task `subagent_type: reviewer` when the host provides it, **or**\n- the in-repo agent at `.claude\u002Fagents\u002Fstrike-reviewer.md`\n\n**Fallback** if Task\u002Freviewer is unavailable: you run the same rubric in-process — still load the diff, still post findings via `gh`. Never skip the loop on Tier B\u002FC.\n\nOptionally spawn a second pass focused on tests\u002Fsecurity if Tier C or the first pass is large.\n\nReviewer prompt **must** include:\n- PR number\u002FURL, base branch (`main`), and current `headRefOid`\n- Issue number and acceptance criteria\n- Hard requirement: run `gh pr diff $PR` (or receive the full patch) and read surrounding callers\u002Ftests before any verdict — **never** approve from title\u002FURL alone\n- Instruction: correctness bugs first (concrete failure scenario), then needless complexity \u002F missed reuse; no impact-free style nits\n- Instruction: return ranked findings with `path:line`, severity `blocking` | `should-fix` | `nit`, failure scenario, and the **head SHA actually reviewed**\n- Instruction: do **not** edit files; findings only; output must be paste-ready verbatim\n\nAlso pull human\u002FGitHub review state:\n```sh\ngh pr view \"$PR\" --json reviews,comments,reviewDecision,headRefOid\ngh api \"repos\u002F$REPO\u002Fpulls\u002F$PR\u002Fcomments\"\ngh api \"repos\u002F$REPO\u002Fissues\u002F$PR\u002Fcomments\"\n```\n\n### Post findings as PR review comments\nPost reviewer output on the PR (not only chat). **Post the reviewer’s ranked findings verbatim** — do not omit, soften, or downgrade severity. If you disagree with a blocking\u002Fshould-fix item, still post it and **stop-and-ask** (or reply on the thread with the dispute); silent drop is forbidden.\n\n**Event policy (handler is usually the PR author):**\n- Automated\u002Fhandler-authored reviews **always** use `\"event\": \"COMMENT\"` (never `REQUEST_CHANGES` or `APPROVE` — GitHub rejects self-approve and self-request-changes leaves merge gates stuck).\n- Encode severity in the review body and inline comment text (`**blocking:**`, `**should-fix:**`, `**nit:**`).\n- Reserve GitHub `APPROVE` \u002F `REQUEST_CHANGES` for **distinct human** reviewers only.\n\n**Preferred — single COMMENT review with inline notes** (only for lines in the PR diff hunk on `$HEAD_SHA`):\n```sh\nHEAD_SHA=$(gh pr view \"$PR\" --json headRefOid -q .headRefOid)\ngh api \"repos\u002F$REPO\u002Fpulls\u002F$PR\u002Freviews\" --method POST --input - \u003C\u003CEOF\n{\n  \"commit_id\": \"$HEAD_SHA\",\n  \"event\": \"COMMENT\",\n  \"body\": \"Review pass N on $HEAD_SHA\\n\\n(verbatim summary of blocking \u002F should-fix \u002F nits)\",\n  \"comments\": [\n    {\n      \"path\": \"path\u002Fto\u002Ffile.go\",\n      \"line\": 42,\n      \"side\": \"RIGHT\",\n      \"body\": \"**blocking:** …\\n\\nFailure scenario: …\"\n    }\n  ]\n}\nEOF\n```\nIf an inline `line` is not part of the diff hunk, the API 422s — put that finding in the top-level review body instead (do not invent lines).\n\n**Fallback — top-level PR comment** when inline mapping is impractical:\n```sh\ngh pr comment \"$PR\" --body \"$(cat \u003C\u003CEOF\n## Review pass N (head \\`$HEAD_SHA\\`)\n### Blocking\n- \\`file:line\\` — … (failure scenario)\n\n### Should-fix\n- …\n\n### Nits (optional)\n- …\nEOF\n)\"\n```\n\n**Clean pass (meets tier bar) — still required on the PR for B\u002FC:**\nA chat-only “LGTM” does **not** count. Always record the clean pass against `$HEAD_SHA`:\n```sh\nHEAD_SHA=$(gh pr view \"$PR\" --json headRefOid -q .headRefOid)\ngh pr comment \"$PR\" --body \"$(cat \u003C\u003CEOF\n## Review pass N (head \\`$HEAD_SHA\\`) — clean\n0 blocking, 0 should-fix (or should-fix deferred per tier B). Merge checklist may proceed for this SHA only.\nEOF\n)\"\n```\n\nWhen building `gh api` JSON for inline reviews, encode bodies with `jq -n --arg body \"$text\"` so quotes\u002Fnewlines do not break the payload.\n\nRules for posted comments:\n- Include severity tag and failure scenario for blocking\u002Fshould-fix.\n- Anchor path:line to the diff on this PR’s current head SHA.\n- Do not spam duplicates across passes — reply on the existing thread or mark resolved in the next summary with the new SHA.\n\n### Address comments\n1. List open review threads \u002F new comments (human + automated).\n2. For each **blocking** (and **should-fix** on Tier C, or B when not deferring): fix in the worktree, add\u002Fadjust tests when behavior changes, run tier gate.\n3. **Nits:** fix if cheap and clearly better; otherwise reply on the thread why deferred (one line).\n4. Commit and push (new commit; no amend\u002Fforce on shared PR branch).\n5. Reply on each addressed thread (or in a single PR comment) with what changed (`commit` shortsha + brief note).\n6. Re-run tier gate; watch CI; **spawn another review pass on the new `headRefOid`** when the tier requires it.\n\n### Merge-ready checklist (all required for the tier)\n- [ ] Review bar met for tier A\u002FB\u002FC on **current** `headRefOid` (posted review\u002Fcomment cites that SHA)\n- [ ] That SHA matches `gh pr view --json headRefOid` at merge time\n- [ ] Latest pass findings posted **verbatim** on the PR (when a pass ran)\n- [ ] All actionable human review comments addressed or explicitly deferred with reason\n- [ ] `reviewDecision` is not `CHANGES_REQUESTED` (human reviewers); do not use self-REQUEST_CHANGES\n- [ ] CI checks green on the same head SHA\n- [ ] `mergeable=MERGEABLE`, not draft, state `OPEN`\n- [ ] Local tier gate passed on the same commit\n\n## CI watch \u002F fix\ngh-only (no Python watchers):\n```sh\ngh pr checks --watch\n# or poll:\ngh pr view --json state,mergeable,mergeStateStatus,statusCheckRollup,reviewDecision,isDraft\ngh pr checks\ngh run list --branch \"$BRANCH\" --limit 5\ngh run view \u003Crun-id> --log-failed\n```\n| Class | Action |\n|---|---|\n| Branch-related | fix in worktree → commit → push → re-watch → **re-enter review loop** if tier requires |\n| Flaky\u002Finfra | `gh run rerun \u003Cid> --failed` ≤2; then stop-and-ask |\n| Ambiguous | one diagnosis; then stop-and-ask |\n| Actionable review | fix → commit → push → **re-enter review loop** |\n\n## Merge\nMerge **only when** the merge-ready checklist above is fully satisfied:\n```sh\ngh pr merge --merge\n```\n`--merge` matches repo history. Do not pass `--delete-branch` while still checked out on the feature branch in the worktree — remote\u002Flocal branch deletion happens in Cleanup after `git worktree remove`. Blocked on review\u002Fpermissions → stop-and-ask; never force. **Hard forbids:** force-push; careless `reset --hard`; merge with failing checks; merge without meeting the tier review bar; close\u002Freopen PR unprompted.\n\n## Cleanup (after merge)\nFrom `MAIN_ROOT`:\n```sh\ncd \"$MAIN_ROOT\" && git fetch origin main\ngit worktree remove \"$WT_PARENT\u002F$BRANCH\"\ngit branch -d \"$BRANCH\" 2>\u002Fdev\u002Fnull || true\ngit worktree prune\n```\nDo not leave cwd inside deleted worktree. Only delete branch you created.\n\n## Sibling skills\n| When | Load |\n|---|---|\n| Writing\u002Fextending `*_test.go` | `write-go-tests` |\n| Before claiming done \u002F after impl or CI-fix | `test-and-validate` |\n| User-visible cmd\u002Fengine\u002Ftui\u002Fsession\u002Fauth | `smoke` |\n| Cutting a version tag | `release` |\n| Any `internal\u002Ftui` view\u002Fpanel\u002Fmodal\u002Ftheme | `tui-components` first |\n\n## Hard rules\n1. Own issue end-to-end through merge — including review-agent loop on B\u002FC.\n2. Never edit primary checkout for issue implementation.\n3. Never claim done without the **tier** local gate (not always full race).\n4. Never push secrets. Never weaken\u002Fdelete tests for green.\n5. Never force-push main; no destructive git on shared history.\n6. Smallest correct change; honor `AGENTS.md` scope. TUI imports: `protocol`, `host`, `tui\u002F…` only.\n7. `.plan\u002F` optional research only — never required; never treat unscoped roadmap as the issue.\n8. Stop-and-ask on ambiguity rather than guess.\n9. Never merge with open blocking findings (or tier-C should-fix) from the latest pass on the **current** head SHA.\n10. Always post review findings on the PR via `gh` (COMMENT review or comment) when a pass runs — chat-only review does not count.\n11. Post reviewer findings verbatim; never omit or downgrade severity. Disputes → stop-and-ask.\n12. Handler-authored automated reviews use `event: COMMENT` only — never self-APPROVE or self-REQUEST_CHANGES.\n\n## Stop-and-ask\n- `gh` auth\u002Fpermission failures; unclear\u002Fcontradictory acceptance criteria\n- Foreign\u002Funexpected dirty worktree; ambiguous path\u002Fbranch collision; CI red outside branch after 2 reruns\n- Merge conflicts with main you cannot resolve confidently (prefer `git merge origin\u002Fmain` over rebase)\n- Review requires product decision; would commit secrets or change CI\u002Fsecurity unexpectedly\n- Review loop still fails the tier bar after 5 passes\n- Desire to drop or downgrade a reviewer’s blocking\u002Fshould-fix finding\n\n## What this skill is not\n- Not unscoped `.plan\u002Ffeatures.md` implementer\n- Not multi-agent orchestrator requirement (beyond required PR review subagent \u002F strike-reviewer)\n- Not Python CI babysitter\n- Not a substitute for sibling domain skills\n","# Issue handler (strike-cli)\n\nOwn the issue end-to-end with due diligence on research, testing, and validation. Shipping is ownership: commit → push → PR → **review-agent loop** → CI green → merge → cleanup. All code edits happen inside a **git worktree**, never the primary checkout.\n\nFor agents developing strike. Authoring skills\u002Fdocs may use this pipeline; apply when the user frames work as an issue (or asks you to own issue→main).\n\n## Preconditions\n- `gh auth status` ok; git repo; network; issue number\u002FURL known.\n- **Stop-and-ask:** no write access; `gh` missing; issue already has an open PR you did not create (attach or ask — no duplicate). Dirty primary is fine for `git worktree add` from `origin\u002Fmain` — do not clean\u002Fstash primary WIP.\n\n## Workflow\n0. **Orient** — `gh issue view N` (+ comments). Read `AGENTS.md` + `docs\u002FARCHITECTURE.md` for boundaries. Note issue headers (`wave`\u002F`depends`\u002F`conflicts`\u002F`priority`) if present.\n1. **Research** — map issue→packages; read code + nearest tests. Optional local `.plan\u002Ffeatures.md` \u002F `FEATURES_STATUS.md` **if present** (never block if missing). State acceptance criteria bullets. Stop-and-ask if ambiguous.\n2. **Worktree** — create\u002Fenter; confirm `pwd` + branch before edits.\n3. **Plan** — smallest correct change; no drive-by refactors. Assign **risk tier A\u002FB\u002FC** (see Verification tiers).\n4. **Implement** — worktree only; load sibling skills when domain matches.\n5. **Test** — load `write-go-tests` when behavior changes.\n6. **Validate** — load `test-and-validate` for the **tier gate**; smoke when applicable.\n7. **Sync main** — if the PR will be open >~1h or `origin\u002Fmain` moved, `git fetch origin main && git merge origin\u002Fmain` then re-run tier gate before\u002Fat push.\n8. **Ship** — commit, push `origin\u002F\u003Cbranch>`, PR with `Fixes #N`.\n9. **Review loop** — tier-scaled (below); post findings; address; re-review until merge-ready.\n10. **Babysit CI** — fix branch-related failures; re-push; re-enter review loop after material code changes.\n11. **Merge** — only when merge gates pass (below).\n12. **Cleanup** — remove worktree after merge; leave cwd outside deleted tree.\n\n## Worktree setup\n```sh\nMAIN_ROOT=$(dirname \"$(git rev-parse --path-format=absolute --git-common-dir)\")\nWT_PARENT=\"$(dirname \"$MAIN_ROOT\")\u002Fstrike-cli-worktrees\"\nBRANCH=\"worktree-\u003Cslug>\"   # e.g. worktree-24-model-prefix; 2–4 kebab words; include issue # if helpful\nmkdir -p \"$WT_PARENT\"\ngit fetch origin main\n# Resume if yours; else create. Never delete others' worktrees.\nif [ -d \"$WT_PARENT\u002F$BRANCH\" ] && git worktree list | grep -q \"$WT_PARENT\u002F$BRANCH\"; then\n  # On $BRANCH and yours (clean or only your WIP): cd and continue.\n  # Stop-and-ask: foreign worktree, unexpected dirty state you don't own, or ambiguous collision.\n  cd \"$WT_PARENT\u002F$BRANCH\"\nelse\n  git worktree add -b \"$BRANCH\" \"$WT_PARENT\u002F$BRANCH\" origin\u002Fmain\n  cd \"$WT_PARENT\u002F$BRANCH\"\nfi\n```\nBefore every edit session:\n```sh\npwd   # must be $WT_PARENT\u002F$BRANCH\ngit rev-parse --abbrev-ref HEAD   # must be $BRANCH\n```\nRefuse Write\u002FEdit under primary checkout for issue implementation.\n\n## Verification tiers (local ship gate)\n\nSource of truth: root `AGENTS.md` *Verification tiers*. Summary:\n\n| Tier | When | Local gate |\n|---|---|---|\n| **A** | Docs\u002Fskills\u002Fmarkdown only | gofmt if any `.go`; no full test suite |\n| **B** | Normal code (default) | gofmt → TUI generate if `_src` → `web-check` if `web\u002F` → `make test && make vet && make build` |\n| **C** | tool \u002F permission \u002F auth \u002F session \u002F engine concurrency \u002F protocol wire \u002F sandbox | Tier B + `go test -race .\u002F... -count=1` + focused package tests |\n\nCI runs `go test -race .\u002F...` on every PR — do **not** always re-run full local race on A\u002FB.\n\n**Smoke:** load skill `smoke` when the diff touches `cmd\u002F`, `internal\u002Fengine`, TUI input\u002Fkeymap\u002Fapp, `session`, or `auth`.\n\n**Contract freeze:** default keybind or config-schema changes must update `docs\u002Fkeybinds.md` \u002F `docs\u002Fconfig.md` and call out migration in the PR body.\n\n**Flakes:** see `test-and-validate` flake policy — do not block unrelated merges on known env-only flakes; file `wave: 0` bugs.\n\nLoad `test-and-validate` for report format. Never weaken\u002Fdelete tests for green.\n\n## Commit and push\n```sh\ngit status && git diff && git log --oneline -10\ngit add \u003Cintended paths only>\ngit commit -m \"$(cat \u003C\u003C'EOF'\ntype(scope): concise summary\n\nFixes #\u003CN>\nEOF\n)\"\ngit push -u origin HEAD\n```\nConventional commits: `feat`\u002F`fix`\u002F`docs`\u002F`refactor`\u002F`test`\u002F`chore`. No secrets. No force-push main. No hook skips. Prefer new commits over amend\u002Fforce on shared PR branch.\n\n## Open PR\n```sh\ngh pr create --base main --head \"$BRANCH\" --title \"type(scope): summary\" --body \"$(cat \u003C\u003C'EOF'\n## Summary\n- …\n\n## Issue\nFixes #\u003CN>\n\n## Tier\nA | B | C\n\n## Verification\n- \u003Cexact commands from tier gate>\n- smoke: ran | skipped (reason)\nEOF\n)\"\n```\nFocused PR; no AI wall of text. If PR exists: `gh pr view`.\n\n## Review-agent loop (required for B\u002FC; optional for A)\n\nAfter the PR exists, **do not merge until the tier’s review bar is met**. You own dispatching reviewers, posting findings on the PR, fixing code, and repeating.\n\n### Pass budget (risk-scaled)\n\n| Tier | Review passes | Merge bar |\n|---|---|---|\n| **A** | 0–1 optional | Owner judgment; no blocking findings if a pass ran |\n| **B** | **1** clean pass on current HEAD | 0 **blocking**; should-fix fixed or explicitly deferred with reason on the PR |\n| **C** | **1–2** passes on current HEAD | 0 **blocking** and 0 **should-fix** |\n\nStall ceiling: **5** passes max — if still dirty, stop-and-ask (do not merge). Five is a cap, not a target.\n\n### When to run\n- Tier B\u002FC: once after first push + PR open (may run in parallel with CI).\n- Again after **any** push that changes production, test, skill, agent, workflow, or other merge-bound files — including review\u002FCI fixes.\n- Skip re-review only for pure changelog typos that cannot affect behavior or process — when unsure, re-review.\n- A clean review on an **older** SHA does **not** satisfy merge gates after a new push.\n\n### Resolve PR identity\n```sh\nPR=$(gh pr view --json number -q .number)\nHEAD_SHA=$(gh pr view --json headRefOid -q .headRefOid)\nREPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)\n```\n\n### Spawn reviewers\n**Preferred:** dispatch a read-only reviewer subagent:\n- Task `subagent_type: reviewer` when the host provides it, **or**\n- the in-repo agent at `.claude\u002Fagents\u002Fstrike-reviewer.md`\n\n**Fallback** if Task\u002Freviewer is unavailable: you run the same rubric in-process — still load the diff, still post findings via `gh`. Never skip the loop on Tier B\u002FC.\n\nOptionally spawn a second pass focused on tests\u002Fsecurity if Tier C or the first pass is large.\n\nReviewer prompt **must** include:\n- PR number\u002FURL, base branch (`main`), and current `headRefOid`\n- Issue number and acceptance criteria\n- Hard requirement: run `gh pr diff $PR` (or receive the full patch) and read surrounding callers\u002Ftests before any verdict — **never** approve from title\u002FURL alone\n- Instruction: correctness bugs first (concrete failure scenario), then needless complexity \u002F missed reuse; no impact-free style nits\n- Instruction: return ranked findings with `path:line`, severity `blocking` | `should-fix` | `nit`, failure scenario, and the **head SHA actually reviewed**\n- Instruction: do **not** edit files; findings only; output must be paste-ready verbatim\n\nAlso pull human\u002FGitHub review state:\n```sh\ngh pr view \"$PR\" --json reviews,comments,reviewDecision,headRefOid\ngh api \"repos\u002F$REPO\u002Fpulls\u002F$PR\u002Fcomments\"\ngh api \"repos\u002F$REPO\u002Fissues\u002F$PR\u002Fcomments\"\n```\n\n### Post findings as PR review comments\nPost reviewer output on the PR (not only chat). **Post the reviewer’s ranked findings verbatim** — do not omit, soften, or downgrade severity. If you disagree with a blocking\u002Fshould-fix item, still post it and **stop-and-ask** (or reply on the thread with the dispute); silent drop is forbidden.\n\n**Event policy (handler is usually the PR author):**\n- Automated\u002Fhandler-authored reviews **always** use `\"event\": \"COMMENT\"` (never `REQUEST_CHANGES` or `APPROVE` — GitHub rejects self-approve and self-request-changes leaves merge gates stuck).\n- Encode severity in the review body and inline comment text (`**blocking:**`, `**should-fix:**`, `**nit:**`).\n- Reserve GitHub `APPROVE` \u002F `REQUEST_CHANGES` for **distinct human** reviewers only.\n\n**Preferred — single COMMENT review with inline notes** (only for lines in the PR diff hunk on `$HEAD_SHA`):\n```sh\nHEAD_SHA=$(gh pr view \"$PR\" --json headRefOid -q .headRefOid)\ngh api \"repos\u002F$REPO\u002Fpulls\u002F$PR\u002Freviews\" --method POST --input - \u003C\u003CEOF\n{\n  \"commit_id\": \"$HEAD_SHA\",\n  \"event\": \"COMMENT\",\n  \"body\": \"Review pass N on $HEAD_SHA\\n\\n(verbatim summary of blocking \u002F should-fix \u002F nits)\",\n  \"comments\": [\n    {\n      \"path\": \"path\u002Fto\u002Ffile.go\",\n      \"line\": 42,\n      \"side\": \"RIGHT\",\n      \"body\": \"**blocking:** …\\n\\nFailure scenario: …\"\n    }\n  ]\n}\nEOF\n```\nIf an inline `line` is not part of the diff hunk, the API 422s — put that finding in the top-level review body instead (do not invent lines).\n\n**Fallback — top-level PR comment** when inline mapping is impractical:\n```sh\ngh pr comment \"$PR\" --body \"$(cat \u003C\u003CEOF\n## Review pass N (head \\`$HEAD_SHA\\`)\n### Blocking\n- \\`file:line\\` — … (failure scenario)\n\n### Should-fix\n- …\n\n### Nits (optional)\n- …\nEOF\n)\"\n```\n\n**Clean pass (meets tier bar) — still required on the PR for B\u002FC:**\nA chat-only “LGTM” does **not** count. Always record the clean pass against `$HEAD_SHA`:\n```sh\nHEAD_SHA=$(gh pr view \"$PR\" --json headRefOid -q .headRefOid)\ngh pr comment \"$PR\" --body \"$(cat \u003C\u003CEOF\n## Review pass N (head \\`$HEAD_SHA\\`) — clean\n0 blocking, 0 should-fix (or should-fix deferred per tier B). Merge checklist may proceed for this SHA only.\nEOF\n)\"\n```\n\nWhen building `gh api` JSON for inline reviews, encode bodies with `jq -n --arg body \"$text\"` so quotes\u002Fnewlines do not break the payload.\n\nRules for posted comments:\n- Include severity tag and failure scenario for blocking\u002Fshould-fix.\n- Anchor path:line to the diff on this PR’s current head SHA.\n- Do not spam duplicates across passes — reply on the existing thread or mark resolved in the next summary with the new SHA.\n\n### Address comments\n1. List open review threads \u002F new comments (human + automated).\n2. For each **blocking** (and **should-fix** on Tier C, or B when not deferring): fix in the worktree, add\u002Fadjust tests when behavior changes, run tier gate.\n3. **Nits:** fix if cheap and clearly better; otherwise reply on the thread why deferred (one line).\n4. Commit and push (new commit; no amend\u002Fforce on shared PR branch).\n5. Reply on each addressed thread (or in a single PR comment) with what changed (`commit` shortsha + brief note).\n6. Re-run tier gate; watch CI; **spawn another review pass on the new `headRefOid`** when the tier requires it.\n\n### Merge-ready checklist (all required for the tier)\n- [ ] Review bar met for tier A\u002FB\u002FC on **current** `headRefOid` (posted review\u002Fcomment cites that SHA)\n- [ ] That SHA matches `gh pr view --json headRefOid` at merge time\n- [ ] Latest pass findings posted **verbatim** on the PR (when a pass ran)\n- [ ] All actionable human review comments addressed or explicitly deferred with reason\n- [ ] `reviewDecision` is not `CHANGES_REQUESTED` (human reviewers); do not use self-REQUEST_CHANGES\n- [ ] CI checks green on the same head SHA\n- [ ] `mergeable=MERGEABLE`, not draft, state `OPEN`\n- [ ] Local tier gate passed on the same commit\n\n## CI watch \u002F fix\ngh-only (no Python watchers):\n```sh\ngh pr checks --watch\n# or poll:\ngh pr view --json state,mergeable,mergeStateStatus,statusCheckRollup,reviewDecision,isDraft\ngh pr checks\ngh run list --branch \"$BRANCH\" --limit 5\ngh run view \u003Crun-id> --log-failed\n```\n| Class | Action |\n|---|---|\n| Branch-related | fix in worktree → commit → push → re-watch → **re-enter review loop** if tier requires |\n| Flaky\u002Finfra | `gh run rerun \u003Cid> --failed` ≤2; then stop-and-ask |\n| Ambiguous | one diagnosis; then stop-and-ask |\n| Actionable review | fix → commit → push → **re-enter review loop** |\n\n## Merge\nMerge **only when** the merge-ready checklist above is fully satisfied:\n```sh\ngh pr merge --merge\n```\n`--merge` matches repo history. Do not pass `--delete-branch` while still checked out on the feature branch in the worktree — remote\u002Flocal branch deletion happens in Cleanup after `git worktree remove`. Blocked on review\u002Fpermissions → stop-and-ask; never force. **Hard forbids:** force-push; careless `reset --hard`; merge with failing checks; merge without meeting the tier review bar; close\u002Freopen PR unprompted.\n\n## Cleanup (after merge)\nFrom `MAIN_ROOT`:\n```sh\ncd \"$MAIN_ROOT\" && git fetch origin main\ngit worktree remove \"$WT_PARENT\u002F$BRANCH\"\ngit branch -d \"$BRANCH\" 2>\u002Fdev\u002Fnull || true\ngit worktree prune\n```\nDo not leave cwd inside deleted worktree. Only delete branch you created.\n\n## Sibling skills\n| When | Load |\n|---|---|\n| Writing\u002Fextending `*_test.go` | `write-go-tests` |\n| Before claiming done \u002F after impl or CI-fix | `test-and-validate` |\n| User-visible cmd\u002Fengine\u002Ftui\u002Fsession\u002Fauth | `smoke` |\n| Cutting a version tag | `release` |\n| Any `internal\u002Ftui` view\u002Fpanel\u002Fmodal\u002Ftheme | `tui-components` first |\n\n## Hard rules\n1. Own issue end-to-end through merge — including review-agent loop on B\u002FC.\n2. Never edit primary checkout for issue implementation.\n3. Never claim done without the **tier** local gate (not always full race).\n4. Never push secrets. Never weaken\u002Fdelete tests for green.\n5. Never force-push main; no destructive git on shared history.\n6. Smallest correct change; honor `AGENTS.md` scope. TUI imports: `protocol`, `host`, `tui\u002F…` only.\n7. `.plan\u002F` optional research only — never required; never treat unscoped roadmap as the issue.\n8. Stop-and-ask on ambiguity rather than guess.\n9. Never merge with open blocking findings (or tier-C should-fix) from the latest pass on the **current** head SHA.\n10. Always post review findings on the PR via `gh` (COMMENT review or comment) when a pass runs — chat-only review does not count.\n11. Post reviewer findings verbatim; never omit or downgrade severity. Disputes → stop-and-ask.\n12. Handler-authored automated reviews use `event: COMMENT` only — never self-APPROVE or self-REQUEST_CHANGES.\n\n## Stop-and-ask\n- `gh` auth\u002Fpermission failures; unclear\u002Fcontradictory acceptance criteria\n- Foreign\u002Funexpected dirty worktree; ambiguous path\u002Fbranch collision; CI red outside branch after 2 reruns\n- Merge conflicts with main you cannot resolve confidently (prefer `git merge origin\u002Fmain` over rebase)\n- Review requires product decision; would commit secrets or change CI\u002Fsecurity unexpectedly\n- Review loop still fails the tier bar after 5 passes\n- Desire to drop or downgrade a reviewer’s blocking\u002Fshould-fix finding\n\n## What this skill is not\n- Not unscoped `.plan\u002Ffeatures.md` implementer\n- Not multi-agent orchestrator requirement (beyond required PR review subagent \u002F strike-reviewer)\n- Not Python CI babysitter\n- Not a substitute for sibling domain skills\n",{"name":5,"description":7},"7fe8098d35c17a7d6497a81e4c08abb4c2d02735",".claude\u002Fskills\u002Fissue-handler",0,"https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins","https:\u002F\u002Fgithub.com\u002Fdayvidpham","dhpham.com","2026-11-11 16:48:56",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add dayvidpham\u002Faura-plugins --skill issue-handler",{"tool":69,"command":70},"bunx","bunx skills add dayvidpham\u002Faura-plugins --skill issue-handler",{"tool":72,"command":73},"pnpm","pnpm dlx skills add dayvidpham\u002Faura-plugins --skill issue-handler","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fissue-handler\u002FSKILL.md",true,[],[78,101,126,131,137,142],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":51},"01M70PPVS3CW9RYWGZ4KSNV7MV","afk-implement","Run an unattended (\"AFK\") implementation session as the supervisor — scope small progressive iterations, push feature branches, open pull requests, drive review waves to clean, and never merge. Use when the user says they are going AFK or to bed, asks for overnight autonomous implementation, says \"don't block on me\", \"open PRs but don't merge\", \"progressive adoption\", or \"stack changes\".","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fafk-implement\u002FSKILL.md",[],[48,85,86,87,88,89,90,91,92,93,28,38,94,95,96,97,46,98,99,100],"afk implement","pull","bed","never","scope","clean","branches","open","autonomous","pull requests","stack","me","run","unattended","overnight","but",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":108,"publishedAt":51},"01M6CHSCKDTSV05385SJ05XWW6","protocol","Aura protocol reference documentation — 12-phase workflow, agent roles, constraints, and coding standards. Read when you need to understand the full workflow or look up conventions.","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002Fskills\u002Fprotocol\u002FSKILL.md",[107],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[103,109,110,111,112,113,114,115,116,117,118,119,28,120,121,122,123,124,125],"coding","standards","documentation","read","up","coding standards","reference","look","workflow","full","constraints","you","phase","roles","understand","conventions","aura",{"skillNo":127,"name":103,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":51},"01M6CHSBJDVKGWAJWQCNQ22F9F","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002Fnix\u002Fhm-module-test-data\u002Ffull\u002Fskills\u002Fprotocol\u002FSKILL.md",[],[103],{"skillNo":132,"name":133,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":51},"01M6CHSAJY85M0W8NEAN4PRF82","example","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002Fnix\u002Fhm-module-test-data\u002Ffull\u002Fskills\u002Fexample\u002FSKILL.md",[],[133],{"skillNo":138,"name":133,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":51},"01M6CHS9KQJYCWR1C9F2GJDZYX","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002Fnix\u002Fhm-module-test-data\u002Ffull\u002F.opencode\u002Fskill\u002Fexample\u002FSKILL.md",[],[133],{"skillNo":143,"name":133,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":146,"publishedAt":51},"01M6CHS8MSW2SDQ5Y05A3GZES4","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002Fnix\u002Fhm-module-test-data\u002Ffull\u002F.agents\u002Fskills\u002Fexample\u002FSKILL.md",[],[133]]