An open protocol, with an implementation to check it

MA2H defines how agents reach people and other agents: notifications, questions, tasks and the answers that must get back to the right session. Building it meant keeping the specification, wire formats and reference behavior in agreement as the protocol evolved.

  • 35 pull requests merged

    The public history connects protocol proposals to the reference implementation, checks and implementer guidance.

  • v0.6 specified and implemented

    A working reference gives other implementers behavior to inspect alongside the written contract.

  • 110 cases define what conformance requires

    Each case states how it is verified: schema validation, evidence from the implementing system or a prose audit.

  • Apache-2.0 specification and source

    The open license lets others inspect, use and build on the protocol and its implementation.

A contract across implementations

The work covers message envelopes, signed responses, cancellation, version negotiation, inbound directives, presence and delivery receipts. A change to one part must agree with the schema, client behavior and conformance material around it.

Used in a working product

OH HAI implements MA2H as a hub, inbox and agent-facing tools. Autonomy uses it to coordinate its own agents and reach the human operating them. The protocol remains open for other implementations.

The recorded work

The protocol’s public history contains 35 merged PRs, 36 issues and 87 published automated review submissions. Those reviews address 87 distinct PR revisions. The examples below connect specific concerns to changes in the contract, reference implementation and conformance checks.

  • 264 review reports raised concerns

    The examples trace concerns about signed answers, retries and delivery status to changes in the protocol and implementation.

  • 30 review reports marked P1

    The reviewer’s priority identifies the reports it considered most urgent. Repeated reports remain separate entries.

  • 87 reviews recorded against the code

    Review followed distinct PR revisions as the contract evolved, leaving a public record of what was challenged.

  • 141 finding threads received an author reply

    Readers can inspect the author’s response alongside the concern and the corresponding code.

Public repository snapshot · November 1, 2026

Work delivered over time

37 pull requests opened and 35 merged over the recorded project history.
The complete repository history, including implementation, documentation and releases. Lines stop at their last recorded event.

How the backlog changed

36 issues created, 23 closed as completed, 23 closed in total.
Closing an issue as unnecessary is different from completing it. The chart distinguishes the two and ends at the last recorded issue event.

What review put on the record

264 published finding reports grouped by the reviewer’s original priority.
Published reports, using the reviewer’s original P1/P2/P3 labels. Some reports revisit the same underlying defect; these totals are not presented as unique bugs or fixes.

What changed in the software

The signed decision also binds the answer

The detached signature protected response metadata but not the answer value an agent would act on. Changing hold to ship could leave verification successful.

v0.3 added a digest of the delivered response and state to the signed context. The receiver reconstructs it. Follow-up work added version negotiation and numeric canonicalization fixtures.

PR #8 records the hold-to-ship tamper failing specifically with signature mismatch, with an honest-payload control first. Current signing tests cover value, actor, comment, edited and state tampering. PRs #11 and #12 carry the negotiation and numeric interoperability follow-ups.

Keep retries available until directive work is complete

A human-to-agent leg needs durable delivery semantics, correct addressee binding and a way to retry work that was received but not durably completed. Committing deduplication before the work would lose that retry.

The v0.4 work added a mailbox and signed directives. Review changed directive handling to reserve the ID while work is in flight, then commit after durable processing or release it for retry. Receipt and presence primitives followed in a stacked PR.

The public discussion records commit fdb0f20 moving deduplication to a caller commit and 38ebdf8 adding reservation/release. Current tests name overlapping delivery, release-and-retry, restart before commit, addressee rejection and unsigned-field stripping. The reference remains in-memory; persistence across an actual Hub restart is a downstream obligation.

An accepted message is not a delivered message

Agents need to distinguish queue acceptance, reachability, delivery and failure; one undifferentiated success label can hide a lost message.

v0.5 introduced session-addressed envelopes, explicit queued/open acknowledgments, reachability snapshots, bounce/expiry semantics and three signed entry kinds. The work was split into spec, conformance, implementation and skills.

Issue #24 led to issues #25–#28, delivered by PRs #29/#31/#33/#35. PR #31 explicitly recorded 64 vector passes and 19 skips before sibling wiring; skipped obligations were not claimed as proof. Current conformance inventory is 79 schema vectors, 29 downstream-proof vectors and two prose audits.

One shared client contract instead of drifting copies

Two real consumers had duplicated version selection, wire validation and error interpretation. Each copy could diverge from the protocol.

PR #51 extracted shared keyed and keyless client layers, made feature-to-minimum-version rules and error classification explicit, and preserved existing exports.

The PR records all 290 pre-existing tests passing with no edits to those test files, 310 total with new coverage, and unchanged signed bytes pinned by fixtures. The public export paths and shared modules remain in current main. Those are change-specific historical checks, not today’s full-suite result.

Refuse impossible questions before they reach a person

The old ask contract admitted input schemas no object answer could satisfy, duplicate option values and underspecified edit permission. The first v0.6 implementation then stripped the old-version edit field, which could corrupt retry identity.

v0.6 made answerability and option uniqueness explicit. A follow-up moved version gating to the point where the permission is used and retained the original envelope unchanged.

PR #66 records the real implementation mistake, a new regression that the old-version allow_edit field survives storage, and 349 tests passing at that change. Current ask-contract tests verify both verbatim storage and refusal of off-menu answers for version 0.5. The v0.6 correction does not add another messaging leg.

The specification carries the accumulated decisions

The repository retains 6 versioned specifications. The reference implementation and conformance vectors make those decisions available to the next implementer, alongside the original proposal and review discussions.

The current tree contains 19 test source files and 110 conformance-vector files: 79 schema-validation vectors, 29 downstream-proof obligations and 2 prose audits. Some properties can be checked against a schema; others need proof from the system implementing the protocol.

The changes also reach the instructions used by implementers. The v0.5 work updated the protocol skills, and the v0.6 correction carried its rule about version checks into the specification, reference code, regression test and implementer skill.

  • 79 message format checks

    These vectors test whether messages satisfy the protocol schema, giving implementers repeatable checks of the wire format.

  • 29 obligations for implementers to prove

    These cases identify behavior a schema alone cannot establish; the implementing system must supply the evidence.

  • 2 requirements checked through an audit

    These vectors identify written requirements for review, keeping them distinct from executable schema checks.

Sources and method

MA2H is stewarded by Autonomy and implemented by OH HAI. This study follows the protocol repository: proposals, contracts, reference code and the review discussions connecting them.

The public source, review history and data below let readers inspect both the resulting protocol and how individual changes were challenged.

Counting rules and coverage
  • Repository totals include all authors, documentation, releases and maintenance. They are not a count of independently verified Descant runs.
  • A published finding is a root inline review comment carrying the reviewer’s priority. Repeated reports remain separate. Replies, resolved threads and outdated lines are not treated as proof that a defect was fixed.
  • Issue charts use creation dates and the final close date of currently closed issues. They do not reconstruct every reopen event. Each series ends at its own last event.
  • PR charts use creation and merge dates, not run durations. Neither open PRs nor merged PR counts establish simultaneous agent execution.
  • Test inventories describe files present in the pinned source tree. Historical test results are identified as reported results; this census did not rerun the entire product test suite.

Start with an issue worth solving

Give Descant a real piece of work. Inspect the code, review the result and see what delivering it cost.