macp-runtime 0.7.4

MACP reference runtime: a coordination kernel and gRPC server enforcing session boundaries, message validation, append-only history, modes, and governance policy.
Documentation
# 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.