| 2. UAT (mandatory) | Replace the human walkthrough. SM messages the PO teammate; the PO runs the po-acceptance skill with mode=uat on its own (the skill lives in the PO's allowlist, not the SM's). The PO builds the user-story inventory .scrum/po/uat-stories-<sprint-id>.md itself by exhaustively deriving stories from docs/requirements.md (FR⇄US traceability appendix; uncovered-FR list MUST be empty or carry waiver rationale) cross-checked against docs/product/vision.md release-criteria section, launches the app, and verifies each story one at a time. UI stories are driven through the browser (Playwright MCP navigate / click / form-fill / screenshot, Chrome DevTools MCP for console / network / display checks) per references/po-browser-uat.md; non-UI stories use runnable commands. Returns one kind=uat_item decision per story. unverifiable items become fail unless waive with rationale. |
| 3. Defect collection | The any other issues? loop collapses to a single structured pass: the PO concludes the PO_ACCEPTANCE_REPORT (failed stories listed as US-NNN with feedback) with its own self-review of adjacent features / shared components and terminates with FEEDBACK_COMPLETE. No further round-trips. |
| 4. Return to Development | Re-entry cap: the integration→development→integration loop may execute at most .scrum/config.json.po.max_integration_cycles (default 3) times. On exceeding the cap, do not continue; emit [product] PO_DECISION kind=release_decision decision=no_go rationale=integration_cycle_cap_hit cap=<n>, append a release-blocking entry to .scrum/po/attention.md enumerating remaining defects, materialise each remaining defect as a known-issues draft PBI in .scrum/backlog.json, then halt the skill in a safe parked state for human morning review. |
| 5. Release decision | "User confirms release-ready" → [product] PO_DECISION_REQUEST kind=release_decision options=[go,no_go] recommendation=<...>. decision=go is mechanically gated by append-po-decision.sh (requires .scrum/test-results.json.overall_status ∈ {passed, passed_with_skips}); a rubber-stamp go without passing results is rejected by the wrapper. |
| 5a. CLAUDE.md regeneration | The "warn user before overwriting" prompt is non-interactive in agent mode: if CLAUDE.md exists, the Developer first copies it to .scrum/po/claude-md-backup-<UTC-ISO8601>.md (writable PO-scoped path), then regenerates. The backup path is recorded in the release_decision=go decision's --evidence. No human wait. |