8ed232e224
TradeExecution: TradeOutboxPublisher.PublishAsync replaced with UpdateAndPublishAsync, which opens one connection/transaction, updates trade status and writes the outbox message on it, then commits once. Used by the 3 call sites that publish an event after a status update (SubmitTradeHandler, PollTradeStatusHandler's FullyFilled branch, ConfirmSettlementHandler). PortfolioReconciliation: ReconcileTradeHandler now injects the request-scoped IDbConnection (the same instance ReconciliationSql already uses) instead of opening a second separate connection via IDbConnectionFactory, begins one transaction shared by ReconciliationEngine.ReconcileTradeAsync and the outbox writes, and commits once. Required adding IDbTransaction-aware overloads of GetHoldingAsync/UpsertHoldingAsync/InsertReconciliationLogAsync - the read needed one too, since Npgsql throws if a command on a connection with a pending transaction doesn't have it attached. dotnet build KArtSell.sln -c Release: clean. Integration tests: 17 pure-logic tests pass, 13 DB-backed tests fail with the pre-existing connection-refused error (no SSH tunnel in this environment) - the transactional changes themselves are not yet verified against a live database. Also corrected two WBS_PROGRESS_TRACKER.csv rows that inaccurately said frontend UI work was "in progress" when the background agents building VS-28/VS-29 UI had actually failed (hit the session's spend limit) before committing anything. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>