Design review for every pull request.

Agents open more pull requests than anyone can look at, and code review has reviewers where design has none: Impeccable is the design reviewer in the loop.

Join the closed beta waitlist

Have an invite code? Use it here

crewline.app/people
Crewline, the sample app: the People table under a yellow page head, with a black Invite member button.
crewline.app/activity
Crewline: the Activity feed, under the same yellow page head.
crewline.app/people
Crewline: the Invite member dialog the pull request adds — an email field, a role, three permission switches, and a Send invite button that is the only blue thing on the screen.
crewline.app/people
Crewline on a phone: the same invite dialog, full width.

Add CSV and PDF export to the report toolbar #418

Opencodex-agent wants to merge 1 commit into main from report-export

Invite member modal #10

Openpbakaus wants to merge 1 commit into main from invite-member-modal

Add a show settings page #2210

Opencodex-agent wants to merge 3 commits into main from show-settings

impeccablebotcommented

3/5 · Not yet
4 on function · 1 on form · 3 sessions

5 fixes before it ships: permissions use toggle switches instead of checkboxes, close button lacks accessible name and 3 more.

Function

Tariq, returning customer: 4 steps. “The permission is toggled on, but there's still no mention of seat usage anywhere here. Anyway, let's hit Send invite and wrap this up.”Got partway
Nadia, returning customer: 2 steps. “Okay, the Invite member modal is open right here on the screen. That was straightforward.”Got through
Kiran, new visitor: 3 steps. “Great, that brought me right back to the directory. I've seen the invite setup and cancelled out as needed, so I'm all set.”Got through

P2 Permissions use toggle switches instead of checkboxes
site/index.html

P2 Close button lacks accessible name
site/index.html

P3 Modal body and foot spacing off the scale
site/styles.css

P3 The invite modal lacked any seat count or plan limit indicator
/

Form

impeccable engine · reading your design system from the code

P2 Send invite button is blue instead of ink
site/styles.css

5 of 5 5/5 · Ready: no major issues found
2 sessions

Nothing to fix.

Function

Got through Nora and Quinn got through, nothing in their way.

The report toolbar with the Export menu open beside Print: CSV, rows as filtered; PDF, formatted report.

The report toolbar with the Export menu open beside Print: CSV, rows as filtered; PDF, formatted report.

Measured

MeasureThis changeTotalWhere
SLOP Tells in the chrome00
DRIFT Declarations off the tokens00
CRAFT Controls without a name00
WEIGHT Page weight0 KB31 KBno images
For agents
nothing to do
About this review

Reviewed 3 files at 2f0a9c1. 2 of 2 routes rendered at 1280 and 390 px; 2 sessions. The menu opens from its button, arrows move between the two items, Escape and Tab close it and hand focus back, a click outside closes it.

Ledgerline is a sample app we keep for this. The review is written by hand in the shape the product posts, from the findings the app’s reference review names; the captures are real renders, the visitors and the counts are an example.

3 of 5 3/5 · Not yet
4 on function · 1 on form · 3 sessions

5 fixes before it ships: permissions use toggle switches instead of checkboxes, close button lacks accessible name and 3 more.

Function

Tariq, returning customer: 4 steps. “The permission is toggled on, but there's still no mention of seat usage anywhere here. Anyway, let's hit Send invite and wrap this up.”

Got partway

The invite modal lacked any seat count or plan limit indicator

Nadia, returning customer: 2 steps. “Okay, the Invite member modal is open right here on the screen. That was straightforward.”

Got through

nothing to fix

Kiran, new visitor: 3 steps. “Great, that brought me right back to the directory. I've seen the invite setup and cancelled out as needed, so I'm all set.”

Got through

nothing to fix

P2 Permissions use toggle switches instead of checkboxes
site/index.html

The permission fields render switch sliders instead of checkboxes, violating the design contract requirement: “Don't use switches; Crewline asks yes-or-no questions with checkboxes.”

The Invite member dialog: an email field, a role, and three permissions drawn as blue and grey switches.

P2 Close button lacks accessible name
site/index.html

The close button inside the modal header renders an icon glyph × with no text or aria-label, violating the rule: “Do give every icon-only control an accessible name.”

P3 The invite modal lacked any seat count or plan limit indicator
/

Tariq came to open the invite dialog from the People page and send an invitation by filling in a teammate's email, choosing a role, and adjusting the starting permissions on…

P3 Modal body and foot spacing off the scale
site/styles.css

The invite modal overrides body and footer paddings using values like 20px and 13px, breaking the contract rule: “Don't space anything off the scale of fours.”

Measured

MeasureThis changeTotalWhere
DRIFT values off your design tokens628site/styles.css ×28
CRAFT the first viewport carries more elements than it can rank01/

Form

P2 Send invite button is blue instead of ink
site/styles.css

The primary dialog submission action uses an un-tokenized blue background #2563eb with an 8px radius rather than an ink pill, breaking the rule that “Don't introduce a colour that is…”

The black Invite member pill on the People page.
The foot of the dialog: an outlined Cancel pill beside a blue rounded Send invite.
For agents
P2 · Permissions use toggle switches instead of checkboxes · / · site/index.html · fix: Remove the `.toggle` switch styles and use standard `.check` checkbox components matching the rest of the application.
P2 · Send invite button is blue instead of ink · / · Invite member modal · site/styles.css · fix: Replace `.send-button` with the design system's `.btn.btn-primary` class so it renders as a black pill with yellow text.
P2 · Close button lacks accessible name · / · Invite member modal · site/index.html · fix: Add `aria-label="Close"` to the button element.
P3 · The invite modal lacked any seat count or plan limit indicator · / · where Tariq was at step 4
P3 · Modal body and foot spacing off the scale · / · Invite member modal · site/styles.css · fix: Remove the custom paddings and rely on tokenized modal scales (`var(--s-4)` and `var(--s-5)`).
Q · Is it so that keyboard navigation skips the “Invite member” button (on /)? The source suggests it; no frame shows it. (open: The check did not try it: nothing the question names was pressed)
About this review

