stagnation / divergence (the "options [split / redesign / hold]" prompt) | [<pbi-id>] PO_DECISION_REQUEST kind=escalation_choice options=[split,redesign,hold] recommendation=<sm-preferred> — SM's recommendation is mandatory (engineering view of the failure mode). |
merge_regression when the failing test sits in the PBI's own scope (the "options [split / redesign / hold]" prompt) | Same as stagnation: kind=escalation_choice options=[split,redesign,hold] recommendation=<...>. |
merge_regression crossing PBI boundaries (regression in unrelated code) | kind=escalation_choice options=[revert,park] recommendation=<...> — park writes the PBI to .scrum/po/attention.md and flips status to blocked; revert rolls the merge back per the matrix's existing semantics. |
requirements_unclear ("SM consults PO via clarification ticket") | kind=spec_clarification — the existing "SM consults PO" wording already names the PO seat; in agent mode the PO is the product-owner teammate, reached by SendMessage. |
coverage_tool_unavailable (the "surface install instruction to user" step) | kind=escalation_choice options=[install,park] recommendation=install — on install, SM delegates the install to the responsible Developer (no human in the loop). If install is impossible (org-level permission, paid license, network restriction), the PO appends a numbered entry to .scrum/po/attention.md and SM flips the PBI to blocked. |
coverage_tool_error, catalog_lock_timeout → human-escalate branches | kind=escalation_choice options=[retry-once,descope-split,park] recommendation=<...> — park writes to .scrum/po/attention.md and flips the PBI to blocked; the team does not idle waiting for a human. |
reviewer_unavailable (both fallback surfaces already failed — this row's only path) | kind=escalation_choice options=[retry-once,descope-split,park] recommendation=<...>. Same park semantics. |
stale_review_snapshot → human-escalate branch (drift recurred ≥ 2 times) | kind=escalation_choice options=[retry-once,descope-split,park] recommendation=<...>. Same park semantics. |
max_rounds / budget_exhausted → human-escalate branches | Same shape: kind=escalation_choice options=[retry-once,descope-split,park] recommendation=<...>. |
merge_conflict / merge_artifact_missing "human-escalate" branches | kind=escalation_choice options=[retry-once,descope-split,park] recommendation=<...>. park again routes to .scrum/po/attention.md + status blocked, never to a blocking human wait. |
kind_mismatch (the reclassify / strip / park choice) | kind=escalation_choice options=[reclassify_code,strip_and_retry,park] recommendation=<...> — reclassify_code and strip_and_retry follow the matrix row's semantics above; park writes to .scrum/po/attention.md and flips the PBI to blocked. |