Review team

Catch accessibility and design slips on changed screens

When a task changes what users see, TLM Forge adds a reviewer for the screens. It looks for buttons a screen reader cannot name, missing empty or error states, and broken platform rules. Each issue comes with the file, the line and a fix.

  • How it startsLaunched by the pipeline
  • Runs onMedium and Deep work that changes screens
A component file, src/SavedCards.tsx, with the line "<TrashIcon />" inside a delete button highlighted, and a dotted line to a TLM Forge terminal running the Stage 5 review wave: the diff has UI files, so ux-reviewer joins. It reports a CRITICAL at line 25, "icon button has no name", a HIGH at line 24, "delete has no undo", a MEDIUM at line 20, "no empty state", and VERDICT: NEEDS REVISION. A lifted card reads: the delete button is only <TrashIcon />; a screen reader just says "button", so no one knows it removes a card. Source src/SavedCards.tsx, line 25.

How to use it

You never start it yourself. On Medium and Deep tasks, /tlmforge:build adds it to plan review (Stage 3) if the plan includes screens, and to the final review (Stage 5) if the changed files include UI code. If, at the final review, it is unclear whether the changed files touch UI, TLM Forge leaves it out.

Words you will see on this page

UI
User interface: the screens, buttons and text people see.
Accessibility
Making the app usable for everyone, including people who use screen readers or larger text.
Screen reader
Software that reads the screen aloud for people who cannot see it well.
WCAG AA
A common accessibility standard; for web text it asks for at least 4.5:1 contrast.
Empty state
What a screen shows when there is no data yet.
Plan review and final review
The two review points: when the plan is checked, in the background as the build starts (Stage 3), and after the code is built and tested (Stage 5).

What it looks for

What it looks forAn example of what it catches
Buttons with no nameA trash icon button that a screen reader reads only as "button".
Deletes with no way backRemoving a saved card with no undo and no confirm step.
Missing empty statesA card list that shows a blank area when there are no cards.
Hard-to-read textWeb text below 4.5:1 contrast with its background.
Layouts that break on small screensA form that works on desktop but overflows at phone width.
Unlabelled form fieldsAn input with no label and no inline error message.
Small tap targets (Android)A button smaller than 48dp, hard to hit with a thumb.
Text that does not scaleText that clips at 200% font size on Android, or ignores Dynamic Type on iOS.

When it runs

LevelWhat the task isDoes this reviewer run?
LightA tiny change you can read in ten seconds, like a typo, a rename or a config valueNo. Claude makes the change directly, test first, with no review agents.
MediumFixing or improving something that already exists, with nothing new for usersOnly if screens change: at plan review if the plan includes UI, and at final review if the changed files include UI code.
DeepSomething new (a feature, screen, endpoint or integration), or anything that changes how the system makes security decisionsSame as Medium: only when screens change.

What it does

Functional tests rarely notice that an icon button has no name, that error text is too faint to read, or that a list has nothing to show when empty. This reviewer looks for exactly that. It only joins when your work touches screens. TLM Forge spots UI changes by file type and folder, such as .tsx, .vue, .html, .css or Android layout files.

Its checklist depends on the platform. Web: phone, tablet and desktop widths, labelled form fields, loading and empty states, readable contrast. Android: Material 3 parts, large enough tap targets, the back button, text at 200% size. iOS: navigation, Dynamic Type, safe areas and sheets. Everywhere: clear hierarchy, feedback, undo or confirm before deleting, screen reader labels, keyboard use and reduced motion.

In the final review it looks only at the screens this feature changed, not your whole app. Every issue goes in a table with the part, the file and line, the problem, how serious it is, and the fix. It is not allowed to stay silent: if all is well, it must list the files it checked and say so.

How it works, step by step

  1. TLM Forge checks for screen changes

    At plan review it checks whether the plan includes screens. At final review it checks the changed files for UI code.

  2. It reads your design rules first

    It reads the UI files, theme files and any design notes, so it judges your screens by your app's own style.

  3. It runs the platform checklist

    Web, Android or iOS rules first, then checks that apply everywhere: hierarchy, feedback, accessibility and wording.

  4. It writes the table and a verdict

    One row per issue, with file, line and fix. The verdict is APPROVE, NEEDS REVISION or REJECT.

  5. Serious issues get fixed

    In the final review, CRITICAL and HIGH issues are fixed, each with a failing test written first. Smaller ones go on a list of known leftovers for you.

What it looks like

The table this reviewer must write, then its verdict. Each row is one problem: which part of the screen, where in the code, what is wrong, how serious it is, and the fix. The format is real; the content is made up for illustration.

| Component | File:line | Issue | Severity | Fix |
|---|---|---|---|---|
| DeleteButton | SavedCards.tsx:25 | icon-only button, no accessible name | CRITICAL | add aria-label="Remove card" |
| DeleteButton | SavedCards.tsx:24 | destructive action, no undo or confirm | HIGH | show an undo toast |
| CardList | SavedCards.tsx:20 | no empty state for zero cards | MEDIUM | add a message and an Add card button |

## VERDICT: NEEDS REVISION

## Accessibility Issues
- SavedCards.tsx:25 icon has no label (WCAG 2.1 AA, name and role)

Why it is better

Only when screens change

Without TLM Forge, you either review every change for UX or none. With it, a backend-only change skips this review, and a detected screen change gets one.

Checks you can verify

Without clear rules, UX feedback is often a matter of taste. With it, many checks have concrete bars, such as 4.5:1 text contrast on the web and 48dp tap targets on Android.

No silent passes

Without a rule, an empty review can look like a clean one. With it, the reviewer must write its table or list the files it checked, and a missing result counts as a CRITICAL.

Good to know

  • Its instructions have it read code, theme and design files, not open the running app. On Deep work, a later step (live verification) checks the running feature. Medium work has no live verification step.
  • In the final review it only checks the screens this feature changed, not the rest of your app.
  • If, at the final review, TLM Forge cannot tell whether the changed files touch UI, it skips this reviewer. A UI change in an unusual file type may not trigger it.
  • It does not run on Light work, which uses no review agents.

Related features