Skip to main content

Sign-in and Account Tokens coverage

Sign-in modes, consent, Account Tokens, and sign-out (§4.4 to §4.9). Upstream: personalagentprotocol.org/docs/spec.

22 entries: 17 implemented, 2 partial, 2 open, 1 not-applicable. Each row is one atomic statement of the upstream text, with the SDK symbols that implement it (Python; TypeScript mirrors them), the tests and shared conformance cases that show it, and its status.

IDSectionLevelRoleRequirementSDK symbolTestsStatus
PAP-4.4-01§4.4MUSTpersonal-agentThe types work on trust: a Personal Agent MUST use direct or Device Sign-In only when the User signs in themselves.DirectSignInClient.begin
DeviceSignInClient.begin
test_direct_and_api.py::test_signed_out_then_direct_sign_in_then_a_read_and_a_proposed_exchange
test_device.py::test_device_sign_in_paces_polling_and_protects_tokens
implemented
PAP-4.4-02§4.4MUST NOTcompanyThe Company MUST NOT grant scopes beyond those requested and allowed for the type used.CompanyService.approve_device
CompanyService.approve_authorization
CompanyService._refresh_grant
CompanyService._mediated
test_direct_and_api.py::test_partial_consent_and_a_write_that_was_not_granted
test_conformance.py::test_python_agent_python_company_over_tls
lifecycle.sign-in-scopes
lifecycle.wider-scopes-refused
implemented
PAP-4.4-03§4.4MUSTpersonal-agentEach sign-in request MUST include scope as a space-separated string, following OAuth scope syntax._scopes
DeviceSignInClient.begin
MediatedSignInClient.sign_in
test_auth.py::test_builds_direct_sign_in_url_with_s256_pkce
test_conformance.py::test_python_agent_python_company_over_tls
lifecycle.sign-in-scopes
lifecycle.unknown-scope-refused
implemented
PAP-4.4-04§4.4SHOULDpersonal-agentThe new Account Token replaces the old one, which the Personal Agent SHOULD revoke (4.9).AccountTokenClient.revoke—open: No helper replaces and revokes the previous Account Token after a wider sign-in; the host calls revoke().
PAP-4.4-05§4.4SHOULDpersonal-agentBefore starting a new sign-in, the Personal Agent SHOULD check whether it already holds an Account Token that covers the task (4.8).——open: No helper maps a task's scopes to a held Account Token; the host decides.
PAP-4.5-01§4.5MUSTcompanyredirect_uri MUST exactly match an entry in the Personal Agent's redirect_uris (4.1).CompanyService._authorize
CompanyService._code_grant
test_direct_and_api.py::test_the_consent_page_is_never_framed_and_bad_redirects_are_not_followedimplemented
PAP-4.5-02§4.5MUSTpersonal-agentThe Personal Agent checks state, and MUST check that iss exactly matches the auth.issuer of the Company it started sign-in with.validate_direct_sign_in_callbacktest_auth.py::test_validates_callback_and_redacts_code_exchange
test_auth.py::test_rejects_invalid_callbacks
implemented
PAP-4.6-01§4.6MUST NOTcompanyOpening the link MUST NOT approve the request by itself.CompanyService.approve_devicetest_company_end_to_end.py::test_a_user_and_a_company_from_question_to_confirmed_exchangeimplemented
PAP-4.7-01§4.7MUSTpersonal-agentsecret marks a value the Personal Agent MUST protect: never shown back to the User, written to logs, or sent anywhere else.MediatedSignInClient
PROTECTED_INPUTS
test_mediated.py::test_the_declared_fields_go_to_the_endpoint_and_the_session_is_signed_in
test_mediated.py::test_a_one_time_code_continues_without_the_credentials
implemented
PAP-4.7-02§4.7MUSTcompanyA Company that offers Mediated Sign-In MUST rate-limit attempts, MUST NOT return credentials in any response, and SHOULD require a one-time code when a sign-in looks unusual.CompanyService._mediated_codetest_company_end_to_end.py::test_mediated_sign_in_with_a_one_time_codepartial: Wrong one-time codes are capped (max_code_attempts); credential attempts are not yet rate-limited by account, client_id, or user.
PAP-4.7-03§4.7MUST NOTcompanyA Company that offers Mediated Sign-In MUST rate-limit attempts, MUST NOT return credentials in any response, and SHOULD require a one-time code when a sign-in looks unusual.CompanyService._mediatedtest_company_end_to_end.py::test_mediated_sign_in_with_a_one_time_code
test_conformance.py::test_python_agent_python_company_over_tls
security.refusals-disclose-no-credential
implemented
PAP-4.7-04§4.7SHOULDcompanyA Company that offers Mediated Sign-In MUST rate-limit attempts, MUST NOT return credentials in any response, and SHOULD require a one-time code when a sign-in looks unusual.AccountDirectory.authenticate
CompanyService._mediated
test_company_end_to_end.py::test_mediated_sign_in_with_a_one_time_codeimplemented
PAP-4.7-05§4.7MUST NOTpersonal-agentPersonal Agents MUST NOT send credentials to any endpoint other than the Company's auth.mediated.endpoint.MediatedSignInClient._endpoint_on_company_domain
MediatedSignInClient._post
test_mediated.py::test_a_redirect_never_carries_the_credentials_elsewhere
test_mediated.py::test_an_endpoint_off_the_company_domain_is_refused_before_asking
implemented
PAP-4.8-01§4.8MUSTcompanyCompanies MUST accept an Account Token only at their token_endpoint and revocation_endpoint, and only from the client_id it was issued to, authenticated by its client assertion.CompanyService._refresh_grant
CompanyService._revoke
CompanyService._caller
test_conformance.py::test_python_agent_python_company_over_tls
lifecycle.account-token-signs-in-new-session
lifecycle.narrower-scopes
lifecycle.account-token-at-api
implemented
PAP-4.8-02§4.8MUSTcompanyCompanies MUST accept an Account Token only at their token_endpoint and revocation_endpoint, and only from the client_id it was issued to, authenticated by its client assertion.CompanyService._client
CompanyService._refresh_grant
test_conformance.py::test_python_agent_python_company_over_tls
lifecycle.account-token-from-another-client
security.client-assertion-bad-audience
implemented
PAP-4.8-03§4.8MUSTcompanyThe Session MUST belong to the same client_id and User ID as the Account Token, and be signed out or signed in to the same account.CompanyService._refresh_granttest_conformance.py::test_python_agent_python_company_over_tls
lifecycle.renew-for-another-user
lifecycle.account-token-for-another-users-session
implemented
PAP-4.8-04§4.8MUSTcompanyThe Session MUST belong to the same client_id and User ID as the Account Token, and be signed out or signed in to the same account.CompanyService._refresh_grant
CompanyService._sign_in
test_conformance.py::test_python_agent_python_company_over_tls
lifecycle.account-mismatch
implemented
PAP-4.8-05§4.8MUSTpersonal-agentA Company MAY return a new Account Token in refresh_token. The Personal Agent then MUST use the new one from then on.AccountTokenClient.refreshtest_accounts.py::test_refresh_signs_the_session_in_and_rotates_the_stored_token
test_accounts.py::test_concurrent_refreshes_rotate_one_after_the_other
test_conformance.py::test_python_agent_python_company_over_tls
lifecycle.rotated-token
lifecycle.sign-out-every-session
implemented
PAP-4.8-06§4.8MUSTpersonal-agentPersonal Agents MUST store Account Tokens as secrets, and MUST NOT put them in model context, conversation messages, logs, or URLs.TokenStore
DeviceSignInClient._complete
DirectSignInClient._result
MediatedSignInClient._complete
test_device.py::test_device_sign_in_paces_polling_and_protects_tokens
test_auth.py::test_orchestrates_one_use_direct_sign_in_with_nonce_and_partial_scopes
implemented
PAP-4.8-07§4.8MUST NOTpersonal-agentPersonal Agents MUST store Account Tokens as secrets, and MUST NOT put them in model context, conversation messages, logs, or URLs.AccountTokenClient
AccountRefreshResult
DirectSignInClient._result
DeviceSignInClient._complete
MediatedSignInClient._complete
test_accounts.py::test_no_error_carries_the_account_token
test_auth.py::test_orchestrates_one_use_direct_sign_in_with_nonce_and_partial_scopes
partial: Results and errors never carry the token, but no test yet proves logs and traces stay free of credentials (plan §2).
PAP-4.9-01§4.9SHOULDcompanyCompanies SHOULD check on each request whether the Session is still signed in, so sign-out takes effect right away.CompanyService._revoke
CompanyService.disconnect
CompanyService._caller
test_company_store.py::test_a_company_restarted_over_its_store_continues_every_flow
test_conformance.py::test_python_agent_python_company_over_tls
lifecycle.sign-out-takes-effect
lifecycle.sign-out-session-continues
lifecycle.sign-out-every-session
lifecycle.mcp-sign-out-takes-effect
implemented
PAP-4.9-02§4.9SHOULDcompanyA Company that doesn't SHOULD use much shorter Session Token lifetimes, such as a few minutes.——not-applicable: The reference company checks on each request (PAP-4.9-01).

Conformance case IDs name protocol/fixtures/conformance cases; see the conformance report for their outcome in every language pairing.