Files
roboco/agents/prompts/_generated/verbs.md
T
Renn F 5bea82dbbc fix(gateway): resolve adversarial-review findings on the pr_reviewer flow
An adversarial review of the feature found two blocking defects (both would
surface the moment external_pr_enabled is turned on) plus hardening gaps:

- HIGH: the enforcement legacy role-gate overlay OVERWROTE spec-derived roles,
  so pr_reviewer was erased from the (in_progress->completed) edge it shares
  with the PM self-complete gate — the review task could never complete. Fix:
  UNION legacy + spec roles instead of overwriting (also preserves the legacy
  'add roles' intent on every shared edge).
- HIGH: claim_pr_review routed claim+start through the verb runner, which hit
  start()'s plan gate (planless review task -> None -> crash/respawn loop) and
  auto-created+pushed a stray branch (violating the read-only/branchless
  invariant). Fix: mirror QA's claim_review — a verb-body TaskService.pr_review_claim
  does pending->in_progress with no plan and no branch.
- MED: add the pr_reviewer Write(*)/Edit(*) deny at the permission layer (it
  ingests untrusted PR diffs — make read-only explicit, not implicit).
- MED: regenerate the verb-table artifacts (the schemas existed but the
  generator had not been re-run; the agent prompt showed 'unknown' signatures).

ruff + mypy clean (279 files); foundation + gateway suites green (5205 passed).
2026-06-16 11:48:24 +02:00

15 KiB

Per-role verb shapes (autogenerated)

Run uv run python scripts/regenerate_verb_tables.py after changing any role config or schema. Role prompts reference this file's sections as the source of truth for verb signatures.

Driver-based roles (prompter, secretary) are intentionally omitted — their real tools live in their agent_sdk drivers, not role_config.

developer

Flow verbs

