Generated protocol artifacts
Harn publishes downstream protocol artifacts under
spec/protocol-artifacts/. The directory is generated by:
make gen-protocol-artifacts
CI and make all verify drift with:
make check-protocol-artifacts
The generated contract includes:
manifest.json: protocol versions, schema provenance, ACP method names,sessionUpdatediscriminators, Harn extension fields, tool lifecycle metadata fields, A2A task states, MCP metadata vocabulary, and abindingsblock enumerating the published TypeScript, Swift, Python, and Go modules with their stability tier and (for Go) the canonical module path.schemas/*.schema.json: stable copies of the ACP, A2A, and MCP adapter profiles validated byharn test protocols. MCP publishes both the stable2025-11-25profile and the opt-inDRAFT-2026-v1RC profile so downstreams can prepare without changing runtime negotiation behavior.harn-protocol.ts: TypeScript bindings for JSON-RPC messages, ACPsession/update, Harn tool lifecycle metadata, A2A task events, and MCP tool/resource/prompt metadata.HarnProtocol.swift: SwiftCodabledefinitions for the same host-facing surface.python/harn_protocol.py: stdlib-only Python 3.9+ module withEnumclasses for every wire vocabulary, dataclasses for the JSON-RPC envelopes, ACP session updates, Harn tool lifecycle metadata, A2A task structures, and MCP tool/resource metadata, plusto_wire/from_wirehelpers that strip unset optional fields so envelopes stay byte-equivalent to the Rust adapter output. Field names match the wire JSON (camelCase).go/harnprotocol/: Go module (harnprotocolpackage) mirroring the same surface with typed string aliases andencoding/json-tagged structs. Thego.moddeclaresgithub.com/burin-labs/harn/spec/protocol-artifacts/go/harnprotocolas the canonical module path so consumers cango getdirectly from the repository.fixtures/round_trip.json: representative request/response/notification envelopes plus an A2A task and an MCP tool entry.make check-bindingsdecodes and re-encodes these through the Python and Go bindings on every CI run, catching wire-vocabulary drift before downstream consumers see it.
MCP RC helpers include DRAFT-2026-v1, the final scheduled
2026-07-28 identity, required request _meta keys, standard Streamable HTTP
headers (MCP-Protocol-Version, Mcp-Method, Mcp-Name), server/discover,
ttlMs/cacheScope cache hints, input_required results, the -32004
unsupported-version error, and the JSON Schema 2020-12 dialect URL. The RC
profile is data-only until the final spec lands; servers and clients should
opt in explicitly instead of assuming Harn's stable MCP runtime negotiates it.
Stability
The host-facing surface listed above is stable: existing wire values and
field names will not change without a Harn minor-version migration note plus a
regenerated artifact diff. Hosts can pin to the artifact directory for the
full surface or to the manifest.json bindings block when they only need to
detect generator/runtime mismatch.
VM internals (the AST, code-index, scanner schemas under
crates/harn-hostlib/schemas/** aside from the published wire profiles) are
not part of this surface. They evolve with the runtime and should be
consumed via the Rust crates rather than vendored as bindings.
Versioning
Artifacts follow the Harn crate version in manifest.json.
Additive changes are minor-version compatible:
- new
sessionUpdateor_harn/agentEventvalues; - new optional fields under
_meta.harn; - new
ToolKind,ToolCallStatus,ToolCallErrorCategory, A2A task state, or MCP metadata values that clients can ignore safely.
Breaking changes require a Harn minor-version migration note:
- removing or renaming a wire value;
- moving a field between canonical ACP locations and
_meta.harn; - changing a required field's type;
- tightening a schema so previously valid Harn adapter output is rejected.
Consumer migration
Hosts should consume the generated bindings or schema artifacts instead of
mirroring Harn protocol enums by hand. Burin consumers can replace local
ACPSessionUpdate, ACPToolKind, and ACPToolCallStatus mirrors with
spec/protocol-artifacts/harn-protocol.ts, and can use
spec/protocol-artifacts/HarnProtocol.swift as the Swift contract source for
ACP session updates and tool-call metadata. Python and Go integrators can
import spec/protocol-artifacts/python/harn_protocol.py (e.g. by vendoring
the file or pinning the artifact directory) and the
harnprotocol Go module under spec/protocol-artifacts/go/harnprotocol
respectively.
Cross-repo release jobs can run:
BURIN_CODE_ROOT=/path/to/burin-code make check-burin-protocol-artifacts
to fail when Burin Code's vendored Swift or TypeScript protocol bindings drift from the Harn source artifacts.
For ACP, clients should still follow the wire namespacing rules in
Bridge protocol: canonical ACP fields remain at the
session-update root, while Harn vendor fields live under _meta.harn.