Second `louisTabular` agent deployed; tabular review chat wired to AgentCore
dropthejase adds a purpose-built `louisTabular` AgentCore agent for tabular review chat and works through the resulting bug cluster: jsonb string parsing across multiple routes, Bedrock client singleton fix, UUID cast on the document IN-query, citation schema fixes, and a revert of a retry mechanism that created stale UI. There's also a useful negative result: naive cross-endpoint retry on 500s causes stale state, not safety.
The two-agent architecture (louisMain for general chat, louisTabular for tabular review) keeps tool surfaces tight. The tabular agent has a single tool: read_table_cells, with the same ownership guard as the main agent. System prompt is built per-request with review title, column manifest, and document list.
The bug cluster after wiring is instructive. columns_config comes back from Aurora as a jsonb string and needs JSON.parse before use in the generation endpoint (66a5cec). The Bedrock client was being re-instantiated on every call; 66a5cec adds a module-level singleton (let _client: BedrockRuntimeClient | null = null). UUID casts on the document IN-query (::uuid on numbered params) appear in multiple places across the tabular route - same class of bug as the main Aurora migration, just showing up later.
The shared_with and columns_config parse-on-read pattern lands in GET and PATCH tabular review responses (6e5b266, 8a09da7), in workflow responses (714bcbd), and in mapTRMessages for the frontend (8c7e740). Each requires the same three-way check: typeof x === 'string' ? JSON.parse(x) : (x ?? []).
The retry attempt and revert are worth noting. 54fd7a3 adds a doRequest wrapper that retries once after 1.5 seconds on HTTP 500. 720650f reverts it immediately with the explanation that retrying idempotent and non-idempotent endpoints uniformly produces stale UI in unrelated parts of the app. The right fix was a resolve-batch endpoint (1fede12c) that reads S3 once, applies all bulk accept/reject operations in memory, and writes once - removing the race condition at the source.
Tabular chat storage migrates from Aurora to S3 in 29b80f4, matching the main agent's session persistence approach. Short-lived tabular chat turns stored in a relational DB were a mismatch to start with.
Spotted something wrong? Or know the PR text has fresher detail than the writeup above?