# Changelog
All notable changes to `macp-runtime` are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/); versions follow the shared
workspace version in the root `Cargo.toml`.
## [Unreleased]
## [0.7.4](https://github.com/multiagentcoordinationprotocol/macp-runtime/compare/macp-runtime-v0.7.3...macp-runtime-v0.7.4) - 2026-09-06
### Fixed
- *(dependabot)* remove versioning-strategy, invalid for cargo ([#151](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/151))
- *(ci)* stop dependabot shipping a Cargo.lock the manifest forbids ([#150](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/150))
### Other
- record the two-lockfile rule and the release-PR approval trap ([#157](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/157))
- guard integration_tests/Cargo.lock against its manifest ([#156](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/156))
- *(deps)* bump the actions group across 1 directory with 3 updates ([#154](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/154))
- *(release-plz)* sync integration_tests/Cargo.lock on the release PR ([#155](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/155))
- *(deps)* bump serde in the minor-and-patch group ([#152](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/152))
## [0.7.3](https://github.com/multiagentcoordinationprotocol/macp-runtime/compare/macp-runtime-v0.7.2...macp-runtime-v0.7.3) - 2026-09-01
### Other
- run the workspace's tests, not just the root package's ([#141](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/141))
## [0.7.2](https://github.com/multiagentcoordinationprotocol/macp-runtime/compare/macp-runtime-v0.7.1...macp-runtime-v0.7.2) - 2026-09-01
### Fixed
- *(server)* reject Progress envelopes with exactly one of session_id/mode empty ([#137](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/137))
### Other
- *(deps)* bump criterion in the major-updates group ([#129](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/129))
- *(deps)* bump tonic-health in the minor-and-patch group ([#128](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/128))
- *(deps)* bump the actions group with 3 updates ([#130](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/130))
- *(conformance)* vendor spec PR #89's fixtures, fix TaskUpdate harness gap ([#135](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/135))
- *(deps)* bump rust in the docker group ([#127](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/127))
## [0.7.1](https://github.com/multiagentcoordinationprotocol/macp-runtime/compare/macp-runtime-v0.7.0...macp-runtime-v0.7.1) - 2026-08-31
### Other
- *(changelog)* record the 0.7.0 release ([#122](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/122))
## [0.7.0](https://github.com/multiagentcoordinationprotocol/macp-runtime/compare/macp-runtime-v0.6.0...macp-runtime-v0.7.0) - 2026-08-31
### Added
- paginate ListSessions (page_size, opaque page_token, next_page_token) ([#116](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/116))
- implement RFC-MACP-0013 canonical commitment hash and tighten the §7.3.1 supersedes check ([#108](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/108))
### Fixed
- *(ci)* call publish.yml from release-plz instead of relying on the tag trigger ([#119](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/119))
- remove the stray .drive.lock committed in #117 ([#118](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/118))
### Other
- *(release)* bump the workspace to 0.7.0 ([#121](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/121))
- *(deps)* bump macp-proto to 0.1.9 ([#120](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/120))
- re-export macp-core, clear RUSTSEC advisories, audit the second lockfile ([#117](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/117))
- close the one-way gap in the conformance-oracle drift guard ([#115](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/115))
- *(deps)* bump the minor-and-patch group across 1 directory with 16 updates ([#113](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/113))
- *(deps)* bump the actions group across 1 directory with 11 updates ([#112](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/112))
- *(deps)* bump the major-updates group across 1 directory with 5 updates ([#110](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/110))
- release v0.6.1 ([#100](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/100))
- split release into release-plz (version+git) and publish.yml (crates.io) ([#99](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/99))
## [0.6.1](https://github.com/multiagentcoordinationprotocol/macp-runtime/compare/macp-runtime-v0.6.0...macp-runtime-v0.6.1) - 2026-07-11
### Other
- split release into release-plz (version+git) and publish.yml (crates.io) ([#99](https://github.com/multiagentcoordinationprotocol/macp-runtime/pull/99))
_Nothing yet._
## [0.6.0] — 2026-07-10
Maintenance release; realigns the runtime with the SDK version line (the
TypeScript SDK advanced to 0.6.0). No changes to the wire protocol, gRPC
surface, or mode semantics — a `Send`/`StreamSession` client built against
0.5.0 interoperates unchanged.
### Added
- Negative-outcome conformance fixtures for the proposal, task, handoff, and
quorum modes (`task.failed`, `proposal.rejected`, `handoff.declined`,
`quorum.rejected`), exercising the `TaskFail`, quorum `Reject`/`Abstain`, and
`HandoffDecline` message types end-to-end.
### Changed
- Releases are now automated with release-plz; all seven crates are pinned to a
single lockstep version via `version_group`, enforced by a CI guard.
### Fixed
- Green the new CI gates (otel build, rustdoc, coverage) and de-flake the test
harness; corrected the release tooling's handling of the tracked `plans/`
docs.
## [0.5.0] — 2026-07-05
### Security
- **Dev-mode auth is now opt-in**: with no authentication configured
(`MACP_AUTH_TOKENS_*` / `MACP_AUTH_ISSUER` unset) the runtime refuses to
start unless `MACP_ALLOW_INSECURE=1`. Previously it silently ran an
any-bearer-token-is-admin fallback. The published Docker image no longer
bakes in `MACP_ALLOW_INSECURE=1`; pass it explicitly for local development.
- **HS256 removed from the default JWT algorithm allowlist** (now
RS256/ES256). Shared-secret deployments must opt in via
`MACP_AUTH_JWT_ALGS=HS256`.
- `WatchSignals` now requires authentication.
- Handoff implicit-accept timeouts are measured against the runtime's
acceptance clock on new sessions — a forged (post-dated) envelope timestamp
can no longer finalize an offer the target never accepted. Existing session
histories keep their original semantics on replay.
- JWKS fetches have connect/total timeouts, a stale-cache grace window
(endpoint outages no longer disable all JWT auth at TTL expiry), and
`kid`-based key selection.
### Fixed
- Passive-subscribe sequence contract (RFC-MACP-0006 §3.2): `after_sequence`
is now the 1-based accepted-envelope ordinal, exclusive (`0` = from start).
Previously it was compared inclusively against a raw log index that shifted
with internal entries. Envelopes accepted during the subscribe window are
no longer delivered twice; ordinals stay stable across log compaction and
restart, and resuming below a compacted range returns `FAILED_PRECONDITION`
instead of silently skipping history.
- `WatchSignals`/`WatchSessions` surface consumer lag as `RESOURCE_EXHAUSTED`
instead of silently closing; `WatchSessions` no longer duplicates `Created`
events for sessions present in the initial sync.
- RocksDB log appends are fsynced before acknowledgement (acked implies
durable, matching the file backend); Redis `replace_log` is atomic; a
corrupt log entry no longer fails a whole session load on RocksDB/Redis
(skip + warn, matching the file backend); file snapshot writes fsync before
rename.
- Quorum policy evaluation conforms to RFC-MACP-0012 §4.2: `threshold` is an
approval-count bar (as the mode reads it), no longer reinterpreted as a
participation quorum. Legitimate negative (decline) commitments are no
longer denied by outcome-blind checks in Quorum/Task/Proposal policy rules.
- A commitment with empty `policy_version` matches the session's bound policy
(clients that started with an empty policy_version no longer have to echo
`policy.default`).
- Extension-mode hardening: `PromoteMode` can no longer re-key a mode into
the reserved `macp.mode.*` namespace; descriptors must declare `Commitment`
as a terminal type; an ext session started without `mode_version` binds the
registered descriptor's version (commitments no longer match `""`
vacuously).
- 36-character base64url session IDs containing `-` are accepted (previously
mis-routed to UUID validation and rejected).
- Rate-limiter stale-sender cleanup is amortized (full sweep every 128
requests) instead of scanning all senders on every request.
- Task mode accepts an external orchestrator: `SessionStart` no longer
requires the initiator in `participants` (RFC-MACP-0009 authorizes
`TaskRequest` by initiator role, not membership). The pool must still
contain at least one eligible assignee other than the initiator. Handoff
keeps requiring initiator membership — intrinsic to the delegated model
(RFC-MACP-0010 §2), now documented at the check.
### Added
- The maximum-suspension cap is session-bound: `SessionStartPayload.max_suspend_ms`
(macp-proto ≥ 0.1.5) binds a per-session cap at start; `0`/absent selects the
runtime default (7 days). The **resolved** cap is recorded on the session and
its SessionStart log entry, and replay uses the recorded value — never live
configuration (RFC-MACP-0001 §7.5, RFC-MACP-0003 §2). Legacy histories carry
no recorded cap and keep default-cap semantics. Negative values are rejected
at SessionStart.
### Changed
- `ext.multi_round.v1` `Contribute` payloads use the canonical protobuf
encoding (`macp.modes.multi_round.v1.ContributePayload`) — the last
advertised mode off the canonical wire format. Legacy JSON
(`{"value":"..."}`) payloads remain accepted (tried first, permanently, so
pre-proto histories replay byte-identically). Requires `macp-proto` ≥ 0.1.4.
- `PolicyEvaluator` is now a single-method trait:
`evaluate_commitment(&CommitmentContext)`. The per-mode methods remain as
deprecated shims for one release. All five standard modes pass
`outcome_positive` (previously only Decision did).
- `Session` and other public core types are `#[non_exhaustive]`; construct
sessions via `Session::builder`.
- CI: main jobs run on stable (1.89 retained as the MSRV check); the
feature-gated RocksDB/Redis backends are built, linted, and tested (Redis
against a live service container); the tier-1 gRPC integration suite gates
pull requests; `cargo audit` is advisory rather than a required gate.
## [0.4.0] — baseline
Workspace split (7 crates), suspend/resume + cancelled lifecycle, policy
registry with schema v2 negative-outcome support, passive subscribe, JWT
bearer auth, RocksDB/Redis backends, checkpoint/compaction replay.