A model request fails, a red toast disappears, and keyboard focus remains on a disabled Send button. The interface has technically reported an error while giving the user no understandable next action.
Provider status should inform this design without becoming UI certainty. OpenAI records a July 25 incident starting at 09:17:49 UTC, mitigation monitoring at 10:02:52, and resolution at 11:08:36. A new incident started at 11:35:24; at research time, it was identified with elevated errors and mitigation in progress. The official page showed Partial System Degradation. That snapshot cannot justify claims about cause, global impact, user totals, or the later incident's final recovery.
Give degradation its own state
Do not overload loading and error. This unexecuted TypeScript model keeps the user's draft separate from remote status:
type RequestState =
| { kind: 'editing'; draft: string }
| { kind: 'sending'; draft: string; attemptId: string }
| { kind: 'outcome_unknown'; draft: string; attemptId: string }
| { kind: 'degraded'; draft: string; reason: 'local' | 'provider_signal' }
| { kind: 'ready_to_switch'; draft: string; reviewed: boolean };
An unknown outcome is not a failed outcome. Preserve the editable text, request identifier, attachments list, and timestamp locally according to the product's privacy policy. Never clear the composer on submission alone.
Semantic structure before decoration
This markup is a proposed pattern, not a tested accessibility result:
<section aria-labelledby="service-state-title">
<h2 id="service-state-title">AI service is degraded</h2>
<p id="service-state-detail">
Your draft is saved on this device. The previous request may still complete.
</p>
<button type="button">Check this request</button>
<button type="button">Review another provider</button>
</section>
<p role="status" aria-live="polite" id="request-updates"></p>
Move focus only when the user's current control disappears or continuing would be unsafe. A background status refresh belongs in the polite live region; repeating the entire incident message every poll creates noise. Keep the status heading in document order so screen-reader and magnification users can find it without interruption.
The fallback control should say “Review another provider,” not “Continue safely.” Multi-provider fallback has semantic risks: models may change meaning, tool behavior, formatting, or safety behavior. Before switching, show what data will be resent, whether context transfers, what capabilities differ, and whether the old attempt could still finish.
| Transition | Visual | Announcement | Keyboard action |
|---|---|---|---|
| sending → unknown | persistent inline panel | outcome is unknown | Check request |
| unknown → degraded | status badge plus details | service signal changed | keep current focus |
| degraded → review | comparison disclosure | provider choice opened | focus dialog heading |
| review → editing | preserved draft | no request sent | return to trigger |
A QA pass should cover keyboard-only navigation, zoom, reduced motion, forced colors, and at least one screen-reader/browser pair with versions recorded. Those are proposed checks; no conformance claim or assistive-technology test was performed here.
Offer choices without overselling them
For developers seeking another environment, the overseas MonkeyCode hosted page currently says “Start free.” Its official README describes managed server-side cloud environments offering build, test, and preview with integrated models. Present it as free to start, with current model/server quotas, regions, and uptime or SLA terms checked in the console rather than frozen into interface copy.
The official MonkeyCode GitHub repository is AGPL-3.0 open source. The README at reviewed main commit 18baaf54937a65a7d47f1f9d83dd808777aa6cea describes built-in development environment, model, task, and requirement management. In an exit panel, I would distinguish “try hosted” from “inspect or self-host source.” Neither option guarantees outage protection, and hosted MonkeyCode reliability was not tested.
This recommendation belongs after preserving the user's work and explaining uncertainty. A provider link is not a recovery experience; retained drafts, honest states, and pointer-independent controls are.
Disclosure: I'm a MonkeyCode user sharing my own experience, not affiliated with the project.
AI assistance disclosure: This article was drafted with AI assistance and reviewed against the cited primary sources.
Top comments (0)