[ { "id": "T001", "description": "Provider resolver defaults to openrouter when AI_CHAT_PROVIDER is missing", "implemented": true, "featureIds": [ "F001", "F002" ] }, { "id": "T002", "description": "Provider resolver returns OpenRouter client/model when OpenRouter config is present", "implemented": true, "featureIds": [ "F001", "F003" ] }, { "id": "T003", "description": "Provider resolver returns Vertex client/model when AI_CHAT_PROVIDER=vertex and required config exists", "implemented": true, "featureIds": [ "F001", "F004" ] }, { "id": "T004", "description": "Vertex provider uses explicit VERTEX_OPENAPI_BASE_URL when provided", "implemented": true, "featureIds": [ "F004", "F005" ] }, { "id": "T005", "description": "Vertex provider derives base URL from VERTEX_PROJECT_ID and VERTEX_LOCATION when explicit URL is absent", "implemented": true, "featureIds": [ "F004", "F005" ] }, { "id": "T006", "description": "Vertex provider returns clear configuration error when required access token is missing", "implemented": true, "featureIds": [ "F004" ] }, { "id": "T007", "description": "Vertex request does not include thinking override payload when VERTEX_ENABLE_THINKING is true or unset", "implemented": true, "featureIds": [ "F006" ] }, { "id": "T008", "description": "Vertex request includes turn-level thinking disable payload when VERTEX_ENABLE_THINKING=false", "implemented": true, "featureIds": [ "F006", "F030" ] }, { "id": "T009", "description": "OpenRouter requests never include Vertex-specific thinking override payload", "implemented": true, "featureIds": [ "F003", "F006" ] }, { "id": "T010", "description": "Completion request validation accepts assistant messages with string reasoning_content", "implemented": true, "featureIds": [ "F007", "F008" ] }, { "id": "T011", "description": "Completion request validation rejects invalid reasoning_content types", "implemented": true, "featureIds": [ "F008" ] }, { "id": "T012", "description": "Conversation normalization preserves reasoning_content values on assistant messages", "implemented": true, "featureIds": [ "F007", "F009" ] }, { "id": "T013", "description": "Client-facing message sanitization does not drop reasoning_content needed for continuation", "implemented": true, "featureIds": [ "F009", "F015" ] }, { "id": "T014", "description": "Vertex message builder includes reasoning_content for assistant messages with preserved thinking", "implemented": true, "featureIds": [ "F009", "F014" ] }, { "id": "T015", "description": "OpenRouter message builder omits reasoning_content while maintaining compatible assistant payload", "implemented": true, "featureIds": [ "F009", "F013" ] }, { "id": "T016", "description": "Reasoning extraction derives reasoning_content from legacy content when explicit reasoning_content is absent", "implemented": true, "featureIds": [ "F013", "F014" ] }, { "id": "T017", "description": "Response parsing prioritizes reasoning_content field over fallback reasoning field when both exist", "implemented": true, "featureIds": [ "F013" ] }, { "id": "T018", "description": "Response parsing falls back to reasoning field when reasoning_content is absent", "implemented": true, "featureIds": [ "F013" ] }, { "id": "T019", "description": "Assistant message appended during tool-call turn includes preserved reasoning_content", "implemented": true, "featureIds": [ "F014", "F015" ] }, { "id": "T020", "description": "Assistant message appended on final non-tool response includes preserved reasoning_content", "implemented": true, "featureIds": [ "F014" ] }, { "id": "T021", "description": "Non-stream completion path uses provider-resolved model/client for OpenRouter", "implemented": true, "featureIds": [ "F010" ] }, { "id": "T022", "description": "Non-stream completion path uses provider-resolved model/client for Vertex", "implemented": true, "featureIds": [ "F010" ] }, { "id": "T023", "description": "Completion requests preserve tool_choice:auto for both providers", "implemented": true, "featureIds": [ "F012" ] }, { "id": "T024", "description": "function_proposed response includes nextMessages/modelMessages with preserved reasoning context", "implemented": true, "featureIds": [ "F015" ] }, { "id": "T025", "description": "execute-after-approval continuation sends preserved assistant context and tool result before requesting follow-up completion", "implemented": true, "featureIds": [ "F016", "F026" ] }, { "id": "T026", "description": "Declined execution path preserves conversation consistency and returns assistant follow-up without executing endpoint", "implemented": true, "featureIds": [ "F016", "F026" ] }, { "id": "T027", "description": "handleExecute returns 400 for missing function call data", "implemented": true, "featureIds": [ "F026" ] }, { "id": "T028", "description": "Tool call identifiers remain stable between proposed call and function result replay", "implemented": true, "featureIds": [ "F016", "F026" ] }, { "id": "T029", "description": "Streaming route request validation accepts assistant reasoning_content", "implemented": true, "featureIds": [ "F008", "F017" ] }, { "id": "T030", "description": "Streaming route emits structured content-delta SSE events", "implemented": true, "featureIds": [ "F017", "F018" ] }, { "id": "T031", "description": "Streaming route emits structured reasoning-delta SSE events", "implemented": true, "featureIds": [ "F017", "F019" ] }, { "id": "T032", "description": "Streaming route emits function-proposal SSE event when model chooses tool call", "implemented": true, "featureIds": [ "F017", "F020" ] }, { "id": "T033", "description": "Streaming route emits terminal done event after successful completion", "implemented": true, "featureIds": [ "F021" ] }, { "id": "T034", "description": "Streaming route stops emission cleanly when request signal is aborted", "implemented": true, "featureIds": [ "F022" ] }, { "id": "T035", "description": "Streaming route returns 400 for malformed messages payload", "implemented": true, "featureIds": [ "F017" ] }, { "id": "T036", "description": "Streaming route preserves aiAssistant feature gating response semantics", "implemented": true, "featureIds": [ "F030" ] }, { "id": "T037", "description": "Streaming route preserves enterprise-edition gating response semantics", "implemented": true, "featureIds": [ "F030" ] }, { "id": "T038", "description": "SSE reader accumulates content tokens correctly from structured events", "implemented": true, "featureIds": [ "F023", "F024" ] }, { "id": "T039", "description": "SSE reader invokes onReasoning callback for reasoning events", "implemented": true, "featureIds": [ "F023", "F024" ] }, { "id": "T040", "description": "SSE reader invokes onToolCalls callback for function proposal events", "implemented": true, "featureIds": [ "F023", "F025" ] }, { "id": "T041", "description": "SSE reader stops and returns doneReceived=true on done event", "implemented": true, "featureIds": [ "F023" ] }, { "id": "T042", "description": "SSE reader ignores malformed JSON lines without crashing", "implemented": true, "featureIds": [ "F023", "F029" ] }, { "id": "T043", "description": "SSE reader cancels underlying reader when shouldContinue returns false", "implemented": true, "featureIds": [ "F022", "F023" ] }, { "id": "T044", "description": "Chat component updates in-progress reasoning state when reasoning stream events arrive", "implemented": true, "featureIds": [ "F024" ] }, { "id": "T045", "description": "Chat component sets pendingFunction when function proposal stream event arrives", "implemented": true, "featureIds": [ "F025" ] }, { "id": "T046", "description": "Approve action posts /api/chat/v1/execute with streamed functionCall metadata", "implemented": true, "featureIds": [ "F026" ] }, { "id": "T047", "description": "Decline action posts /api/chat/v1/execute with action=decline and keeps conversation usable", "implemented": true, "featureIds": [ "F026" ] }, { "id": "T048", "description": "Chat marks interrupted stream state correctly on stop/abort without false completion", "implemented": true, "featureIds": [ "F022", "F024", "F032" ] }, { "id": "T049", "description": "Quick Ask expanded chat path can receive streamed function proposal and complete approve->execute loop", "implemented": true, "featureIds": [ "F027" ] }, { "id": "T050", "description": "Right Sidebar chat path can receive streamed function proposal and complete approve->execute loop", "implemented": true, "featureIds": [ "F028" ] }, { "id": "T051", "description": "DB-backed happy path: approved function execution completes and persists final assistant message for the chat", "implemented": true, "featureIds": [ "F016", "F026", "F032" ] }, { "id": "T052", "description": "DB-backed guard path: declined or failed execution does not persist a false completed assistant message", "implemented": true, "featureIds": [ "F022", "F026", "F032" ] }, { "id": "T053", "description": "OpenRouter provider compatibility: streaming text-only responses still render correctly when no tool call occurs", "implemented": true, "featureIds": [ "F002", "F029" ] }, { "id": "T054", "description": "Vertex provider compatibility: reasoning+content streaming without tools still yields final assistant response", "implemented": true, "featureIds": [ "F004", "F019", "F024" ] }, { "id": "T055", "description": "Vertex preserved-thinking loop: second request after tool result includes prior assistant reasoning_content", "implemented": true, "featureIds": [ "F009", "F014", "F016" ] }, { "id": "T056", "description": "Unknown provider value falls back safely to OpenRouter behavior", "implemented": true, "featureIds": [ "F002" ] }, { "id": "T057", "description": "Env example documentation includes both provider setup blocks and required keys", "implemented": true, "featureIds": [ "F031" ] }, { "id": "T058", "description": "No migration required: chat persistence schema remains unchanged and existing read/write flows still pass", "implemented": true, "featureIds": [ "F032" ] } ]