chore(post-audit): document notify verb + remove # type: ignore

Audit followups before pushing the gateway-restoration batch:
- Add notify() row to cell_pm.md, main_pm.md, board.md verb tables.
  Manifests + routes + MCP + tests all wired in 3a2498a but agents
  had no prompt-level cue.
- Replace # type: ignore[attr-defined] in test_pm_respawn_reset.py
  with cast('Any', orch) — matches project's no-suppress standard.
This commit is contained in:
Renn F
2026-05-03 18:04:26 +02:00
parent 9bae446cbe
commit 9310d66508
4 changed files with 5 additions and 1 deletions
+1
View File
@@ -27,6 +27,7 @@ If you find yourself reaching for `Bash git`, `Edit`, or any execution tool, sto
| `note(text, scope?, task_id?)` | Journal. Required: `scope='decision'` before `escalate_to_ceo`. Auditor uses `scope='reflect'` for observations. | None. | | `note(text, scope?, task_id?)` | Journal. Required: `scope='decision'` before `escalate_to_ceo`. Auditor uses `scope='reflect'` for observations. | None. |
| `evidence(task_id)` | Inspect a task's PR + commits + diff. | None. | | `evidence(task_id)` | Inspect a task's PR + commits + diff. | None. |
| `say(channel, text)` / `dm(recipient, text)` | Channel post / DM. **Auditor cannot use these — silent observer.** Channel slug without `#`. | None for PO/HoM; denied for Auditor. | | `say(channel, text)` / `dm(recipient, text)` | Channel post / DM. **Auditor cannot use these — silent observer.** Channel slug without `#`. | None for PO/HoM; denied for Auditor. |
| `notify(target, text, priority?)` | Send a formal ack-required notification to an agent (`be-dev-1`, `ceo`, etc.). `priority` is one of `normal`/`high`/`urgent` (default `normal`). **Auditor cannot use this — silent observer.** | None for PO/HoM; denied for Auditor. |
| `i_am_idle()` | Exit cleanly. | None. | | `i_am_idle()` | Exit cleanly. | None. |
## Workflow ## Workflow
+1
View File
@@ -31,6 +31,7 @@ You merge what your developers submit (leaf PRs into your cell branch via `compl
| `resume(task_id)` | Resume a paused task. Transitions paused → in_progress. | Task assigned to you and in paused state. | | `resume(task_id)` | Resume a paused task. Transitions paused → in_progress. | Task assigned to you and in paused state. |
| `note(text, scope?, task_id?)` | Journal. Required: `scope='decision'` before `i_will_plan` / `delegate` / `unblock` / `complete` / `submit_up` / `escalate_up`. | None. | | `note(text, scope?, task_id?)` | Journal. Required: `scope='decision'` before `i_will_plan` / `delegate` / `unblock` / `complete` / `submit_up` / `escalate_up`. | None. |
| `say(channel, text)` / `dm(recipient, text)` | Channel post / DM. Channel slug without `#` (e.g. `"backend-cell"`). | None. | | `say(channel, text)` / `dm(recipient, text)` | Channel post / DM. Channel slug without `#` (e.g. `"backend-cell"`). | None. |
| `notify(target, text, priority?)` | Send a formal ack-required notification to an agent (`be-dev-1`, `ceo`, etc.). `priority` is one of `normal`/`high`/`urgent` (default `normal`). | None. |
| `evidence(task_id)` | Inspect a task's PR + commits + diff. | None. | | `evidence(task_id)` | Inspect a task's PR + commits + diff. | None. |
| `i_am_idle()` | Exit cleanly; auto-pauses any `in_progress` tasks you own so you'll be respawned at the right moment. | None. | | `i_am_idle()` | Exit cleanly; auto-pauses any `in_progress` tasks you own so you'll be respawned at the right moment. | None. |
+1
View File
@@ -31,6 +31,7 @@ You merge what your Cell PMs submit (cell PRs into your root branch via `complet
| `resume(task_id)` | Resume a paused task. Transitions paused → in_progress. | Task assigned to you and in paused state. | | `resume(task_id)` | Resume a paused task. Transitions paused → in_progress. | Task assigned to you and in paused state. |
| `note(text, scope?, task_id?)` | Journal. Required: `scope='decision'` before `i_will_plan` / `delegate` / `complete` / `escalate_*`. | None. | | `note(text, scope?, task_id?)` | Journal. Required: `scope='decision'` before `i_will_plan` / `delegate` / `complete` / `escalate_*`. | None. |
| `say(channel, text)` / `dm(recipient, text)` | Channel post / DM. Channel slug without `#` (e.g. `"main-pm-board"`). | None. | | `say(channel, text)` / `dm(recipient, text)` | Channel post / DM. Channel slug without `#` (e.g. `"main-pm-board"`). | None. |
| `notify(target, text, priority?)` | Send a formal ack-required notification to an agent (`be-dev-1`, `ceo`, etc.). `priority` is one of `normal`/`high`/`urgent` (default `normal`). | None. |
| `evidence(task_id)` | Inspect a task's PR + commits + diff. | None. | | `evidence(task_id)` | Inspect a task's PR + commits + diff. | None. |
| `i_am_idle()` | Exit cleanly; auto-pauses any `in_progress` tasks you own so you'll be respawned at the right moment. | None. | | `i_am_idle()` | Exit cleanly; auto-pauses any `in_progress` tasks you own so you'll be respawned at the right moment. | None. |
+2 -1
View File
@@ -23,6 +23,7 @@ instead of incrementing.
from __future__ import annotations from __future__ import annotations
from datetime import UTC, datetime from datetime import UTC, datetime
from typing import Any, cast
from unittest.mock import AsyncMock, patch from unittest.mock import AsyncMock, patch
from uuid import uuid4 from uuid import uuid4
@@ -34,7 +35,7 @@ from roboco.seeds.initial_data import AGENT_UUIDS
def _new_orchestrator() -> AgentOrchestrator: def _new_orchestrator() -> AgentOrchestrator:
"""Bypass __init__ so tests don't need a full DI graph.""" """Bypass __init__ so tests don't need a full DI graph."""
orch = AgentOrchestrator.__new__(AgentOrchestrator) orch = AgentOrchestrator.__new__(AgentOrchestrator)
orch._pm_respawn_tracker = {} # type: ignore[attr-defined] cast("Any", orch)._pm_respawn_tracker = {}
return orch return orch