CHAP

by Brightbeam (open source) · Claude Desktop, Claude Code, OpenCode, любой MCP-клиент, macOS, Linux

MCP MCP Servers Open Source v0.2.11 · 20.08.2026 активный

Collaborative Human Agent Protocol — протокол координации между людьми и AI-агентами.

v0.2.11
20.08.2026 current

Установка
# TypeScript / Node:
npm install @brightbeamai/chap-coordinator

# Python:
pip install chap-coordinator
показать оригинал переведено ИИ

Протокол совместной работы человека и агента (CHAP)

Протокол для людей и агентов, которые вместе делают настоящую работу.

Когда ИИ-агент готовит черновик, а человек его правит, где живёт эта правка? В CHAP она живёт в конверте, который можно запросить, воспроизвести и проверить даже спустя полгода.

Установка · Экскурсия за 90 секунд · Двенадцать сценариев · Об этом репозитории · Статья


Один сценарий, два стека. Без CHAP: шесть инструментов хранят фрагменты одного решения (логи OpenAI истекли, тред в Zendesk, переписка в Slack ушла вверх, комментарии в Linear, хвост вебхука, runbook в Notion), 45 минут на четырёх интерфейсах, чтобы ответить на вопрос «что набросал агент и почему мы это одобрили?». С CHAP: три конверта, связанных по хешам (task.create → artefact → decide.override), соединённых через prev_hash, один вызов audit.read, 30 секунд.


У вас есть агенты, которые делают настоящую работу. Готовят ревью кода, разбирают тикеты, предлагают условия урегулирования споров, проверяют договоры. Каждое решение человек одобряет, правит или отклоняет. Сейчас эти решения живут в коде вашего приложения, в чатах, в комментариях к тикетам и у вас в голове. Когда через шесть недель что-то идёт не так, восстановление картины происходящего отнимает сорок пять минут и наполовину состоит из догадок.

CHAP даёт вам одно место для таких решений и одну форму, в которую их нужно класть. Черновик агента — это артефакт. Правка человека — это структурированный оверрайд с диффом, обоснованием и тегами, которыми управляете вы. Всё это связывается в цепочку по хешу содержимого. Вы запрашиваете цепочку вместо того, чтобы грепать логи по четырём интерфейсам.

Цепочка переживает ротацию ключей, истечение логов и уход людей; один вызов audit.read возвращает всё целиком. Оверрайды, которые ваши ревьюеры и так делали, накапливаются в данные супервизии, которые иначе пришлось бы заказывать отдельно. Когда одобрения должны быть неотказуемыми, security-signed/1.0 добавляет подписи, привязанные к OIDC, с определяемым вами signature_meaning, а audit-scitt/1.0 заякоривает цепочку во внешнем журнале прозрачности, проверяемом без доверия вашим серверам. И CHAP стоит рядом с MCP и A2A, а не заменяет их: MCP — для инструментов, A2A — для других агентов, CHAP — для совместной работы с людьми.

Вот и весь питч.

Экскурсия за 90 секунд

Один разработчик использует Cursor для ревью пулл-реквестов. Бот помечает «предупреждение», с которым разработчик не согласен. Вот весь обмен целиком, от начала до конца. Клип ниже идёт около 23 секунд и разбит на шесть подписанных шагов; соответствующий код — сразу под ним.

Пошаговый разбор CHAP Core+Review из шести шагов с полосой прогресса и индикатором шага сверху. Шаг 1: настройка (воркспейс, два участника, задача). Шаг 2: подготовка черновика (агент готовит ответ). Шаг 3: ожидание ревью (review.request с черновиком-артефактом). Шаг 4: оверрайд (человек не согласен: дифф, обоснование, теги). Шаг 5: цепочка аудита (воспроизведение со связыванием по хешам, prev_hash непрерывен). Шаг 6: два месяца спустя (отчёт об обучении на оверрайдах показывает framework-pattern как самый частый тег, направляя следующую правку промпта на правильную проблему).

А вот и код, каждая его строчка. Одна непрерывная история на двух языках; выбирайте тот стек, которым действительно пользуетесь.

1. Поднимите воркспейс. Встроенный координатор с сохранением данных в SQLite, два участника, воркспейс:

TypeScriptPython
import { Coordinator } from "@brightbeamai/chap-coordinator";
import { SqliteStore } from
  "@brightbeamai/chap-coordinator/storage/sqlite";

const coord = new Coordinator({
  store: new SqliteStore("./chap.db"),
});

