If your operations dashboard reports health with a red, amber, or green dot, you have made a bet that every reader sees those colors the same way. The US National Eye Institute says "About 1 in 12 men have color vision deficiency." The dot gives those readers nothing to fall back on.
This is a standards question, not only a design preference. WCAG Success Criterion 1.4.1 requires that "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element." A bare status dot is color as the only means.
I build Team-X, an open-source, local-first desktop app for running AI-agent organizations. In v3.4.0 we rebuilt every surface of it on one status rule: state is a stencil word in a lamp tile (GO, HOLD, NO-GO, STBY, EXEC), and color is a second channel. Here is what that rule is built on, and where we got it wrong.
What do regulated industries do instead?
They assign color a job and then protect it. The US rule on flightcrew alerting, 14 CFR 25.1322, requires a convention: "Red for warning alert indications. (ii) Amber or yellow for caution alert indications." It also limits the spend: "Use of the colors red, amber, and yellow on the flight deck for functions other than flightcrew alerting must be limited and must not adversely affect flightcrew alerting."
Process industries worry about volume rather than hue. The UK Health and Safety Executive's COMAH guidance says: "The alarms should be processed in such a manner as to avoid operator overload at all times (alarm floods)." Both bodies reach the same operating principle. A signal channel is a scarce resource, and you do not give it away to decoration.
What does this look like in a product?
Three rules, all written down in the Team-X design system:
- Words carry state. The design system's rule is "Stencil words, not icons, for status." The color supports the word and never replaces it.
- Red has a form. Steady red means live. Blinking red means an unacknowledged warning that demands an answer. A failure nobody needs to acknowledge uses a separate steady NO-GO tone.
- No lamp without a signal. The checklist bans decorative LEDs, meters, and lamps. The alert rail derives five lamps (QUE, GGUF, BUDG, APPR, MTG) from real signals, and missing data resolves to a calm lamp.
I should be direct about one tension. The flight-deck rule assigns red to warnings, and Team-X spends steady red on "live". That regulation governs airplanes, not desktop software, but it means red carries two jobs here and only form separates them. If you copy this pattern, copy the discipline with it.
What did we get wrong?
Quite a lot, and the v3.4.0 changelog records it. A word does not rescue text on a bad surface, and contrast is where we slipped:
| Defect | Observed | Fix |
|---|---|---|
| Status text on the silver chassis, privacy provider list | About 1.9:1 contrast | Rendered as the recessed display well; AA restored in both themes |
| Muted text in always-dark displays, Day Shift theme | About 3.1:1 contrast | New token at about 5.9:1, applied at 24 sites |
| Employee status dot | Steady error used the blink-only red | Steady faults use the NO-GO token |
| Add Provider dialog | Escape did not close it | Keydown listener scoped to the open state |
The floor we missed is WCAG 1.4.3: "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, except for the following:" We are in common company. The 2026 WebAIM Million reports that "Low contrast text, below the WCAG 2 AA thresholds, was found on 83.9% of home pages, an increase from 79.1% in 2025."
Two limits belong in the record. At this release the privacy provider list still pairs a check icon with its word, which breaks our own no-icons rule. And the changelog lists the failures we found, not a clean bill for every screen.
What should an operations or product lead do?
- Audit your status columns for color-only encoding. Add the word next to every dot.
- Write each color's meaning as one sentence. If a color means two things, make the form differ and document it.
- Test contrast in every theme you ship. Both of our contrast failures were Day Shift failures, not dark-default ones.
- Separate settled failures from alerts that need an answer. They are different states and should not look alike.
- Add a regression guard. We now have a test that fails when a dialog lacks a description. Your equivalent will pay for itself the next time a sweep touches every screen.
The full argument, the token table, and the rail details are in the original post: Status is a word, not a color. The design rules are public in DESIGN.md at the v3.4.0 tag.
-Rocky
#TeamX #StatusDesign #Accessibility #EngineeringDreams #StrategiaX
Originally published on Team-X Blog.