Verb Body schema
give_me_work give_me_work()
i_am_blocked `i_am_blocked(task_id: UUID, reason: str, blocker_type: str
i_am_done i_am_done(task_id: UUID, notes: str = '')
i_am_idle i_am_idle()
i_will_work_on `i_will_work_on(task_id: UUID, plan: str
open_pr open_pr(task_id: UUID)
resume resume(task_id: UUID)
unclaim unclaim(task_id: UUID)

Content (do) tools

Tool Body schema
commit `commit(message: str, files: list[str]
note `note(text: str, scope: str = 'note', task_id: UUID
say `say(channel: str, text: str, task_id: UUID
dm `dm(recipient: str, text: str, task_id: UUID
evidence evidence(task_id: UUID)
progress `progress(task_id: UUID, message: str, plan_step: str
pr_update pr_update(see do_server)
notify_list notify_list(unread_only: bool = True, pending_ack_only: bool = False, limit: int = 20)
notify_get notify_get(notification_id: UUID)
notify_ack notify_ack(notification_id: UUID)
read_messages read_messages()
channels channels()

qa

Flow verbs

Verb Body schema
claim_review claim_review(task_id: UUID)
fail_review fail_review(task_id: UUID, issues: list[str])
give_me_work give_me_work()
i_am_blocked `i_am_blocked(task_id: UUID, reason: str, blocker_type: str
i_am_idle i_am_idle()
pass_review `pass_review(task_id: UUID, notes: str, ac_verdicts: list[str]
resume resume(task_id: UUID)
unclaim unclaim(task_id: UUID)

Content (do) tools

Tool Body schema
note `note(text: str, scope: str = 'note', task_id: UUID
say `say(channel: str, text: str, task_id: UUID
dm `dm(recipient: str, text: str, task_id: UUID
evidence evidence(task_id: UUID)
notify_list notify_list(unread_only: bool = True, pending_ack_only: bool = False, limit: int = 20)
notify_get notify_get(notification_id: UUID)
notify_ack notify_ack(notification_id: UUID)
read_messages read_messages()
channels channels()

documenter

Flow verbs

Verb Body schema
claim_doc_task claim_doc_task(task_id: UUID)
give_me_work give_me_work()
i_am_blocked `i_am_blocked(task_id: UUID, reason: str, blocker_type: str
i_am_idle i_am_idle()
i_documented i_documented(task_id: UUID, notes: str, files: list[str])
resume resume(task_id: UUID)
unclaim unclaim(task_id: UUID)

Content (do) tools

Tool Body schema
commit `commit(message: str, files: list[str]
note `note(text: str, scope: str = 'note', task_id: UUID
say `say(channel: str, text: str, task_id: UUID
dm `dm(recipient: str, text: str, task_id: UUID
evidence evidence(task_id: UUID)
progress `progress(task_id: UUID, message: str, plan_step: str
pr_update pr_update(see do_server)
notify_list notify_list(unread_only: bool = True, pending_ack_only: bool = False, limit: int = 20)
notify_get notify_get(notification_id: UUID)
notify_ack notify_ack(notification_id: UUID)
read_messages read_messages()
channels channels()

cell_pm

Flow verbs

Verb Body schema
complete complete(task_id: UUID, notes: str)
delegate `delegate(parent_task_id: UUID, title: str, description: str, assigned_to: str, team: str, task_type: str, nature: str, estimated_complexity: str, acceptance_criteria: list[str], project_id: UUID
escalate_up escalate_up(task_id: UUID, reason: str)
give_me_work give_me_work()
i_am_idle i_am_idle()
i_will_plan `i_will_plan(task_id: UUID, plan: str, approach: str, sub_tasks: list[str
reassign reassign(task_id: UUID, new_assignee: str)
resume resume(task_id: UUID)
submit_up submit_up(task_id: UUID, notes: str)
triage triage()
unblock unblock(task_id: UUID, restore: bool = True)
unclaim unclaim(task_id: UUID)

Content (do) tools

Tool Body schema
note `note(text: str, scope: str = 'note', task_id: UUID
say `say(channel: str, text: str, task_id: UUID
dm `dm(recipient: str, text: str, task_id: UUID
notify `notify(target: str, text: str, priority: str = 'normal', task_id: UUID
evidence evidence(task_id: UUID)
open_session `open_session(task_id: UUID, channel: str, topic: str, relationship_type: str = 'discussion', group_id: UUID
link_session link_session(session_id: UUID, task_id: UUID, is_primary: bool = False, relationship_type: str = 'discussion')
pr_update pr_update(see do_server)
notify_list notify_list(unread_only: bool = True, pending_ack_only: bool = False, limit: int = 20)
notify_get notify_get(notification_id: UUID)
notify_ack notify_ack(notification_id: UUID)
read_messages read_messages()
channels channels()

main_pm

Flow verbs

Verb Body schema
complete complete(task_id: UUID, notes: str)
delegate `delegate(parent_task_id: UUID, title: str, description: str, assigned_to: str, team: str, task_type: str, nature: str, estimated_complexity: str, acceptance_criteria: list[str], project_id: UUID
escalate_to_ceo escalate_to_ceo(task_id: UUID, reason: str)
escalate_up escalate_up(task_id: UUID, reason: str)
give_me_work give_me_work()
i_am_idle i_am_idle()
i_will_plan `i_will_plan(task_id: UUID, plan: str, approach: str, sub_tasks: list[str
resume resume(task_id: UUID)
triage triage()
triage_all triage_all()
unblock unblock(task_id: UUID, restore: bool = True)
unclaim unclaim(task_id: UUID)

Content (do) tools

Tool Body schema
note `note(text: str, scope: str = 'note', task_id: UUID
say `say(channel: str, text: str, task_id: UUID
dm `dm(recipient: str, text: str, task_id: UUID
notify `notify(target: str, text: str, priority: str = 'normal', task_id: UUID
evidence evidence(task_id: UUID)
open_session `open_session(task_id: UUID, channel: str, topic: str, relationship_type: str = 'discussion', group_id: UUID
link_session link_session(session_id: UUID, task_id: UUID, is_primary: bool = False, relationship_type: str = 'discussion')
pr_update pr_update(see do_server)
notify_list notify_list(unread_only: bool = True, pending_ack_only: bool = False, limit: int = 20)
notify_get notify_get(notification_id: UUID)
notify_ack notify_ack(notification_id: UUID)
read_messages read_messages()
channels channels()

product_owner

Flow verbs

Verb Body schema
escalate_to_ceo escalate_to_ceo(task_id: UUID, reason: str)
i_am_idle i_am_idle()
triage triage()

Content (do) tools

Tool Body schema
note `note(text: str, scope: str = 'note', task_id: UUID
pitch pitch(title: str, slug: str, problem: str, proposed_solution: str, target_cells: list[str])
say `say(channel: str, text: str, task_id: UUID
dm `dm(recipient: str, text: str, task_id: UUID
notify `notify(target: str, text: str, priority: str = 'normal', task_id: UUID
evidence evidence(task_id: UUID)
open_session `open_session(task_id: UUID, channel: str, topic: str, relationship_type: str = 'discussion', group_id: UUID
notify_list notify_list(unread_only: bool = True, pending_ack_only: bool = False, limit: int = 20)
notify_get notify_get(notification_id: UUID)
notify_ack notify_ack(notification_id: UUID)
read_messages read_messages()
channels channels()

head_marketing

Flow verbs

Verb Body schema
escalate_to_ceo escalate_to_ceo(task_id: UUID, reason: str)
i_am_idle i_am_idle()
triage triage()

Content (do) tools

Tool Body schema
note `note(text: str, scope: str = 'note', task_id: UUID
pitch pitch(title: str, slug: str, problem: str, proposed_solution: str, target_cells: list[str])
say `say(channel: str, text: str, task_id: UUID
dm `dm(recipient: str, text: str, task_id: UUID
notify `notify(target: str, text: str, priority: str = 'normal', task_id: UUID
evidence evidence(task_id: UUID)
open_session `open_session(task_id: UUID, channel: str, topic: str, relationship_type: str = 'discussion', group_id: UUID
notify_list notify_list(unread_only: bool = True, pending_ack_only: bool = False, limit: int = 20)
notify_get notify_get(notification_id: UUID)
notify_ack notify_ack(notification_id: UUID)
read_messages read_messages()
channels channels()

auditor

Flow verbs

Verb Body schema
i_am_idle i_am_idle()
triage triage()

Content (do) tools

Tool Body schema
note `note(text: str, scope: str = 'note', task_id: UUID
evidence evidence(task_id: UUID)
notify_list notify_list(unread_only: bool = True, pending_ack_only: bool = False, limit: int = 20)
notify_get notify_get(notification_id: UUID)
channels channels()

pr_reviewer

Flow verbs

Verb Body schema
claim_pr_review claim_pr_review(task_id: UUID)
give_me_work give_me_work()
i_am_idle i_am_idle()
post_pr_review post_pr_review(task_id: UUID, body: str, event: str = 'REQUEST_CHANGES')

Content (do) tools

Tool Body schema
note `note(text: str, scope: str = 'note', task_id: UUID
evidence evidence(task_id: UUID)
notify_list notify_list(unread_only: bool = True, pending_ack_only: bool = False, limit: int = 20)
notify_get notify_get(notification_id: UUID)
channels channels()