# Escalation Workflow ## Escalation Chain ``` Developer/QA/Documenter ↓ Cell PM ↓ Main PM ↓ Product Owner / Head of Marketing (Board) ↓ CEO ``` `escalate_up` walks this chain **one rung at a time** — it auto-routes to your immediate escalation target; you cannot choose a higher level or skip a rung. The one exception is `escalate_to_ceo`: it is a **separate** verb, available only to Main PM and the Board (Product Owner / Head of Marketing), that goes straight to the CEO for final approval of a major task. It is not part of the `escalate_up` chain. ## How to Escalate (up one rung) ```python escalate_up( task_id="", reason="Need clarification on the API contract", ) ``` Auto-routes to your escalation target (you cannot choose it). `escalate_up` is refused on a **terminal** task (`completed` / `cancelled`) — it returns `invalid_state` rather than resurrecting a finished task. Escalate live work only. ## When to Escalate | Situation | Escalate To | |-----------|-------------| | Unclear requirements | Cell PM | | Blocked by external factor | Cell PM | | Blocked by another task | Cell PM | | Cross-cell coordination | Main PM (via Cell PM) | | Major feature ready for CEO sign-off | CEO (via `escalate_to_ceo`, PM/Board only) | ## Escalate vs Block | Action | When | Verb | |--------|------|------| | **Escalate** | Need a decision / help from above | `escalate_up` | | **Block** | Can't proceed on an external dependency | `i_am_blocked` | There is no agent-facing "pause" verb. If you need to step off a task you claimed but haven't progressed, use `unclaim(task_id)` to return it to the pool. ## Blocking a Task ```python i_am_blocked( task_id="", reason="Waiting for the auth service to land", blocker_type="external", what_needed="auth-service /token endpoint deployed", ) ``` Your Cell PM is notified and is the one who can `unblock` it. ## CEO Escalation (Main PM / Board Only) For major tasks requiring CEO approval: ```python escalate_to_ceo( task_id="", reason="Major feature ready for final review", ) ``` Requirements: - Task must be in `awaiting_pm_review` - PR must exist - Only Main PM, Product Owner, or Head of Marketing can call it - **PARENT TASKS ONLY** — subtasks cannot be escalated to CEO If you need to escalate a subtask, escalate the parent task instead. The CEO reviews the complete feature, not individual components. ## Good Escalation Format Include: - What's the issue - What context you have - Specific question - What you already tried - How it's affecting work ## Handling Escalations (PM) 1. ACK the notification: `notify_ack(notification_id)` 2. Investigate: read the task and journals 3. Decide, or escalate further with `escalate_up` 4. Communicate the decision (`dm` / `notify`) 5. Unblock if needed: `unblock(task_id, reason)` CRITICAL: Verbal resolution is NOT enough. To clear a block you MUST call `unblock(task_id, reason)`. The `reason` (why you are clearing the block) is recorded as your `journal:decision` — no separate `note(scope='decision')` call is required.