Conversations coverage
Messages, events, streaming, handoff, Direct Conversations, and closing (§7). Upstream: personalagentprotocol.org/docs/spec.
18 entries: 16 implemented, 2 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.
| ID | Section | Level | Role | Requirement | SDK symbol | Tests | Status |
|---|---|---|---|---|---|---|---|
PAP-7.2-01 | §7.2 | MUST | company | The Company MUST reject requests from any other client_id, User, or account. | CompanyService._owned | test_company_end_to_end.py::test_the_conversation_streams_and_a_stranger_cannot_read_ittest_conformance.py::test_python_agent_python_company_over_tlsconversations.not-found-indistinguishableconversations.signed-out-token-on-account-conversation | implemented |
PAP-7.2-02 | §7.2 | SHOULD | both | They SHOULD start with a short prefix for their kind, such as cnv_, msg_, or evt_. | generate_message_idCompanyService._id | test_conversations.py::test_start_and_continue_preserve_message_ids_and_parse_waited_events | implemented |
PAP-7.2-03 | §7.2 | MUST NOT | both | Beyond these rules, the side that chooses an ID decides its format, and the other side MUST NOT depend on it. | Message.validate_idConversationEventPage.validate_ids | test_models.py::test_shared_client_conversation_and_operation_fixtures | implemented |
PAP-7.3-01 | §7.3 | MUST | personal-agent | The Personal Agent chooses each message's id, and MUST make it unique for the User. | generate_message_id | test_conversations.py::test_start_and_continue_preserve_message_ids_and_parse_waited_eventstest_conformance.py::test_python_agent_python_company_over_tlsconversations.retry-replaysconversations.message-id-conflict | implemented |
PAP-7.4-01 | §7.4 | MUST | both | A message MUST have at least one of text, data, or context. | Message.validate_content | test_models.py::test_message_requires_contenttest_fixtures.py::test_local_fixture_caseprotocol.message-context-fields | implemented |
PAP-7.4-02 | §7.4 | SHOULD NOT | both | Personal Agents and Company Agents SHOULD NOT put JSON or other markup in text. | — | — | not-applicable: Message text is written by the host's agent and the company agent; the SDK carries it unchanged. |
PAP-7.4-03 | §7.4 | MUST | personal-agent | When a Personal Agent shares one of these facts, it MUST use the field and format defined here: locale, time_zone, user_available. | Message.validate_context | test_fixtures.py::test_local_fixture_caseprotocol.message-context-fields | implemented |
PAP-7.4-04 | §7.4 | SHOULD | personal-agent | Personal Agents SHOULD share only what the task needs. | — | — | not-applicable: What a message shares is the host's decision; the SDK adds nothing to it. |
PAP-7.5-01 | §7.5 | MUST | personal-agent | Personal Agents MUST skip event types they don't recognize, so later versions and extensions can add types. | ConversationEvent.knownConversationClient.events | test_fixtures.py::test_local_fixture_caseprotocol.unknown-event-type | implemented |
PAP-7.5-02 | §7.5 | MUST NOT | personal-agent | Cursors are opaque, so the Personal Agent MUST NOT compare or sort them. | ConversationClient.events | test_conversations.py::test_events_recover_cursor_drain_backlog_and_suppress_duplicatestest_conformance.py::test_python_agent_python_company_over_tlsconversations.invalid-cursor | implemented |
PAP-7.5-03 | §7.5 | MUST | company | Every successful read MUST include cursor, has_more, status, and responder, even with no events. | CompanyService._page_response | test_company_store.py::test_a_company_restarted_over_its_store_continues_every_flowtest_conformance.py::test_python_agent_python_company_over_tlsconversations.start-and-replyconversations.has-more-drainedconversations.empty-read | implemented |
PAP-7.5-04 | §7.5 | SHOULD | personal-agent | The Personal Agent then reads from the beginning and SHOULD tell the User that part of the conversation is missing. | ConversationClient.events | test_conversations.py::test_events_recover_cursor_drain_backlog_and_suppress_duplicatestest_conformance.py::test_python_agent_python_company_over_tlsconversations.cursor-expired-recovery | implemented |
PAP-7.6-01 | §7.6 | MUST NOT | personal-agent | It MUST NOT act on text from a text-delta event. | TextDeltaConversationClient.stream | test_conversation_control.py::test_stream_yields_events_and_deltas_and_stops_at_closedtest_conversation_control.py::test_a_closed_stream_reopens_from_last_event_id_and_drops_partial_texttest_conformance.py::test_python_agent_python_company_over_tlsconversations.sse-reconnectconversations.text-delta-not-actionable | implemented |
PAP-7.7-01 | §7.7 | MUST | company | Every successful response to a POST or a read MUST include status and responder. | CompanyService._receiptCompanyService._page_response | test_conformance.py::test_python_agent_python_company_over_tlsconversations.start-and-replyconversations.handoffconversations.closed | implemented |
PAP-7.7-02 | §7.7 | MUST | company | Each Company message MUST also include sender, with agent or human, to identify who wrote it. | CompanyService._reply | test_conformance.py::test_python_agent_python_company_over_tlsconversations.start-and-replyconversations.attribution | implemented |
PAP-7.8-01 | §7.8 | MUST | personal-agent | On the Personal Agent's side, the Personal Agent MUST set each message's sender: agent when the Personal Agent wrote it, and human only when it carries the User's own words. | Message.sender | test_conversation_control.py::test_a_direct_conversation_names_its_parent_and_the_parent_points_to_ittest_conformance.py::test_python_agent_python_company_over_tlsconversations.attribution | implemented |
PAP-7.10-01 | §7.10 | MUST | company | The parent conversation MUST be open, belong to the same owner (7.2), and not be a Direct Conversation itself. | CompanyService._start_conversation | test_company_refusals.py::test_a_direct_conversation_locks_its_parent_until_it_closestest_conformance.py::test_python_agent_python_company_over_tlsconversations.direct-conversationconversations.direct-of-direct-refused | implemented |
PAP-7.11-01 | §7.11 | SHOULD | company | When the Company Agent needs the User's account, the Company adds an authorization event. It SHOULD also ask in a message, so a User in a Direct Conversation sees the request. | Reply.authorizationManzanitaAgent.respond | test_conformance.py::test_python_agent_python_company_over_tlsconversations.authorization-then-same-conversation | implemented |
Conformance case IDs name protocol/fixtures/conformance cases; see the conformance report for their outcome in every language pairing.