From 0c1c3b345abdca089959dfe344ddfe563ee54f03 Mon Sep 17 00:00:00 2001 From: Renn F Date: Mon, 29 Jun 2026 03:03:34 +0200 Subject: [PATCH] [docs] regenerate lifecycle artifacts for sync_branch + branch-keyed submit_root gate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The committed artifacts were stale: lifecycle.py grew the sync_branch verb (B1) and the branch-keyed submit_root gate description (B2/B3) but the generated markdown/json were never regenerated. make foundation-check enforces artifact==generator(lifecycle.py); regenerating restores that. No source change — pure generator output. --- .../prompts/_generated/lifecycle-developer.md | 1 + .../prompts/_generated/lifecycle-main_pm.md | 2 +- docs/rag/lifecycle/intent-verbs.md | 17 +- panel/lib/lifecycle.json | 396 ++++++++++++++---- 4 files changed, 331 insertions(+), 85 deletions(-) diff --git a/agents/prompts/_generated/lifecycle-developer.md b/agents/prompts/_generated/lifecycle-developer.md index 0a48274a..9dabef13 100644 --- a/agents/prompts/_generated/lifecycle-developer.md +++ b/agents/prompts/_generated/lifecycle-developer.md @@ -10,4 +10,5 @@ other verb will be rejected with a Decision telling you the right one. - **i_will_work_on**: Claim a task, set the plan, and transition to in_progress. Atomic - preconditions checked before any state mutation. - **open_pr**: 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. - **resume**: Resume a paused task you own. paused -> in_progress. +- **sync_branch**: Rebase your task's branch onto its current base THROUGH the gate (raw git is denied). Use when your branch has fallen behind its base — e.g. a sibling task's PR merged into the parent branch while you worked. Fetches origin, rebases head onto base, and force-pushes (with-lease). No DB state change. On conflicts the rebase is aborted and the conflicted files are returned — resolve by hand, commit, then sync_branch again. - **unclaim**: Voluntarily release a claim back to pending. The work-in-progress branch is preserved. diff --git a/agents/prompts/_generated/lifecycle-main_pm.md b/agents/prompts/_generated/lifecycle-main_pm.md index 9d54960d..c4b12564 100644 --- a/agents/prompts/_generated/lifecycle-main_pm.md +++ b/agents/prompts/_generated/lifecycle-main_pm.md @@ -11,7 +11,7 @@ other verb will be rejected with a Decision telling you the right one. - **i_am_idle**: Signal you have no active work. PMs auto-pause owned in_progress tasks. - **i_will_plan**: PM mirror of i_will_work_on for parent tasks. Claim, plan, transition to in_progress; from there delegate subtasks. - **resume**: Resume a paused task you own. paused -> in_progress. -- **submit_root**: Main PM opens the root→master PR and moves the root task to awaiting_pr_review for the main reviewer (the root analogue of the cell PM's submit_up). After pr_pass, call complete to escalate to the CEO. Only for code roots; branchless coordination roots skip the gate and complete directly. +- **submit_root**: Main PM opens the root→master PR and moves the root task to awaiting_pr_review for the main reviewer (the root analogue of the cell PM's submit_up). After pr_pass, call complete to escalate to the CEO. For branch-bearing roots (a Main-PM root-subtask assembles the cells' merged work); branchless coordination roots skip the gate and complete directly. The gate is branch-keyed, not task_type-keyed — a Main-PM root is planning-typed, never code. - **triage**: List actionable tasks in your scope. - **triage_all**: List actionable tasks across all teams (Main PM only). - **unblock**: PM unblocks a blocked task; restores pre-block state. diff --git a/docs/rag/lifecycle/intent-verbs.md b/docs/rag/lifecycle/intent-verbs.md index 73a54a91..fd090ec7 100644 --- a/docs/rag/lifecycle/intent-verbs.md +++ b/docs/rag/lifecycle/intent-verbs.md @@ -73,6 +73,8 @@ Escalate to your role's escalation_target. **Composes:** (no atomic actions) +**Preconditions:** non_terminal + ## fail_review @@ -162,7 +164,7 @@ Push the branch and open a PR. Atomic - preconditions (assignee, >=1 commit, no **Side effects:** push_branch, create_pr -**Preconditions:** commits>=1, no_prior_pr, owns_task +**Preconditions:** commits>=1, no_prior_pr, owns_task, pr_open_state ## pass_review @@ -221,7 +223,7 @@ Resume a paused task you own. paused -> in_progress. ## submit_root -Main PM opens the root→master PR and moves the root task to awaiting_pr_review for the main reviewer (the root analogue of the cell PM's submit_up). After pr_pass, call complete to escalate to the CEO. Only for code roots; branchless coordination roots skip the gate and complete directly. +Main PM opens the root→master PR and moves the root task to awaiting_pr_review for the main reviewer (the root analogue of the cell PM's submit_up). After pr_pass, call complete to escalate to the CEO. For branch-bearing roots (a Main-PM root-subtask assembles the cells' merged work); branchless coordination roots skip the gate and complete directly. The gate is branch-keyed, not task_type-keyed — a Main-PM root is planning-typed, never code. **Allowed roles:** main_pm @@ -241,6 +243,17 @@ Cell PM opens the cell→root PR and moves the cell task into the PR-review gate **Pre side effects:** create_pr +## sync_branch + +Rebase your task's branch onto its current base THROUGH the gate (raw git is denied). Use when your branch has fallen behind its base — e.g. a sibling task's PR merged into the parent branch while you worked. Fetches origin, rebases head onto base, and force-pushes (with-lease). No DB state change. On conflicts the rebase is aborted and the conflicted files are returned — resolve by hand, commit, then sync_branch again. + +**Allowed roles:** developer + +**Composes:** (no atomic actions) + +**Preconditions:** owns_task + + ## triage List actionable tasks in your scope. diff --git a/panel/lib/lifecycle.json b/panel/lib/lifecycle.json index dcc15f93..007f22f7 100644 --- a/panel/lib/lifecycle.json +++ b/panel/lib/lifecycle.json @@ -1,19 +1,38 @@ { "claim_rules": { "auditor": [], - "cell_pm": ["needs_revision", "pending"], + "cell_pm": [ + "needs_revision", + "pending" + ], "ceo": [], - "developer": ["needs_revision", "pending"], - "documenter": ["awaiting_documentation", "pending"], + "developer": [ + "needs_revision", + "pending" + ], + "documenter": [ + "awaiting_documentation", + "pending" + ], "head_marketing": [], - "main_pm": ["needs_revision", "pending"], - "pr_reviewer": ["awaiting_pr_review", "pending"], + "main_pm": [ + "needs_revision", + "pending" + ], + "pr_reviewer": [ + "awaiting_pr_review", + "pending" + ], "product_owner": [], - "qa": ["awaiting_qa"] + "qa": [ + "awaiting_qa" + ] }, "intents": [ { - "allowed_roles": ["documenter"], + "allowed_roles": [ + "documenter" + ], "composes": [], "description": "Claim awaiting_documentation. Returns evidence inline.", "name": "claim_doc_task", @@ -21,7 +40,9 @@ "side_effects": [] }, { - "allowed_roles": ["pr_reviewer"], + "allowed_roles": [ + "pr_reviewer" + ], "composes": [], "description": "Claim an assembled-PR review task (awaiting_pr_review) WITHOUT transitioning it \u2014 mirrors QA's claim_review. The assembled diff and the parent task's acceptance criteria are returned inline.", "name": "claim_gate_review", @@ -29,15 +50,22 @@ "side_effects": [] }, { - "allowed_roles": ["pr_reviewer"], - "composes": ["claim", "start"], + "allowed_roles": [ + "pr_reviewer" + ], + "composes": [ + "claim", + "start" + ], "description": "Claim an inbound external-PR review task and start work. pending -> claimed -> in_progress.", "name": "claim_pr_review", "pre_side_effects": [], "side_effects": [] }, { - "allowed_roles": ["qa"], + "allowed_roles": [ + "qa" + ], "composes": [], "description": "Claim a task in awaiting_qa for review. Returns evidence inline.", "name": "claim_review", @@ -45,31 +73,52 @@ "side_effects": [] }, { - "allowed_roles": ["cell_pm", "main_pm"], - "composes": ["complete"], + "allowed_roles": [ + "cell_pm", + "main_pm" + ], + "composes": [ + "complete" + ], "description": "Cell PM merges the PR (leaf into the cell branch, or the gated cell\u2192root PR into the root branch) + transitions to completed; Main PM escalates the root to the CEO (who merges root\u2192master).", "name": "complete", "pre_side_effects": [], - "side_effects": ["pr_merge"] + "side_effects": [ + "pr_merge" + ] }, { - "allowed_roles": ["cell_pm", "main_pm"], - "composes": ["create_subtask"], + "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/research, UX devs also design). documentation is NOT delegatable \u2014 the lifecycle auto-creates the doc phase after the code subtask passes QA.", "name": "delegate", "pre_side_effects": [], "side_effects": [] }, { - "allowed_roles": ["head_marketing", "main_pm", "product_owner"], - "composes": ["escalate_to_ceo"], + "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"], + "allowed_roles": [ + "cell_pm", + "main_pm" + ], "composes": [], "description": "Escalate to your role's escalation_target.", "name": "escalate_up", @@ -77,8 +126,12 @@ "side_effects": [] }, { - "allowed_roles": ["qa"], - "composes": ["qa_fail"], + "allowed_roles": [ + "qa" + ], + "composes": [ + "qa_fail" + ], "description": "Fail QA with concrete issues. Transitions to needs_revision.", "name": "fail_review", "pre_side_effects": [], @@ -100,16 +153,27 @@ "side_effects": [] }, { - "allowed_roles": ["developer", "documenter", "qa"], - "composes": ["block"], + "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"], + "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": [], @@ -136,71 +200,111 @@ "side_effects": [] }, { - "allowed_roles": ["documenter"], - "composes": ["docs_complete"], + "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"], + "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"], + "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"], + "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"] + "side_effects": [ + "push_branch", + "create_pr" + ] }, { - "allowed_roles": ["qa"], - "composes": ["qa_pass"], + "allowed_roles": [ + "qa" + ], + "composes": [ + "qa_pass" + ], "description": "Pass QA. Transitions awaiting_qa -> awaiting_documentation.", "name": "pass_review", "pre_side_effects": [], "side_effects": [] }, { - "allowed_roles": ["pr_reviewer"], - "composes": ["pr_review_done"], + "allowed_roles": [ + "pr_reviewer" + ], + "composes": [ + "pr_review_done" + ], "description": "Post one complete change-request to the external PR and finish the review task. in_progress -> completed.", "name": "post_pr_review", "pre_side_effects": [], "side_effects": [] }, { - "allowed_roles": ["pr_reviewer"], - "composes": ["pr_fail"], + "allowed_roles": [ + "pr_reviewer" + ], + "composes": [ + "pr_fail" + ], "description": "Fail the assembled-PR review with concrete issues. Transitions awaiting_pr_review -> needs_revision, routed back like a QA fail.", "name": "pr_fail", "pre_side_effects": [], "side_effects": [] }, { - "allowed_roles": ["pr_reviewer"], - "composes": ["pr_pass"], + "allowed_roles": [ + "pr_reviewer" + ], + "composes": [ + "pr_pass" + ], "description": "Pass the assembled-PR review. Transitions awaiting_pr_review -> awaiting_pm_review so the PM can merge.", "name": "pr_pass", "pre_side_effects": [], "side_effects": [] }, { - "allowed_roles": ["cell_pm"], + "allowed_roles": [ + "cell_pm" + ], "composes": [], "description": "Hand a claimed/in_progress task to another developer in your own cell. The branch is keyed to the task (not the agent), so it is preserved \u2014 the new developer continues the work-in-progress. No status change.", "name": "reassign", @@ -208,27 +312,57 @@ "side_effects": [] }, { - "allowed_roles": ["cell_pm", "developer", "documenter", "main_pm", "qa"], - "composes": ["resume"], + "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": ["main_pm"], - "composes": ["submit_for_review"], - "description": "Main PM opens the root\u2192master PR and moves the root task to awaiting_pr_review for the main reviewer (the root analogue of the cell PM's submit_up). After pr_pass, call complete to escalate to the CEO. Only for code roots; branchless coordination roots skip the gate and complete directly.", + "allowed_roles": [ + "main_pm" + ], + "composes": [ + "submit_for_review" + ], + "description": "Main PM opens the root\u2192master PR and moves the root task to awaiting_pr_review for the main reviewer (the root analogue of the cell PM's submit_up). After pr_pass, call complete to escalate to the CEO. For branch-bearing roots (a Main-PM root-subtask assembles the cells' merged work); branchless coordination roots skip the gate and complete directly. The gate is branch-keyed, not task_type-keyed \u2014 a Main-PM root is planning-typed, never code.", "name": "submit_root", - "pre_side_effects": ["create_root_pr"], + "pre_side_effects": [ + "create_root_pr" + ], "side_effects": [] }, { - "allowed_roles": ["cell_pm"], - "composes": ["submit_for_review"], + "allowed_roles": [ + "cell_pm" + ], + "composes": [ + "submit_for_review" + ], "description": "Cell PM opens the cell\u2192root PR and moves the cell task into the PR-review gate (awaiting_pr_review). The cell reviewer reviews the assembled diff; after pr_pass the same Cell PM completes it.", "name": "submit_up", - "pre_side_effects": ["create_pr"], + "pre_side_effects": [ + "create_pr" + ], + "side_effects": [] + }, + { + "allowed_roles": [ + "developer" + ], + "composes": [], + "description": "Rebase your task's branch onto its current base THROUGH the gate (raw git is denied). Use when your branch has fallen behind its base \u2014 e.g. a sibling task's PR merged into the parent branch while you worked. Fetches origin, rebases head onto base, and force-pushes (with-lease). No DB state change. On conflicts the rebase is aborted and the conflicted files are returned \u2014 resolve by hand, commit, then sync_branch again.", + "name": "sync_branch", + "pre_side_effects": [], "side_effects": [] }, { @@ -246,7 +380,9 @@ "side_effects": [] }, { - "allowed_roles": ["main_pm"], + "allowed_roles": [ + "main_pm" + ], "composes": [], "description": "List actionable tasks across all teams (Main PM only).", "name": "triage_all", @@ -254,15 +390,26 @@ "side_effects": [] }, { - "allowed_roles": ["cell_pm", "main_pm"], - "composes": ["unblock"], + "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"], + "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", @@ -273,109 +420,160 @@ "transitions": [ { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "awaiting_ceo_approval", "target": "cancelled" }, { "action": "ceo_approve", - "roles": ["ceo"], + "roles": [ + "ceo" + ], "source": "awaiting_ceo_approval", "target": "completed" }, { "action": "ceo_reject", - "roles": ["ceo"], + "roles": [ + "ceo" + ], "source": "awaiting_ceo_approval", "target": "needs_revision" }, { "action": "docs_complete", - "roles": ["documenter"], + "roles": [ + "documenter" + ], "source": "awaiting_documentation", "target": "awaiting_pm_review" }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "awaiting_documentation", "target": "cancelled" }, { "action": "claim", - "roles": ["documenter"], + "roles": [ + "documenter" + ], "source": "awaiting_documentation", "target": "claimed" }, { "action": "escalate_to_ceo", - "roles": ["head_marketing", "main_pm", "product_owner"], + "roles": [ + "head_marketing", + "main_pm", + "product_owner" + ], "source": "awaiting_pm_review", "target": "awaiting_ceo_approval" }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "awaiting_pm_review", "target": "cancelled" }, { "action": "complete", - "roles": ["cell_pm", "main_pm"], + "roles": [ + "cell_pm", + "main_pm" + ], "source": "awaiting_pm_review", "target": "completed" }, { "action": "pr_pass", - "roles": ["pr_reviewer"], + "roles": [ + "pr_reviewer" + ], "source": "awaiting_pr_review", "target": "awaiting_pm_review" }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "awaiting_pr_review", "target": "cancelled" }, { "action": "claim", - "roles": ["pr_reviewer"], + "roles": [ + "pr_reviewer" + ], "source": "awaiting_pr_review", "target": "claimed" }, { "action": "pr_fail", - "roles": ["pr_reviewer"], + "roles": [ + "pr_reviewer" + ], "source": "awaiting_pr_review", "target": "needs_revision" }, { "action": "qa_pass", - "roles": ["qa"], + "roles": [ + "qa" + ], "source": "awaiting_qa", "target": "awaiting_documentation" }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "awaiting_qa", "target": "cancelled" }, { "action": "claim", - "roles": ["qa"], + "roles": [ + "qa" + ], "source": "awaiting_qa", "target": "claimed" }, { "action": "qa_fail", - "roles": ["qa"], + "roles": [ + "qa" + ], "source": "awaiting_qa", "target": "needs_revision" }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "backlog", "target": "cancelled" }, @@ -387,13 +585,21 @@ }, { "action": "escalate_to_ceo", - "roles": ["head_marketing", "main_pm", "product_owner"], + "roles": [ + "head_marketing", + "main_pm", + "product_owner" + ], "source": "blocked", "target": "awaiting_ceo_approval" }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "blocked", "target": "cancelled" }, @@ -411,7 +617,11 @@ }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "claimed", "target": "cancelled" }, @@ -441,13 +651,19 @@ }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "in_progress", "target": "cancelled" }, { "action": "pr_review_done", - "roles": ["pr_reviewer"], + "roles": [ + "pr_reviewer" + ], "source": "in_progress", "target": "completed" }, @@ -465,7 +681,11 @@ }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "needs_revision", "target": "cancelled" }, @@ -477,7 +697,11 @@ }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "paused", "target": "cancelled" }, @@ -489,7 +713,11 @@ }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "pending", "target": "cancelled" }, @@ -507,7 +735,11 @@ }, { "action": "cancel", - "roles": ["cell_pm", "ceo", "main_pm"], + "roles": [ + "cell_pm", + "ceo", + "main_pm" + ], "source": "verifying", "target": "cancelled" }