Skip to main content

Compatibility and conformance report

SDK version 0.15.0, PAP profile 0.1 (draft updated 2026-10-09), Operations extension v1. Each pairing runs every positive, negative and recovery fixture case over real TCP and TLS, the personal agent in one language and the reference company (Manzanita) in the other. A case is skipped, never passed, when a side lacks what it needs; the reason is listed below.

Pairings​

Personal agentCompanyPassedFailedSkipped
PythonPython9100
PythonTypeScript9100
TypeScriptPython9100
TypeScriptTypeScript9100

Protocol​

CaseKindRequirementsPython → PythonPython → TypeScriptTypeScript → PythonTypeScript → TypeScript
protocol.extension-required-companynegativeOPS-2-01, PAP-3.3-03passpasspasspass

Security​

CaseKindRequirementsPython → PythonPython → TypeScriptTypeScript → PythonTypeScript → TypeScript
security.client-assertion-alg-nonenegativeGUIDE-jwt-02, PAP-4.1-02passpasspasspass
security.client-assertion-hs256-public-keynegativeGUIDE-jwt-02passpasspasspass
security.client-assertion-rs256-header-on-ec-keynegativeGUIDE-jwt-01, GUIDE-jwt-02passpasspasspass
security.client-assertion-embedded-key-ignorednegativeGUIDE-jwt-03passpasspasspass
security.client-assertion-bad-audiencenegativeGUIDE-jwt-04, PAP-4.8-02passpasspasspass
security.client-assertion-audience-arraynegativeGUIDE-jwt-04passpasspasspass
security.session-assertion-bad-audiencenegativeGUIDE-jwt-04passpasspasspass
security.session-assertion-wrong-issuernegativeGUIDE-jwt-03passpasspasspass
security.session-assertion-clock-skew-toleratedpositiveGUIDE-jwt-04passpasspasspass
security.session-assertion-from-the-futurenegativeGUIDE-jwt-04passpasspasspass
security.session-assertion-expirednegativeGUIDE-jwt-04passpasspasspass
security.session-assertion-long-livednegativeGUIDE-jwt-04passpasspasspass
security.session-assertion-replaynegativeGUIDE-jwt-05passpasspasspass
security.browser-assertion-at-token-endpointnegativePAP-5-05passpasspasspass
security.token-request-without-dpopnegativePAP-4.3-11passpasspasspass
security.token-dpop-with-athnegativePAP-4.3-07passpasspasspass
security.dpop-alg-nonenegativePAP-4.3-02, GUIDE-jwt-02passpasspasspass
security.dpop-wrong-signaturenegativePAP-4.3-02passpasspasspass
security.dpop-other-keynegativePAP-4.3-03passpasspasspass
security.dpop-method-mismatchnegativePAP-4.3-04passpasspasspass
security.dpop-url-mismatchnegativePAP-4.3-04passpasspasspass
security.dpop-stalenegativePAP-4.3-05passpasspasspass
security.dpop-replaynegativePAP-4.3-06passpasspasspass
security.dpop-token-hash-mismatchnegativePAP-4.3-07passpasspasspass
security.dpop-missingnegativePAP-4.3-01, PAP-4.3-11passpasspasspass
security.dpop-token-as-bearernegativePAP-4.3-10, PAP-4.3-11passpasspasspass
security.token-in-url-refusednegativePAP-4.3-17, PAP-4.3-16passpasspasspass
security.authorization-header-without-cookiespositivePAP-4.3-12passpasspasspass
security.token-responses-not-cachedpositiveGUIDE-secrets-03passpasspasspass
security.refusals-disclose-no-credentialnegativeGUIDE-secrets-01, PAP-4.7-03passpasspasspass

Lifecycle​

