mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
* feat(a2a): CEO can DM the Auditor and PR reviewers
A mid-flight PR reviewer or Auditor that's stuck was unreachable — the CEO
had no way to DM them. Both roles now carry dm/read_a2a, so the CEO can open
a 1:1 and they can reply in-thread through the existing CEO-reply path.
Scoped deliberately: the Auditor stays a silent observer to its peers — it
gains no peer-initiation surface (can_a2a_direct routes it through
_check_auditor_a2a, which refuses every initiation target; it can only reply
inside a CEO-opened DM). PR reviewers keep their owning-PM scope. Intake and
Secretary stay excluded — they have their own dedicated chat pages.
NO_COMMS_ROLES drops to {prompter, secretary}; the panel's EXCLUDE_NON_DM_ROLES
matches. KB/docs updated so the 'auditor/pr_reviewer have no dm' claim isn't
left stale.
* test(a2a): smoke guard checks _NO_COMMS_ROLES, not a hardcoded 'auditor'
The dm() runtime guard no longer names the auditor (it now carries dm to
reply to the CEO); it refuses the canonical _NO_COMMS_ROLES set. Assert on
that set so the smoke test tracks the guard, not a stale role name.
* chore(foundation): regenerate verb tables for auditor/pr_reviewer dm+read_a2a
---------
Co-authored-by: Renn F <rennf93@users.noreply.github.com>
28 lines
1.5 KiB
Markdown
28 lines
1.5 KiB
Markdown
<!-- AUTOGENERATED by scripts/regenerate_verb_tables.py. -->
|
|
<!-- Per-role verb signatures, derived from Pydantic schemas. -->
|
|
|
|
## Verbs available to you (autogenerated source of truth)
|
|
|
|
### Flow verbs
|
|
|
|
| Verb | Body schema |
|
|
|------|-------------|
|
|
| `i_am_idle` | `i_am_idle()` |
|
|
| `triage` | `triage()` |
|
|
| `waive_finding` | `waive_finding(finding_id: UUID, note: str)` |
|
|
|
|
### Content (do) tools
|
|
|
|
| Tool | Body schema |
|
|
|------|-------------|
|
|
| `note` | `note(text: str, scope: str = 'note', task_id: UUID | None = None, title: str | None = None, context: str = '', options: list[str | str] | None = None, chosen: str = '', rationale: str = '', consequences: list[str] | None = None, what_done: str = '', what_learned: str = '', what_struggled: str = '', next_steps: list[str] | None = None, section: str | Any | None = None, done: str = '', next: str = '', where_to_look: list[str] | None = None)` |
|
|
| `evidence` | `evidence(task_id: UUID)` |
|
|
| `dm` | `dm(recipient: str, text: str, task_id: UUID | None = None, skill: str | None = None)` |
|
|
| `read_a2a` | `read_a2a(see do_server)` |
|
|
| `approve_playbook` | `approve_playbook(playbook_id: UUID)` |
|
|
| `reject_playbook` | `reject_playbook(playbook_id: UUID, reason: str)` |
|
|
| `archive_playbook` | `archive_playbook(playbook_id: UUID)` |
|
|
| `curate_vault` | `curate_vault(task_id: UUID, narrative: str)` |
|
|
| `notify_list` | `notify_list(unread_only: bool = True, pending_ack_only: bool = False, limit: int = 20)` |
|
|
| `notify_get` | `notify_get(notification_id: UUID)` |
|