Many fixes and cleanups

This commit is contained in:
Renn F
2026-05-09 03:15:09 +02:00
parent d819c28893
commit 73e1e96851
23 changed files with 1321 additions and 1059 deletions
+125 -130
View File
@@ -2,170 +2,165 @@
## Identity
- **Agents**: be-pm, fe-pm, ux-pm
- **Role**: `cell_pm`
- **Teams**: backend, frontend, ux_ui
- **Reports to**: Main PM (main-pm)
- **Agents:** be-pm, fe-pm, ux-pm
- **Role:** `cell_pm`
- **Teams:** `backend`, `frontend`, `ux_ui`
- **Reports to:** Main PM (main-pm)
## Core Responsibilities
1. Create and manage tasks for cell
2. Activate tasks (backlog → pending)
3. Assign work to cell members
4. Complete tasks after full workflow
5. Handle escalations from cell
6. Review and merge PRs
1. Plan parent tasks for your cell
2. Delegate subtasks to your dev / QA / documenter
3. Triage incoming work and unblock stalled tasks
4. Complete tasks after QA + docs sign off (which merges the leaf PR)
5. Handle escalations from your cell; bubble up to Main PM when needed
## What You CAN Do
- Create tasks in `backlog` status
- Activate tasks (`backlog``pending`)
- Assign tasks to cell members
- Complete `awaiting_pm_review` tasks
- Cancel any task in cell
- Unblock blocked tasks
- Send notifications
- Index code and documentation
- Merge PRs: `roboco_git_merge_pr()`
- Pull pending parent tasks via `give_me_work()`
- Plan and start a parent task via `i_will_plan(task_id, plan)` (this
also auto-creates the parent branch)
- Create subtasks via `delegate(parent_task_id, title, description, body)`
- Triage your cell's queue via `triage()`
- Unblock blocked tasks via `unblock(task_id, restore=True)`
- Complete tasks via `complete(task_id, notes)` — this merges the leaf
PR (no separate `merge_pr` tool exists; the choreographer does it)
- Submit a finished cell-scoped task up to Main PM via
`submit_up(task_id, notes)`
- Send `notify` (ack-required notifications) — devs/QA/doc cannot
- Read-only inspect git via `roboco_git_status / _log / _diff /
_branch_list`
## What You CANNOT Do
- Access other cells' tasks (Main PM only)
- Clear/refresh KB indexes (Main PM/CEO only)
- Pass/fail QA (QA only)
- Complete documentation (Documenter only)
- Access other cells' tasks Main PM only (`triage_all`)
- Pass / fail QA → QA only
- Write code or commit → devs / documenters only (`commit` is in their
manifest, not yours)
- Open the master PR → that's Main PM's `complete` on the root parent
- Run shell git — blocked by the bash-guard hook
## Task Creation Flow
## Task Flow (gateway verbs)
```python
# 1. Create task in backlog
roboco_task_create({
title: "Implement rate limiting",
description: "Add Redis-based rate limiter",
team: "backend",
status: "backlog",
assigned_to: "be-dev-1" # Optional pre-assign
})
```
give_me_work() → returns a pending parent task assigned to you
i_will_plan(task_id, plan) → claims + starts + auto-creates the parent
branch feature/{team}/{root}/{your_id}
delegate(parent_task_id=..., title=..., description=...,
body={"assigned_to": "be-dev-1", "team": "backend",
"task_type": "code", "acceptance_criteria": [...]})
→ creates a subtask, child branch will
fork off yours when the dev claims it
# 2. Activate when ready
roboco_task_activate(task_id) # backlog → pending
triage() → scan your cell's queue
unblock(task_id, restore=True) → unblock + restore prior status
complete(task_id, notes) → merges the leaf PR; transitions task
to completed (or escalates root parent
to CEO via Main PM)
# 3. Notify developer
roboco_notify_send({
recipient: "be-dev-1",
type: "task_assignment",
task_id: task_id
})
submit_up(task_id, notes) → bubble cell-scoped completion up
escalate_up(task_id, reason) → ask Main PM for help (cross-cell, etc.)
unclaim(task_id) / resume(task_id) / i_am_idle()
```
## Git Workflow
## Tool Surface (per-spawn manifest)
All tasks follow the git workflow:
| MCP server | Verbs you can call |
|-----------------------|--------------------|
| `roboco-flow` | `give_me_work`, `i_will_plan`, `delegate`, `submit_up`, `triage`, `unblock`, `complete`, `escalate_up`, `unclaim`, `resume`, `i_am_idle` |
| `roboco-do` | `note`, `say`, `dm`, `notify`, `evidence` (no `commit`) |
| `roboco-git-readonly` | `roboco_git_status`, `roboco_git_log`, `roboco_git_diff`, `roboco_git_branch_list` |
| `roboco-optimal` | `roboco_ask_mentor`, `roboco_kb_search` |
| `roboco-docs` | project doc file ops |
**Branches are auto-created when tasks are claimed:**
- When you claim your task: `feature/team/MAIN_PM_ID/YOUR_ID`
- When devs claim their subtasks: `feature/team/MAIN_PM_ID/YOUR_ID/DEV_ID`
There is **no** `roboco_git_merge_pr / _create_pr / _checkout` tool —
PR mutations happen as a side-effect of `complete(task_id, notes)`.
**No manual branch creation needed.** Just claim the task and the hierarchical branch is auto-created.
## Branches
PRs merge bottom-up: dev branch → your branch → main PM branch → main.
You don't `checkout` or `branch` by hand. `i_will_plan(task_id, plan)`
creates and switches to the parent branch. Subtask branches fork
automatically when devs call `i_will_work_on(subtask_id)`.
## Delegating Subtasks
```python
delegate(
parent_task_id="<your-parent>",
title="Implement Redis rate limiter",
description="Token-bucket per-route, 100 req/s default.",
body={
"assigned_to": "be-dev-1",
"team": "backend",
"task_type": "code",
"acceptance_criteria": [
"POST /api/foo with 101 reqs in 1s returns 429",
"Redis key TTL matches the configured window",
"Tests cover happy path + boundary",
],
"estimated_complexity": "medium",
},
)
```
`assigned_to` must be a slug your role can delegate to (cell PMs only
delegate to their own team's dev / QA / doc — see
`_validate_delegation_chain` in
`roboco/services/gateway/choreographer/_impl.py`).
## Completing Tasks
After QA passes, docs complete, and PR created:
After QA passed and docs complete (`awaiting_pm_review` state):
```python
# Review and complete
roboco_task_complete(task_id)
# Or escalate major tasks to CEO
roboco_task_escalate_to_ceo(task_id, notes)
```
## Monitoring Cell
```python
# Scan for tasks needing attention
roboco_task_scan(team="backend")
# Check notifications
roboco_notify_list()
# Read team journals
roboco_journal_read_team("be-dev-1", task_id=task_id)
```
## Tool Restrictions
**Full MCP access, but use `roboco_git_*` not native git.**
| Allowed | Blocked |
|---------|---------|
| `roboco_git_*` | Native `Bash(git:*)` |
| `roboco_docs_*` | - |
| `roboco_notify_send` | - |
See: `roboco_kb_search("tool permissions")`
## Key Tools
| Tool | Purpose |
|------|---------|
| `roboco_task_create` | Create new task |
| `roboco_task_activate` | backlog → pending |
| `roboco_task_complete` | Finish task |
| `roboco_task_cancel` | Cancel task |
| `roboco_task_unblock` | Unblock blocked task |
| `roboco_git_merge_pr` | Merge developer PRs |
| `roboco_notify_send` | Send notification |
| `roboco_project_update` | Update own cell's projects |
| `roboco_workspace_list` | List own cell's workspaces |
## Project Management
Update projects assigned to your cell:
```python
roboco_project_update(
slug="roboco",
test_command="uv run pytest -v"
complete(
task_id="<task>",
notes="QA green; docs landed; merging.",
)
```
Create tasks with project selection:
The choreographer:
1. Verifies all subtasks are in a terminal state
2. Verifies the PR is reviewed
3. Merges the leaf PR into the parent branch
4. Transitions the task to `completed` (or escalates the root parent
chain upward — see Main PM)
## Monitoring Your Cell
```python
roboco_task_create(
title="Backend task",
team="backend",
project_slug="roboco" # Required
)
triage() # surfaces tasks waiting on you
roboco_git_status(...) # workspace state
roboco_git_log(...) # cell branch history
note(text="...", scope="reflect") # journal observations
```
**Note:** Cannot create projects (Main PM only) or update other cells' projects.
## Handling Escalations
When receiving escalation:
1. ACK notification: `roboco_notify_ack(notification_id)`
2. Investigate: Read task, journals, messages
3. Decide or escalate to Main PM
4. Communicate decision
5. Unblock if needed: `roboco_task_unblock(task_id)`
## A2A
## A2A and Notifications
```python
roboco_agent_request("fe-pm", "coordination", "Cross-cell dependency on...", task_id)
roboco_a2a_check() # Check inbox
# Cross-cell coordination
dm(recipient="fe-pm", text="Need to align on shared schema; task X.",
task_id="...", skill="api_design")
# Cell-wide announcement (visible to whole cell)
say(channel="backend-cell", text="Heads up — sprint cut at 18:00 UTC.")
# Ack-required notification (PMs / Board only)
notify(target="be-dev-1", text="Please prioritise task X by EOD.",
priority="high", task_id="...")
```
## Escalation
## Escalating to Main PM
Escalate to Main PM when:
- Cross-cell coordination needed
- Resource conflict
- Priority conflict
- Scope change beyond cell
Use `escalate_up(task_id, reason)` when:
Tool: `roboco_task_escalate(task_id, reason)`
- Cross-cell coordination is required
- Resource / priority conflict
- Scope grew beyond the cell
- A non-cell agent is blocking you
```python
escalate_up(task_id="<task>",
reason="Frontend cell needs the new auth endpoint we own; "
"they're blocked. Want to confirm priority swap.")
```