coord.api.workspace.create({
  workspace: "wsp_pr_reviews",
  profiles:  ["core/1.0", "review/1.0"],
});

coord.api.participant.join({
  workspace: "wsp_pr_reviews",
  from:      "human:me@local",
  type:      "human",
});

coord.api.participant.join({
  workspace: "wsp_pr_reviews",
  from:      "agent:cursor#v1",
  type:      "agent",
});
from chap_coordinator import Coordinator
from chap_coordinator.storage.sqlite \
    import SqliteStore

coord = Coordinator(store=SqliteStore("./chap.db"))

def send(method, params):
    return coord.dispatch({
        "jsonrpc": "2.0", "id": method,
        "method": method, "params": params,
    })

send("workspace.create", {
    "workspace": "wsp_pr_reviews",
    "profiles":  ["core/1.0", "review/1.0"],
})

send("participant.join", {
    "workspace": "wsp_pr_reviews",
    "from":      "human:me@local",
    "type":      "human",
})

send("participant.join", {
    "workspace": "wsp_pr_reviews",
    "from":      "agent:cursor#v1",
    "type":      "agent",
})

2. Бот готовит черновик, вы вносите оверрайд. Настройте вашу существующую интеграцию с Cursor так, чтобы она выпускала конверты:

TypeScriptPython
// The bot's review is the output of a task.
const { task_id } = coord.api.task.create({
  workspace: "wsp_pr_reviews",
  from:      "agent:cursor#v1",
  assignee:  "agent:cursor#v1",
  kind:      "code_review",
  input:     { pr_id: "PR-482" },
});

coord.api.task.complete({
  workspace: "wsp_pr_reviews",
  from:      "agent:cursor#v1",
  task_id,
  output:    cursorReview,
});

coord.api.review.request({
  workspace: "wsp_pr_reviews",
  from:      "agent:cursor#v1",
  task_id,
  artefact:  cursorReview,
  to:        "human:me@local",
});

// You disagree with one comment. Override it.
coord.api.decide.override({
  workspace:        "wsp_pr_reviews",
  from:             "human:me@local",
  task_id,
  intent_preserved: true,
  diff: [{ op: "replace",
           path: "/comments/0/severity",
           value: "info" }],
  rationale: "False positive. Framework " +
             "convention, not a bug.",
  tags: ["false-positive",
         "framework-pattern-misread"],
});
# The bot's review is the output of a task.
r = send("task.create", {
    "workspace": "wsp_pr_reviews",
    "from":      "agent:cursor#v1",
    "assignee":  "agent:cursor#v1",
    "kind":      "code_review",
    "input":     {"pr_id": "PR-482"},
})
task_id = r["result"]["task_id"]

send("task.complete", {
    "workspace": "wsp_pr_reviews",
    "from":      "agent:cursor#v1",
    "task_id":   task_id,
    "output":    cursor_review,
})

send("review.request", {
    "workspace": "wsp_pr_reviews",
    "from":      "agent:cursor#v1",
    "task_id":   task_id,
    "artefact":  cursor_review,
    "to":        "human:me@local",
})

# You disagree with one comment. Override it.
send("decide.override", {
    "workspace":        "wsp_pr_reviews",
    "from":             "human:me@local",
    "task_id":          task_id,
    "intent_preserved": True,
    "diff": [{"op":    "replace",
              "path":  "/comments/0/severity",
              "value": "info"}],
    "rationale": "False positive. Framework "
                 "convention, not a bug.",
    "tags": ["false-positive",
             "framework-pattern-misread"],
})

О поверхностях интерфейса. В TypeScript поставляется типизированный фасад (coord.api.*), поэтому каждый метод получает полное автодополнение и проверку на этапе компиляции. Python сохраняет структуру конверта JSON-RPC на поверхности (coord.dispatch({...})), а потребители оборачивают её как удобно для места вызова; вспомогательная функция send() — это идиома, которую используют тесты на Python. Оба пути генерируют идентичные байты в сети; цепочка аудита побайтово одинакова независимо от того, какой клиент сделал вызов.

3. Через два месяца проанализируйте, что вы делали. В эталонном репозитории есть аналитический скрипт на обоих языках, который читает цепочку аудита (по HTTP или напрямую из вашего файла SQLite) и группирует переопределения:

# TypeScript reference, against the SqliteStore from step 1:
$ npm --prefix reference/core-plus-review run analyze -- --db ./chap.db wsp_pr_reviews

# Python reference, same idea:
$ python3 reference/python/analyze_overrides.py --db ./chap.db wsp_pr_reviews

