#region FixtureManifest [C:3] [TYPE ADR] [SEMANTICS test,fixture,agent-chat]
@defgroup Fixtures Canonical test fixtures for Gradio Agent Chat (LangGraph stack).

## @{ Fixture FX_AgentChat.Conversations.ListValid [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Valid paginated conversation list response.
@RELATION VERIFIES -> [AgentChat.Api.ListConversations]
@TEST_FIXTURE: list_valid -> fixtures/api/conversations_list_valid.json
@TEST_EDGE: valid_request -> 200 with items[] and meta
## @} Fixture FX_AgentChat.Conversations.ListValid

## @{ Fixture FX_AgentChat.Conversations.ListEmpty [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Empty conversation list — new user, no conversations.
@RELATION VERIFIES -> [AgentChat.Api.ListConversations]
@TEST_FIXTURE: list_empty -> fixtures/api/conversations_list_empty.json
@TEST_EDGE: empty_result -> items=[], totals=0
## @} Fixture FX_AgentChat.Conversations.ListEmpty

## @{ Fixture FX_AgentChat.Conversations.ListMissingAuth [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Missing Authorization header → 401.
@RELATION VERIFIES -> [AgentChat.Api.ListConversations]
@TEST_FIXTURE: list_missing_auth -> fixtures/api/conversations_list_missing_auth.json
@TEST_EDGE: missing_field (Authorization) -> 401 UNAUTHORIZED
## @} Fixture FX_AgentChat.Conversations.ListMissingAuth

## @{ Fixture FX_AgentChat.Conversations.ListInvalidPage [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Invalid page parameter → 422 validation error.
@RELATION VERIFIES -> [AgentChat.Api.ListConversations]
@TEST_FIXTURE: list_invalid_page -> fixtures/api/conversations_list_invalid_page.json
@TEST_EDGE: invalid_type (page=-1) -> 422 VALIDATION_ERROR
## @} Fixture FX_AgentChat.Conversations.ListInvalidPage

## @{ Fixture FX_AgentChat.Conversations.ListExternalFail [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Database connection failure → 500.
@RELATION VERIFIES -> [AgentChat.Api.ListConversations]
@TEST_FIXTURE: list_external_fail -> fixtures/api/conversations_list_external_fail.json
@TEST_EDGE: external_fail (DB down) -> 500 INTERNAL_ERROR
## @} Fixture FX_AgentChat.Conversations.ListExternalFail

## @{ Fixture FX_AgentChat.History.Valid [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Valid paginated history response for existing conversation.
@RELATION VERIFIES -> [AgentChat.Api.GetHistory]
@TEST_FIXTURE: history_valid -> fixtures/api/history_valid.json
@TEST_EDGE: valid_conversation_id -> 200 with messages[]
## @} Fixture FX_AgentChat.History.Valid

## @{ Fixture FX_AgentChat.History.NotFound [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Non-existent conversation → 404.
@RELATION VERIFIES -> [AgentChat.Api.GetHistory]
@TEST_FIXTURE: history_not_found -> fixtures/api/history_not_found.json
@TEST_EDGE: invalid_conversation_id -> 404 NOT_FOUND
## @} Fixture FX_AgentChat.History.NotFound

## @{ Fixture FX_AgentChat.History.MissingField [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Missing conversation_id parameter → 422.
@RELATION VERIFIES -> [AgentChat.Api.GetHistory]
@TEST_FIXTURE: history_missing_field -> fixtures/api/history_missing_field.json
@TEST_EDGE: missing_field (conversation_id) -> 422 VALIDATION_ERROR
## @} Fixture FX_AgentChat.History.MissingField

## @{ Fixture FX_AgentChat.Delete.Valid [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Valid soft-delete (archive) of owned conversation.
@RELATION VERIFIES -> [AgentChat.Api.DeleteConversation]
@TEST_FIXTURE: delete_valid -> fixtures/api/delete_valid.json
@TEST_EDGE: valid_conversation_id -> 200, is_archived=true
## @} Fixture FX_AgentChat.Delete.Valid

## @{ Fixture FX_AgentChat.Delete.NotOwner [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Deleting another user's conversation → 403.
@RELATION VERIFIES -> [AgentChat.Api.DeleteConversation]
@TEST_FIXTURE: delete_not_owner -> fixtures/api/delete_not_owner.json
@TEST_EDGE: not_owner -> 403 FORBIDDEN
## @} Fixture FX_AgentChat.Delete.NotOwner

## @{ Fixture FX_AgentChat.Delete.NotFound [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Deleting already-deleted conversation → 404.
@RELATION VERIFIES -> [AgentChat.Api.DeleteConversation]
@TEST_FIXTURE: delete_not_found -> fixtures/api/delete_not_found.json
@TEST_EDGE: already_deleted -> 404 NOT_FOUND
## @} Fixture FX_AgentChat.Delete.NotFound

## @{ Fixture FX_AgentChat.ServiceToken.Valid [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Valid service token request → JWT with role agent.
@RELATION VERIFIES -> [AgentChat.Api.ServiceToken]
@TEST_FIXTURE: token_valid -> fixtures/api/service_token_valid.json
@TEST_EDGE: valid_secret -> 200, role=agent
## @} Fixture FX_AgentChat.ServiceToken.Valid

