Status: in force from 1.0. Pre-1.0 (0.x) wire shipped fast and broke surfaces freely (see README "Status & API stability"); this policy is the promise that replaces that freedom at 1.0.
1.0 freezes five surfaces (see ROAD_TO_1.0.md §1). This document says how any of
them may change after 1.0 — the contract is a deprecation window, never a
silent break:
- Identities & pairings — a DID/pairing that worked in 1.0 keeps working.
- On-disk state —
sessions/,trust.json,relay.json, pidfile schema. - The wire protocol — event kinds, the agent-card schema (
v3.x), the signing/canonicalization rules, the relay HTTP surface. - The operator/agent surface — CLI verbs,
--jsonoutput shapes, the MCP tool catalog (names + input schemas), the file-system contract. - Security posture honesty — the threat model matches the code.
wire is semver-ish from 1.0:
- MAJOR (
2.0) — may remove anything previously deprecated, and may make breaking on-disk/protocol changes (with a migration). A removal can only land in a MAJOR, and only after the deprecation window below. - MINOR (
1.x) — additive only. New CLI verbs, new--jsonfields (never removed/renamed ones), new MCP tools, new optional agent-card fields. Existing consumers keep working unchanged. This is where almost everything lands — thev3.xagent card is additive/forward-compatible by design, so the org/identity layer can grow across 1.x without a major. - PATCH (
1.0.x) — bug/security fixes only, no surface change.
To remove or break a frozen surface element (a CLI verb, a --json field, an
MCP tool or one of its params, an on-disk field):
- Announce in the release that first deprecates it: a
### DeprecatedCHANGELOG entry naming the element, the replacement, and the earliest version it may be removed. - Warn at runtime where feasible — a deprecated CLI verb/flag prints a
one-line stderr deprecation notice (not an error); a deprecated
--jsonfield stays present and gains a sibling*_deprecated: truemarker where it matters; a deprecated MCP tool keeps responding and its description is prefixedDEPRECATED:. - Wait at least one MINOR release and ≥ 90 days, whichever is longer, with the deprecation live. (Security-forced removals may compress this — see below — but must still announce + provide a migration.)
- Remove only in the next MAJOR, listing it under
### Removedwith the migration.
A consumer that pins a 1.x version and ignores deprecation warnings will still
work until they choose to move to 2.0.
These may change in a MINOR without a deprecation window, because 1.0 never promised them — they are documented as out-of-scope/experimental:
- Anything in
BACKLOG.mdmarked deferred (MLS group confidentiality, forward secrecy, multi-relay redundancy, file-share, registry). - Internal-only output behind a documented
--unstable/experimental flag. - Human-facing prose:
--helpwording, log lines, stderr phrasing (the machine surface —--json, exit codes — is frozen; the prose around it is not).
Note — org-SSO is supported, not windowless. The OIDC/SSO channel
(RFC-001 amendment §B–§E) is a supported 1.0 feature, not an exception above:
its wire-side contract (ORG_VERIFIED tier + org_attestation.via provenance +
the DNS-TXT floor) is frozen, and its IdP-integration config (JWKS, claims
mapping, tenant/issuer shape) changes only through the deprecation window —
the external-dependency churn is real, so the config is iterable, but never
silently.
- The MCP tool catalog (names + input-schema props + required) is golden-locked
by
mcp_catalog_schema_is_frozen(src/mcp.rstests) — a diff there fails CI and forces an explicit, reviewed surface change + this policy's window. --jsonshapes for the load-bearing builders are schema-locked in unit tests (e.g.send::delivery_json). Extending that lock to every--jsonsurface is ongoing 1.0-hardening work.- Doc/tool drift (PLUGIN.md vs
tool_defs()) is guarded byagent_docs_match_advertised_tools(#255).
- Security. A vulnerability may force a faster removal/break than the window allows. Even then: announce in the release, document the migration, and prefer a compatibility shim over a hard break where one exists.
- Pre-1.0 state. Nothing here applies retroactively to 0.x; the 0.x→1.0 step
may require a one-time
wire nuke+ re-pair (RFC-005/006), called out in the 1.0 release notes.