Accessibility is not a phase
Accessibility is not a phase, and it is not an audit you book before launch. It is a set of small properties that are cheap to hold continuously and expensive to retrofit. Three of ours, and how each one is actually enforced.
Colour comes first because it is the easiest to get right and the easiest to lose. Every colour in the app is a token carrying both a light and a dark value, and there is no way to declare only one of them. That does not guarantee contrast on its own, but it removes the failure where a colour was chosen against one background and later read against the other.
Motion is second. Five motion tokens, three of them carrying a reduced-motion substitute in the same object, so the preference is answered at the token rather than at every call site. The other two, the header fade and the sheet settle, do not carry one yet. Our features page taught us the limit of that approach: scroll-linked scenes, where the reader controls every frame, were exempted for a long time on the argument that nothing autoplays. That argument was excusing a word growing to fill the screen and a camera dolly of 1520 pixels. Controlling the rate of a zoom is not the same as not being zoomed. Those scenes now cut and crossfade, and every word, state and image is still reachable by scrolling.
The third one is the one we like best, because it has no visual symptom at all.
A list row that looks tappable across its whole width often is not. If the tappable label is a horizontal stack with a spacer in it, and nothing sets an explicit hit shape, the row only receives taps on the pixels its text and icon actually cover. The gap between them, which is most of the row, is dead. It looks perfect in a screenshot and it feels broken in the hand. It survived in two of our profile hub's four rows until somebody reported it, and no amount of design review would have caught it, because design review looks at pictures.
So it is a check that runs over the source: if a tappable label contains a stack with a spacer, something inside it has to declare a hit shape. Deliberate exceptions carry a comment saying so. This is not a style opinion. The row already looks tappable across its width, and the rule is simply that the hit area has to match what the design has already promised.
That is the pattern for all three. Find the property, make it structurally hard to violate rather than a thing to remember, and where you cannot do that, make a machine check it. The alternative is a list of good intentions and an audit at the end, which finds a hundred instances of five mistakes and fixes none of the causes.