Override Learning Report
========================
Total overrides: 47

By tag:
  false-positive             ████████████████  31  (66%)
  framework-pattern-misread  ███████████       22  (47%)
  cosmetic-pref              ████              8   (17%)

Top file paths:
  src/handlers/                                    18 overrides
  src/components/                                  9  overrides

Ваша следующая редакция промпта для Cursor ссылается на шаблон по имени, вместо того чтобы гадать о нём.


Конверт переопределения, подробно

Если вы внимательно изучите одну структуру, пусть это будет конверт переопределения. У каждого поля есть своя задача:

Анатомия конверта decide.override, с аннотациями каждого поля: task_id связывает с цепочкой ревью, from несёт доступную для запроса идентичность, logical_id переживает ревизию, intent_preserved отделяет уточняющие переопределения от замещающих, diff — это RFC 6902 JSON Patch, rationale — это «зачем» в дополнение к «что», tags — структурированные данные супервизии.

Два поля, которые большинство людей упускают при первом чтении — это intent_preserved и tags.

intent_preserved отличает уточняющее переопределение (человек согласился с решением агента, но переписал то, как оно было выражено) от замещающего переопределения (человек пришёл к другому решению). Это два разных режима сбоя, и они требуют разных исправлений. Высокий коэффициент уточнений вокруг одного пункта политики означает, что извлечение данных агентом работает некорректно; высокий коэффициент замещений по тому же пункту означает, что сама политика неоднозначна или контекст задачи агента неверен.

tags — это контролируемый словарь, о котором договаривается ваша команда. Держите его небольшим. Всё, что вы туда поместите, станет измерением, по которому вы будете агрегировать данные через три месяца, когда будете отвечать на вопросы вроде какие промпты нуждаются в доработке? или какие пути бот стабильно проходит неверно?

Установка

TypeScript / Node:

npm install @brightbeamai/chap-coordinator

Python:

pip install chap-coordinator

Любой из путей даёт вам Core плюс профиль review/1.0 и запускаемый эталон. Эталон на TypeScript находится в reference/; эталон на Python — в reference/python/. Библиотека TypeScript располагается в packages/coordinator/; библиотека Python — в packages/coordinator-py/.

Пятиминутное практическое руководство: examples/00-five-minute-start.md.

Статус

CHAP 0.2 — это публичный черновик. Спецификация состоит из семи методов Core плюс одиннадцать необязательных профилей (SPECIFICATION.md), с двумя эталонными реализациями, TypeScript и Python, которые покрывают каждый профиль и проходят проверку на соответствие на одной и той же проводной линии JSON-RPC 2.0. Координатор может представлять себя как сервер MCP или агент A2A, а пять мостов для фреймворков ставят решения с участием человека LangGraph, Pydantic AI, AG2, LlamaIndex Workflows и Google ADK в цепочку аудита. Полная опись, структура репозитория и то, как CHAP соотносится с MCP и A2A, находятся в ABOUT.md.

Ломающие изменения следуют Семантическому Версионированию. Поверхности профилей меняются быстрее, чем Core, поэтому если вам нужна строгая стабильность, дождитесь версии 1.0.

Читайте далее

Начните с IN_PRACTICE.md: двенадцать сценариев — от разработчика-одиночки с Cursor до производства, регулируемого стандартами GMP; это самое полезное для дальнейшего чтения. ABOUT.md описывает содержимое репозитория, как CHAP соотносится с MCP и A2A, какие стандарты он переиспользует и как внести свой вклад. core/SPEC.md вмещает всю поверхность протокола на одном экране. А технический отчёт на arXiv обосновывает проектные решения: архитектуру, семантику профилей, модель угроз и двенадцать сценариев в виде JSON-трасс в проработанном приложении.

Цитирование

Если вы ссылаетесь на CHAP в академической или технической работе, пожалуйста, цитируйте технический отчёт:

@techreport{chap2026,
  author      = {Shahid, Arsalan and Suttie, Gordon and Black, Philip},
  title       = {Collaborative Human-Agent Protocol (CHAP): An open protocol for auditable, structured multi-human and multi-agent collaboration},
  institution = {Brightbeam AI},
  year        = {2026},
  type        = {Technical Report},
  number      = {arXiv:2606.09751},
  url         = {https://arxiv.org/abs/2606.09751}
}

CC-BY 4.0 (спецификация) · Apache 2.0 (код) · Без роялти, любой язык, любое развертывание.

Войдите, чтобы оставить комментарий