Follow-up to the 2026-10-18 architecture audit, linked to PAR-449 and the completed architecture rebuild PAR-408. Rules are in docs/architecture.md. Audit baseline: commit 08d99ee; all 18 architecture checks passed, which does not establish full compliance.
Evidence: triage/ai/DecideInstruction.java:120,137 calls AiGateway.complete inline. triage/TriageFacade.decide explicitly uses Propagation.NOT_SUPPORTED to avoid holding a database connection while waiting. Rule 19 currently states that OpenAI calls go through transactional outbox rows. The synchronous assistant behavior and the written rule disagree.
Acceptance:
Rían explicitly approved the synchronous inference exception: synchronous inference and read-only vendor lookups may run outside database transactions; durable effects of committed mutations must use the transactional outbox. The implementation preserves the existing triage request-response interaction, suspends ranked-search transactions, guards provider calls against active transactions, and configures bounded timeouts with SDK retries disabled.
Implemented in stacked PR #117, based on the preceding architecture layer. Cumulative verification at 46d7c31: 1,334 backend tests, 1,230 web unit tests and 480 Chromium story tests passed; lint, typecheck, API drift and production build/CSS checks passed. The complete story suite passed on the CI-prescribed retry after the known PAR-443 iframe import flake. Diagram uploaded and PR base/head verified. Awaiting review; not merged.
Merged PR #117 into main after all eight stack PRs passed CI. Merge commits preserved dependency ancestry; every layer's retargeted diff and exact head were verified. The full stack head 46d7c31 is now an ancestor of main at b5d5ef5. Marked Done. The separate tenant-index clarification remains tracked in PAR-495.
Rían explicitly approved keeping synchronous inference and read-only vendor lookups outside database transactions; committed post-mutation effects remain transactional-outbox work. Implementing that decision as layer 2, above PAR-473, with a transaction guard at the inference/lookup boundary and regression tests. No pending-job UI is needed.