## @{ Fixture FX_AgentChat.ServiceToken.InvalidSecret [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Wrong service secret → 401.
@RELATION VERIFIES -> [AgentChat.Api.ServiceToken]
@TEST_FIXTURE: token_invalid_secret -> fixtures/api/service_token_invalid_secret.json
@TEST_EDGE: invalid_secret -> 401 UNAUTHORIZED
## @} Fixture FX_AgentChat.ServiceToken.InvalidSecret

## @{ Fixture FX_AgentChat.Document.ParsePdf.Valid [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Valid PDF → extracted text.
@RELATION VERIFIES -> [AgentChat.Document.ParsePdf]
@TEST_FIXTURE: pdf_valid -> fixtures/api/document_parse_pdf_valid.json
@TEST_EDGE: valid_pdf -> text extracted
## @} Fixture FX_AgentChat.Document.ParsePdf.Valid

## @{ Fixture FX_AgentChat.Document.ParsePdf.Encrypted [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Encrypted PDF → ParseError.
@RELATION VERIFIES -> [AgentChat.Document.ParsePdf]
@TEST_FIXTURE: pdf_encrypted -> fixtures/api/document_parse_pdf_encrypted.json
@TEST_EDGE: encrypted_pdf -> ParseError
## @} Fixture FX_AgentChat.Document.ParsePdf.Encrypted

## @{ Fixture FX_AgentChat.Document.ParseXlsx.Valid [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Valid XLSX → structured sheet data.
@RELATION VERIFIES -> [AgentChat.Document.ParseXlsx]
@TEST_FIXTURE: xlsx_valid -> fixtures/api/document_parse_xlsx_valid.json
@TEST_EDGE: valid_xlsx -> sheets parsed
## @} Fixture FX_AgentChat.Document.ParseXlsx.Valid

## @{ Fixture FX_AgentChat.Document.ParseXlsx.PasswordProtected [C:2] [TYPE Block] [SEMANTICS test,fixture,api]
@BRIEF Password-protected XLSX → ParseError.
@RELATION VERIFIES -> [AgentChat.Document.ParseXlsx]
@TEST_FIXTURE: xlsx_password -> fixtures/api/document_parse_xlsx_password.json
@TEST_EDGE: password_protected -> ParseError with clear message
## @} Fixture FX_AgentChat.Document.ParseXlsx.PasswordProtected

## @{ Fixture FX_AgentChat.Model.SendMessage.Valid [C:2] [TYPE Block] [SEMANTICS test,fixture,model]
@BRIEF Valid sendMessage invocation — transitions to streaming state.
@RELATION VERIFIES -> [AgentChat.Model]
@TEST_FIXTURE: send_valid -> fixtures/model/send_message_valid.json
@TEST_INVARIANT: StreamingStateGatesInput -> VERIFIED_BY: [Test.AgentChat.Model]
## @} Fixture FX_AgentChat.Model.SendMessage.Valid

## @{ Fixture FX_AgentChat.Model.CancelGeneration [C:2] [TYPE Block] [SEMANTICS test,fixture,model]
@BRIEF Cancel during streaming — returns to idle, partial text preserved.
@RELATION VERIFIES -> [AgentChat.Model]
@TEST_FIXTURE: cancel_streaming -> fixtures/model/cancel_generation.json
@TEST_EDGE: cancel_during_streaming -> idle, partialText preserved
## @} Fixture FX_AgentChat.Model.CancelGeneration

## @{ Fixture FX_AgentChat.Model.ResumeConfirm [C:2] [TYPE Block] [SEMANTICS test,fixture,model]
@BRIEF HITL resume confirm — transitions from awaiting_confirmation to streaming.
@RELATION VERIFIES -> [AgentChat.Model]
@TEST_FIXTURE: resume_confirm -> fixtures/model/resume_confirm.json
@TEST_EDGE: confirm_from_awaiting -> streaming, pendingThreadId cleared
## @} Fixture FX_AgentChat.Model.ResumeConfirm

## @{ Fixture FX_AgentChat.Model.ResumeDeny [C:2] [TYPE Block] [SEMANTICS test,fixture,model]
@BRIEF HITL resume deny — transitions to idle.
@RELATION VERIFIES -> [AgentChat.Model]
@TEST_FIXTURE: resume_deny -> fixtures/model/resume_deny.json
@TEST_EDGE: deny_from_awaiting -> idle
## @} Fixture FX_AgentChat.Model.ResumeDeny

## @{ Fixture FX_AgentChat.Model.RejectedPath [C:2] [TYPE Block] [SEMANTICS test,fixture,model]
@BRIEF @REJECTED: WebSocket model cannot be resurrected — verify no WebSocket imports.
@RELATION VERIFIES -> [AgentChat.Model]
@TEST_FIXTURE: rejected_ws -> fixtures/model/rejected_websocket.json
@TEST_INVARIANT: NoWebSocketImports -> VERIFIED_BY: [Test.AgentChat.Model.RejectedPaths]
## @} Fixture FX_AgentChat.Model.RejectedPath

#endregion FixtureManifest
