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 agent | Company | Passed | Failed | Skipped |
|---|---|---|---|---|
| Python | Python | 91 | 0 | 0 |
| Python | TypeScript | 91 | 0 | 0 |
| TypeScript | Python | 91 | 0 | 0 |
| TypeScript | TypeScript | 91 | 0 | 0 |
Protocol​
| Case | Kind | Requirements | Python → Python | Python → TypeScript | TypeScript → Python | TypeScript → TypeScript |
|---|---|---|---|---|---|---|
protocol.extension-required-company | negative | OPS-2-01, PAP-3.3-03 | pass | pass | pass | pass |
Security​
| Case | Kind | Requirements | Python → Python | Python → TypeScript | TypeScript → Python | TypeScript → TypeScript |
|---|---|---|---|---|---|---|
security.client-assertion-alg-none | negative | GUIDE-jwt-02, PAP-4.1-02 | pass | pass | pass | pass |
security.client-assertion-hs256-public-key | negative | GUIDE-jwt-02 | pass | pass | pass | pass |
security.client-assertion-rs256-header-on-ec-key | negative | GUIDE-jwt-01, GUIDE-jwt-02 | pass | pass | pass | pass |
security.client-assertion-embedded-key-ignored | negative | GUIDE-jwt-03 | pass | pass | pass | pass |
security.client-assertion-bad-audience | negative | GUIDE-jwt-04, PAP-4.8-02 | pass | pass | pass | pass |
security.client-assertion-audience-array | negative | GUIDE-jwt-04 | pass | pass | pass | pass |
security.session-assertion-bad-audience | negative | GUIDE-jwt-04 | pass | pass | pass | pass |
security.session-assertion-wrong-issuer | negative | GUIDE-jwt-03 | pass | pass | pass | pass |
security.session-assertion-clock-skew-tolerated | positive | GUIDE-jwt-04 | pass | pass | pass | pass |
security.session-assertion-from-the-future | negative | GUIDE-jwt-04 | pass | pass | pass | pass |
security.session-assertion-expired | negative | GUIDE-jwt-04 | pass | pass | pass | pass |
security.session-assertion-long-lived | negative | GUIDE-jwt-04 | pass | pass | pass | pass |
security.session-assertion-replay | negative | GUIDE-jwt-05 | pass | pass | pass | pass |
security.browser-assertion-at-token-endpoint | negative | PAP-5-05 | pass | pass | pass | pass |
security.token-request-without-dpop | negative | PAP-4.3-11 | pass | pass | pass | pass |
security.token-dpop-with-ath | negative | PAP-4.3-07 | pass | pass | pass | pass |
security.dpop-alg-none | negative | PAP-4.3-02, GUIDE-jwt-02 | pass | pass | pass | pass |
security.dpop-wrong-signature | negative | PAP-4.3-02 | pass | pass | pass | pass |
security.dpop-other-key | negative | PAP-4.3-03 | pass | pass | pass | pass |
security.dpop-method-mismatch | negative | PAP-4.3-04 | pass | pass | pass | pass |
security.dpop-url-mismatch | negative | PAP-4.3-04 | pass | pass | pass | pass |
security.dpop-stale | negative | PAP-4.3-05 | pass | pass | pass | pass |
security.dpop-replay | negative | PAP-4.3-06 | pass | pass | pass | pass |
security.dpop-token-hash-mismatch | negative | PAP-4.3-07 | pass | pass | pass | pass |
security.dpop-missing | negative | PAP-4.3-01, PAP-4.3-11 | pass | pass | pass | pass |
security.dpop-token-as-bearer | negative | PAP-4.3-10, PAP-4.3-11 | pass | pass | pass | pass |
security.token-in-url-refused | negative | PAP-4.3-17, PAP-4.3-16 | pass | pass | pass | pass |
security.authorization-header-without-cookies | positive | PAP-4.3-12 | pass | pass | pass | pass |
security.token-responses-not-cached | positive | GUIDE-secrets-03 | pass | pass | pass | pass |
security.refusals-disclose-no-credential | negative | GUIDE-secrets-01, PAP-4.7-03 | pass | pass | pass | pass |
Lifecycle​
| Case | Kind | Requirements | Python → Python | Python → TypeScript | TypeScript → Python | TypeScript → TypeScript |
|---|---|---|---|---|---|---|
lifecycle.signed-out-session | positive | PAP-4.2-03, PAP-4.2-04, PAP-4.2-05 | pass | pass | pass | pass |
lifecycle.parallel-sessions | positive | PAP-4.2-01 | pass | pass | pass | pass |
lifecycle.renew-signed-out | positive | PAP-4.3-15 | pass | pass | pass | pass |
lifecycle.renew-for-another-user | negative | PAP-4.8-03 | pass | pass | pass | pass |
lifecycle.sign-in-scopes | positive | PAP-4.4-02, PAP-4.4-03 | pass | pass | pass | pass |
lifecycle.unknown-scope-refused | negative | PAP-4.4-03 | pass | pass | pass | pass |
lifecycle.account-token-signs-in-new-session | positive | PAP-4.8-01 | pass | pass | pass | pass |
lifecycle.rotated-token | negative | PAP-4.8-05 | pass | pass | pass | pass |
lifecycle.narrower-scopes | positive | PAP-4.8-01 | pass | pass | pass | pass |
lifecycle.wider-scopes-refused | negative | PAP-4.4-02 | pass | pass | pass | pass |
lifecycle.account-token-from-another-client | negative | PAP-4.8-02 | pass | pass | pass | pass |
lifecycle.account-token-at-api | negative | PAP-4.8-01 | pass | pass | pass | pass |
lifecycle.account-mismatch | negative | PAP-4.8-04 | pass | pass | pass | pass |
lifecycle.account-token-for-another-users-session | negative | PAP-4.8-03 | pass | pass | pass | pass |
lifecycle.sign-out-takes-effect | positive | PAP-4.9-01 | pass | pass | pass | pass |
lifecycle.sign-out-session-continues | positive | PAP-4.9-01 | pass | pass | pass | pass |
lifecycle.sign-out-every-session | positive | PAP-4.9-01, PAP-4.8-05 | pass | pass | pass | pass |
lifecycle.disconnect-from-account-settings | positive | GUIDE-co-account-01 | pass | pass | pass | pass |
lifecycle.mcp-protected-resource-metadata | positive | PAP-6-06, PAP-6-03 | pass | pass | pass | pass |
lifecycle.mcp-bearer-for-its-url | positive | PAP-4.3-09, PAP-6-04, GUIDE-pa-tokens-01 | pass | pass | pass | pass |
lifecycle.mcp-bearer-only-at-mcp | negative | PAP-4.3-10, PAP-6-05 | pass | pass | pass | pass |
lifecycle.mcp-sign-out-takes-effect | positive | PAP-4.9-01, PAP-6-04 | pass | pass | pass | pass |
lifecycle.browser-joins-session | positive | PAP-5-01, PAP-5-03, PAP-5-12, PAP-5-10, PAP-5-11 | pass | pass | pass | pass |
lifecycle.browser-assertion-refused | negative | PAP-5-05, PAP-5-06, PAP-5-07, PAP-5-08, PAP-5-09 | pass | pass | pass | pass |
Conversations​
| Case | Kind | Requirements | Python → Python | Python → TypeScript | TypeScript → Python | TypeScript → TypeScript |
|---|---|---|---|---|---|---|
conversations.start-and-reply | positive | PAP-7.7-01, PAP-7.7-02, PAP-7.5-03, PAP-4.3-01 | pass | pass | pass | pass |
conversations.retry-replays | positive | PAP-7.3-01 | pass | pass | pass | pass |
conversations.message-id-conflict | negative | PAP-7.3-01 | pass | pass | pass | pass |
conversations.invalid-cursor | negative | PAP-7.5-02 | pass | pass | pass | pass |
conversations.cursor-expired-recovery | recovery | PAP-7.5-04 | pass | pass | pass | pass |
conversations.has-more-drained | positive | PAP-7.5-03 | pass | pass | pass | pass |
conversations.empty-read | positive | PAP-7.5-03 | pass | pass | pass | pass |
conversations.sse-reconnect | recovery | PAP-7.6-01 | pass | pass | pass | pass |
conversations.text-delta-not-actionable | positive | PAP-7.6-01 | pass | pass | pass | pass |
conversations.attribution | positive | PAP-7.8-01, PAP-7.7-02 | pass | pass | pass | pass |
conversations.handoff | positive | PAP-7.7-01 | pass | pass | pass | pass |
conversations.direct-conversation | positive | PAP-7.10-01 | pass | pass | pass | pass |
conversations.direct-of-direct-refused | negative | PAP-7.10-01 | pass | pass | pass | pass |
conversations.authorization-then-same-conversation | positive | PAP-7.11-01 | pass | pass | pass | pass |
conversations.closed | negative | PAP-7.7-01 | pass | pass | pass | pass |
conversations.not-found-indistinguishable | negative | PAP-7.2-01 | pass | pass | pass | pass |
conversations.signed-out-token-on-account-conversation | negative | PAP-7.2-01 | pass | pass | pass | pass |
Operations​
| Case | Kind | Requirements | Python → Python | Python → TypeScript | TypeScript → Python | TypeScript → TypeScript |
|---|---|---|---|---|---|---|
operations.proposed-not-performed | positive | OPS-3-03, OPS-3-01, OPS-4.1-01 | pass | pass | pass | pass |
operations.readable-until-final | positive | OPS-3.2-01 | pass | pass | pass | pass |
operations.confirm-succeeded | positive | OPS-5.1-01, OPS-3-02, OPS-6-05 | pass | pass | pass | pass |
operations.at-most-once | positive | OPS-6-02 | pass | pass | pass | pass |
operations.terms-changed | negative | OPS-3.1-01, OPS-5.1-01 | pass | pass | pass | pass |
operations.user-approval-required | negative | OPS-5.1-05 | pass | pass | pass | pass |
operations.standing-permission-within-bounds | positive | OPS-5.1-05, GUIDE-ops-pa-03 | pass | pass | pass | pass |
operations.standing-permission-out-of-bounds | negative | OPS-5.1-05 | pass | pass | pass | pass |
operations.standing-permission-concurrent-use | negative | GUIDE-ops-pa-03 | pass | pass | pass | pass |
operations.cross-channel-identity | positive | OPS-4-01 | pass | pass | pass | pass |
operations.cross-channel-mcp | positive | OPS-4-01 | pass | pass | pass | pass |
operations.web-confirm-at-most-once | positive | OPS-6-02, OPS-3-02 | pass | pass | pass | pass |
operations.message-is-not-approval | negative | OPS-5.1-04 | pass | pass | pass | pass |
operations.confirm-timeout-recovery | recovery | OPS-6-04, GUIDE-ops-pa-04 | pass | pass | pass | pass |
operations.cancel-proposed | positive | OPS-6-02 | pass | pass | pass | pass |
operations.in-progress-outcome-unknown | recovery | OPS-6-03, OPS-6-01 | pass | pass | pass | pass |
operations.failed-partial-result | positive | OPS-6-05 | pass | pass | pass | pass |
operations.expired | negative | OPS-3.2-01 | pass | pass | pass | pass |
operations.not-found-indistinguishable | negative | OPS-3.2-01 | pass | pass | pass | pass |
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.
| Case | Kind | Check | SDKs |
|---|---|---|---|
protocol.major-version-unsupported | negative | discovery_document | python, typescript |
protocol.minor-version-newer | positive | discovery_document | python, typescript |
protocol.version-not-major-minor | negative | discovery_document | python, typescript |
protocol.unknown-api-type | positive | discovery_document | python, typescript |
protocol.unknown-conversation-protocol | positive | discovery_document | python, typescript |
protocol.unknown-extension-ignored | positive | extension_negotiation | python, typescript |
protocol.extension-version-mismatch | negative | extension_negotiation | python, typescript |
protocol.third-party-extension-name | positive | extension_names | python, typescript |
protocol.extension-required-error | negative | extension_required | python, typescript |
protocol.unknown-event-type | positive | conversation_page | python, typescript |
protocol.unknown-operation-fields | positive | operation | python, typescript |
protocol.message-context-fields | negative | message_context | python, typescript |
protocol.multi-domain-issuer | positive | discovery | python, typescript |
protocol.issuer-not-claiming-domain | negative | discovery | python, typescript |
protocol.issuer-mismatch | negative | discovery | python, typescript |
protocol.organization-domain-www | positive | discovery | python, typescript |
protocol.organization-domain-after-redirect | negative | discovery | python, typescript |
security.duplicate-json-members | negative | strict_json | python, typescript |
security.ssrf-loopback | negative | url_safety | python, typescript |
security.ssrf-private | negative | url_safety | python, typescript |
security.ssrf-link-local-metadata | negative | url_safety | python, typescript |
security.ssrf-ipv6-loopback-and-unique-local | negative | url_safety | python, typescript |
security.ssrf-ipv4-mapped | negative | url_safety | python, typescript |
security.dns-rebinding-mixed-answers | negative | url_safety | python, typescript |
security.dns-rebinding-after-check | negative | pinned_connect | python |
security.public-address-allowed | positive | url_safety | python, typescript |
security.discovery-redirect-to-http | negative | discovery | python, typescript |
security.discovery-redirect-followed | positive | discovery | python, typescript |
security.discovery-redirect-limit | negative | discovery | python, typescript |
security.oversized-metadata | negative | discovery | python, typescript |
security.slow-metadata | negative | discovery | python, typescript |
security.metadata-not-json | negative | discovery | python, typescript |
lifecycle.rate-limit-retry-after | negative | rate_limited | python, typescript |
The runners' JSON reports (schema 1) carry each case's requirements and messages; see the conformance guide.