CaseKindRequirementsPython → PythonPython → TypeScriptTypeScript → PythonTypeScript → TypeScript
lifecycle.signed-out-sessionpositivePAP-4.2-03, PAP-4.2-04, PAP-4.2-05passpasspasspass
lifecycle.parallel-sessionspositivePAP-4.2-01passpasspasspass
lifecycle.renew-signed-outpositivePAP-4.3-15passpasspasspass
lifecycle.renew-for-another-usernegativePAP-4.8-03passpasspasspass
lifecycle.sign-in-scopespositivePAP-4.4-02, PAP-4.4-03passpasspasspass
lifecycle.unknown-scope-refusednegativePAP-4.4-03passpasspasspass
lifecycle.account-token-signs-in-new-sessionpositivePAP-4.8-01passpasspasspass
lifecycle.rotated-tokennegativePAP-4.8-05passpasspasspass
lifecycle.narrower-scopespositivePAP-4.8-01passpasspasspass
lifecycle.wider-scopes-refusednegativePAP-4.4-02passpasspasspass
lifecycle.account-token-from-another-clientnegativePAP-4.8-02passpasspasspass
lifecycle.account-token-at-apinegativePAP-4.8-01passpasspasspass
lifecycle.account-mismatchnegativePAP-4.8-04passpasspasspass
lifecycle.account-token-for-another-users-sessionnegativePAP-4.8-03passpasspasspass
lifecycle.sign-out-takes-effectpositivePAP-4.9-01passpasspasspass
lifecycle.sign-out-session-continuespositivePAP-4.9-01passpasspasspass
lifecycle.sign-out-every-sessionpositivePAP-4.9-01, PAP-4.8-05passpasspasspass
lifecycle.disconnect-from-account-settingspositiveGUIDE-co-account-01passpasspasspass
lifecycle.mcp-protected-resource-metadatapositivePAP-6-06, PAP-6-03passpasspasspass
lifecycle.mcp-bearer-for-its-urlpositivePAP-4.3-09, PAP-6-04, GUIDE-pa-tokens-01passpasspasspass
lifecycle.mcp-bearer-only-at-mcpnegativePAP-4.3-10, PAP-6-05passpasspasspass
lifecycle.mcp-sign-out-takes-effectpositivePAP-4.9-01, PAP-6-04passpasspasspass
lifecycle.browser-joins-sessionpositivePAP-5-01, PAP-5-03, PAP-5-12, PAP-5-10, PAP-5-11passpasspasspass
lifecycle.browser-assertion-refusednegativePAP-5-05, PAP-5-06, PAP-5-07, PAP-5-08, PAP-5-09passpasspasspass

Conversations​

CaseKindRequirementsPython → PythonPython → TypeScriptTypeScript → PythonTypeScript → TypeScript
conversations.start-and-replypositivePAP-7.7-01, PAP-7.7-02, PAP-7.5-03, PAP-4.3-01passpasspasspass
conversations.retry-replayspositivePAP-7.3-01passpasspasspass
conversations.message-id-conflictnegativePAP-7.3-01passpasspasspass
conversations.invalid-cursornegativePAP-7.5-02passpasspasspass
conversations.cursor-expired-recoveryrecoveryPAP-7.5-04passpasspasspass
conversations.has-more-drainedpositivePAP-7.5-03passpasspasspass
conversations.empty-readpositivePAP-7.5-03passpasspasspass
conversations.sse-reconnectrecoveryPAP-7.6-01passpasspasspass
conversations.text-delta-not-actionablepositivePAP-7.6-01passpasspasspass
conversations.attributionpositivePAP-7.8-01, PAP-7.7-02passpasspasspass
conversations.handoffpositivePAP-7.7-01passpasspasspass
conversations.direct-conversationpositivePAP-7.10-01passpasspasspass
conversations.direct-of-direct-refusednegativePAP-7.10-01passpasspasspass
conversations.authorization-then-same-conversationpositivePAP-7.11-01passpasspasspass
conversations.closednegativePAP-7.7-01passpasspasspass
conversations.not-found-indistinguishablenegativePAP-7.2-01passpasspasspass
conversations.signed-out-token-on-account-conversationnegativePAP-7.2-01passpasspasspass

Operations​

