The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the CHAP Coordinator listing page.
The open protocol for humans and agents doing accountable work together.
CHAP gives approvals, overrides, handoffs and escalations one shared, auditable shape across MCP and A2A.
Start here · Concepts · Install · 90-second tour · MCP quickstart · Scenarios · Implementations · Wiki · Discussions · Paper
Work is moving towards teams in which hundreds of agents and hundreds of people take part. Agents draft, triage and recommend; people approve, correct, overrule and escalate. Those human decisions make the work accountable, yet they are usually recorded only in chat threads, ticket comments and memory.
CHAP gives those decisions a defined structure and an auditable record: what the agent produced, what the person decided and why, in one log that can be queried and verified.
SECURITY.md §5). The history survives key rotation, expired vendor logs and staff changes.CHAP is a protocol: a set of calls that agents, people and their tools send to a coordinator, the service that mediates a workspace. The coordinator checks each call against the workspace's rules, answers it, and records each accepted change in the workspace's audit log. The TypeScript and Python packages below are coordinators, to embed in your own process or run as a server.
| Term | What it is |
|---|---|
| Workspace | A named context for one body of work: its members, its tasks, and the profiles it uses |
| Participant | A member, named by a URI such as human:alice@example.org or agent:triage; group: names a set of members |
| Task | A unit of work, assigned to a participant |
| Artefact | What a participant produces in a task: a draft, a decision, an override |
| Envelope | One call, as a JSON-RPC 2.0 message; its method is the verb, such as task.create or decide.approve |
| Audit log | The ordered record of every change to the workspace; with the hash chain on, each entry carries the hash of the one before it |
The verbs read as their names. A task is created, completed and sent for review (task.create, task.complete, review.request). A reviewer approves, rejects or overrides it (decide.approve, decide.reject, decide.override). Work is handed off or escalated (handoff.propose, escalate.raise), and audit.read returns the record.
Core and profiles. Every coordinator implements Core (core/1.0): workspaces, participants, tasks and the audit log. Everything else is an optional profile, named with its version. review/1.0 adds review requests and decisions. Others add quick questions to a person (whisper/1.0), group votes (deliberation/1.0), handoffs (handoff/1.0), pausing and rollback (control/1.0), routing (routing/1.0), shadow and trial modes (modes/1.0), signed calls (security-signed/1.0), verified identities (identity-oidc/1.0, identity-vc/1.0) and a transparency log (audit-scitt/1.0). A workspace advertises the profiles it uses, and the coordinator refuses calls that belong to any other profile. core/SPEC.md fits Core on one page, profiles/PROFILES.md lists the profiles, and GLOSSARY.md defines every term.
Libraries. Each package implements Core and every profile; a new workspace advertises core/1.0 and review/1.0 unless you name others.
| TypeScript | Python |
|---|---|
A new project. create-chap-app generates one with a review desk, one profile setting and a diff-profiles command:
The default template is the code gate: each change a coding agent makes in a git repository is reviewed as a diff, approved with the reviewer's signature, and committed with the evidence beside it for CI to verify. The other templates are an MCP gate for Claude Desktop, Cursor and Claude Code, a support desk, an outbound approval gate and a production set. docs/profile-explorer.md shows what each profile changes.
From a clone of this repository. START_HERE.md runs a local review desk on the Python coordinator, with Python 3.10 or later and nothing else to install:
examples/00-five-minute-start.md sends envelopes to the Core reference server with curl and reads back the audit log. The libraries are in packages/coordinator/ and packages/coordinator-py/, the reference implementations in reference/ and reference/python/.
A solo developer reviews pull requests with Cursor, and the bot flags a warning the developer disagrees with. The clip shows the exchange in six steps, in about 23 seconds.
The code for each step follows, in TypeScript and Python.
| TypeScript | Python |
|---|---|
| TypeScript | Python |
|---|---|
The two surfaces. TypeScript ships a typed facade,
coord.api.*, so every method has autocomplete and compile-time checks. Python keeps the JSON-RPC envelope on the surface,coord.dispatch({...}), wrapped here in asend()helper, the idiom the Python tests use. Both send the same parameters in the same envelope, so the audit chain reads the same whichever client made the call.
The repository ships the script in both languages. It reads the audit chain over HTTP or straight from your SQLite file:
The most common tags name what the next prompt revision for Cursor should fix.
chap-analytics (pip install chap-analytics) loads the whole chain into documented pandas tables, from a SQLite file, a JSON export, a live coordinator or an audit.read: overrides, decisions, reviewers, whispers and handoffs. A notebook works through a week of review data, and ANALYTICS_ROADMAP.md describes the planned work.
The override envelope records a reviewer's change to an agent's output. Each field is annotated below:
Two fields matter most for analysis:
intent_preserved tells a refining override, where the person kept the agent's decision and rewrote its wording, from a substituting one, where the person decided differently. Each points at a different fix: many refining overrides around one policy clause point at the agent's retrieval; many substituting ones point at an ambiguous policy, or at the agent's task context.tags are the small, controlled vocabulary your team agrees on. They are what you will count by three months from now, to answer which prompts need work? and which paths does the bot keep getting wrong?CHAP 0.3 is a public draft: a small Core and optional profiles (SPECIFICATION.md).
review/1.0, and runs against the Python coordinator and a standalone TypeScript server.Before 1.0, a minor release may break things, and its changelog lists each break with a migration; from 1.0 the specification follows Semantic Versioning. For strict stability, wait for 1.0: ROADMAP.md sets out what it will promise and the milestones on the way.
| Read | For |
|---|---|
START_HERE.md | A local review desk on the Python coordinator, with nothing to install beyond Python |
IN_PRACTICE.md | Scenarios, from a solo developer with Cursor to GMP-regulated manufacturing |
ABOUT.md | The repository's contents, how CHAP relates to MCP and A2A, the standards it reuses, and contributing |
core/SPEC.md | Core, on one page |
| The technical report | The architecture, profile semantics and threat model, with the scenarios as JSON traces |
If you reference CHAP in academic or technical work, please cite the technical report.
CC BY 4.0 (specification text, see LICENSE-SPEC.md) · Apache 2.0 (everything else) · Any language, any deployment.