---
name: csuite-agent-protocol
source: https://app.decimal.ai/s/csuite-agent-protocol@1/SKILL.md
source_sha256: b08fd1ce1bcd
---

# C-Suite Inter-Agent Protocol

## Contract
When C-suite advisor agents query each other or coordinate multi-agent analysis, every
inter-agent message is a **literal bracketed token**, never prose and never a self-invented
shape. Apply whenever one agent asks another for input, replies to a query, blocks a call,
records an assumption, surfaces a conflict, broadcasts, or annotates a call chain.

## Rules (the complete token surface)

### R1 — Invocation
One agent queries another on a single line:
`[INVOKE:role|question]`
- Square brackets wrap the whole thing. Literal uppercase word `INVOKE`, a colon, the
  lowercase role token, a `|` pipe, then the question text. Nothing before or after the
  brackets on that line.

### R2 — Role tokens (fixed, lowercase, exactly these 14)
`ceo`, `cfo`, `cro`, `cmo`, `cpo`, `cto`, `chro`, `coo`, `ciso`, `gc`, `cdo`, `caio`, `cco`, `vpe`.
Map the job to the token — never invent a name like `finance` or `FinanceAgent`:

| Job | Token | Job | Token |
|---|---|---|---|
| CEO | `ceo` | security / infosec | `ciso` |
| finance | `cfo` | legal / general counsel | `gc` |
| revenue / sales | `cro` | data / data strategy | `cdo` |
| marketing | `cmo` | AI / ML / evals | `caio` |
| product | `cpo` | customer success / retention | `cco` |
| technology | `cto` | VP of Engineering / delivery | `vpe` |
| people / HR | `chro` | operations | `coo` |

### R3 — Response
The invoked agent answers wrapped in tags, with these EXACT labels in THIS order:
```
[RESPONSE:role]
Key finding: <one line — the answer>
Supporting data:
  - <data point>
  - <data point>
Confidence: <high | medium | low>
Caveat: <one line — what could make this wrong>
[/RESPONSE]
```
- `[RESPONSE:role]` opens, `[/RESPONSE]` closes.
- The four labels are `Key finding:`, `Supporting data:`, `Confidence:`, `Caveat:` — in that
  order, spelled exactly.
- `Supporting data:` carries at least one `  - ` bullet.
- `Confidence:` value is exactly one of `high`, `medium`, `low` — no synonyms ("strong",
  "fairly sure", percentages).

### R4 — Loop prevention (hard, unconditional)
- **No self-invocation:** an agent never emits `[INVOKE:<its own role>|...]`.
- **Max depth 2:** chains may go A→B→C; the third hop onward is blocked.
- **No circular calls:** if A called B in this chain, B cannot invoke A back.
- A blocked call emits, INSTEAD of invoking:
  `[BLOCKED: cannot invoke <role> — <reason>]`
  then states the fallback as `[ASSUMPTION: <explicit assumption used instead>]`.
- Annotate the path with `[CHAIN: cro → cfo → coo]` (lowercase tokens, ` → ` separators).

### R5 — Other tokens
- Unverified figure: `[ASSUMPTION: <claim> — not verified with <role>]`.
- Disagreement between two agents: `[CONFLICT: <role> says X; <role> says Y]` — surface it;
  never silently adopt one side.
- CEO fan-out to every role at once: `[BROADCAST:all|question]` (literal `all`, then a pipe).

### R6 — Isolation phases
- **Independent-analysis phase:** NO invocations at all; each role forms its own view first.
  If a role needs another's data, it records `[ASSUMPTION: ...]` instead of invoking.
- **Critique phase:** an agent may *reference* another role's output in prose but may NOT
  `[INVOKE:...]` it.

## Worked examples (BEFORE = base default → AFTER = conforming)

### R1/R2 — Invocation + role token
- Task: revenue agent asks finance agent whether hiring 5 engineers next quarter is affordable.
- BEFORE: `Hey CFO, can we afford to hire 5 engineers next quarter?`
- AFTER: `[INVOKE:cfo|Can we afford to hire 5 engineers next quarter?]`

- Task: CEO agent asks the HR agent for typical senior-engineer time-to-hire.
- BEFORE: `@HR what's our usual time-to-hire for senior engineers?`
- AFTER: `[INVOKE:chro|What is our typical time-to-hire for senior engineers?]`

- Task: CEO agent asks the AI agent for eval coverage on the new model.
- BEFORE: `[INVOKE:ai|eval coverage?]`  (invented token `ai`)
- AFTER: `[INVOKE:caio|What is the eval coverage and hallucination rate on the new model?]`

### R3 — Response format
- Task: finance agent replies about runway impact of hiring 5 engineers.
- BEFORE:
  ```
  Hiring 5 engineers cuts runway from 14 to 9 months. I'm fairly confident, though it
  assumes a 3-month ramp.
  ```
- AFTER:
  ```
  [RESPONSE:cfo]
  Key finding: Hiring 5 engineers in Q3 cuts runway from 14 to 9 months at current burn.
  Supporting data:
    - Monthly burn rises ~$280K → ~$380K fully loaded
    - ~$1.2M additional ARR needed within 12 months to offset
  Confidence: medium
  Caveat: Assumes a 3-month ramp and no change in revenue trajectory.
  [/RESPONSE]
  ```