CaseKindRequirementsPython → PythonPython → TypeScriptTypeScript → PythonTypeScript → TypeScript
operations.proposed-not-performedpositiveOPS-3-03, OPS-3-01, OPS-4.1-01passpasspasspass
operations.readable-until-finalpositiveOPS-3.2-01passpasspasspass
operations.confirm-succeededpositiveOPS-5.1-01, OPS-3-02, OPS-6-05passpasspasspass
operations.at-most-oncepositiveOPS-6-02passpasspasspass
operations.terms-changednegativeOPS-3.1-01, OPS-5.1-01passpasspasspass
operations.user-approval-requirednegativeOPS-5.1-05passpasspasspass
operations.standing-permission-within-boundspositiveOPS-5.1-05, GUIDE-ops-pa-03passpasspasspass
operations.standing-permission-out-of-boundsnegativeOPS-5.1-05passpasspasspass
operations.standing-permission-concurrent-usenegativeGUIDE-ops-pa-03passpasspasspass
operations.cross-channel-identitypositiveOPS-4-01passpasspasspass
operations.cross-channel-mcppositiveOPS-4-01passpasspasspass
operations.web-confirm-at-most-oncepositiveOPS-6-02, OPS-3-02passpasspasspass
operations.message-is-not-approvalnegativeOPS-5.1-04passpasspasspass
operations.confirm-timeout-recoveryrecoveryOPS-6-04, GUIDE-ops-pa-04passpasspasspass
operations.cancel-proposedpositiveOPS-6-02passpasspasspass
operations.in-progress-outcome-unknownrecoveryOPS-6-03, OPS-6-01passpasspasspass
operations.failed-partial-resultpositiveOPS-6-05passpasspasspass
operations.expirednegativeOPS-3.2-01passpasspasspass
operations.not-found-indistinguishablenegativeOPS-3.2-01passpasspasspass

Decided by each SDK alone​

33 fixture cases need no company: parsing, extension negotiation, URL safety and bounded discovery. Python runs them in test_fixtures.py and TypeScript in conformance-fixtures.test.mjs; a case marked for one SDK only is listed with it.

CaseKindCheckSDKs
protocol.major-version-unsupportednegativediscovery_documentpython, typescript
protocol.minor-version-newerpositivediscovery_documentpython, typescript
protocol.version-not-major-minornegativediscovery_documentpython, typescript
protocol.unknown-api-typepositivediscovery_documentpython, typescript
protocol.unknown-conversation-protocolpositivediscovery_documentpython, typescript
protocol.unknown-extension-ignoredpositiveextension_negotiationpython, typescript
protocol.extension-version-mismatchnegativeextension_negotiationpython, typescript
protocol.third-party-extension-namepositiveextension_namespython, typescript
protocol.extension-required-errornegativeextension_requiredpython, typescript
protocol.unknown-event-typepositiveconversation_pagepython, typescript
protocol.unknown-operation-fieldspositiveoperationpython, typescript
protocol.message-context-fieldsnegativemessage_contextpython, typescript
protocol.multi-domain-issuerpositivediscoverypython, typescript
protocol.issuer-not-claiming-domainnegativediscoverypython, typescript
protocol.issuer-mismatchnegativediscoverypython, typescript
protocol.organization-domain-wwwpositivediscoverypython, typescript
protocol.organization-domain-after-redirectnegativediscoverypython, typescript
security.duplicate-json-membersnegativestrict_jsonpython, typescript
security.ssrf-loopbacknegativeurl_safetypython, typescript
security.ssrf-privatenegativeurl_safetypython, typescript
security.ssrf-link-local-metadatanegativeurl_safetypython, typescript
security.ssrf-ipv6-loopback-and-unique-localnegativeurl_safetypython, typescript
security.ssrf-ipv4-mappednegativeurl_safetypython, typescript
security.dns-rebinding-mixed-answersnegativeurl_safetypython, typescript
security.dns-rebinding-after-checknegativepinned_connectpython
security.public-address-allowedpositiveurl_safetypython, typescript
security.discovery-redirect-to-httpnegativediscoverypython, typescript
security.discovery-redirect-followedpositivediscoverypython, typescript
security.discovery-redirect-limitnegativediscoverypython, typescript
security.oversized-metadatanegativediscoverypython, typescript
security.slow-metadatanegativediscoverypython, typescript
security.metadata-not-jsonnegativediscoverypython, typescript
lifecycle.rate-limit-retry-afternegativerate_limitedpython, typescript

The runners' JSON reports (schema 1) carry each case's requirements and messages; see the conformance guide.