Charter design playbook
How to draft strong Charters that work for human, agent, and hybrid seats.
A Charter is a seat's operating contract. It must be specific enough for a human to understand the job and strict enough for an agent to operate safely.
Required Charter sections
- Purpose: why this seat exists.
- Responsibilities: the recurring outcomes the seat owns.
- Autonomous scope: what the seat may do without asking.
- Approval scope: what requires human confirmation.
- Must-escalate conditions: what the seat must not decide alone.
- Measurables: how the seat knows it is on track.
- Tools and data: which systems the seat may use.
- Reporting rhythm: what the seat reports into Signal, Friction, Cascade, and Sync.
Responsibility quality bar
Responsibilities should be outcomes, not vague activities. "Keep vendor payments clean and on time" is stronger than "help with accounting." The test is whether a measurable, escalation, or handoff can be attached to the responsibility.
Agent and hybrid Charters
Agent Charters need tighter boundaries than human Charters. They must separate autonomous work from approval-required work, and they must name conditions that always escalate.
Hybrid Charters should split the work: what the human remains accountable for, what the agent performs, and where the handoff happens.
Operate Charters from CLI or MCP
List and read first, then draft, then leave activation to a human.
- List:
rost command charter.list --json '{}'orrost_list_charters(scope: tenant). Read one withcharter.get/rost_get_charter. - Draft one:
rost command charter.draft --json '{"seat_id":"<seat-id>"}'(scope: seat or tenant-admin); draft every eligible seat withcharter.draft_all/rost_draft_all_charters. Draft commands are not gated — they produce a draftcharter_version_id.charter.draft_allonly drafts active seats and returns the real result:{ drafted, skipped, draft_ids, skipped_seats: [{ seat_id, reason }] }wherereasonisseat_not_active(the seat is still draft/vacant — confirm it first) orcharter_exists(it already has a draft/active Charter). Readskipped_seatsto see why a freshly-built graph drafted fewer Charters than it has seats. - Edit a draft:
charter.update_draft/rost_update_charter_draftwith thecharter_version_idand the newdoc.
When to stop for confirmation
charter.approve, charter.skip, charter.apply_seat_type_recommendation, and charter.sign_manifest are human_required. Over MCP rost_approve_charter returns a pending confirmation, not an activation. Approving a Charter, signing a permission manifest, or expanding authority is a human act recorded against decided_by. An agent prepares the draft and surfaces the approve link; it does not approve. See the confirmations guide.
Approval rule
Drafting can be assisted by agents. Activation is a human decision. When authority, tool permissions, credentials, or go-live status changes, route through confirmation.