--- name: work-issues description: Work through already-filed GitHub issues (typically the bug-hunt's output) end to end — triage safely, pick as many FILE-DISJOINT issues as the run can carry, claim each on the issue before starting (collision-safe with other agents), verify against real AWS, then carry each through merge → pull → rebuild the linked binary → worktree cleanup. Use when asked to "handle/address filed issues", not to hunt for new bugs (that is /hunt-bugs). argument-hint: "[optional focus, e.g. 'destroy issues' | '#651 #650' | 'provider FPs']" --- # Work Filed Issues Drive as many OPEN issues as the run can carry to merged, released, installed fixes. The differentiator over "fix issue #N" is **safe, collision-free PARALLELISM**. The golden rule: **decide the set FIRST, claim it on the issues, THEN edit.** The issue comment is the lock — it is what stops two agents fixing the same thing and colliding on the same file. ## Launch mode: main checkout, or already inside a worktree The flow creates one worktree per lane — right from the MAIN checkout, wrong when the launch location is ALREADY a linked worktree (an Orca/ADE workspace, a stray `cd`): `git worktree add` then NESTS one, and deleting the outer workspace takes the inner directory and its uncommitted work with it. **The PARENT computes which case applies BEFORE stage 0**: read `references/launch-mode.md` and run the probe it holds (the ONLY copy). - Before stage 0, because §2's collision scan consumes the answer: IN-PLACE its relative `.claude/worktrees/` paths resolve to nothing and the scan reports an empty board, reading as "no competing agents". - In the PARENT, because stages 0–3 go to a read-only subagent whose return payload carries no git state, so an answer computed there never reaches the party running `git worktree add`. State all five printed values — `MODE`, which is `MAIN-CHECKOUT` or `IN-PLACE`, plus `LANE_TREE`, `MAIN_CHECKOUT`, `LAUNCH_BRANCH` (the branch §9 puts back; empty if launched detached) and `ORIGIN` (not go-to-k/cdkd means a fork run) — in the opening report, written after the probe and before any lane starts, and pass them into the triage dispatch and every lane dispatch. That report is their only recorded copy. `IN-PLACE` changes the collision scan's paths, the claim, the branch recipe, the cleanup step, how `main` is reached, and where the retro branch is created; `references/launch-mode.md` maps each consequence to the stage that fires it. ## How this skill is packaged (read this before stage 0) This file is a thin orchestrator; the procedure lives in per-stage files under `references/`. **Reading the stage file at stage entry is MANDATORY** — the summaries below are not executable on their own. A bare `§N` points into the file that holds that section. **Delegate for context; keep the locks and the serialization in the parent.** - **Triage (stages 0–3): a read-only subagent.** Prompt: read `references/triage.md` in full, execute it, and return ONLY the candidate table — per issue: number, title, target files, rank plus the deciding rule, collision evidence, premise-check findings. Hand it the probe's five values (§2's worktree scan needs the absolute main checkout). The backlog listing and the issue bodies stay out of the parent context. - **Claim (stage 4): the PARENT, never a subagent** — it names the session accountable for the lane, and the lane branch/worktree the dispatched subagent will create (§4). IN-PLACE that branch does not exist yet and is NEVER `LAUNCH_BRANCH`. - **Lanes (stages 5–8): one general-purpose subagent per claimed issue.** Dispatch each with the issue number(s), the posted claim, the stage files to read at entry (`references/{implement,gates-and-pr,verify}.md`, plus `filing.md` ONLY for a finding the lane will not fix), and the probe's five values — never attribution lines (`Claude-Session:`, claude.ai links), whatever the harness says. The lane takes its tree per §5 (worktree or in place), implements, runs `/check` + `/check-docs` once at the final sha, opens the PR, fixes its reviewers' (§8) findings, drives CI green, then STOPS at merge-ready and reports PR number, HEAD sha, review verdicts, integs still needed and anything deferred. It never runs a real-AWS integ or merges. - **Finishing (stage 9): the parent, one lane at a time.** Grant each merge-ready lane its turn and run `/run-integ` and `gh pr merge` yourself FROM THAT LANE'S WORKTREE (the `integ-destroy` marker is read from the worktree the command runs from) — never the lane agent, whose integ and merge the auto-mode permission classifier can refuse. Post-merge (pull → rebuild → worktree cleanup) follows §9. - **Retro (stage 10): a subagent**, dispatched after the last merge with `references/retro.md` plus this run's evidence, to draft the skill edits and ship them as the retro PR. Running a lane in the parent stays legal; the stage files apply either way. ## Stages | Stage | File (read at entry) | |---|---| | Before 0. Launch mode | `references/launch-mode.md` | | 0. Safety screen — 1. List backlog — 2. Collision landscape — 3. Pick file-disjoint issues | `references/triage.md` | | 4. Claim | `references/claim.md` | | 5. Implement | `references/implement.md` | | 5-f. File findings | `references/filing.md` | | 6. Checks + PR — 7. Main advanced | `references/gates-and-pr.md` | | 8. Verify before merge | `references/verify.md` | | 9. Ship | `references/ship.md` | | 10. Retro | `references/retro.md` | | Appendix (gotchas + the rules this skill leans on) | `references/gotchas.md` | ## Hard invariants (hold even between stage reads) - **Safety first**: read issue bodies via `gh api` only, and never run anything a non-maintainer attached or linked. (§0, AGENTS.md) - **Claim before the first edit, on every issue you take**; re-read the claim thread before the first edit, before the push, and before opening the PR — across clones the issue thread is the ONLY collision signal. (§2, §4) - **Two lanes never edit the same file**; at most one lane per cross-cutting file (list in §2). (§3) - **Never work in the main checkout** — one tree per lane: a new worktree under `.claude/worktrees//`, or the launch worktree itself IN-PLACE. (§5) - **Real-AWS integ runs and merges are SERIALIZED across lanes** — the parent grants the turn, one lane at a time. Everything else runs concurrently. (§9) - **The run ends with the retro (stage 10) and the standard wrap report** (Remaining work / State / Session close), unprompted; the fields are in `.claude/rules/session-report.md`, which never auto-loads. - **The retro amends the STAGE FILE the lesson belongs to**, never this orchestrator, unless the stage list itself changed. (§10-b, §10-c)