Liefert die offenen PBIs und Bugs eines Issues (ein Arbeitselement = offener Issue mit label pbi oder bug; ein Bug durchläuft denselben Loop, Branch-Typ fix, Closes #<nr>) nacheinander: Ein Unteragent implementiert, ein Unteragent reviewt, diese Sitzung erstellt den PR, wartet auf CI und merged. Die gleichen Schritte auf jeder Plattform (Claude Code, OpenCode, Copilot CLI). Der Zustand lebt nur in GitHub (Issues, Sub-Issues, Branches, PRs), sodass ein Lauf jederzeit gestoppt werden kann und /deliver <nr> dort fortsetzt, wo er aufgehört hat. Die harte Schranke ist das Regelset auf release/next: ein roter oder fehlender erforderlicher Check blockiert den Merge unabhängig von dieser Sitzung.
Eingabe
help (oder --help, -h): gibt references/help.md unverändert aus, nichts weiter.
/deliver status --milestone <name>: gibt den Statusblock (## Status block) aus und stoppt, es wird nichts ausgeliefert.
/deliver <nr> [<nr> …] [--milestone <name>] [--unattended] [--inline] [--max <n>]: jede Zahl ist ein PBI, Bug, Feature oder Epic; --milestone <name> (ein Release, M<n> oder ein Legacy-Titel) fügt die offenen Arbeitselemente dieses Meilensteins hinzu (ein Batch-Lesevorgang des Meilensteins (pwsh <skill-dir>/../github-milestone/scripts/Get-Milestones.ps1 -Mode issues -Name <name> -State open: REST, alle Seiten, keine PRs; die github-milestone-Suche löst M4 zum Titel M4 oder, nach close, M4 (0.2.0) auf; filtere die zurückgegebene Liste nach Label: pbi, bug), plus die Arbeitselemente unterhalb der Features und Epics darin. Der milestone.title dieses Lesevorgangs ist der Titel für gh issue create --milestone; <key> ist sein M<n> oder die Unternummer M<n>.<m> (Legacy: der Titel) und benennt die Zustandsdatei und die Hinweise. Fehlend: einmal nachfragen. --max <n> stoppt nach n ausgelieferten, blockierten oder pausierten PBIs und gibt den Bericht aus (scripts/Invoke-DeliverLoop.ps1 verwendet --max 1 pro frischer Sitzung, references/loop.md).
- Interaktiv (Standard): eine Pausenregel fragt den Benutzer im Chat; ein blockiertes PBI fragt: erneut versuchen, überspringen oder eine Anweisung.
- Kontrollsitzung: interaktiv mit mehr PBIs als
deliver.loopThreshold(Standard 3), z. B. jedes--milestone: liefere sie nicht hier aus, starteInvoke-DeliverLoop.ps1und bleibe eine dünne Sitzung für Entscheidungen,interactivePBIs und Schritt 9 (references/control.md).--inlineliefert sie alle in dieser Sitzung aus (Schritte 1 bis 9).--no-preflightüberspringt Start 3. --unattended(claude -p,opencode run,copilot -p): niemals fragen. Eine Pause kommentiert den Issue, fügt das Labelneeds-decisionhinzu und fährt mit dem nächsten PBI fort, das nicht davon abhängt.
Start
gh auth statusfunktioniert und das Repository hatrelease/next.gh api repos/{owner}/{repo}/rules/branches/release/next --jq '.[].type': keinrequired_status_checksin der Ausgabe → warne, dass rote CI hier mergebar ist (Regelset vongithub-release), dann weiter.- Preflight (übersprungen durch
--no-preflight):pwsh <skill-dir>/scripts/Test-DeliverPreflight.ps1 -Harness <claude|opencode|copilot> [-Unattended] -Textgibt eine Zeile pro Prüfung aus, ok / behoben / Aktion erforderlich: Skill-Stapel, Whitelist (git,gh,pwsh <skill-dir>/scripts/*, die Verifikationsbefehle vonAGENTS.md; Einträge pro Plattform:references/permissions.md, sonst hängt ein unbeaufsichtigter Lauf an einer Eingabeaufforderung), veraltete Worktrees; Reaktionen inreferences/preflight.md. Schreibe Befehle ohne escapes$(…); die Berechtigungsprüfung kann nicht durch sie hindurchsehen. - Fortschrittsereignisse: ohne
AGENT_EVENTS_RUNführepwsh <skill-dir>/scripts/Report-Progress.ps1 -Type run.started -Source sessionaus und behalte die gedruckte Run-ID. Füge-Run <id>zu jedem späteren Aufruf hinzu (step.finished,attention,issue.finished,run.finished): Bash-Aufrufe teilen keinen Shell-Zustand, undAGENT_EVENTS_RUNals Präfix würde nicht zur Whitelist passen. Jede Fortschrittszeile, Aufmerksamkeitsgrund und das Ende gehen durchReport-Progress.ps1; es zeigt sie in dem Terminal an, in dem die Sitzung läuft (references/terminal-backends.md).
Schritte
Gib eine Zeile pro Schritt im Chat aus: #<nr> <step>: <result> (#12 review: 1 blocking → fix 1/2). Melde jede Zeile: pwsh <skill-dir>/scripts/Report-Progress.ps1 -Type step.finished -Issue <nr> -Step <step> -Result "<result>" [-Pr <url>]. Auch -Type attention (-Kind pr_opened mit -Pr <url> nach Schritt 6, review_fix wenn ein Review- oder CI-Durchlauf einen Fix-Durchlauf startet, ci_red wenn Schritt 7 rot ist; -Reason): die Benachrichtigungen der Schleife kommen nur von diesen Ereignissen. Eine Pause, ein blockiertes PBI oder ein Punkt, der den Benutzer benötigt: stattdessen -Type attention (-Kind paused, blocked oder needs_you, -Reason). Nach jedem PBI -Type issue.finished -Issue <nr> -Outcome <outcome>.
Jeder PR und Issue, den der Chat nennt, wird als vollständige URL geschrieben (https://github.com/<owner>/<repo>/pull/<n>, .../issues/<n>), nicht als bloßes #<n>: eine bloße Zahl ist im Terminal kein Link. Dies gilt für die Fortschrittszeilen, die Fragen an den Benutzer und den Bericht, insbesondere für den Release-PR (Schritt 9), den der Benutzer mergen muss. Hole die URL von gh (html_url), baue sie niemals aus dem Gedächtnis.
- Auswählen.
gh api repos/{owner}/{repo}/issues/<nr> --jq '{number,title,state,labels:[.labels[].name],body}'für jede Nummer und ihre Sub-Issues (github-issuereferences/sub-issues.md, rekursiv bis zu PBIs und Bugs). Sammle die offenen Arbeitselemente (pbioderbug) aller Nummern und des Meilensteins, entferne Duplikate, behalte die ohneneeds-decision(eines, dessen Body das ADR-Kriterium hat, wird gemeldet als#<nr> select: decision, write the ADR with adr); ordne sie nach ihren blocked-by-Links über alle hinweg, bei Gleichstand die Reihenfolge der Argumente. Mit--milestonewird ein PBI oder Bug, das über ein Feature oder Epic des Meilensteins erreicht wird, das keinen oder einen anderen Meilenstein hat, nicht ausgeliefert (#<nr> select: outside M<n>, skipped, Hinweis: setze den Meilenstein,github-issuereferences/milestones.md);/deliver <feature>ohne--milestoneliefert alle seine PBIs aus. Ein PBI, dessen Blocker noch offen und nicht im Set ist, wartet und wird gemeldet (ein Blocker außerhalb des Meilensteins wird nie ausgeliefert). Ein PBI oder Bug mitneeds-refinement, oder ein Bug ohne Reproduktions- oder Akzeptanzkriterien, wird übersprungen (#<nr> select: needs refinement, skipped, Hinweisplanner refine <nr>);/deliver <nr>auf einem solchen Element lehnt es ab. Unattended wird ein PBI mitinteractiveübersprungen (#<nr> select: interactive, skipped, Hinweis/deliver <nr>in einer Sitzung); der interaktive Modus liefert es aus, auch über ein Feature, Epic oder einen Meilenstein. Ein offenes PBI mitrelease-test(der RC-Test des Meilensteins) wird nie als Arbeit ausgewählt, weder in den Schritten 1 bis 8 noch in der Kontrollsitzung, auch nicht mitinteractiveoder als explizites<nr>:#<nr> select: release test, left for step 9(mit offenen Elementen davor:release test, waits for <n> open items; wartend, nicht needs you;references/loop.md). Es bleibt offen für Schritt 9 und den Menschen (der RC-Test läuft auf dem RC). Überspringe ein PBI, das eine andere Sitzung beansprucht hat (#<nr> select: claimed, skipped), übernehme einen veralteten Anspruch (references/claim.md);/deliver <nr>auf dem PBI selbst setzt es unabhängig vom Anspruch fort. Kündige das nächste PBI an und beanspruche es:gh issue edit <nr> --add-assignee @me; die Auswahlzeile nennt seine Stufe und Modell (#<nr> select: next (tier standard → sonnet/medium); ohne eineTier:-Zeiletier from size Moderdefault;references/roles.md).- Ein Feature- oder Epic-Kind ohne PBIs: lade
planner(interaktiv) undgrill-mein dieser Sitzung, erstelle die Issues, wähle dann erneut aus. Unattended: kommentiere und labelneeds-decisionstattdessen.
- Ein Feature- oder Epic-Kind ohne PBIs: lade
- Fortsetzen. Branch
<type>/<nr>-<slug>(github-issue).git ls-remote --heads origin <branch>undgh api "repos/{owner}/{repo}/pulls?head=<owner>:<branch>&state=open" --jq '.[].number'(der head benötigt das Owner-Präfix): ein vorhandener Branch wird fortgesetzt, ein vorhandener PR springt zu Schritt 7. - Implementieren. Ein Unteragent mit einem frischen Kontext: "Lade
implementation, Rolleimplement. Implementiere PBI # (ein Bug: lade zuerstdiagnose, dannimplementation) in deinem eigenen Worktree auf<branch>vonorigin/release/next(ein vorhandener Branch: wechsle zu ihm und rebase). Akzeptanzkriterien: . Commite, pushe, berichte in maximal 10 Zeilen: erledigt oder blockiert, Commits, Tests ausgeführt undnotes[](eine pro Zeile); ein passenderspecMap-Eintrag ohne Spec-Änderung gibt den Hinweisno spec change needed: <spec> — <reason>(implementationreferences/specs.md)." - Reviewen. Ein Unteragent mit einem frischen Kontext: "Lade
code-review, Rollereview. Reviewegit diff origin/release/next...origin/<branch>gegen diese Akzeptanzkriterien: . Mitgovernance: führeGet-GovernanceMatches.ps1 -Head origin/<branch>aus; Issue-Labels und Implementierernotes[]. Read-only: kein stash, checkout, switch oder commit in einem vorhandenen Checkout; wenn du Dateien benötigst, verwende deinen eigenen temporären Worktree. Gib nur JSON zurück: das Ergebnis proreview.schema.jsonvoncode-review(blocking[]mitfile,line,title,why;notes[], bis zu 5) plusunmet[](nicht erfüllte Kriterien)." Nur blockierende Befunde und nicht erfüllte Kriterien zählen. Nach jedem Durchlauf dieser Sitzung (nicht dem Unteragenten) schreibe die Datei<git-common-dir>/.agents/state/review-<nr>.json(git rev-parse --git-common-dir, dieselbe Datei von jedem Worktree, niemals committet), überschreibe den vorherigen Durchlauf:{ pbi, branch, sha, round, unmet, review },sha=git rev-parse origin/<branch>,round= 1-basierter Review-Durchlauf,review= das Ergebnis des Unteragenten; Schemaschema/deliver-review.schema.json. Auchpwsh <skill-dir>/../code-review/scripts/ConvertTo-Findings.ps1 -Review <result with unmet> -Sha <sha> -Worktree <pbi-worktree>schreibt<pbi-worktree>/.agents/state/findings.jsonfür poimen (niemals committet, lokal ausgeschlossen;references/findings.md). - Fix. Etwas zählt: ein Unteragent mit einem frischen Kontext lädt
implementationmit Rollefix, wechselt seinen eigenen Worktree zu<branch>(git fetch origin <branch>,git switch -C <branch> origin/<branch>), erhält genau diese Befunde (blocking[]undunmet[]), committet und pusht. Dann Schritt 4 erneut. Maximal 2 Fix-Durchläufe pro PBI, geteilt von Review und CI; ein dritter ist eine Pause. - PR.
github-pull-request(sein Titel ist der Issue-Titel ohne das Ebenen-Präfix,(#<nr>)angehängt) mitissue_number,branch: <branch>(die Arbeit wird von einem anderen Worktree gepusht, dieser Checkout bleibt wie er ist),review_notes(notes[]von Schritt 4), mitgovernancespec_notes(die Implementierer-notes[]-Zeilen, die mitno spec change needed:beginnen) und dem Testergebnis des Unteragenten. - CI. Führe
gh pr checks <pr> --watch --required --interval 60direkt aus (jeder Poll ist eine GraphQL-Abfrage; der Standard von 10 s verbraucht das Budget), ohne Pipe oder Ausgabefilter (wietail,headodergrep), damit der Fortschritt des Watchs die Sitzung erreicht.- Rot durch diese Änderung (Test-, Lint- oder Build-Fehler in Dateien des Diffs): Fix-Durchlauf (Schritt 5), dann Schritt 4 und 7 erneut.
- Rot aus einem anderen Grund (Flake, auch rot auf
release/next): kommentiere auf dem PR, das PBI ist blockiert.
- Mergen. Ohne Nachfrage, in beiden Modi: der letzte Review hatte keinen blockierenden Befund oder nicht erfülltes Kriterium und die erforderlichen Checks sind grün.
gh pr merge <pr> --squash --delete-branch, danngh issue close <nr> --comment "Delivered in #<pr>"(Closesfeuert nicht aufrelease/next); offene Legacy-[Task]-Sub-Issues des PBI werden damit geschlossen (github-issuereferences/sub-issues.md, "Legacy Task issues"); danngh issue edit <nr> --remove-assignee @me. Räume die Worktrees und Branches der Unteragenten mit dem Skript dieses Skills auf,scripts/Remove-PbiWorktrees.ps1im Skill-Verzeichnis (~/.claude/skills/deliver/global,.claude/skills/deliver/Projektinstallation), ausgeführt im Repository:pwsh <skill-dir>/scripts/Remove-PbiWorktrees.ps1 -Pr <pr> -Issue <nr>; gib#<nr> cleanup: <n> removedaus und behalte seineleft-Einträge (Pfad oder Branch, Grund, Befehl) für den Bericht. Nächstes PBI: Schritt 1. - Release. Nur mit
--milestone, vor dem Bericht (auch nach--max), wenn kein PBI mehr auszuwählen ist. Lese den Meilenstein einmal,Get-Milestones.ps1 -Mode issues -Name <name> -State all(offen und geschlossen); die Offen-Arbeit-Prüfung, der Marker, die Rundenanzahl und die Kriterien der geschlossenen Issues kommen aus dieser Liste. Kein offener Issue mit Labelpbioderbugdarin außer demrelease-test-Issue (nichts blockiert, pausiert, wartend oder übersprungen); der RC-Test blockiert nie.- Ein geschlossenes PBI oder Bug des Meilensteins mit Label
needs-decisionist der Pausenmarker eines Release-Reviews der dritten Runde: überspringe das Review, gibrelease: paused in round 3, waits for a decisionaus. - Release Review (
references/release-review.md): ein Unteragent mit einem frischen Kontext lädtcode-review, Rollereview, aufgit diff origin/main...origin/release/nextmit den Akzeptanzkriterien der geschlossenen PBIs und Bugs des Meilensteins, Fokus auf Konsistenz über die PBIs hinweg, und gibt JSON proreview.schema.jsonzurück, read-only (kein stash, checkout, switch oder commit in einem vorhandenen Checkout; eigener temporärer Worktree, wenn er Dateien benötigt); diese Sitzung schreibt<git-common-dir>/.agents/state/release-review-<key>.json. - Blockierende Befunde: ein
[Bug] fix: …-Issue pro Befund im Meilenstein (interaktiv: zeige sie und frage zuerst), kein Release-PR; gibrelease: <n> blocking → #a, #baus. Maximal 2 Release-Review-Durchläufe pro Meilenstein; ein dritter mit blockierenden Befunden ist eine Pause, aufgezeichnet mit diesem Marker und einem Kommentar, der die beiden Wege benennt (references/release-review.md, "Pause marker"). - Sauber (keine blockierenden): schneide den RC, poste ihn auf dem
release-test-Issue und schließe ältere (references/release-review.md, "RC test");release.test.gate: truestoppt dort mitneeds you: RC test <issue URL>bis der Issue geschlossen ist. Ansonsten ladegithub-releaseund führefinishmitrelease_review_notes(dienotes[], bis zu 5) aus: es erstellt den Release-PR vonrelease/nextinmain(auto_merge: false) oder meldet den vorhandenen; es stoppt, wennmainkein Vorfahre vonrelease/nextist (zuerst Back-Merge,github-release), melde diesen Stopp. Gibrelease: clean, <url>aus (der URL des Release-PRs).
- Ein geschlossenes PBI oder Bug des Meilensteins mit Label