### R4 — No self-invocation
- Task: finance agent is missing verified runway data mid-analysis; its only source is itself.
- BEFORE: `[INVOKE:cfo|What's our exact current runway?]`  (an agent calling itself)
- AFTER:
  ```
  [BLOCKED: cannot invoke cfo — self-invocation not allowed]
  [ASSUMPTION: runway ~12 months based on a typical Series A burn profile — not verified with cfo]
  ```

### R4 — Depth limit
- Task: chain is `cro → cfo → coo`; the operations agent wants to pull in HR for a 4th hop.
- BEFORE: `[INVOKE:chro|What's the comp budget for these hires?]`
- AFTER:
  ```
  [BLOCKED: cannot invoke chro — chain already at depth 2 (cro → cfo → coo)]
  [ASSUMPTION: senior-eng comp ~$210K fully loaded based on market mid-point — not verified with chro]
  ```

### R4 — Circular call
- Task: revenue agent invoked finance agent; finance now wants to ask revenue back.
- BEFORE: `[INVOKE:cro|What's the committed pipeline this quarter?]`
- AFTER:
  ```
  [BLOCKED: cannot invoke cro — circular call; cro is already upstream in this chain]
  [ASSUMPTION: committed pipeline ~$3M based on last quarter's close rate — not verified with cro]
  ```

### R4 — Chain annotation
- Task: record that an invocation went revenue → finance → operations.
- BEFORE: `Chain so far: Revenue Agent, then Finance, then Ops`
- AFTER: `[CHAIN: cro → cfo → coo]`

### R5 — Assumption
- Task: an agent must use an unverified ~12-month runway figure in a budget analysis.
- BEFORE: `Assuming runway is about 12 months...`
- AFTER: `[ASSUMPTION: runway ~12 months based on a typical Series A profile — not verified with cfo]`

### R5 — Conflict
- Task: finance projects 14-month runway; revenue's pipeline implies 18+ months.
- BEFORE: `The runway is 18+ months once pipeline closes.`  (silently picks one)
- AFTER: `[CONFLICT: cfo says ~14-month runway; cro says pipeline close implies 18+ months]`

### R5 — Broadcast
- Task: CEO wants every role to assess the impact of a missed fundraise at once.
- BEFORE: `Everyone: what happens if we miss the raise?`
- AFTER: `[BROADCAST:all|What is the impact if we miss the fundraise?]`

## Edge cases & exceptions
- **Two-message exchanges** (query + reply): emit the `[INVOKE:role|...]` line first, then the
  full `[RESPONSE:role] ... [/RESPONSE]` block — both conform independently.
- **Need data during the independent-analysis phase:** do NOT invoke; record an
  `[ASSUMPTION: ...]` and continue. Invocations resume only after that phase.
- **Critique phase:** reference another role's output in prose ("the cfo projection assumes X")
  but never `[INVOKE:...]` mid-critique.
- **Question contains a pipe character:** the FIRST `|` after the role token is the delimiter;
  the rest of the line is the question verbatim.
- **A blocked call still owes an answer:** `[BLOCKED: ...]` alone is incomplete — it must be
  followed by the `[ASSUMPTION: ...]` fallback so the analysis still proceeds.
- **Confidence is genuinely uncertain:** still pick exactly `low` — never write "unknown",
  "TBD", or a percentage.

## Do / Don't
- DO write `[INVOKE:cfo|...]`. DON'T write `INVOKE cfo: ...`, `@cfo`, or prose.
- DO use the lowercase token (`cfo`). DON'T use `CFO`, `finance`, `FinanceAgent`, or `cfo-advisor`.
- DO close every response with `[/RESPONSE]`. DON'T leave the block open or use `[END]`.
- DO set `Confidence:` to `high`/`medium`/`low`. DON'T write "very high", "80%", or "pretty sure".
- DO emit `[BLOCKED: ...]` + `[ASSUMPTION: ...]` when a call is barred. DON'T silently invoke anyway.
- DO surface disagreement with `[CONFLICT: ...]`. DON'T quietly choose one side.
- DO keep the four response labels in order. DON'T reorder, rename, or drop `Caveat:`.

## Common mistakes (the base's wrong defaults)
1. Answering or asking in **prose** instead of the bracketed tokens.
2. Inventing role names (`finance`, `HR`, `engineering`) instead of the fixed tokens.
3. Uppercasing the token (`[INVOKE:CFO|...]`).
4. Putting `Confidence:` outside the `high|medium|low` vocabulary.
5. Reordering or omitting the response labels, or skipping the closing `[/RESPONSE]`.
6. Silently invoking itself / a 4th hop / an upstream agent instead of emitting `[BLOCKED]`.
7. Picking a winner on conflicting answers instead of emitting `[CONFLICT: ...]`.
8. Using a space or comma instead of the `|` pipe between role and question.

## Quick checklist
- [ ] Inter-agent message is a bracketed token, not prose.
- [ ] Role is one of the 14 lowercase tokens.
- [ ] Invocation is `[INVOKE:role|question]` on one line.
- [ ] Response uses `[RESPONSE:role] ... [/RESPONSE]` with the four labels in order.
- [ ] `Confidence:` is exactly `high`, `medium`, or `low`.
- [ ] Barred calls emit `[BLOCKED: ...]` + `[ASSUMPTION: ...]`.
- [ ] Conflicts use `[CONFLICT: ...]`; broadcasts use `[BROADCAST:all|...]`; chains use `[CHAIN: ...]`.
