0% 5h quota used · resets in 2h live · 08/09/2026 12:04 CEST

`DirectoryApiClient` upstream timeout — a graceful-degrade fix was already rejected in review, and the failure keeps growing unaddressed

Entry OS-004 in Global's register.

decision open open 6d opened by _global:sentry-triage (run 2026-09-02T04-00-00-3fe0bc) Selectra-Dev/cms

Reply to the Google Chat message — any wording. A model reads it, and tn:decisions-answer writes it down.

What is failing. App\Directory\DirectoryApiClient::fetch() calls cities-api.app.production.aws.selectra.io with no rescue()/try-catch around the HTTP call. A connection timeout throws ConnectionException before a Response exists, so it escapes uncaught and 500s every directory page on every site that uses this shared client. Two shortIds, same file, same root cause, different sites:

shortId events (this run) site / route
CMS-8K 883 (was 582 on 2026-07-29, 241 on 2026-07-02) companiadeluz.es, comparadorluz.com, mercato-libero.it, tarifasgasluz.com, tarifasdeagua.es, and the Spain-energy/Italy-telecom/Portugal-* directory pages generally
CMS-112 716 at last triage 2026-08-12, not re-checked this run tarifasdeagua.es, /oficinas/{province}/{city}

Why this is a decision, not a routine fix. A fix already shipped once — rescue(fn () => ..., null), reporting to Sentry by default, exactly the shape memory/review-feedback.md says is normally acceptable — and a human reviewer (@aurian) reverted it anyway: "hiding the upstream timeout behind a clean null degrade removes the only signal that cities-api is failing. Leaving this unhandled so it surfaces (Sentry / 500) is the correct behavior here." (PR #8898, 2026-07-14). That is a considered call that a 500 is the intended signal for this specific client, not an oversight — so a triage run cannot apply the review-feedback rule's normal "rescue() that still reports is fine" reading here; it was tried and explicitly rejected for this call site.

Why it is coming to you now instead of staying a REPORT row. This has been re-classified REPORT at every triage since 2026-07-02 (five runs) with no design proposed and no GitHub issue opened — the event count has grown 3.7x in that time (241 → 883) with nothing to show a human ever saw it outside a journal entry that scrolls away. That is precisely the failure this register exists to stop.

What is being asked. Whether cities-api going down should keep 500ing directory pages indefinitely (current behavior, deliberately preserved by the revert), or whether there is an acceptable middle design — e.g. a distinct "upstream degraded" response/status that is visibly different from a normal 200 (so it can't be mistaken for "working") but doesn't crash the request, or an uptime/alerting hook outside Sentry-issue-count that would let a graceful fallback stay actionable. Sizing that trade-off is exactly the human judgment call PR #8898 asked for and never got a follow-up design for.


Resolved

Bookkeeping

Opened
2026-09-02
Announced
2026-09-02
Register
countries/_global/decisions.md
Overdue after
30 days
Reminded every
7 days