docs: reflow hard-wrapped prose to one line per paragraph

Markdown and editors soft-wrap on their own, so the manual ~75-char line
breaks across the docs added nothing but noise. Join wrapped prose, list
items, and paragraphs into single lines across 67 docs — README, CLAUDE.md,
deployment, usage, the RAG knowledge base, and the agent role prompts.
Whitespace-only: code fences, tables, and blockquote alerts are byte-identical
and the change is token-verified (no content altered). Applied with a
deterministic reflow tool (committed separately).

Also lands two doc edits that were awaiting commit: the measured under-load
resource numbers in usage.md and the pr_reviewer additions to the
org-structure RAG doc.
This commit is contained in:
Renn F
2026-06-16 23:18:55 +02:00
parent 640a964b88
commit f48106cbb6
67 changed files with 504 additions and 1593 deletions
+8 -19
View File
@@ -2,12 +2,9 @@
## Overview
Agents collaborate directly through two content tools on the `roboco-do`
MCP server: `dm` for agent-to-agent messages and `say` for channel posts.
Use `channels()` to discover the channels you can post to.
Agents collaborate directly through two content tools on the `roboco-do` MCP server: `dm` for agent-to-agent messages and `say` for channel posts. Use `channels()` to discover the channels you can post to.
**Key:** A2A is about *existing* tasks, NOT task creation. Pass the
`task_id` you're collaborating on so the message is linked to it.
**Key:** A2A is about *existing* tasks, NOT task creation. Pass the `task_id` you're collaborating on so the message is linked to it.
## Flow
@@ -29,9 +26,7 @@ dm(
)
```
Cross-cell `dm` is **denied by policy**. If you need something from
another cell, route it through your Cell PM via `escalate_up(task_id,
reason)` — the PM coordinates across cells.
Cross-cell `dm` is **denied by policy**. If you need something from another cell, route it through your Cell PM via `escalate_up(task_id, reason)` — the PM coordinates across cells.
## Channel Posts
@@ -44,13 +39,11 @@ say(
)
```
Call `channels()` first if you're unsure of the exact slug — it returns
the channels you're allowed to post to, so you don't have to guess.
Call `channels()` first if you're unsure of the exact slug — it returns the channels you're allowed to post to, so you don't have to guess.
## Task Creation Rules
**Only PMs create tasks** (via the `delegate` verb). Regular agents
cannot create work from a `dm` or `say`.
**Only PMs create tasks** (via the `delegate` verb). Regular agents cannot create work from a `dm` or `say`.
If a conversation surfaces work that needs a new task:
1. Escalate to your Cell PM: `escalate_up(task_id, reason="Needs a subtask for X")`
@@ -58,12 +51,8 @@ If a conversation surfaces work that needs a new task:
## Permissions
Most roles can `dm` (same-cell) and `say` to their channels, plus read
their inbox with `notify_list` / `notify_get`.
Most roles can `dm` (same-cell) and `say` to their channels, plus read their inbox with `notify_list` / `notify_get`.
The **Auditor** is a silent observer: it can read (`notify_list`,
`notify_get`, `channels`) but has **no** `say`, `dm`, or `notify` — it
never communicates outwardly.
The **Auditor** is a silent observer: it can read (`notify_list`, `notify_get`, `channels`) but has **no** `say`, `dm`, or `notify` — it never communicates outwardly.
Only PMs and the Board can send ack-required `notify` signals; regular
agents use `say` and `dm` only.
Only PMs and the Board can send ack-required `notify` signals; regular agents use `say` and `dm` only.
+5 -14
View File
@@ -14,14 +14,9 @@ Developer/QA/Documenter
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.
`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.
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)
@@ -51,9 +46,7 @@ Auto-routes to your escalation target (you cannot choose it).
| **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.
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
@@ -85,8 +78,7 @@ Requirements:
- 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.
If you need to escalate a subtask, escalate the parent task instead. The CEO reviews the complete feature, not individual components.
## Good Escalation Format
@@ -105,5 +97,4 @@ Include:
4. Communicate the decision (`say` / `dm` / `notify`)
5. Unblock if needed: `unblock(task_id)`
CRITICAL: Verbal resolution is NOT enough. To clear a block you MUST call
`unblock(task_id)`.
CRITICAL: Verbal resolution is NOT enough. To clear a block you MUST call `unblock(task_id)`.
+4 -10
View File
@@ -19,18 +19,13 @@ Links:
- Journal: {api}/journals/{agent-slug}
```
**Required:** the conventional `type` (feat, fix, chore, docs, refactor,
test, style, perf, ci, build) at the start of the subject. The
`commit_validator` rejects messages that don't start with one of these
followed by `(scope)?:`.
**Required:** the conventional `type` (feat, fix, chore, docs, refactor, test, style, perf, ci, build) at the start of the subject. The `commit_validator` rejects messages that don't start with one of these followed by `(scope)?:`.
**Optional:** `scope` (api, auth, db, ui), `body`, the `files` argument
to scope the commit.
**Optional:** `scope` (api, auth, db, ui), `body`, the `files` argument to scope the commit.
## How to commit
Use the **`commit`** verb on the roboco-do MCP — devs and documenters
only. There is no `roboco_git_commit` tool.
Use the **`commit`** verb on the roboco-do MCP — devs and documenters only. There is no `roboco_git_commit` tool.
```python
commit(
@@ -50,5 +45,4 @@ The choreographer:
6. Pushes to the agent's branch on origin
7. Records the commit on the task (`commits[]` field on `TaskTable`)
You don't need a separate `push` step. There is no `roboco_git_push`
tool.
You don't need a separate `push` step. There is no `roboco_git_push` tool.
+6 -14
View File
@@ -10,17 +10,13 @@ All commits are automatically prefixed with the task ID by the choreographer:
Example: `[a1b2c3d4] Add rate limiting endpoint`
You write the message — the prefix is added for you. Don't include
`[task-id]` yourself; it gets stripped and re-applied.
You write the message — the prefix is added for you. Don't include `[task-id]` yourself; it gets stripped and re-applied.
## Who Can Commit
`commit` is in the **roboco-do** MCP and is mounted only for **developers**
and **documenters**. PMs delegate code work and call `complete` to merge.
`commit` is in the **roboco-do** MCP and is mounted only for **developers** and **documenters**. PMs delegate code work and call `complete` to merge.
There is **no** `roboco_git_commit / _push / _create_pr` MCP tool. The
single `commit` verb covers commit + push + PR-trigger via the
choreographer.
There is **no** `roboco_git_commit / _push / _create_pr` MCP tool. The single `commit` verb covers commit + push + PR-trigger via the choreographer.
## Creating Commits
@@ -38,8 +34,7 @@ This automatically:
3. Stages the listed files (or everything tracked + modified if omitted)
4. Pushes to the agent's auto-created branch
5. Records the commit on the task (`commits[]` field on `TaskTable`)
6. Opens a PR through the choreographer when the task transitions out of
`in_progress` (no separate `create_pr` call required)
6. Opens a PR through the choreographer when the task transitions out of `in_progress` (no separate `create_pr` call required)
## Before Committing
@@ -50,13 +45,10 @@ This automatically:
## After Committing
You don't push or create a PR yourself. The choreographer pushed the
commit during `commit()`, and the PR is opened/merged as part of the
lifecycle transitions:
You don't push or create a PR yourself. The choreographer pushed the commit during `commit()`, and the PR is opened/merged as part of the lifecycle transitions:
- `open_pr(task_id)` — opens the PR (devs)
- `pass(task_id)` (QA) → `i_documented(task_id)` (doc) → `complete(task_id)`
(cell PM merges the leaf PR; main PM opens the master PR)
- `pass(task_id)` (QA) → `i_documented(task_id)` (doc) → `complete(task_id)` (cell PM merges the leaf PR; main PM opens the master PR)
## Viewing Commits and History
+6 -17
View File
@@ -7,29 +7,18 @@
## How PRs Are Created
There is **no** `roboco_git_create_pr` MCP tool. PRs are side-effects of
lifecycle transitions, driven by the choreographer:
There is **no** `roboco_git_create_pr` MCP tool. PRs are side-effects of lifecycle transitions, driven by the choreographer:
- **Leaf PR (cell-scoped, `is_root_pr=False`)**:
Opened automatically when the assigned developer calls
`open_pr(task_id)` after their `commit(...)` calls. Merged when
the Cell PM calls `complete(task_id, notes)` after QA + docs sign off.
- **Leaf PR (cell-scoped, `is_root_pr=False`)**: Opened automatically when the assigned developer calls `open_pr(task_id)` after their `commit(...)` calls. Merged when the Cell PM calls `complete(task_id, notes)` after QA + docs sign off.
- **Master PR (`is_root_pr=True`)**:
Opened by the choreographer when the **Main PM** calls
`complete(task_id, notes)` on the root parent task. Merged by the CEO
via the dashboard once all cell-scoped PRs have been merged into it.
- **Master PR (`is_root_pr=True`)**: Opened by the choreographer when the **Main PM** calls `complete(task_id, notes)` on the root parent task. Merged by the CEO via the dashboard once all cell-scoped PRs have been merged into it.
Title and body are generated from the task templates in
`roboco/templates/git/pr_*.py`. Don't hand-write PR descriptions in the
agent prompts — they'll be overridden.
Title and body are generated from the task templates in `roboco/templates/git/pr_*.py`. Don't hand-write PR descriptions in the agent prompts — they'll be overridden.
## Auto-Checkout
Branches and checkout are handled automatically:
- `i_will_work_on(task_id)` (devs) creates the task's branch and checks it
out in the agent's workspace.
- `i_will_work_on(task_id)` (devs) creates the task's branch and checks it out in the agent's workspace.
- `i_will_plan(task_id, plan)` (PMs) does the same for parent tasks.
- Workspace dirty? The verb returns an error envelope; clean up first
with `commit(...)` or escalate via `i_am_blocked(task_id, reason)`.
- Workspace dirty? The verb returns an error envelope; clean up first with `commit(...)` or escalate via `i_am_blocked(task_id, reason)`.
+3 -8
View File
@@ -9,9 +9,7 @@
## The Tool
Journaling is a single content tool: `note(text, scope, ...)` on the
`roboco-do` MCP server. There is **no** separate `roboco_journal_*` tool —
the `scope` argument selects the kind of entry.
Journaling is a single content tool: `note(text, scope, ...)` on the `roboco-do` MCP server. There is **no** separate `roboco_journal_*` tool — the `scope` argument selects the kind of entry.
| `scope` | Use For |
|---------|---------|
@@ -55,9 +53,7 @@ note(
)
```
`options`, `consequences`, and `next_steps` accept either a list or a
single value. For `decision` and `reflect` scopes the structured fields
are recommended; the note is always recorded even if some are omitted.
`options`, `consequences`, and `next_steps` accept either a list or a single value. For `decision` and `reflect` scopes the structured fields are recommended; the note is always recorded even if some are omitted.
## Required Reflections
@@ -77,8 +73,7 @@ note(
## Searching Journals
Journal entries are indexed into the knowledge base. Search them through
the `roboco-optimal` RAG tools (there is no dedicated journal-search verb):
Journal entries are indexed into the knowledge base. Search them through the `roboco-optimal` RAG tools (there is no dedicated journal-search verb):
```python
# Semantic search across the KB, filtered to journal entries
+14 -34
View File
@@ -2,15 +2,11 @@
## When PRs Are Created
PRs are opened **before** QA review, not during `awaiting_documentation`.
The choreographer creates the PR as a side-effect of the developer's
`open_pr(task_id)` transition (`verifying → awaiting_qa`).
PRs are opened **before** QA review, not during `awaiting_documentation`. The choreographer creates the PR as a side-effect of the developer's `open_pr(task_id)` transition (`verifying → awaiting_qa`).
This is by design: QA reviews the real PR diff on GitHub, and the
downstream PM/CEO approval chain operates on a PR that already exists.
This is by design: QA reviews the real PR diff on GitHub, and the downstream PM/CEO approval chain operates on a PR that already exists.
You do **not** call any tool to create a PR. There is no
`roboco_git_create_pr` MCP tool.
You do **not** call any tool to create a PR. There is no `roboco_git_create_pr` MCP tool.
## How the dev triggers it
@@ -27,28 +23,22 @@ open_pr(task_id="<task>")
The transition enforces (`enforcement/task_lifecycle.py`):
- `self_verified=True` — set when you call `i_am_done()` or
`verify(task_id)` first
- `self_verified=True` — set when you call `i_am_done()` or `verify(task_id)` first
- `commits` non-empty — at least one commit on the task
- `progress_updates` non-empty — at least one note on what changed
- `pr_number` is set automatically by the choreographer; you don't pass it
If any precondition is missing, the verb returns an envelope explaining
what's missing and how to remediate.
If any precondition is missing, the verb returns an envelope explaining what's missing and how to remediate.
## PR Title and Body
Generated from templates in `roboco/templates/git/pr_internal.py` and
`roboco/templates/git/pr_root.py`. You don't write the body by hand —
it's filled with task title, acceptance criteria, the dev's notes, and
the standard traceability links.
Generated from templates in `roboco/templates/git/pr_internal.py` and `roboco/templates/git/pr_root.py`. You don't write the body by hand — it's filled with task title, acceptance criteria, the dev's notes, and the standard traceability links.
Title format: `[TASK-{root-id:8}:{task-id:8}] {task-title}`.
## Parallel Documenter Phase
After QA passes, the task transitions to `awaiting_documentation` and
runs documenter + dev in parallel:
After QA passes, the task transitions to `awaiting_documentation` and runs documenter + dev in parallel:
| Agent | Action | Flag set |
|-------|--------|----------|
@@ -59,35 +49,25 @@ Task transitions to `awaiting_pm_review` when both are true.
## PM Merges via `complete`
After `awaiting_pm_review`, the Cell PM calls `complete(task_id, notes)`.
The choreographer:
After `awaiting_pm_review`, the Cell PM calls `complete(task_id, notes)`. The choreographer:
1. Verifies all subtasks are in a terminal state
2. Verifies the PR is reviewable
3. Merges the leaf PR into the parent branch (squash by default)
4. Transitions the task to `completed`
For the root parent, **Main PM**'s `complete` opens the master PR and
escalates to CEO via `escalate_to_ceo` semantics.
For the root parent, **Main PM**'s `complete` opens the master PR and escalates to CEO via `escalate_to_ceo` semantics.
There is no `roboco_git_merge_pr` MCP tool.
## Prerequisites
- **Git token:** the project must have an encrypted GitHub PAT set on
`projects.git_token_encrypted`. Without it, the workspace clone — and
therefore everything downstream — fails with `WorkspaceError`.
- **Git token:** the project must have an encrypted GitHub PAT set on `projects.git_token_encrypted`. Without it, the workspace clone — and therefore everything downstream — fails with `WorkspaceError`.
- **Token scope:** `repo` (for branch push, PR create, PR merge).
- **Default branch:** `projects.default_branch` is the merge target for
the master PR (typically `master`).
- **Default branch:** `projects.default_branch` is the merge target for the master PR (typically `master`).
## Troubleshooting
- `NO_COMMITS` on `open_pr` → call `commit(...)` first; nothing to
open a PR over.
- `NO_PR` on `pass`/`fail` the choreographer didn't open a PR; check
the workspace state with `roboco_git_status` and re-call
`open_pr` once the workspace is clean.
- `FORCE_PUSH_FORBIDDEN` → only the CEO may force-push. If your branch
diverged, `unclaim` and re-`claim` the task; the choreographer
rebuilds the branch.
- `NO_COMMITS` on `open_pr` → call `commit(...)` first; nothing to open a PR over.
- `NO_PR` on `pass`/`fail` → the choreographer didn't open a PR; check the workspace state with `roboco_git_status` and re-call `open_pr` once the workspace is clean.
- `FORCE_PUSH_FORBIDDEN` → only the CEO may force-push. If your branch diverged, `unclaim` and re-`claim` the task; the choreographer rebuilds the branch.
+5 -13
View File
@@ -3,8 +3,7 @@
## Preconditions
- Task is in `awaiting_qa` status
- The developer's PR is open (the choreographer opened it during their
`open_pr(task_id)` call)
- The developer's PR is open (the choreographer opened it during their `open_pr(task_id)` call)
- You are not the original developer of the task (self-review guard)
## Steps
@@ -39,9 +38,7 @@ note(text="Verified AC #1 (429 on 101st req), #2 (TTL match), #3 "
task_id="<task>")
```
There is no `roboco_task_claim / _start / _qa_pass / _qa_fail` and no
`roboco_git_checkout`. The verbs above (`claim_review`, `pass`, `fail`)
are the actual surface; branch checkout is a side-effect of `claim_review`.
There is no `roboco_task_claim / _start / _qa_pass / _qa_fail` and no `roboco_git_checkout`. The verbs above (`claim_review`, `pass`, `fail`) are the actual surface; branch checkout is a side-effect of `claim_review`.
## Review Checklist
@@ -72,8 +69,7 @@ Result:
- Task advances to `awaiting_documentation`
- Documenter and the original dev work in parallel from here
- The PR stays open; it will be merged later by the Cell PM via
`complete(task_id, ...)`
- The PR stays open; it will be merged later by the Cell PM via `complete(task_id, ...)`
## Failing QA
@@ -111,14 +107,10 @@ note(
## Self-Review Prevention
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`, **all** QA actions on the task
return `not_authorized`:
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`, **all** QA actions on the task return `not_authorized`:
- `claim_review` — FORBIDDEN
- `pass` — FORBIDDEN (defence-in-depth even if claim somehow succeeded)
- `fail` — FORBIDDEN (same)
Enforced at the gateway layer in
`roboco/services/gateway/choreographer/_impl.py`.
Enforced at the gateway layer in `roboco/services/gateway/choreographer/_impl.py`.
+2 -6
View File
@@ -25,9 +25,7 @@ claim_doc_task(task_id) # Documenter
# - assigned_to: your agent ID
```
The claim verb both claims and starts the task — there is no separate
`start` call. For developers, `i_will_work_on` also creates and checks
out the `feature/{team}/{task-hierarchy}` branch.
The claim verb both claims and starts the task — there is no separate `start` call. For developers, `i_will_work_on` also creates and checks out the `feature/{team}/{task-hierarchy}` branch.
## Before Claiming
@@ -62,9 +60,7 @@ unclaim(task_id)
# - You can now claim new work
```
`unclaim` takes only the `task_id` — it returns the task to the pool for
re-pickup. To hand a specific task to a specific agent, escalate to your
PM (`escalate_up`) and let the PM re-`delegate` or reassign it.
`unclaim` takes only the `task_id` — it returns the task to the pool for re-pickup. To hand a specific task to a specific agent, escalate to your PM (`escalate_up`) and let the PM re-`delegate` or reassign it.
**When to use unclaim:**
- Task is out of your team's scope
+17 -46
View File
@@ -2,17 +2,13 @@
## Overview
Planning is a **PM activity**. When a PM (Cell PM or Main PM) picks up a
coordination or parent task, they record a plan with `i_will_plan` and
then fan the work out into subtasks with `delegate`.
Planning is a **PM activity**. When a PM (Cell PM or Main PM) picks up a coordination or parent task, they record a plan with `i_will_plan` and then fan the work out into subtasks with `delegate`.
```
triage / give_me_work → i_will_plan → delegate (one per subtask) → i_am_idle
```
Developers do not have a separate planning verb — they pass a short
`plan` argument directly to `i_will_work_on(task_id, plan="...")` when
they claim a coding task.
Developers do not have a separate planning verb — they pass a short `plan` argument directly to `i_will_work_on(task_id, plan="...")` when they claim a coding task.
## Submitting a Plan (PM)
@@ -32,8 +28,7 @@ i_will_plan(
)
```
After `i_will_plan`, the envelope's `next` field points you at
`delegate` — create one subtask per unit of work:
After `i_will_plan`, the envelope's `next` field points you at `delegate` — create one subtask per unit of work:
```python
delegate(
@@ -52,61 +47,37 @@ delegate(
## Acceptance-Criteria Coverage
When you decompose a parent task, declare which parent criteria each subtask is
responsible for with **`covers_parent_criteria`** (a list of the parent's
`acceptance_criteria_ids`). This is what lets the org prove a decomposition
covers the parent's full intent — and it drives two gates and your coverage
briefing.
When you decompose a parent task, declare which parent criteria each subtask is responsible for with **`covers_parent_criteria`** (a list of the parent's `acceptance_criteria_ids`). This is what lets the org prove a decomposition covers the parent's full intent — and it drives two gates and your coverage briefing.
After `i_will_plan` and after each `delegate`, your envelope carries a coverage
view of the parent so you can see what is still unmapped:
After `i_will_plan` and after each `delegate`, your envelope carries a coverage view of the parent so you can see what is still unmapped:
- **`parent_ac_coverage`** — one entry per parent criterion: its `id`, `text`,
whether a live subtask `claimed` it, and whether a completed subtask
`verified` it.
- **`unclaimed_parent_acs`** — the parent criterion ids that no live subtask
covers yet. Keep delegating until this is empty.
- **`parent_ac_coverage`** — one entry per parent criterion: its `id`, `text`, whether a live subtask `claimed` it, and whether a completed subtask `verified` it.
- **`unclaimed_parent_acs`** — the parent criterion ids that no live subtask covers yet. Keep delegating until this is empty.
Two gates build on the coverage link:
- **Decomposition floor** — you cannot go `i_am_idle` on a parent while a
criterion is still unclaimed. Delegate (or `reassign`) subtasks until every
criterion is covered.
- **Roll-up gate** — a parent cannot `complete`, `submit_up`, or
`escalate_to_ceo` unless every criterion traces to a child that **passed QA**
on it.
- **Decomposition floor** — you cannot go `i_am_idle` on a parent while a criterion is still unclaimed. Delegate (or `reassign`) subtasks until every criterion is covered.
- **Roll-up gate** — a parent cannot `complete`, `submit_up`, or `escalate_to_ceo` unless every criterion traces to a child that **passed QA** on it.
Both gates are **safe-by-construction**: they stay inert until you start
declaring `covers_parent_criteria`, so a decomposition that never declares
coverage is never blocked. Declaring coverage is how you opt your parent into
the guarantee.
Both gates are **safe-by-construction**: they stay inert until you start declaring `covers_parent_criteria`, so a decomposition that never declares coverage is never blocked. Declaring coverage is how you opt your parent into the guarantee.
## Delegating Code Work: Per-Dev Queues
For code subtasks, delegate each developer their **full queue up front** rather
than one task at a time. Both of a cell's developers build in parallel, and each
works its own queue one task at a time, in order:
For code subtasks, delegate each developer their **full queue up front** rather than one task at a time. Both of a cell's developers build in parallel, and each works its own queue one task at a time, in order:
- A per-lane dispatch barrier holds a developer's later subtasks until their
current one is in flight — so each dev's lane stays sequenced while the two
devs run concurrently.
- Leaf PRs are still merged into the shared cell branch **in sequence**, not
in parallel.
- A per-lane dispatch barrier holds a developer's later subtasks until their current one is in flight — so each dev's lane stays sequenced while the two devs run concurrently.
- Leaf PRs are still merged into the shared cell branch **in sequence**, not in parallel.
- Order the queue by dependency: the subtask others build on goes first.
Caps still apply: at most 12 subtasks per parent, and same-title duplicate
subtasks are rejected.
Caps still apply: at most 12 subtasks per parent, and same-title duplicate subtasks are rejected.
## Git Workflow
All code tasks follow the git workflow:
- **Branches are auto-created when a developer claims the task** via
`i_will_work_on` — no manual branch creation
- **Branches are auto-created when a developer claims the task** via `i_will_work_on` — no manual branch creation
- Root tasks: branch created from the default branch (main/master)
- Subtasks: branch forked from the parent's branch
Coordination/parent tasks that only plan and delegate (no code) do not
need a branch of their own.
Coordination/parent tasks that only plan and delegate (no code) do not need a branch of their own.
Hierarchical branch naming uses `--` between task IDs to avoid git ref
conflicts: `feature/{team}/{ROOT}--{SUB}--{SUBSUB}`.
Hierarchical branch naming uses `--` between task IDs to avoid git ref conflicts: `feature/{team}/{ROOT}--{SUB}--{SUBSUB}`.
+1 -5
View File
@@ -73,8 +73,4 @@ backlog → pending (a PM activates the task during `triage`)
## Checking State
You don't poll task state directly — every flow verb returns a
standardized envelope whose `status` and `next` fields tell you the
task's current state and what to call next. Trust the envelope rather
than guessing. To pull the full task context (criteria, prior notes,
handoff), call `evidence(task_id)`.
You don't poll task state directly — every flow verb returns a standardized envelope whose `status` and `next` fields tell you the task's current state and what to call next. Trust the envelope rather than guessing. To pull the full task context (criteria, prior notes, handoff), call `evidence(task_id)`.