pb-bug-fix
Turn a GitHub issue into a tested fix on a branch with an open PR: read the issue as the contract, find the root cause, write the failing test first, fix, prove it, review the diff against the issue,
SKILL.mdskills/playbooks/pb-bug-fix/SKILL.md
GitHubGitHub issue to tested fix and PR
What you get: a branch with a failing-then-passing test and the fix, reviewed against the issue, and an open PR that closes it. Merging is a separate run (pb-ship).
Inputs
- repo — the current directory, or the one the user names;
<owner/repo>comes fromgit -C <repo> remote get-url origin - issue_number — the GitHub issue to fix, asked if missing
Steps
- github — repo, issue_number →
gh auth status, thengh issue view <n> -R <owner/repo> --json title,body,labels,stateas the contract (acceptance points as a list) in the run log (gh missing, unauthenticated, no GitHub remote, or the issue is closed → log it, give thegh auth login/ remote hint, stop) — contract written - deja-memory — error text or symptom from the issue →
deja fixresult in the run log — prior fix found, or "none" - systematic-debugging — contract → root cause and a local repro command in the run log — repro fails locally on the base SHA (base SHA logged), or the reason it cannot run locally
- test-driven-development — root cause → failing test first (run, red, output pasted), then the minimal fix on a new branch
fix/<n>-<slug>— the new test fails on the base SHA and passes after the fix; no unrelated edits - verification-before-completion — repro command and the repo's test, lint and typecheck scripts that exist → fresh passing output pasted in the run log — output pasted, not claimed
- reviewer (agent) —
git diff <base>...HEAD; the contract is the issue from step 1, never the run log and never the implementer's claim (input material only) → findings table in the run log — any openblockingfinding sends the run back to step 4, at most 2 cycles, then stop and escalate. No subagent support in this harness → the main session reads agents/reviewer.md and runs the review inline, same contract, findings table in the run log, using only the diff and the contract, never the session's reasoning - git-pr-review —
git log <base>..HEAD→ PR body draft in the run log, ending inFixes #<n>— draft only, nothing posted - [GO] git push + gh pr create —
git push -u origin <branch>thengh pr create -R <owner/repo> --base <base> --head <branch> --title "<title>" --body-file <draft>— the WAITING FOR GO line names branch, base, title and issue number. The run stops here until the human types GO. One GO covers the push and the PR creation, one time. (Where the hook runs, it covers the push only;gh pr createis not hooked, so this GO is its only guard.) - github —
gh pr view <branch> -R <owner/repo> --json url,closingIssuesReferences→ PR URL in the run log —closingIssuesReferencescontains<n>
Run log: production_artifacts/pb-bug-fix-<date>.md in the start directory, never committed
Rules
- Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
- GO is by contract in every harness. The go-gate hook is only a backstop on Claude Code, OpenCode and agy (Codex: unverified; Cursor, Kimi: none). A missing hook is never permission to proceed.
- A failed check stops the run: write the failure into the run log and report. No silent retries beyond what a step names.
- Write one run-log line per step as it completes (
N. done|skipped|failed — artifact — check result) andWAITING FOR GO: <step>at each gate.