Skip to content

fix(deps): require agent-manifest>=0.6.1 and report unappraisable manifests clearly - #422

Merged
imran-siddique merged 1 commit into
mainfrom
chore/bump-agent-manifest-0.6.1
Jul 27, 2026
Merged

fix(deps): require agent-manifest>=0.6.1 and report unappraisable manifests clearly#422
imran-siddique merged 1 commit into
mainfrom
chore/bump-agent-manifest-0.6.1

Conversation

@imran-siddique

Copy link
Copy Markdown
Contributor

Picks up the verifier crash fixed in agent-manifest 0.6.1 (agent-manifest#245), which cMCP is exposed to.

Why this matters here specifically

verify_agent_manifest_binding calls the SDK verifier on a peer-supplied manifest. Before agent-manifest 0.6.1, a manifest declaring ML-DSA-65 or hybrid-Ed25519-ML-DSA-65 reached _require_oqs() and crashed the SDK with an uncaught RuntimeError on any install without the optional [pq] extra, which is the default. So this path answered a crash rather than a rejection, triggered by input a peer controls, with no valid signature or trusted key needed.

The existing floor was >=0.5, which merely allows 0.6.1. The comment in pyproject.toml says why it is now a requirement rather than a preference.

Behaviour change

Fail-closed behaviour is unchanged: cMCP already rejected UNVERIFIABLE, which is what the SDK now returns. What changes is the message.

UNVERIFIABLE previously raised ConfigError("Agent Manifest signature verification failed"), which is misleading. The signature did not fail; it could not be checked, either because there is no trusted key for it or because this build cannot run the algorithm. Those need opposite operator responses: install an extra or fix the trust anchor, versus reject a bad manifest. It now raises "Agent Manifest signature could not be verified" and appends the verifier's own reason:

ConfigError: Agent Manifest signature could not be verified: signature algorithm
ML-DSA-65 is not supported by this build, so the signature could not be appraised: ...

The MISMATCH-with-signature-detail path keeps "signature verification failed", so a genuinely bad signature still reads that way.

Verification

Exercised through cMCP's own entry point, not the SDK's, with agent-manifest 0.6.1 resolved from the new floor and no [pq] extra installed. A peer-supplied ML-DSA-65 manifest yields the ConfigError above rather than a RuntimeError.

  • 892 passed, 6 skipped (was 891 before; one new regression test pins this path so the floor cannot be silently lowered)
  • Built in a throwaway venv from the edited pyproject.toml, confirming the floor resolves to 0.6.1

…ifests clearly

verify_agent_manifest_binding runs the SDK verifier over a peer-supplied
manifest. Before agent-manifest 0.6.1, a manifest declaring ML-DSA-65 or
hybrid crashed the SDK with an uncaught RuntimeError on any install
without the optional [pq] extra, so this path answered a crash rather
than a rejection. The floor is now 0.6.1, where the SDK returns
UNVERIFIABLE instead.

cMCP already rejects UNVERIFIABLE, so the fail-closed behavior is
unchanged. What changes is the message: "could not be verified" (no
trusted key, or an algorithm this build cannot run) is now distinct from
"verification failed" (a bad signature), and the verifier's own reason is
surfaced. An operator seeing the first needs to install an extra or fix
their trust anchor; one seeing the second has a bad manifest.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@imran-siddique
imran-siddique merged commit 5990a67 into main Jul 27, 2026
12 checks passed
@imran-siddique
imran-siddique deleted the chore/bump-agent-manifest-0.6.1 branch July 27, 2026 17:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant