A2A Versioning And Backward Compatibility: How Pacts Survive Protocol Upgrades
Protocol upgrades should not invalidate existing pacts. The versioning policy: semver of A2A, backward-compatible contracts, migration windows. The matrix.
Continue the reading path
Topic hub
Behavioral ContractsThis page is routed through Armalo's metadata-defined behavioral contracts hub rather than a loose category bucket.
Turn this trust model into a scored agent.
Start with a 14-day Pro trial, register a starter agent, and get a measurable score before you wire a production endpoint.
TL;DR
Protocols evolve. Pacts persist. The challenge is reconciling the two: a pact written under A2A protocol version 1.2 has to keep working when the network upgrades to 1.3 and 1.4 and eventually 2.0. The reconciliation is not automatic. It requires a versioning policy that distinguishes additive from breaking changes, migration windows that give counterparties time to adapt, and an explicit compatibility matrix so callers can know without ambiguity which versions of which features work with which versions of which counterparties. This post lays out the policy, the matrix, and the operational practices that keep pacts honored across protocol upgrades.
The Failure Mode That Forces The Policy
A payments agent and an escrow agent have been operating together under a pact since the network's protocol version 1.4. The pact specifies a sequence of capability calls that move funds through several confirmation steps. The network announces protocol version 1.5, which adds a required field to one of the capability calls in the pact. The escrow agent upgrades to 1.5 immediately. The payments agent is on a slower upgrade cadence and is still on 1.4. The next call from the payments agent to the escrow agent fails because the new required field is missing. The pact is being honored on both sides, but the protocol upgrade has broken the integration.
The operators of both agents now face an unpleasant set of choices. The escrow operator can roll back to 1.4 (giving up the benefits of the upgrade). The payments operator can upgrade immediately (rushing a deployment they had planned for next quarter). They can leave the integration broken until the payments operator catches up (losing revenue and probably triggering disputes). Or they can negotiate a special-case pact amendment that lets the payments agent send the call without the new required field, with the escrow agent filling in a default (which works but creates a per-counterparty exception that the operations team has to track).
This incident is what happens when a protocol upgrade is not designed with backward compatibility as a first-class requirement. The upgrade was treated as a feature addition; the consequences for existing pacts were treated as the operators' problem to solve. The result is an integration that breaks every time the protocol moves, an operations burden that scales with the number of integrations, and an erosion of trust between counterparties because each upgrade becomes an opportunity for things to go wrong.
The alternative is to treat protocol versioning as a contract: every upgrade is either additive (and old code keeps working) or it is breaking (and there is a defined migration window with explicit deprecation), with no third option. The contract is published as part of the protocol governance and enforced by the network's verification layer. Counterparties know what to expect from each upgrade and can plan accordingly.
The policy below makes the contract concrete. It defines the version semantics, the categorization of changes, the migration windows for breaking changes, and the matrix that operators consult when they need to know whether two specific versions of two specific agents can work together. The policy is not free; it imposes constraints on protocol evolution. The constraints are the price of stable infrastructure.
Semantic Versioning For A2A Protocols
The A2A protocol uses semantic versioning with the following discipline. The discipline is stricter than how many software libraries practice semver, because A2A protocols cannot afford the looseness that libraries can.
Major Version (X.0.0) Major versions introduce breaking changes: required field additions, semantics changes to existing fields, removal of capabilities, changes to canonicalization, changes to signature schemes. Major versions are rare (roughly one per year is the upper bound for a healthy protocol) and are accompanied by a long migration window (typically 12 months) during which both major versions are supported. A counterparty on the old major version can interoperate with a counterparty on the new major version through a translation shim provided by the protocol operators; the shim is part of the migration support.
Minor Version (1.X.0) Minor versions introduce additive changes: new optional fields, new capabilities, new error codes, new metadata. Minor versions never break old code. A counterparty on minor version 1.4 can call a counterparty on minor version 1.7 without any change; the minor version difference is invisible at the protocol level. Counterparties advertise their highest supported minor version as part of their catalog entry; callers can use this to take advantage of newer capabilities when both sides support them, without depending on the new capabilities for basic interoperability.
Patch Version (1.4.X) Patch versions are clarifications, bug fixes, or security patches that do not change the protocol's behavior in any way that affects compliant implementations. A patch is essentially invisible to callers; the protocol operators may push patches without coordination with implementers, and implementers can pick them up at their convenience. Patches that turn out to have observable effects are escalated to minor versions.
The distinction between minor and major is the load-bearing one. The temptation, in any protocol's evolution, is to call a breaking change a minor change because that lets it ship faster. The A2A discipline is to resist this temptation: anything that breaks an old call is major, full stop, with the migration window and the operational burden that implies. The operators who maintain the protocol have to absorb the cost of this discipline; they would much rather ship a breaking change as a minor and let downstream operators deal with the breakage. The discipline only holds if the governance is strong enough to enforce it.
The discipline also applies to deprecation. A capability that is being deprecated cannot just disappear in a minor version; it has to be marked as deprecated in a minor version, then removed in a subsequent major version after the migration window. The deprecation gives operators advance notice and time to migrate; the removal is the breaking change that justifies the major version bump.
Versions are immutable once published. A protocol version 1.4.0 means a specific set of fields, capabilities, semantics, and canonicalization rules; once published, it cannot be retroactively changed. Bug fixes that change behavior become 1.4.1 or 1.5.0 depending on whether they affect compliant implementations; they do not republish 1.4.0. The immutability is what makes audit trails meaningful: a record that says it was produced under 1.4.0 is referencing a specific, never-changed protocol definition.
What Counts As Breaking, What Counts As Additive
The semver discipline above depends on a clear classification of changes. Operators need to know without ambiguity whether a proposed change is breaking or additive, because the answer determines the version bump and the migration plan.
Always Breaking
- Adding a required field to an existing message.
- Removing a field from an existing message that was previously required or that consumers might have relied on.
- Changing the type of an existing field (e.g., string to integer).
- Tightening validation on an existing field (e.g., narrowing the allowed range).
- Changing the canonicalization algorithm.
- Changing the signature scheme or key types.
- Changing the meaning of an existing capability so that the same call produces different results.
- Removing or renaming an existing capability.
- Changing required ordering of multi-step interactions.
Always Additive
- Adding a new capability that is opt-in.
- Adding a new optional field to an existing message that defaults to a sensible value when omitted.
- Adding a new error code that is only returned in conditions that the old version did not handle.
- Adding new metadata fields to audit records.
- Adding new fields to catalog entries.
- Loosening validation on an existing field (e.g., expanding the allowed range).
Sometimes One, Sometimes The Other Some changes look additive but are breaking depending on how implementations rely on the old behavior. Adding a new error code that an old implementation does not handle gracefully (treating it as an unknown error and crashing) is functionally breaking even though the addition is technically additive. Adding a new field that old implementations might pass through unchanged in audit records can be functionally breaking if the new field affects the canonicalization. The A2A policy resolves these by erring on the side of treating ambiguous cases as breaking, with the explicit reasoning recorded in the version notes.
The boundary cases are also where the operators' judgment is most exercised. A protocol governance process should include a review committee that classifies proposed changes against the rubric and publishes the classification before the version is committed. The classification can be challenged; if a change is classified as additive but a review surfaces that some compliant implementation will break, the classification is corrected and the version bump escalated.
The rubric is not abstract. It is what protects operators from the worst version-management failure mode: a change shipped as additive that turns out to be breaking, with no migration window, and with downstream operators discovering the breakage in production. Every protocol that has had this failure has paid for it in trust erosion and integration breakage. The rubric is the discipline that prevents the failure.
Migration Windows And Their Discipline
When a major version is published, the protocol enters a migration window: a defined period during which both the old and new major versions are operational, both are supported, and counterparties can interoperate across the version boundary through translation shims.
The migration window has a published start date (when the new major version becomes available) and a published end date (when the old major version is no longer supported). Operators have the entire window to plan and execute their upgrade; they can do it on day one, day three hundred sixty-four, or any time in between. The window length depends on the scope of the breaking changes; larger breakages need longer windows. The convention is 12 months for typical major versions and up to 24 months for major versions that affect security primitives (signature schemes, canonicalization).
During the window, the protocol operators provide translation infrastructure. The translation shim accepts calls in the old version's format and forwards them to recipients on the new version (translating fields where translation is well-defined, raising explicit errors where translation is not possible). Symmetric translation lets new-version callers reach old-version recipients. The shim is operated as part of the network's protocol infrastructure, paid for by the protocol governance, and not metered separately to the operators using it.
The shim is not always able to translate cleanly. Some breaking changes are breaking precisely because the new behavior cannot be expressed in the old format, or vice versa. The shim handles these by failing the call with a clear error: this call cannot be translated between versions X and Y because of specific reason Z. The caller can then either retry with a version-compatible alternative counterparty or wait until the recipient upgrades.
The migration window also includes an upgrade tracking system. The protocol operators publish, at intervals during the window, the percentage of active counterparties that have completed the upgrade. The tracking lets operators see whether they are leading or lagging the network and gives the protocol operators visibility into when the cutoff is realistic. If the upgrade rate is too slow, the cutoff date can be extended; if it is fast and most counterparties have moved, the cutoff can be brought forward.
The discipline that keeps migration windows healthy is the protocol operator's commitment to honor the published cutoff. If the cutoff is announced as 12 months, it is 12 months. Slipping the cutoff repeatedly trains operators to ignore announced dates, which defeats the planning value of the cutoff. Slipping early in a window because the change turned out to be more disruptive than expected is acceptable; slipping repeatedly because operators procrastinate is not.
The ending of a migration window is itself an event. On the cutoff date, the old version is retired: the translation shim no longer accepts old-version calls, agents on the old version cease to participate, and any pacts that referenced the old version need to be amended or terminated. Operators that have not upgraded by the cutoff face an integration outage. The catalog flags non-upgraded agents as deprecated several months in advance and as offline after the cutoff.
The A2A Upgrade Compatibility Matrix
Here is the named artifact, the A2A Upgrade Compatibility Matrix. The matrix describes which versions of which features can interact with which other versions, so operators planning upgrades or integrations can consult it without having to read protocol changelogs.
The matrix has three axes: protocol version (the major.minor version of A2A), feature (the named capability or field group), and counterparty version (the major.minor version of the protocol the counterparty implements). Each cell of the matrix indicates whether the feature works in the (caller, counterparty) version combination, with options including: works directly, works through translation shim, works with downgrade (the feature is exercised in its older form), does not work.
The matrix is not a single table; it is a set of feature-specific tables that share the version axes. Each feature has a small table showing its compatibility across version combinations. The catalog can present the matrix interactively: a consumer browsing for a counterparty can see, for each candidate, which features they can use with their own current version.
The matrix is computed automatically from the version notes and the translation shim's capabilities. Each protocol version's release notes include a structured changelog that lists added features, deprecated features, removed features, and translation rules. The matrix consumes the changelogs and produces the compatibility view. This automation is important because manual matrix maintenance is error-prone and falls behind quickly.
The matrix also surfaces the operational implications of each cell. A combination that works through the translation shim has slightly higher latency and may have subtle semantic differences; the matrix flags these so callers know to test their integration before relying on it. A combination that works with downgrade gives up some functionality; the matrix flags what is lost so callers can decide whether the downgrade is acceptable.
For planning purposes, the matrix supports a what-if mode: an operator considering an upgrade can see how their compatibility footprint changes with the new version. Some counterparties become reachable directly that were previously through the shim; some new features become accessible. The what-if view turns the upgrade decision into a concrete tradeoff rather than a leap of faith.
The matrix is the operational artifact that makes the versioning policy work in practice. Without it, operators have to read changelogs and make decisions in the abstract. With it, the decisions are concrete: I am on 1.5, the counterparty is on 1.7, this feature combination works through the shim with these implications. Operators that can answer this question quickly are operators that can plan upgrades intelligently.
Pacts That Reference Specific Protocol Versions
A pact is a contract between agents about behavior. The pact necessarily references the protocol version under which it was negotiated, because the protocol defines the meaning of the capabilities and fields the pact talks about. Versioning the pact in lockstep with the protocol is what makes pacts portable across upgrades.
The convention is for each pact to declare a protocolVersionMin and a protocolVersionMax. The min is the lowest version under which the pact's terms are coherent (calls older than this would not have the fields the pact requires). The max is the highest version under which the terms are still coherent (calls newer than this might use semantics the pact did not anticipate). Most pacts have a min and an unbounded max, with the unbounded max meaning the pact is forward-compatible until otherwise marked.
When the protocol version exceeds the pact's max, the pact is auto-marked as needing renegotiation. The agents involved are notified that the pact has aged out and that they should either renegotiate under the current protocol or terminate the pact. The auto-marking does not invalidate the pact for in-flight calls; it just stops new calls from being initiated under the aged-out terms.
When a pact is renegotiated for a new protocol version, the new pact carries a reference to the prior version (the prior pact's content hash). The reference creates a continuity chain: the audit trail can trace a long-running counterparty relationship through multiple pact renegotiations across multiple protocol upgrades. The continuity is useful for trust signal computation (the relationship's longevity is meaningful even when the specific pact has changed) and for dispute resolution (a dispute over a current pact may need to consult the prior pact to understand the history).
The renegotiation also handles the case where the new protocol version has features that the parties want to take advantage of. A pact under 1.4 may not have used a capability that became available in 1.6; the renegotiation under 1.6 can include the new capability. This is how protocol features percolate through the network: not by being mandated, but by being adopted in successive pact renegotiations.
Pact renegotiation is not free. Both parties have to agree to the new terms, both have to sign, both have to deploy any internal changes the new pact requires. The cost is similar to the original negotiation. To minimize the cost across many pacts, agents often maintain a few pact templates that they renegotiate in batches when a major protocol version arrives; the templates evolve once and the renegotiations propagate the evolution to many counterparty relationships.
The pact-versioning discipline is what makes the protocol-versioning discipline operational. Without pact versioning, every protocol upgrade either invalidates all pacts (catastrophic) or leaves them ambiguous (worse). With pact versioning, the protocol can evolve, the pacts can age in place, and the renegotiation cycle is bounded and predictable.
Capability Versioning Within A Protocol Version
Protocol versions are not the only things that have versions. Individual capabilities also evolve, and capability versioning is a finer-grained mechanism that handles changes that do not warrant a protocol-level version bump.
A capability has a name and a version: verify-customs-docs-eu-uk@2. The version increments when the capability's input schema, output schema, or semantics change in a way that callers need to be aware of. Multiple versions of the same capability can coexist; an agent can offer verify-customs-docs-eu-uk@1 and verify-customs-docs-eu-uk@2 simultaneously, with each version serving callers that have been written against that specific version.
The capability version is independent of the protocol version. A capability can evolve through multiple versions within a single protocol version; a capability can stay at version 1 across multiple protocol versions. The independence is intentional: capability evolution is driven by domain needs (the customs verification rules changed, so the capability evolves to handle the new rules), while protocol evolution is driven by infrastructure needs (the canonicalization is being upgraded, so the protocol evolves to handle the new canonicalization).
The capability versioning has its own deprecation semantics. A capability version that is being deprecated is marked deprecated in the catalog; callers that use it see a deprecation warning. After a defined deprecation window (typically 6 months at the capability level, which is shorter than the protocol-level migration window because the scope is narrower), the deprecated version is removed and callers must use a current version.
The capability version interacts with the pact: a pact references specific capability versions, and the pact's renegotiation cycle includes the capability versions. When a capability version is deprecated, pacts that reference it are flagged for renegotiation against the current version. The flagging gives operators advance notice without forcing immediate action.
Capability versioning is also where most evolution actually happens. Protocol version bumps are rare events; capability version bumps are common. The protocol provides the framework; the capabilities live inside the framework and evolve at their own cadence. Operators that focus on protocol versioning miss most of the evolution; operators that track capability versioning see the actual movement of the network's domain expertise.
Counter-Argument: Just Pin Everything
The most common counter-argument to the versioning discipline is that it is too much overhead and that the simpler alternative is to pin: every pact specifies exact versions, every counterparty stays on the version their pacts expect, and there is no migration drama because nothing moves.
This argument is the version-management equivalent of refusing to update software because updates are scary. It works in the short term and fails over the long term. The protocol evolves whether or not the operators want it to: security patches are mandatory, deprecated capabilities are eventually removed, the underlying infrastructure changes over time. An operator who pins indefinitely accumulates technical debt that becomes a wall when forced upgrades arrive.
The other failure mode of pinning is fragmentation. If every pact pins to a specific version, the network ends up with many small islands of agents on different versions, none of them able to interoperate easily. The catalog becomes much less useful because callers have to filter by version compatibility before they can use any other criterion. The translation shim becomes essential infrastructure but is bypassed by the pinning, since pinned pacts do not allow translation.
The right alternative to pinning is the discipline this post describes: bound versions sensibly, use migration windows, expect renegotiation cycles. The alternative absorbs the same total cost as pinning (you have to upgrade eventually) but distributes the cost over time and across operators in predictable, manageable chunks. The pin-everything strategy concentrates the cost into rare, high-stakes upgrade events that are themselves where the disasters happen.
The argument has merit in one specific case: very long-lived contracts where the parties truly do not want any evolution to affect the integration. For this case, the pact can declare a fixed protocolVersionMax and accept that renegotiation will be needed when the protocol moves past that version. This is pinning with eyes open, which is acceptable. It is not acceptable as a default for every pact.
What Armalo Does
Armalo's protocol governance follows the discipline above. The A2A protocol uses semantic versioning with the strict major-minor-patch distinction, with a 12-month migration window for major versions and explicit translation shims operated as network infrastructure. Pact templates are versioned alongside the protocol and the pact templates carry protocolVersionMin and protocolVersionMax fields.
The trust oracle (/api/v1/trust/) and the catalog both expose protocol version metadata for each agent. Callers can filter for counterparties on a specific version range and the catalog surfaces the compatibility matrix automatically based on the network's published version notes.
The multi-LLM jury that contributes to the composite score handles version differences gracefully: judgments are made against the protocol version under which the call was made, so a call that was correct under version 1.4 is not retroactively penalized for not meeting the standards of version 1.6. The 20 percent trim of outlier judgments still applies, and the trimming includes any judgments that confused versions.
For pact renegotiation, Armalo provides tooling that surfaces the pacts in an operator's portfolio that need renegotiation as protocol versions evolve. The tooling shows the current pact, the protocol version it references, the deprecation window, and the suggested renegotiation timeline.
The audit log includes the protocol version under which each call was made, so forensic reconstruction of historical calls uses the correct semantics regardless of how the protocol has evolved since.
FAQ
Q: How long is a typical migration window for major versions? 12 months for typical major versions. 24 months for major versions that affect security primitives. The protocol operators publish the window length when the major version is announced.
Q: Can a counterparty be on multiple protocol versions simultaneously? Yes, during a migration window. After the window closes, the counterparty must be on the current major version.
Q: What happens to in-flight calls when a migration window closes? They are completed under the version they started on. The cutoff applies to new calls, not to calls already in progress.
Q: How do I know which protocol version a counterparty is on? From the catalog entry. Each entry includes the counterparty's current protocol version and the highest minor version it supports.
Q: What is the cost of operating the translation shim? Low latency overhead (typically under 10ms per call) and a per-call infrastructure cost paid by the protocol operators, not by the calling parties. Operators using the shim do not see incremental billing for the translation.
Q: Can I propose a protocol change? Yes, through the protocol governance process. Proposals are reviewed against the breaking-versus-additive rubric and either committed to a future version or rejected with reasoning.
Q: What if a translation shim cannot translate cleanly? The call fails with a clear error indicating which version combination is incompatible and why. The caller can either choose a version-compatible counterparty or wait for the recipient to upgrade.
Q: How do capabilities evolve between protocol versions? Capabilities have their own version numbers that are independent of the protocol version. Capability evolution is more frequent than protocol evolution and follows its own deprecation cycle.
Bottom Line
Versioning is the practice that lets infrastructure stay stable while it evolves. The A2A versioning policy is strict about the boundary between additive and breaking changes, generous about migration windows, and clear about the operational implications of each version transition. The compatibility matrix is the artifact that turns the policy from doctrine into daily operations. Pacts that reference specific protocol versions and that follow a renegotiation cycle stay honored across protocol upgrades without surprises. The discipline is more work upfront than ad hoc versioning; the discipline pays back the first time a major version arrives and operators can plan their upgrades against a published window instead of scrambling. Stable infrastructure is built; it does not happen on its own.
The Trust Score Readiness Checklist
A 30-point checklist for getting an agent from prototype to a defensible trust score. No fluff.
- 12-dimension scoring readiness — what you need before evals run
- Common reasons agents score under 70 (and how to fix them)
- A reusable pact template you can fork
- Pre-launch audit sheet you can hand to your security team
Turn this trust model into a scored agent.
Start with a 14-day Pro trial, register a starter agent, and get a measurable score before you wire a production endpoint.
Put the trust layer to work
Explore the docs, register an agent, or start shaping a pact that turns these trust ideas into production evidence.
Comments
Loading comments…