mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
chore(comms): purge dead say()/channel refs the first sweep missed
The #306 teardown finalize (7cb00611) grepped only `say(` / `channels()`
(paren-anchored) and missed bare mentions, docstrings, error strings, and
inline prompt templates baked into .py. This catches them:
- content_actions.py: error remediations no longer tell agents to "use say()"
(a removed verb) when a notify is rejected
- orchestrator.py: the inline PM/board/escalation/audit prompt templates no
longer teach say(channel); the now-dead channel local is removed
- secretary directive descriptions: relay_message payload is (text), not
(channel, text) — the handler was already rerouted to a broadcast notification
- say/channel bare mentions purged from do_server, flow_server, role_config,
task, security, notification, a2a_access, permissions + board/main_pm/
auditor/base/secretary/head-marketing/product-owner prompts
- dead CHANNEL_ACCESS_DENIED error-map keys removed (missed next to SESSION_CLOSED)
Pending (dead-vs-live pass, not in this commit): panel stream.ts channel-perms
client (unimported), agents.channels unused field, CHANNEL_ACCESS_DENIED enum,
and channel-perm bits tangled in the live /stream extraction router.
This commit is contained in:
@@ -19,8 +19,8 @@ The envelope's top-level `error` is one of four categories:
|
||||
|
||||
- `tracing_gap` — a precondition (commit, PR, journal entry, plan, etc.) is missing. Look at `missing` for the literal field key. See the cheatsheet below.
|
||||
- `invalid_state` — task is in a status that doesn't allow this verb (e.g. cannot `start` a `cancelled` task). The `message` names the actual status. Common phrasings: "task X is in <status>; cannot start work", "task X is in <status>, expected awaiting_qa for review", "parent task X is in pending; must be in_progress to accept subtasks", "claim failed", "start failed for task X", "fail_review requires at least one issue", "no commits on this task yet", "parent already has N subtasks; cap is 12", "N architectural-convention violation(s) must be fixed" (a definition is in the wrong module per `.roboco/conventions.yml`, or a lint/type suppression slipped in — `remediate` lists each `file:line` + fix; move it, or for a genuine false positive add a `waiver` to `.roboco/conventions.yml` in your branch).
|
||||
- `not_authorized` — your role / assignment / channel-access doesn't permit this. The `message` names the rule. Common phrasings: "not assigned to you", "role 'cell_pm' may not commit code; only developers and documenters write commits", "Cell PM cannot claim code tasks. PMs coordinate, never execute code.", "you are not the assignee of {task_id}; cannot post content to it", "agent '{X}' may not write to channel '{Y}'", "role X cannot send formal notifications".
|
||||
- `not_found` — task / agent / channel id doesn't exist.
|
||||
- `not_authorized` — your role / assignment doesn't permit this. The `message` names the rule. Common phrasings: "not assigned to you", "role 'cell_pm' may not commit code; only developers and documenters write commits", "Cell PM cannot claim code tasks. PMs coordinate, never execute code.", "you are not the assignee of {task_id}; cannot post content to it", "role X cannot send formal notifications".
|
||||
- `not_found` — task / agent id doesn't exist.
|
||||
|
||||
The fix is always in `remediate`, never in working around the gate.
|
||||
|
||||
|
||||
@@ -23,8 +23,8 @@ You silently observe org activity and log anomalies. You do **not** communicate
|
||||
- `i_am_idle()` when no anomalies remain — **but you must have recorded at least one observation this session first.** Recording observations is your entire output and is obligated like everyone else's notes: if you have not noted anything recently, `i_am_idle()` is blocked. Always `note(scope='reflect', ...)` what you observed (even "scanned X, no anomalies") before going idle.
|
||||
|
||||
## Access
|
||||
- **Read-only** to ALL channels and tasks.
|
||||
- You have **no** `say` or `dm` verbs. Your output is your journal.
|
||||
- **Read-only** to ALL tasks.
|
||||
- You have **no** `dm` verb. Your output is your journal.
|
||||
- Errors include a `remediate` field — follow it.
|
||||
|
||||
## Principle
|
||||
|
||||
@@ -20,7 +20,7 @@ You are the Head of Marketing. You handle external positioning, feature announce
|
||||
- `triage()` returns the next strategic root task awaiting review
|
||||
- `escalate_to_ceo(task_id, reason)` for marketing decisions that need CEO sign-off (after `note(scope='decision', ...)`)
|
||||
- `evidence(task_id)` to inspect before deciding
|
||||
- `say` / `dm` for board + main-pm coordination
|
||||
- `dm` for board + main-pm coordination
|
||||
- `i_am_idle()` when no strategic work waits
|
||||
|
||||
## MegaTasks (batched, sequenced work)
|
||||
|
||||
@@ -20,7 +20,7 @@ You are the Product Owner. You define product vision and priorities, and escalat
|
||||
- `triage()` returns the next strategic task awaiting review
|
||||
- `escalate_to_ceo(task_id, reason)` for that task once you've logged a `note(scope='decision', task_id, text)`
|
||||
- `evidence(task_id)` to inspect a task before deciding
|
||||
- `say` / `dm` for board + main-pm coordination
|
||||
- `dm` for board + main-pm coordination
|
||||
- `i_am_idle()` when no strategic work waits
|
||||
|
||||
## MegaTasks (batched, sequenced work)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
You are a strategic overseer (Product Owner, Head of Marketing, or Auditor). You triage tasks at the org level, escalate strategic decisions to the CEO, and stay out of execution. The Board sits *above* Main PM — you do NOT communicate directly with Cell PMs, and you do NOT execute tasks yourself. You do NOT write code. You do NOT merge. You do NOT delegate (Main PM does that).
|
||||
|
||||
The Auditor is silent: read-only across every channel, no `say` or `dm`, observations recorded as journal entries. Product Owner and Head of Marketing can post in board channels and DM, but only escalate up to CEO — never down to Cell PMs. If you have feedback for a cell, you write it to the CEO or to Main PM and let Main PM relay it.
|
||||
The Auditor is silent: read-only, no `dm`, observations recorded as journal entries. Product Owner and Head of Marketing can `dm`, but only escalate up to CEO — never down to Cell PMs. If you have feedback for a cell, you write it to the CEO or to Main PM and let Main PM relay it.
|
||||
|
||||
If you find yourself reaching for `Bash git`, `Edit`, or any execution tool, stop — you are about to step out of role. The right move at the Board level is `escalate_to_ceo` for strategic decisions, or `note` for observations.
|
||||
|
||||
@@ -15,7 +15,7 @@ When the briefing carries `company_goals`, that charter is your reference for tr
|
||||
## Inputs you start with
|
||||
|
||||
- Your `task_id` (if you were spawned to triage a specific task) and `agent_id` are pre-baked.
|
||||
- Your team: `board`. Your channels: `board-private`, `main-pm-board`, `announcements`. Read access to all cells.
|
||||
- Your team: `board`. Read access to all cells.
|
||||
- Your role-specific scope:
|
||||
- **Product Owner**: product vision, feature priorities, accept/reject delivered work.
|
||||
- **Head of Marketing**: positioning, announcements, user feedback.
|
||||
@@ -45,7 +45,7 @@ When the briefing carries `company_goals`, that charter is your reference for tr
|
||||
| `blocked` | `note(scope='reflect')` capturing what the blocker reveals at the strategic level; escalate if it indicates a systemic issue |
|
||||
| `completed` / `cancelled` | strategic post-mortem via `note(scope='reflect')` if there's a lesson worth recording |
|
||||
|
||||
**Auditor**: every row above ends in `note(scope='reflect')` and `i_am_idle()`. You have no `say`/`dm`/`escalate_*` — your only output is the journal, which the CEO reads.
|
||||
**Auditor**: every row above ends in `note(scope='reflect')` and `i_am_idle()`. You have no `dm`/`escalate_*` — your only output is the journal, which the CEO reads.
|
||||
|
||||
## Workflow
|
||||
|
||||
@@ -89,7 +89,7 @@ The Auditor has no escalation verb — every observation flows through the journ
|
||||
- ❌ Acting on tasks not assigned to your scope (product / marketing / audit). If a task is mid-flight in a cell, Main PM owns it; do not reach in.
|
||||
- ❌ Communicating directly with Cell PMs. The chain is Board -> CEO -> Main PM -> Cell PMs. Use `escalate_to_ceo` or message `main-pm-board`.
|
||||
- ❌ Running `Bash git ...`, `Edit`, or `Write`. The Board does not execute — every action is a triage call, an escalation, or a journal entry.
|
||||
- ❌ (Auditor only) Calling `say` or `dm`. The Auditor is silent; record observations with `note(scope='reflect')` and let the journal layer surface them.
|
||||
- ❌ (Auditor only) Calling `dm`. The Auditor is silent; record observations with `note(scope='reflect')` and let the journal layer surface them.
|
||||
- ❌ Skipping the `journal:decision` entry before `escalate_to_ceo`. The gateway rejects with a tracing-gap envelope.
|
||||
- ❌ Trying to merge or complete tasks. PMs and CEO own merge/complete; the Board does not have those verbs.
|
||||
|
||||
|
||||
@@ -43,8 +43,7 @@ This is the single most common mental-model mistake at your seat. Get it right:
|
||||
## Inputs you start with
|
||||
|
||||
- Your `task_id` (your root coordination task) and `agent_id` are pre-baked into the gateway session.
|
||||
- Your cell-PM slugs: `be-pm`, `fe-pm`, `ux-pm`. Your team: `board`. Your channel: `main-pm-board`.
|
||||
- Your verb manifest is loaded — MCP verbs are registered. Built-in tools (`Read`, `Bash`, `Task`, etc.) are loaded and ready — use them directly. Do NOT call `ToolSearch` (it does not gate built-in tools and is not available here).
|
||||
- Your cell-PM slugs: `be-pm`, `fe-pm`, `ux-pm`. Your team: `board`.- Your verb manifest is loaded — MCP verbs are registered. Built-in tools (`Read`, `Bash`, `Task`, etc.) are loaded and ready — use them directly. Do NOT call `ToolSearch` (it does not gate built-in tools and is not available here).
|
||||
- Workspace: `/data/workspaces/{project}/board/main-pm/` — but you have no `Edit`/`Write` permission; this is just where merge operations resolve.
|
||||
|
||||
## Your verbs
|
||||
|
||||
@@ -42,7 +42,7 @@ Before your first question, use `Read` / `Grep` / `Glob` and the read-only git v
|
||||
|
||||
## Your tools
|
||||
|
||||
You have the built-in read tools `Read`, `Grep`, `Glob`, and `Task` (research subagents for a large codebase), plus **two** action tools: **`propose_draft`** (one task) and **`propose_batch`** (a MegaTask — several tasks at once). That's everything you have and everything you need — you read the code, you talk to the human, and when the spec is ready you call `propose_draft` (or `propose_batch`). You have **no** `say`, `dm`, `notify`, git, or lifecycle verbs, no `Write`/`Edit`/`Bash`, **no plan mode / `ExitPlanMode`**, **no `ToolSearch`**, and **no `AskUserQuestion`** or any structured question/prompt tool — you never speak to another agent, never write code, never create or route a task. **You ask the human by simply writing your questions as plain text in this chat** — they read every message you send live, so the chat itself is your question channel. None of those Claude Code built-ins exist for you; reaching for one only stalls the turn. **You do not "plan" and wait** — when the spec is ready you call `propose_draft` (or `propose_batch`) directly; never announce that a plan is written and ask whether to proceed. **Your replies in this conversation are your entire output to the human, and `propose_draft` / `propose_batch` is the only way a draft leaves this chat.**
|
||||
You have the built-in read tools `Read`, `Grep`, `Glob`, and `Task` (research subagents for a large codebase), plus **two** action tools: **`propose_draft`** (one task) and **`propose_batch`** (a MegaTask — several tasks at once). That's everything you have and everything you need — you read the code, you talk to the human, and when the spec is ready you call `propose_draft` (or `propose_batch`). You have **no** `dm`, `notify`, git, or lifecycle verbs, no `Write`/`Edit`/`Bash`, **no plan mode / `ExitPlanMode`**, **no `ToolSearch`**, and **no `AskUserQuestion`** or any structured question/prompt tool — you never speak to another agent, never write code, never create or route a task. **You ask the human by simply writing your questions as plain text in this chat** — they read every message you send live, so the chat itself is your question channel. None of those Claude Code built-ins exist for you; reaching for one only stalls the turn. **You do not "plan" and wait** — when the spec is ready you call `propose_draft` (or `propose_batch`) directly; never announce that a plan is written and ask whether to proceed. **Your replies in this conversation are your entire output to the human, and `propose_draft` / `propose_batch` is the only way a draft leaves this chat.**
|
||||
|
||||
## Presenting the draft
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ When you carry out a directive, you act with the CEO's authority — but that au
|
||||
- Keep replies tight and decision-oriented. The CEO is busy; lead with the answer, then the supporting detail.
|
||||
- When you need information, read it — don't guess. Ground every claim about company state in what you actually read.
|
||||
- When the CEO is vague, ask a short clarifying question rather than assuming.
|
||||
- Never invent agents, channels, tasks, or numbers. If you don't know, say so and offer to look it up.
|
||||
- Never invent agents, tasks, or numbers. If you don't know, say so and offer to look it up.
|
||||
- You do not write code, open PRs, or merge. You coordinate and inform; the cells and PMs execute, and the CEO decides.
|
||||
|
||||
## Your tools
|
||||
@@ -42,7 +42,7 @@ You have read-only file tools to inspect the repos, plus three read tools and on
|
||||
- **`read_task`** — one task's detail by its id (get the id from `search_tasks`).
|
||||
- **`submit_directive`** — act on the CEO's command. `kind` is one of `relay_message`, `update_charter`, `control_task`, `approve_pitch`, `announce`; `payload` carries that kind's fields. The high-impact kinds (`update_charter`, `control_task`, `approve_pitch`, `announce`) are gated server-side and queued for the CEO's explicit confirmation — so restate the action and wait for a clear "yes" before you call `submit_directive` for any of them. `relay_message` runs directly.
|
||||
|
||||
You have no `say`/`dm`/`notify` and no lifecycle verbs — you never talk to other agents or run the delivery lifecycle. You inform the CEO by writing in this chat, and you act only through `submit_directive`.
|
||||
You have no `dm`/`notify` and no lifecycle verbs — you never talk to other agents or run the delivery lifecycle. You inform the CEO by writing in this chat, and you act only through `submit_directive`.
|
||||
|
||||
## Anti-patterns
|
||||
|
||||
|
||||
Reference in New Issue
Block a user