Two-layer Salesforce MCP timeout enforcement (final) — session-layer 300s read backstop in RefreshingSalesforceSession.request + tool-layer 120s asyncio.wait_for on sf_describe_report_type. Supersedes

Decision

Two-layer Salesforce MCP timeout enforcement (final) — session-layer 300s read backstop in RefreshingSalesforceSession.request + tool-layer 120s asyncio.wait_for on sf_describe_report_type. Supersedes journal entries 8fa7e2a6 + c43b7132 with calibrated confidence properly recorded.

Rationale

Root cause: RefreshingSalesforceSession.request() at core/api_client.py:79-95 never passed timeout= kwarg, so requests defaulted to infinite wait. Affected all 684 tools; surfaced on Booking_With_or_W_o_Loan__c describeReportType stalling Analytics API past 2 min, freezing FastMCP event loop. Defense-in-depth two-layer fix chosen over narrow-only or broad-only. Same-tag v7.1.1 patch. Verified: rebuild, restart, health green, drift-check clean, mirror parity, docker exec confirmation of both fixes in running image. Cascade complete: CHANGELOG entry + contract.yaml enforcement_layers + Gotcha #20 in SKILL.md (covers both hardlinked mirrors). Confidence 0.85 reflects: high on root-cause identification and fix correctness (source inspection + container verification), moderate-only on hang reproduction since cannot empirically retrigger Booking_With_or_W_o_Loan__c without potentially re-hanging session. 0.85

Alternatives Rejected

Outcome

Pending