shiftlisted
Install: claude install-skill bengous/claude-code-plugins
# Shift
One pass over the tracker with nobody watching. The state lives on GitHub, in labels, never in a file: a shift that runs twice does its work once.
## Input
`$ARGUMENTS`
- `--max <n>`: issues dispatched this pass. Default 2, for cost.
- `--dry-run`: print each action in place of taking it. No comment, no label, no worker.
## Protocol
1. **Labels.** `gh label list --limit 100`. Create the ones it does not list: `needs-info`, `dispatched`, `blocked` for issues, `shift`, `needs-human` for PRs.
```bash
gh label create needs-info --description "Missing evidence or acceptance criteria"
```
2. **Triage.** `gh issue list --state open --json number,title,labels,createdAt`. Drop the ones already labelled `dispatched`, `blocked`, `needs-info` or `epic`. Oldest first, `bug` before the rest. Read `${CLAUDE_PLUGIN_ROOT}/skills/triage/SKILL.md` and apply its protocol to each: it verifies the issue against the current code and closes or comments as its verdict fixes. Read it, do not invoke it: `github-flow:triage` is a manual skill. `unclear` → label `needs-info`. `valid` → candidate.
3. **Dispatch.** The first `--max` candidates, in one call to `github-flow:dispatch` with their numbers.
4. **Maintain.** `gh pr list --state open --label shift --json number,headRefName,mergeable,statusCheckRollup,reviewDecision,comments`. Skip the ones labelled `needs-human`. A PR with a red check, `mergeable: CONFLICTING`, or a review comment nobody answered goes to one `github-flow:i