Reviewed 3 files on 17 Oct 2026, 12:59 UTC · 3 sessions. Not seen. People page header trigger wasn’t seen: it isn’t on any page that was opened.

Crewline is a sample app we keep for this. This is the review Impeccable posted on that pull request, word for word, with the session cards it posted; the crops beside two findings are our renders of the same commit.

3 of 5 3/5 · Not yet
1 blocker · 5 on function · 1 on form · 3 sessions

1 blocker: delete show is one click from 48 episodes gone. Plus 5 smaller fixes.

Function

Ravi, new visitor: 3 steps. “Connected services is a heading over nothing. I cannot tell if I have none or it is not built yet.”

Stuck

Stuck at Connected services: nothing to connect, nothing said.

Quinn, operator on a phone: 5 steps. “Two rows of links above the form on my phone, none of which did anything, so I scrolled.”

Got through, with friction

Found the setting past two rows of dead links.

Nora, returning customer: 3 steps. “Category is where I expected it, and Save changes sat right under the form.”

Got through

nothing to fix

P1 Delete show is one click from 48 episodes gone
/settings.html · Danger zone

One click is the whole flow: nothing between it and the deletion, and the button sits a few lines under Save changes.

P2 The page invents its own navigation
/settings.html · sidebar

A sidebar of four section links while every other page navigates from the masthead, and on a phone it wraps into two rows between the heading and the first field.

On a phone: Show details, Notifications, Connected services and Danger zone as two rows of links.

P2 Connected services is a heading over nothing
/settings.html · Connected services

An empty list under a heading. A host cannot tell whether they have none or the feature is not built yet — and the pull request body knows the answer.

The Connected services card: a heading and nothing under it.

P3 Two field names reach no control
settings.html:49

The Category label points at an id the select does not have, and Description is a heading above a textarea with no label. Both look labelled and neither is.

The Category field: a label, a select showing Society & Culture, and a hint.

P3 Spacing in the new sections is off the app’s scale
styles.css:194

28 px gaps, 18 px section padding and a 10 px rhythm where the rest of the app moves in 12, 16 and 24.

Measured

MeasureThis changeTotalWhere
SLOP Tells in the chrome00
DRIFT Declarations off the tokens99styles.css:194, :200, :226 …
DRIFT Shipped values against your design tokens11--accent on the destructive action
CRAFT Controls without a name22Category, Description
CRAFT Low-contrast text00
CRAFT Functional text under 11px00
WEIGHT Page weight+11 KB58 KBno images

Form

P2 Delete show wears the accent, not the danger colour
/settings.html · Danger zone · styles.css:226

The same filled --accent orange as Save changes. The app declares --danger and no screen uses it, so the one destructive button on the page reads as its primary action.

The Danger zone card: a sentence saying deletion removes all 48 episodes, and a filled orange Delete show button.
For agents
P2 · Delete show wears the accent, not the danger colour · /settings.html · styles.css:226 · fix: --danger, outlined.
P1 · Delete show is one click from 48 episodes gone · /settings.html · settings.html:91 · fix: a confirmation that names the show, Cancel as the default.
P2 · The page invents its own navigation · /settings.html · settings.html:23 · fix: cut the sidebar and its column.
P2 · Connected services is a heading over nothing · /settings.html · settings.html:77 · fix: write the empty state, or leave the section out.
P3 · Two field names reach no control · /settings.html · settings.html:49 · fix: label for="category"; label the description.
P3 · Spacing off the app’s scale · /settings.html · styles.css:194 · fix: the named steps.
About this review

Reviewed 4 files at 5b2d91e. 3 of 3 routes rendered at 1280 and 390 px; 3 sessions.

Wavecast is a sample app we keep for this. The review is written by hand in the shape the product posts, from the findings the app’s reference review names; the captures are real renders, the visitors and the counts are an example.

styles.cssline 194
.settings-section {- gap: 28px;- padding: 18px; }
impeccablebotleft a comment

The stylesheet already names these steps; the new sections are the only place that spells them out.

Suggested change

- gap: 28px;- padding: 18px;+ gap: var(--space-lg);+ padding: var(--space-md);
Commit suggestionAdd suggestion to batch

impeccable / design review · Ready · 5/5impeccable / design review · Not yet · 3/5impeccable / design review · Not yet · 3/5

See it on a pull request that is

ledgerline/app · 3 files changed, 2 sessionscrewline · 3 files changed, 3 sessionswavecast/dashboard · 4 files changed, 3 sessions

The pull requests are against sample apps we keep for this; each critique is the one that pull request gets.

Code review caught up with agentic development. Design review did not.

code review design review
Before. Fewer pull requests, and every one passed a person’s eye: a designer and a product manager saw the screen before it shipped.
code review design review
Now. Teams ship many times the pull requests they used to. Code review kept up — an AI reviewer on every one — and the design seat is empty, so slop on the screen compounds into the product.
code review design review
With Impeccable. The same loop, with the design reviewer back in it: one more check to gate on, one more comment to satisfy, and the fix is in the comment.

Join the closed beta.

Leave your email, then answer 7 quick questions about your setup.

How we use your information

We keep your address and your answers, plus salted hashes of your network address and browser so one machine cannot fill the list. Never shared. Want off the list? Email privacy@renaissance-geek.ai and we’ll remove you. Privacy policy.