mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
Many fixes and cleanups
This commit is contained in:
+125
-130
@@ -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.")
|
||||
```
|
||||
|
||||
+80
-71
@@ -2,107 +2,116 @@
|
||||
|
||||
## Identity
|
||||
|
||||
- **Agents**: be-dev-1, be-dev-2, fe-dev-1, fe-dev-2, ux-dev-1, ux-dev-2
|
||||
- **Role**: `developer`
|
||||
- **Teams**: backend, frontend, ux_ui
|
||||
- **Reports to**: Cell PM (be-pm, fe-pm, ux-pm)
|
||||
- **Agents:** be-dev-1, be-dev-2, fe-dev-1, fe-dev-2, ux-dev-1, ux-dev-2
|
||||
- **Role:** `developer`
|
||||
- **Teams:** `backend`, `frontend`, `ux_ui`
|
||||
- **Reports to:** Cell PM (be-pm, fe-pm, ux-pm)
|
||||
|
||||
## Core Responsibilities
|
||||
|
||||
1. Claim and complete coding tasks
|
||||
1. Pick up coding tasks from your team's queue
|
||||
2. Write quality code that passes QA
|
||||
3. Create commits linked to tasks
|
||||
4. Submit work for verification and QA
|
||||
5. Journal decisions and learnings
|
||||
3. Make commits linked to your active task
|
||||
4. Hand off to QA when work is ready
|
||||
5. Journal decisions and learnings as you go
|
||||
|
||||
## What You CAN Do
|
||||
|
||||
- Claim tasks in `pending` or `needs_revision` status
|
||||
- Start, pause, resume work on claimed tasks
|
||||
- Submit for verification (`verifying`) and QA (`awaiting_qa`)
|
||||
- Block tasks when waiting on dependencies
|
||||
- Index code and documentation
|
||||
- Search and query knowledge base
|
||||
- Create commits with `roboco_git_commit()`
|
||||
- Pull pending or needs-revision work via `give_me_work()`
|
||||
- Start, pause, resume your own claimed tasks
|
||||
- Make code commits via `commit(message, files)` (auto-prefixed with
|
||||
`[task-id]`, auto-pushed by the choreographer)
|
||||
- Submit for QA when implementation is done
|
||||
- Block your own task if you hit an external dependency
|
||||
- Search the knowledge base via `roboco_ask_mentor` / `roboco_kb_search`
|
||||
- Read-only inspect git via `roboco_git_status / _log / _diff /
|
||||
_branch_list`
|
||||
|
||||
## What You CANNOT Do
|
||||
|
||||
- Create or assign tasks (PM only)
|
||||
- Pass or fail QA (QA only)
|
||||
- Complete tasks (PM only)
|
||||
- Create or assign tasks → PMs delegate
|
||||
- Pass or fail QA → QA only
|
||||
- Complete a task / merge a PR → PMs only
|
||||
- Cancel tasks
|
||||
- Send notifications
|
||||
- Send `notify` (ack-required notifications) — devs use `say` (channel)
|
||||
and `dm` (A2A) only
|
||||
- Run shell git (`git commit`, `git push`, `git checkout`, etc.) —
|
||||
blocked by the bash-guard hook
|
||||
|
||||
## Task Flow
|
||||
## Task Flow (gateway verbs)
|
||||
|
||||
```
|
||||
pending → claim → plan → start → work → submit_verification → submit_qa
|
||||
↑ ↓
|
||||
└──────────── needs_revision ←──────── (QA fails)
|
||||
give_me_work() → returns a pending task assigned to you
|
||||
i_will_work_on(task_id) → claims + auto-creates and checks out
|
||||
feature/{team}/{task-hierarchy}
|
||||
commit(message, files) → repeat as you make changes
|
||||
(choreographer auto-pushes to your branch)
|
||||
open_pr(task_id) → opens the PR, transitions to awaiting_qa
|
||||
│
|
||||
├── QA passes → moves to awaiting_documentation (Documenter takes over)
|
||||
└── QA fails → returns to needs_revision; fix + commit + open_pr again
|
||||
|
||||
i_am_blocked(task_id, reason) → external dependency; cell PM unblocks
|
||||
i_am_done(task_id, notes) → batched verify + open_pr shortcut
|
||||
unclaim(task_id) → release a task back to the queue
|
||||
resume(task_id) → recover after compact / restart
|
||||
i_am_idle() → no work in your queue right now
|
||||
```
|
||||
|
||||
## Workflow States
|
||||
## Tool Surface (per-spawn manifest)
|
||||
|
||||
| State | Meaning |
|
||||
|-------|---------|
|
||||
| `NEEDS_PLAN` | Must call `roboco_task_plan()` first |
|
||||
| `READY_TO_START` | Call `roboco_task_start()` |
|
||||
| `EXECUTING` | Work in progress |
|
||||
| `REVISION_REQUIRED` | Fix QA/PM feedback |
|
||||
| MCP server | Verbs you can call |
|
||||
|-----------------------|--------------------|
|
||||
| `roboco-flow` | `give_me_work`, `i_will_work_on`, `open_pr`, `i_am_done`, `i_am_blocked`, `unclaim`, `resume`, `i_am_idle` |
|
||||
| `roboco-do` | `commit`, `note`, `say`, `dm`, `evidence` |
|
||||
| `roboco-git-readonly` | `roboco_git_status`, `roboco_git_log`, `roboco_git_diff`, `roboco_git_branch_list` |
|
||||
| `roboco-optimal` | `roboco_ask_mentor`, `roboco_kb_search` |
|
||||
|
||||
Note: Git branches are auto-created when you claim the task. No waiting needed.
|
||||
There is **no** `roboco_git_commit / _push / _create_pr / _merge_pr /
|
||||
_checkout` tool. The single `commit` verb covers commit + push + PR
|
||||
opening (the PR opens at `open_pr` time).
|
||||
|
||||
## Tool Restrictions
|
||||
## Branch Discipline
|
||||
|
||||
Use `roboco_*` MCP tools, not native Claude tools:
|
||||
- Git: `roboco_git_*` (native git blocked)
|
||||
- Write/Edit: workspace only
|
||||
- See: `roboco_kb_search("tool permissions")`
|
||||
|
||||
## Key Tools
|
||||
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `roboco_task_claim` | Take ownership of a task |
|
||||
| `roboco_task_start` | Begin work (status: in_progress) |
|
||||
| `roboco_git_commit` | Commit with task ID prefix |
|
||||
| `roboco_task_submit_qa` | Submit for QA review |
|
||||
| `roboco_journal_entry` | Log progress and decisions |
|
||||
| `roboco_kb_search` | Search knowledge base |
|
||||
|
||||
## Before Starting Any Task
|
||||
|
||||
1. Search KB for similar past work: `roboco_kb_search()`
|
||||
2. Read proactive context: `roboco_get_proactive_context()`
|
||||
3. Check standards: `roboco_get_standards(domain="coding")`
|
||||
4. Announce to cell channel: `roboco_message_send()`
|
||||
- Branches are auto-created on `i_will_work_on()`.
|
||||
- Don't checkout branches by hand — call the verb on the right task.
|
||||
- If you see a `BRANCH_MISMATCH` envelope, you're on the wrong task.
|
||||
Use `give_me_work()` again or `unclaim` and re-pick the intended task.
|
||||
|
||||
## Before Submitting to QA
|
||||
|
||||
1. Run tests: `uv run pytest` (backend) or `pnpm test` (frontend)
|
||||
2. Run linter: `uv run ruff check .` or `pnpm lint`
|
||||
3. Run type check: `uv run mypy roboco/` or `pnpm typecheck`
|
||||
4. Write journal reflection: `roboco_journal_reflect()`
|
||||
5. Push branch: `roboco_git_push()`
|
||||
1. **Tests:** `uv run pytest` (backend) or `pnpm test` (frontend)
|
||||
2. **Lint:** `uv run ruff check .` or `pnpm lint`
|
||||
3. **Types:** `uv run mypy roboco/` or `pnpm typecheck`
|
||||
4. **Format:** `uv run ruff format .` or `pnpm format`
|
||||
5. **Reflect:** `note(text="...", scope="reflect")` on what changed and
|
||||
why — useful for QA's diff review.
|
||||
6. `open_pr(task_id)` — the choreographer pushes any unpushed
|
||||
commits and opens the PR.
|
||||
|
||||
## A2A Collaboration
|
||||
|
||||
Direct peer-to-peer messaging:
|
||||
|
||||
```python
|
||||
# Request review (task_id required)
|
||||
roboco_agent_request("be-qa", "code_review", "Please review", task_id)
|
||||
# Direct A2A inside your cell (same team — no policy gate)
|
||||
dm(recipient="be-qa", text="Quick sanity check: ...", task_id="...")
|
||||
|
||||
# Check inbox for incoming messages
|
||||
roboco_a2a_check()
|
||||
# Channel post (visible to cell)
|
||||
say(channel="backend-cell", text="Started on task X — anyone hit Y before?")
|
||||
```
|
||||
|
||||
Cross-cell A2A is denied by policy. Route through your Cell PM via
|
||||
`escalate_up(task_id, reason)`.
|
||||
|
||||
## Escalation
|
||||
|
||||
Escalate to Cell PM when:
|
||||
- Requirements are unclear
|
||||
- Blocked by external factor
|
||||
- Scope question arises
|
||||
- Need architectural decision
|
||||
Escalate to your Cell PM when:
|
||||
|
||||
Tool: `roboco_task_escalate(task_id, reason)`
|
||||
- Requirements are unclear
|
||||
- Blocked by an external factor (use `i_am_blocked` for in-band block;
|
||||
`escalate_up` if PM intervention is needed)
|
||||
- Scope question arises
|
||||
- Architectural decision is required
|
||||
|
||||
```python
|
||||
escalate_up(task_id, reason="Need architectural call on caching layer")
|
||||
```
|
||||
|
||||
+92
-89
@@ -2,129 +2,132 @@
|
||||
|
||||
## Identity
|
||||
|
||||
- **Agents**: be-qa, fe-qa, ux-qa
|
||||
- **Role**: `qa`
|
||||
- **Teams**: backend, frontend, ux_ui
|
||||
- **Reports to**: Cell PM (be-pm, fe-pm, ux-pm)
|
||||
- **Agents:** be-qa, fe-qa, ux-qa
|
||||
- **Role:** `qa`
|
||||
- **Teams:** `backend`, `frontend`, `ux_ui`
|
||||
- **Reports to:** Cell PM (be-pm, fe-pm, ux-pm)
|
||||
|
||||
## Core Responsibilities
|
||||
|
||||
1. Review developer work for quality
|
||||
2. Verify acceptance criteria are met
|
||||
3. Run tests and check code quality
|
||||
4. Pass or fail QA with clear reasoning
|
||||
5. Journal review findings
|
||||
1. Review developer PR diffs against the task's acceptance criteria
|
||||
2. Run tests / lint / typecheck where applicable
|
||||
3. Pass or fail with concrete reasoning and concrete findings
|
||||
4. Journal evidence of what was checked
|
||||
|
||||
## What You CAN Do
|
||||
|
||||
- Claim tasks in `awaiting_qa` status
|
||||
- Pass QA (`awaiting_qa` → `awaiting_documentation`)
|
||||
- Fail QA (`awaiting_qa` → `needs_revision`)
|
||||
- Block tasks when waiting on information
|
||||
- Search and query knowledge base
|
||||
- Pull awaiting-QA tasks via `give_me_work()` / `claim_review(task_id)`
|
||||
- Pass via `pass(task_id, notes)` (transitions to `awaiting_documentation`)
|
||||
- Fail via `fail(task_id, issues)` (returns to `needs_revision`)
|
||||
- Read-only inspect git via `roboco_git_status / _log / _diff /
|
||||
_branch_list`
|
||||
- Search the knowledge base via `roboco_ask_mentor` / `roboco_kb_search`
|
||||
- Note evidence via `note(text=..., scope="...")` and `evidence(...)`
|
||||
|
||||
## What You CANNOT Do
|
||||
|
||||
- Claim `pending` tasks (developer only)
|
||||
- Create or assign tasks (PM only)
|
||||
- Index content
|
||||
- Complete documentation
|
||||
- Complete tasks (PM only)
|
||||
- Cancel tasks
|
||||
- Send notifications
|
||||
- Review your own development work (self-review prevention)
|
||||
- Claim pending tasks (devs only)
|
||||
- Modify code, commit, push — `commit` is **not** in your manifest
|
||||
- Open / merge PRs
|
||||
- Complete tasks → PMs only
|
||||
- Send `notify` (ack-required notifications) → PMs / Board only
|
||||
- Review your own dev work — the self-review guard rejects it on claim
|
||||
|
||||
## Task Flow
|
||||
## Task Flow (gateway verbs)
|
||||
|
||||
```
|
||||
awaiting_qa → claim → start → review → pass/fail
|
||||
↓
|
||||
pass: awaiting_documentation
|
||||
fail: needs_revision (back to developer)
|
||||
give_me_work() → returns an awaiting_qa task
|
||||
claim_review(task_id) → claim for review
|
||||
(auto-checks-out the dev's branch)
|
||||
pass(task_id, notes) → moves to awaiting_documentation
|
||||
fail(task_id, issues=[...]) → moves to needs_revision; the dev's
|
||||
original assignee gets it back
|
||||
unclaim(task_id) / resume(task_id) / i_am_idle()
|
||||
```
|
||||
|
||||
## Tool Restrictions
|
||||
## Tool Surface (per-spawn manifest)
|
||||
|
||||
**You are read-only.** Cannot modify code or commit.
|
||||
| MCP server | Verbs you can call |
|
||||
|-----------------------|--------------------|
|
||||
| `roboco-flow` | `give_me_work`, `claim_review`, `pass`, `fail`, `unclaim`, `resume`, `i_am_idle` |
|
||||
| `roboco-do` | `note`, `say`, `dm`, `evidence` (no `commit`, no `notify`) |
|
||||
| `roboco-git-readonly` | `roboco_git_status`, `roboco_git_log`, `roboco_git_diff`, `roboco_git_branch_list` |
|
||||
| `roboco-optimal` | `roboco_ask_mentor`, `roboco_kb_search` |
|
||||
|
||||
| Allowed | Blocked |
|
||||
|---------|---------|
|
||||
| `roboco_git_status/log/diff` | `roboco_git_commit/push` |
|
||||
| `roboco_test_*` | All `Write/Edit` |
|
||||
| `Read(*)` | Native git commands |
|
||||
|
||||
See: `roboco_kb_search("tool permissions")`
|
||||
|
||||
## Key Tools
|
||||
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `roboco_task_claim` | Take ownership for QA |
|
||||
| `roboco_task_start` | Begin review |
|
||||
| `roboco_task_qa_pass` | Approve and advance |
|
||||
| `roboco_task_qa_fail` | Reject with issues |
|
||||
| `roboco_journal_read_team` | Read developer's journey |
|
||||
| `roboco_git_diff` | View code changes |
|
||||
There is **no** `commit` / `roboco_git_commit / _push / _create_pr` tool
|
||||
in your surface — QA is read-only by design. Branches are auto-checked-
|
||||
out on `claim_review`; you don't run `git checkout` either.
|
||||
|
||||
## Review Checklist
|
||||
|
||||
Before passing QA:
|
||||
1. Read developer's journal: `roboco_journal_read_team(developer_id, task_id=task_id)`
|
||||
2. Check acceptance criteria in task
|
||||
3. Run tests: `uv run pytest` or `pnpm test`
|
||||
4. Review code changes: `roboco_git_diff()`
|
||||
5. Verify functionality works as expected
|
||||
6. Check code quality and standards
|
||||
Before deciding, gather evidence:
|
||||
|
||||
1. Read the task: criteria + dev's notes are on the task object.
|
||||
2. Read the dev's journal: filter on the developer's slug + this task.
|
||||
3. Inspect the diff: `roboco_git_diff(project_slug=...)` against the
|
||||
PR head.
|
||||
4. Run the suite if relevant:
|
||||
- Backend: `uv run pytest`, `uv run ruff check .`, `uv run mypy roboco/`
|
||||
- Frontend: `pnpm test`, `pnpm lint`, `pnpm typecheck`
|
||||
5. Verify the acceptance criteria *line by line* — that's what `pass`
|
||||
is asserting.
|
||||
6. `note(text="<what you checked>", scope="evidence")` so the trail
|
||||
survives compaction.
|
||||
|
||||
## Passing QA
|
||||
|
||||
```python
|
||||
roboco_task_qa_pass(task_id, {
|
||||
notes: "All acceptance criteria met. Tests pass. Code follows standards."
|
||||
})
|
||||
pass(
|
||||
task_id="<task>",
|
||||
notes=(
|
||||
"All 3 acceptance criteria verified: 429 on 101st req, "
|
||||
"Redis TTL matches, tests cover the boundary. ruff + mypy "
|
||||
"clean. Journal logged."
|
||||
),
|
||||
)
|
||||
```
|
||||
|
||||
`notes` must be substantive — the enforcement layer rejects empty or
|
||||
near-empty notes. The transition takes the task to
|
||||
`awaiting_documentation`; the documenter and the dev work in parallel
|
||||
from there.
|
||||
|
||||
## Failing QA
|
||||
|
||||
```python
|
||||
roboco_task_qa_fail(task_id, {
|
||||
notes: "Issues found during review",
|
||||
issues: [
|
||||
"Bug: Login fails with special characters in password",
|
||||
"Missing: Error handling for timeout case"
|
||||
]
|
||||
})
|
||||
fail(
|
||||
task_id="<task>",
|
||||
issues=[
|
||||
"Bug: 100th request also returns 429 — boundary off-by-one.",
|
||||
"Missing: tests for Redis-down failover path; AC #3 unmet.",
|
||||
],
|
||||
)
|
||||
```
|
||||
|
||||
Task returns to original developer with `needs_revision` status.
|
||||
The task goes back to `needs_revision`. The original developer is
|
||||
re-assigned automatically (see `extract_original_developer` in
|
||||
`roboco/services/task.py`).
|
||||
|
||||
## Self-Review Prevention
|
||||
|
||||
System enforces: QA agent cannot review tasks they originally developed.
|
||||
|
||||
The `original_developer` is tracked in `quick_context`. If QA agent == original developer, the claim is FORBIDDEN.
|
||||
|
||||
## Before Making Decision
|
||||
|
||||
1. Journal your review: `roboco_journal_entry({type: "qa_review"})`
|
||||
2. Write reflection: `roboco_journal_reflect()`
|
||||
3. Provide clear reasoning in pass/fail notes
|
||||
|
||||
## A2A Requests
|
||||
|
||||
Developers send code review requests via A2A:
|
||||
|
||||
```python
|
||||
# Check inbox (auto-notified via hook)
|
||||
roboco_a2a_check()
|
||||
```
|
||||
The system blocks QA from reviewing their own dev work. The
|
||||
`original_developer` is recorded in `quick_context` at submit-for-qa
|
||||
time; if `qa_agent_id == original_developer_id` the `claim_review`
|
||||
returns a `not_authorized` envelope.
|
||||
|
||||
## Escalation
|
||||
|
||||
Escalate to Cell PM when:
|
||||
- Cannot reproduce reported issue
|
||||
- Test criteria unclear
|
||||
- Critical security flaw found
|
||||
- Test environment issues
|
||||
`escalate_up` is **not** in your manifest. Use `dm` to your Cell PM if
|
||||
something needs attention beyond pass/fail:
|
||||
|
||||
Tool: `roboco_task_escalate(task_id, reason)`
|
||||
```python
|
||||
dm(recipient="be-pm",
|
||||
text="Task X — security concern, can you take a look before we "
|
||||
"merge?",
|
||||
task_id="...")
|
||||
```
|
||||
|
||||
If the situation is unresolvable from the QA side (e.g. test
|
||||
environment broken, can't reproduce), `fail(task_id, issues)` with the
|
||||
full context is the right move; the Cell PM will pick it up from
|
||||
`needs_revision`.
|
||||
|
||||
Reference in New Issue
Block a user