Files
roboco/panel/lib/lifecycle.json
T
Renn F e3def6b3a2 fix(gateway): cell PM completes its own cell task; drop main-PM handoff
submit_up bubbled the cell task to Main PM (_handoff_to_main_pm), but
main_pm_complete rejects any task with a parent_task_id ("only operates
on root tasks"), so the cell->root PR had no one to merge it and the
cell task wedged at awaiting_pm_review. _maybe_advance_parent_to_pm_review
already intends the CELL PM to complete it.

Cell PM now owns cell completion:
- submit_up no longer hands off to Main PM; the cell task stays assigned
  to the cell PM, which is respawned to complete() it. Removed the
  now-unused _handoff_to_main_pm.
- cell_pm_complete resolves the merge target from the parent task's real
  branch_name (shared merge_chain.resolve_parent_branch, also used by the
  PR side-effects) so the cell->root PR merges into feature/main_pm/...,
  not the team-mis-derived feature/<cellteam>/... (same root cause as the
  prior PR-base fix).
- submit_up description + next_hint updated; lifecycle artifacts regen.

Main PM still only completes the ROOT (root->master + escalate-to-CEO).
First run to reach cell-PM bubble-up exposed this.
2026-05-23 05:16:56 +02:00

581 lines
12 KiB
JSON

{
"claim_rules": {
"auditor": [],
"cell_pm": [
"pending"
],
"ceo": [],
"developer": [
"needs_revision",
"pending"
],
"documenter": [
"awaiting_documentation",
"pending"
],
"head_marketing": [],
"main_pm": [
"pending"
],
"product_owner": [],
"qa": [
"awaiting_qa"
]
},
"intents": [
{
"allowed_roles": [
"documenter"
],
"composes": [],
"description": "Claim awaiting_documentation. Returns evidence inline.",
"name": "claim_doc_task",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"qa"
],
"composes": [],
"description": "Claim a task in awaiting_qa for review. Returns evidence inline.",
"name": "claim_review",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"cell_pm",
"main_pm"
],
"composes": [
"complete"
],
"description": "Cell PM merges leaf PR + transitions to completed; Main PM merges root PR + escalates to CEO.",
"name": "complete",
"pre_side_effects": [],
"side_effects": [
"pr_merge"
]
},
{
"allowed_roles": [
"cell_pm",
"main_pm"
],
"composes": [
"create_subtask"
],
"description": "Create a subtask under the current task. Validates the delegation chain (main_pm->cell_pm; cell_pm->its team's devs) and the assignee-vs-task_type rule (Cell PMs get planning-typed tasks; devs get code/documentation).",
"name": "delegate",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"head_marketing",
"main_pm",
"product_owner"
],
"composes": [
"escalate_to_ceo"
],
"description": "Escalate to CEO with reason. Transitions to awaiting_ceo_approval.",
"name": "escalate_to_ceo",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"cell_pm",
"main_pm"
],
"composes": [],
"description": "Escalate to your role's escalation_target.",
"name": "escalate_up",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"qa"
],
"composes": [
"qa_fail"
],
"description": "Fail QA with concrete issues. Transitions to needs_revision.",
"name": "fail_review",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"cell_pm",
"developer",
"documenter",
"main_pm",
"qa"
],
"composes": [],
"description": "Return your most-actionable task or signal idle.",
"name": "give_me_work",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"developer",
"documenter",
"qa"
],
"composes": [
"block"
],
"description": "Escalate to PM. Logs a struggle journal entry.",
"name": "i_am_blocked",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"developer"
],
"composes": [
"submit_verification",
"submit_qa"
],
"description": "Submit work for QA. Auto-runs in_progress->verifying then verifying->awaiting_qa. Strict - PR must be open (call open_pr first) and >=1 commit.",
"name": "i_am_done",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"auditor",
"cell_pm",
"developer",
"documenter",
"head_marketing",
"main_pm",
"product_owner",
"qa"
],
"composes": [],
"description": "Signal you have no active work. PMs auto-pause owned in_progress tasks.",
"name": "i_am_idle",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"documenter"
],
"composes": [
"docs_complete"
],
"description": "Signal docs complete. Transitions to awaiting_pm_review.",
"name": "i_documented",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"cell_pm",
"main_pm"
],
"composes": [
"claim",
"set_plan",
"start"
],
"description": "PM mirror of i_will_work_on for parent tasks. Claim, plan, transition to in_progress; from there delegate subtasks.",
"name": "i_will_plan",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"developer"
],
"composes": [
"claim",
"set_plan",
"start"
],
"description": "Claim a task, set the plan, and transition to in_progress. Atomic - preconditions checked before any state mutation.",
"name": "i_will_work_on",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"developer"
],
"composes": [],
"description": "Push the branch and open a PR. Atomic - preconditions (assignee, >=1 commit, no prior PR) checked BEFORE any git operation. After success, call i_am_done.",
"name": "open_pr",
"pre_side_effects": [],
"side_effects": [
"push_branch",
"create_pr"
]
},
{
"allowed_roles": [
"qa"
],
"composes": [
"qa_pass"
],
"description": "Pass QA. Transitions awaiting_qa -> awaiting_documentation.",
"name": "pass_review",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"cell_pm",
"developer",
"documenter",
"main_pm",
"qa"
],
"composes": [
"resume"
],
"description": "Resume a paused task you own. paused -> in_progress.",
"name": "resume",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"cell_pm"
],
"composes": [
"submit_pm_review"
],
"description": "Cell PM opens the cell\u2192root PR and moves the cell task to awaiting_pm_review. The same Cell PM then completes it.",
"name": "submit_up",
"pre_side_effects": [
"create_pr"
],
"side_effects": []
},
{
"allowed_roles": [
"auditor",
"cell_pm",
"head_marketing",
"main_pm",
"product_owner"
],
"composes": [],
"description": "List actionable tasks in your scope.",
"name": "triage",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"main_pm"
],
"composes": [],
"description": "List actionable tasks across all teams (Main PM only).",
"name": "triage_all",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"cell_pm",
"main_pm"
],
"composes": [
"unblock"
],
"description": "PM unblocks a blocked task; restores pre-block state.",
"name": "unblock",
"pre_side_effects": [],
"side_effects": []
},
{
"allowed_roles": [
"cell_pm",
"developer",
"documenter",
"main_pm",
"qa"
],
"composes": [],
"description": "Voluntarily release a claim back to pending. The work-in-progress branch is preserved.",
"name": "unclaim",
"pre_side_effects": [],
"side_effects": []
}
],
"transitions": [
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "awaiting_ceo_approval",
"target": "cancelled"
},
{
"action": "ceo_approve",
"roles": [
"ceo"
],
"source": "awaiting_ceo_approval",
"target": "completed"
},
{
"action": "ceo_reject",
"roles": [
"ceo"
],
"source": "awaiting_ceo_approval",
"target": "needs_revision"
},
{
"action": "docs_complete",
"roles": [
"documenter"
],
"source": "awaiting_documentation",
"target": "awaiting_pm_review"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "awaiting_documentation",
"target": "cancelled"
},
{
"action": "claim",
"roles": [
"documenter"
],
"source": "awaiting_documentation",
"target": "claimed"
},
{
"action": "escalate_to_ceo",
"roles": [
"head_marketing",
"main_pm",
"product_owner"
],
"source": "awaiting_pm_review",
"target": "awaiting_ceo_approval"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "awaiting_pm_review",
"target": "cancelled"
},
{
"action": "complete",
"roles": [
"cell_pm",
"main_pm"
],
"source": "awaiting_pm_review",
"target": "completed"
},
{
"action": "qa_pass",
"roles": [
"qa"
],
"source": "awaiting_qa",
"target": "awaiting_documentation"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "awaiting_qa",
"target": "cancelled"
},
{
"action": "claim",
"roles": [
"qa"
],
"source": "awaiting_qa",
"target": "claimed"
},
{
"action": "qa_fail",
"roles": [
"qa"
],
"source": "awaiting_qa",
"target": "needs_revision"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "backlog",
"target": "cancelled"
},
{
"action": "activate",
"roles": null,
"source": "backlog",
"target": "pending"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "blocked",
"target": "cancelled"
},
{
"action": "unblock",
"roles": null,
"source": "blocked",
"target": "in_progress"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "claimed",
"target": "cancelled"
},
{
"action": "start",
"roles": null,
"source": "claimed",
"target": "in_progress"
},
{
"action": "submit_pm_review",
"roles": null,
"source": "in_progress",
"target": "awaiting_pm_review"
},
{
"action": "block",
"roles": null,
"source": "in_progress",
"target": "blocked"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "in_progress",
"target": "cancelled"
},
{
"action": "pause",
"roles": null,
"source": "in_progress",
"target": "paused"
},
{
"action": "submit_verification",
"roles": null,
"source": "in_progress",
"target": "verifying"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "needs_revision",
"target": "cancelled"
},
{
"action": "claim",
"roles": null,
"source": "needs_revision",
"target": "claimed"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "paused",
"target": "cancelled"
},
{
"action": "resume",
"roles": null,
"source": "paused",
"target": "in_progress"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "pending",
"target": "cancelled"
},
{
"action": "claim",
"roles": null,
"source": "pending",
"target": "claimed"
},
{
"action": "submit_qa",
"roles": null,
"source": "verifying",
"target": "awaiting_qa"
},
{
"action": "cancel",
"roles": [
"cell_pm",
"ceo",
"main_pm"
],
"source": "verifying",
"target": "cancelled"
}
]
}