Survey-only pass across the authenticated paliad surface as test admin
on Playwright at 1280×900 + 375 mobile spot-checks + DE/EN toggle.
Top 10 (best value-per-effort):
1. Strip "Hogan Lovells"/"HL" from public surface (landing, downloads)
2. Pick lime as the single primary green; retire forest-green
3. "Projekt archivieren" red → neutral (reversible, not destructive)
4. /admin/team search input has overlapping placeholder text (visible bug)
5. fristen.field.project.choose raw i18n key on /deadlines/new
6. Activity log leaks project_type_changed + "Type case → litigation"
7. lang="de" on date and time inputs (mm/dd/yyyy + 09:00 AM in DE UI)
8. "Akte" → "Projekt" residue on /deadlines + /appointments
9. Office values lowercased no-umlaut on /projects/{id}/team
10. Project tabs use href="#" — middle-click broken
Plus 40 other findings ranked by severity (broken/friction/polish) and
effort (≤30min/1-2h/half-day+). Suggested 5-PR batching.
41 screenshots in tests/screenshots-polish-2026-04-27/ covering every
sidebar entry + project detail tabs + DE/EN + mobile.
No code changes. Implementation tasks dispatched separately by head.
24 KiB
Paliad Polish Audit — 2026-04-27
Scope: survey-only. Find high-value, low-risk UX improvements across the authenticated paliad surface. No fixes in this doc — head dispatches implementation tasks separately.
Method: Playwright headless against https://paliad.de, logged in as
tester@hlc.de (admin, Munich, DE), captures at 1280×900 (desktop primary),
spot-checks at 375×900 (mobile) and DE/EN toggle. 41 screenshots in
tests/screenshots-polish-2026-04-27/.
Bias: what would a HLC patent lawyer notice on Monday morning? Spacing, copy, brand, i18n leaks, stale firm names, English in DE narrative, and broken-feeling defaults. Architectural changes, perf, new features — out of scope.
Severity legend: 🔴 broken / 🟠 friction / 🟡 polish.
Effort legend: 🟢 ≤30min / 🟡 1–2h / 🔴 half-day+.
Scope: BATCH = bundle as one PR with siblings; STANDALONE = own task;
DEFER = mention but don't ship now.
Findings
🔴 Broken — visible bugs / data-incorrect / leaking implementation
F-01 — Marketing landing still says "Hogan Lovells", page title same 🟢 STANDALONE
The hero on / reads "Patent Knowledge for Hogan Lovells" and the subtitle
"Guides, templates, and documents for the HL patent team." The browser tab
title is "Paliad — Patent Knowledge for Hogan Lovells". Per CLAUDE.md the
firm rebranded to HLC on 2026-04-16; this is the first thing colleagues
see. Same stale firm reference on /downloads ("HL Patents Style", "für das
HL Patent-Team"). Screens: 34-landing.png, 25-downloads.png.
F-02 — /admin/team search input has overlapping placeholder text 🟢 STANDALONE
The search box visibly renders two pieces of placeholder copy on top of
each other: "Nach Name oder E-Mail" + "suche". Reproducible at desktop
and mobile. Looks like a data-i18n-placeholder doubled with another
attribute. Screens: 30-admin-team.png, 36-admin-team-mobile.png.
F-03 — /api/departments?include=members returns 500 on /team 🟡 STANDALONE
Console error every time /team loads as the test admin. Page falls back
to /api/users so it still renders, but the dept-grouped toggle uses the
500'd endpoint. Smoke 2026-04-25 reported the same error class; t-paliad-037
claimed to fix it via INNER JOIN. Either a regression or a different code
path. Worth a fresh look. Screens: 03-team-1280.png + console log.
F-04 — /deadlines/new shows raw i18n key in the project picker 🟢 STANDALONE
The default option text in the Akte <select> is literally
fristen.field.project.choose. t-paliad-037 fixed fristen.filter.project.all
but missed .choose. Add the key DE+EN, done. Screen: 16-deadline-new.png.
F-05 — Date pickers show US mm/dd/yyyy in German UI 🟢 STANDALONE
/deadlines/new Fälligkeitsdatum field, /appointments Von/Bis filters,
and inline date inputs across the app render mm/dd/yyyy placeholder text
even though the user's lang is de. Native <input type="date"> follows
the browser locale, not the page's lang attribute. Fix: set lang="de"
on the input element (or render the date in a labelled wrapper). The
output dates everywhere are correctly 27.04.2026 — only inputs are wrong.
Screens: 16-deadline-new.png, 17-appointments-list.png.
F-06 — Time pickers show 12-hour 09:00 AM / 04:00 PM in DE Settings 🟢 STANDALONE
/settings?tab=benachrichtigungen reminder time fields render in 12h format
with English AM/PM. Same root cause as F-05: native <input type="time">.
Set lang="de" on the inputs to force 24h. Screen: 28-settings-notifications.png.
F-07 — Activity log leaks raw English event types 🟡 STANDALONE Dashboard "Letzte Aktivität" includes:
- "Test Tester project_type_changed" — raw English event slug instead of a translated verb.
- "Type case → litigation" — raw English values inside German narrative.
- "Note zu deadline hinzugefügt" and "Deadline „Foo" geändert" — English
nouns ("Note", "Deadline") inside German prose; should be "Notiz" / "Frist".
Same class as Bug 4 from the 2026-04-25 smoke audit but for events shipped
in t-paliad-056 and the polymorphic notes. Add the missing
dashboard.action.project_type_changed, render dynamic value in the description (translated), and switch the noun. Screens:01-dashboard-1280-viewport.png,06-project-detail-1280.png.
F-08 — Project tabs use href="#" (or …/history#) 🟡 BATCH
Every tab on /projects/{id} (Verlauf/Team/Untergeordnet/Parteien/Fristen/
Termine/Notizen/Checklisten) is a JS-only navigation: middle-click and
"open in new tab" don't work. The URL does update via history.replaceState
when you click them, so the routes are real (/projects/{id}/team,
/projects/{id}/parties, etc.) — the anchors just aren't pointing at them.
Wire the real path into href and let the click handler preventDefault for
the SPA flow. Screens: 06-project-detail-1280.png, 07-project-team-1280.png.
F-09 — ?view=tree URL parameter is silently ignored on /projects 🟢 STANDALONE
Visiting https://paliad.de/projects?view=tree shows the flat list with the
"Ansicht" dropdown set to "Flache Liste". The ?view= query param has no SSR
effect. Bookmarks, dashboard links, and shareable filtered views don't work.
Screens: 04-projects-list-1280.png, 05b-projects-tree-actual.png.
F-10 — REGEL column shows raw rule slug inf.rejoin on /deadlines 🟢 BATCH
Two rows show "inf.rejoin" instead of a human label like "Replik (Patent)" or
similar. Either a missing i18n key or a missing display lookup against the
Fristenrechner regel-catalog. Screen: 15-deadlines-list.png.
F-11 — Office values render lowercase, no umlauts 🟢 BATCH
/projects/{id}/team lists members with · duesseldorf, · munich —
slugs from the DB, not the localized labels. The offices module already has
LabelDE / LabelEN; just look up by key. Screen: 07-project-team-1280.png.
F-12 — AKTE column header + filter still says "Akte" on /deadlines 🟢 BATCH
The column header on the deadlines table is "AKTE", and the filter dropdown
shows "Alle Akten". The rest of the app uses Projekt/Projekte after the
rename. Same on /appointments. Screens: 15-deadlines-list.png,
17-appointments-list.png.
F-13 — L-2026-001Siemens AG ./. collision on /appointments AKTE cell 🟢 BATCH
The reference code and the project title are concatenated with no separator
in the AKTE column ("L-2026-001Siemens AG ./. Huawei Technologies"). Need
either a space, a delimiter, or two visual lines. Screen: 17-appointments-list.png.
🟠 Friction — visibly inconsistent / awkward
F-14 — Two greens fight everywhere (forest dark green vs lime brand) 🟡 STANDALONE
Brand inconsistency is the most pervasive issue in the app. Lime
--accent (#c6f41c) is the brand; but a darker forest green is used for many
primary CTAs and active filter chips. Same page often has both:
- Lime: "Neue Frist", "Neuer Termin", "Neues Projekt", "Mitglied hinzufügen", "Frist hinzufügen", "Hinzufügen" (Notizen), "Zurück zum Dashboard" CTA on 404, "Vergleichen" preset chips, year tab on Gebührentabellen ("2025 (Aktuell)").
- Forest dark green: "Vergleichen" submit, "Begriff vorschlagen", "Korrektur
vorschlagen", "Link vorschlagen", "Sign In", "Bestehendes Konto onboarden",
"Neue:n Kolleg:in einladen", "Nachschlagen", filter "Alle" chips on
Checklisten/Gerichte/Links/Glossar, year-bucket tabs, GKG/RVG/UPC/EPA tabs
on Gebührentabellen, the active sidebar tab indicator on Settings.
Pick one (lime is the brand) and convert. Touches lots of files but each edit
is trivial. Screens: most of them — see
19-kostenrechner.png,20-gebuehrentabellen.png,22-glossary.png,23-courts.png,24-links.png,30-admin-team.png,33-login.png.
F-15 — "Projekt archivieren" button is bright red 🟢 STANDALONE
Bottom of every project-detail tab. Archiving is reversible — red signals
destructive and will make real lawyers hesitate to archive routine matters,
defeating the affordance. Make it neutral/outline (or amber if you want
caution without danger). Reserve red for Löschen. Screens: 06-project-detail-1280.png,
07-project-team-1280.png, 09-project-parties-1280.png, 10-project-deadlines-tab.png.
F-16 — Type pills on /projects use saturated random colors 🟡 STANDALONE
Mandant=lavender, Streitsache=pink-red, Patent=cyan, Verfahren=salmon-orange,
Projekt=neutral. The colors aren't carrying meaning (they're not
ordered/ranked) and red-pink looks alarming for a routine type label.
Recommend: single neutral chip with the type icon (project-tree.ts has
icons), use color only when the type is the salient signal (e.g. Mandant
to mark a client root). Same critique for STANDORT pills on /admin/team
which random-color per office. Screens: 04-projects-list-1280.png,
05b-projects-tree-actual.png, 30-admin-team.png.
F-17 — "Lead" role label is English in German UI 🟢 BATCH
/projects/{id}/team ROLLE column shows literal "Lead". Subtitle on
/projects/new: „Sie werden als „Lead" automatisch hinzugefügt". Should
be "Leitung" or "Verantwortlich" in DE; keep "Lead" in EN. Screens:
07-project-team-1280.png, 14-projects-new.png.
F-18 — "Berechtigung" column on /admin/team shows "Global Admin", "Standard" 🟢 BATCH
Half-translated. Either translate both ("Globaler Admin" / "Standard" — both
fine in DE) or display a localized label keyed off the role enum. Screen:
30-admin-team.png.
F-19 — German DOM IDs lingering on /projects 🟢 BATCH
Dropdowns have id="projekt-type", id="projekt-view", id="akten-status"
even though everywhere else this app is now English-coded. Stale rename
sweep — flag for the next pass. Screen: 04-projects-list-1280.png (DOM).
F-20 — Tab styling is inconsistent across the app 🟡 BATCH Three different tab styles in current use:
- Lime underline on active tab:
/settings,/projects/{id}— the canonical pattern. - Color-only no underline:
/tools/gebuehrentabellen(GKG/RVG/UPC/EPA tabs). - Card grid with badges:
/admin. Pull all top-level tab navs into the lime-underline pattern; the card grid on /admin is fine because it's a launcher, not nav. Screens:20-gebuehrentabellen.png,27-settings.png,06-project-detail-1280.png.
F-21 — "Deadline updated" English event title in Verlauf 🟢 BATCH
On /projects/{id}/history, an event row reads "Deadline updated" + DE
description. Same i18n class as F-07 — different code path. Screen:
06-project-detail-1280.png.
F-22 — Settings notification checkboxes are far from their labels 🟢 BATCH
/settings?tab=benachrichtigungen lays out checkboxes flush-right and
labels flush-left with a wide gap between. Hard to scan which checkbox
belongs to which option. Pull them together (label + checkbox in the same
row, justify-start). Screen: 28-settings-notifications.png.
F-23 — Status column noise on /deadlines and /projects 🟡 BATCH
/deadlines shows STATUS=Offen on every row (filter default is "Alle
offenen"). /projects shows STATUS=Aktiv on every row (filter default is
visible status). When the filter constrains the value, the column adds
nothing. Either hide the column when single-valued or move it to a small
tag in the title cell. Screens: 04-projects-list-1280.png, 15-deadlines-list.png.
F-24 — Dropdowns in /projects filter row wrap awkwardly on mobile 🟢 BATCH
At 375 the Typ/Status/Ansicht filter row stacks oddly: each label floats on
its own line, selects on the next, no clean grouping. Should stack each as
a labelled block (label above select, full-width). Screen: 35-projects-mobile.png.
F-25 — Mobile project + admin tables overflow horizontally 🟡 BATCH
At 375 the /projects table shows TITEL + TYP only (4 other columns clipped
right). /admin/team shows NAME + E-MAIL only. No horizontal scroll
indicator, and important columns (Status, last-modified, Standort, Rolle)
just disappear. Card layout on mobile is the standard fix. Screens:
35-projects-mobile.png, 36-admin-team-mobile.png.
F-26 — "Akte" filter dropdown label on /deadlines//appointments is "Akte" 🟢 BATCH
Already covered by F-12 but worth flagging: filter label literally says
"Akte" while the rest of the app says "Projekt".
F-27 — Single-child breadcrumb is redundant 🟢 BATCH
On /projects/{root-id}/{tab} the breadcrumb shows just the project title
in a pill, then below it the H1 shows the same title. When path-depth=1,
hide the breadcrumb. Screens: 10-project-deadlines-tab.png,
12-project-notizen-tab.png.
F-28 — Empty placeholder inconsistency: "—" vs blank cell 🟢 BATCH
/projectsREFERENZ + CLIENTMATTER cells render blank when empty./admin/teamWEITERE STANDORTE renders "—"./projects/{id}/deadlinesREGEL renders "—"./appointmentsORT renders blank when empty. Pick one (recommend "—") and apply consistently. Screens:04-projects-list-1280.png,17-appointments-list.png,30-admin-team.png.
F-29 — /projects/{id}/checklists empty state references "Vorlagen-Seite" as plain text 🟢 BATCH
Empty-state copy says "Instanzen werden auf der Vorlagen-Seite unter
Checklisten angelegt." — but "Checklisten" is just text, not a link. Make
it a real <a href="/checklists"> so the user can jump there. Screen:
13-project-checklists-tab.png.
F-30 — Email cells on /admin/team are default-blue underlined links 🟢 BATCH
Inconsistent with the lime accent system used everywhere else. Either
restyle as a normal text + small icon, or keep <a href="mailto:"> but use
the Paliad link styling. Screen: 30-admin-team.png.
🟡 Polish — small wins
F-31 — /deadlines "Kalenderansicht" link is underlined plain text next to a styled button 🟢 BATCH
Inconsistent click affordance with the adjacent "Neue Frist" filled button.
Make it a secondary outline button (or vice-versa). Screen: 15-deadlines-list.png.
F-32 — /agenda redundant status pill below each card 🟡 BATCH
Cards already carry an urgency stripe on the left edge (red/orange/green).
The pill ("HEUTE", "MORGEN", "IN 2 TAGEN", "DIESE WOCHE", "SPÄTER") sits as
a separate row below each card and duplicates the visual signal. Move to a
small tag inside the card next to the title, or drop it. Screen:
02-agenda-1280-viewport.png.
F-33 — /dashboard upcoming-list project refs truncate without tooltip 🟢 BATCH
"C-UPC-0002 · UPC-CFI München — Klage Siemens ./. Hu…" — ellipsis but no
title attribute, so hovering doesn't reveal the full reference. Add title=
on the project-ref element. Screen: 01-dashboard-1280-viewport.png.
F-34 — /projects/new has no Cancel button (just back-link) 🟢 BATCH
/deadlines/new shows a standard "Abbrechen" + primary submit pair;
/projects/new only has the form with submit at the bottom — back to list
is via the breadcrumb only. Add the Abbrechen button for parity. Screens:
14-projects-new.png, 16-deadline-new.png.
F-35 — "Mandant, Streitsache, Patente und Fälle" subtitle on /projects does not match the type taxonomy 🟢 BATCH
The actual types are Mandant/Streitsache/Patent/Verfahren/Projekt — no
"Fälle". Subtitle copy is stale. Screen: 04-projects-list-1280.png.
F-36 — "Mandant" type is the default on /projects/new 🟢 BATCH
Most projects created in production are Verfahren (per current data). A
Mandant project is created rarely (one per client). Better default:
Verfahren, or "Bitte wählen…" with required validation. Screen: 14-projects-new.png.
F-37 — Notiz textarea has no formatting/length hint 🟢 BATCH
/projects/{id}/notes textarea has no character counter, no markdown hint,
no Strg+Enter shortcut hint. Add a small footer with at least the keyboard
hint. Screen: 12-project-notizen-tab.png.
F-38 — Bottom-nav agenda badge "2" semantics unclear 🟢 STANDALONE
Mobile bottom nav shows "2" badge on the Agenda icon. Not clear if that's
"2 today", "2 unread", "2 overdue", "2 this week". Add a title= or limit
to overdue-only. Screens: 35-projects-mobile.png, 36-admin-team-mobile.png.
F-39 — Search counter inconsistency between flat and tree views 🟢 BATCH
/projects flat list shows "11 / 11" in the search box; tree view shows
just "11". Match the format. Screen: 05b-projects-tree-actual.png.
F-40 — Glossar filter chips mix English + German 🟡 BATCH
Filter chips: "Alle / Litigation / Prosecution / UPC / EPA / SEP/FRAND /
Allgemein". "Litigation" / "Prosecution" are English while "Allgemein" is
German. Decide: are these jargon kept in EN intentionally (defensible —
patent lawyers use them in EN), or convert all to DE? At least make this
decision explicit and consistent. Screen: 22-glossary.png.
F-41 — Date input on /deadlines/new defaults to today (good) 🟢 OK
Not a finding — observed-good behaviour worth keeping.
F-42 — /deadlines table AKTE column line-wrapping 🟢 BATCH
Project ref + title is one long string ("C-UPC-0001 UPC-CFI München — Klage
Siemens ./. Huawei (EP3456789)") that wraps to 2 lines per row, ballooning
row height. Split into a small monospace ref pill + a text-overflow: ellipsis title with a tooltip. Screen: 15-deadlines-list.png.
F-43 — /projects/{id}/parties empty state is bare 🟢 BATCH
Just "Noch keine Parteien eingetragen." — the "Partei hinzufügen" button is
at the top. Add an empty-state CTA card below the message. Screen:
09-project-parties-1280.png.
F-44 — "Departments / Dezernate" admin card uses slash-mixed languages 🟢 BATCH
Just "Dezernate" suffices. Screen: 29-admin.png.
F-45 — "Dezernat / Partner" settings field uses slash separator unusual in DE 🟢 BATCH
Reads more naturally as "Dezernat oder Partner". Screen: 27-settings.png.
F-46 — "Good day, Test Tester" greeting on EN dashboard 🟢 BATCH
"Good day" is correct German→EN literal but stiff. "Hello" / "Hi" reads
warmer. Screen: 32-dashboard-EN.png.
F-47 — /settings profile placeholder mixes EN/DE 🟢 BATCH
"z.B. Associate, Partner, PA" — Associate is EN, Partner is both, PA is
abbrev. Either keep EN-only as legal-jargon convention, or move to all DE.
Currently inconsistent. Screen: 27-settings.png.
F-48 — /projects/{id}/sub-projects is 404, but tab label is "Untergeordnet" 🟢 BATCH
URL slug for the Untergeordnet tab is something else (the JS handles it
client-side). If a user types /sub-projects from intuition they hit the
404 page. Either alias the slug or document the canonical URL. Screen:
08-project-untergeordnet-1280.png.
F-49 — /changelog first entry is meta-circular 🟡 DEFER
Top entry titled "Neuigkeiten" describes the page itself. Cute on first
load, weird as the entry ages. Drop or replace with content news. Screen:
26-changelog.png.
F-50 — Mobile bottom-nav overlaps last list item on /dashboard 🟢 BATCH
At 375 the lime "Anlegen" FAB sits over the "Lecker Frist" list item in
"Kommende Fristen" — the bottom-nav background gradient covers but doesn't
fully obscure. Add bottom-padding to <main> equal to the bottom-nav
height. Screen: 01-dashboard-375.png.
Top 10 — best value-per-effort
Ranked by visible impact on the first-5-minutes experience of a HLC patent lawyer. Each is small enough to land in one focused PR.
- F-01 — Strip "Hogan Lovells" / "HL" from the public surface 🟢 Stale firm name on the marketing landing, page title, downloads section. First impression for any new colleague. The single most embarrassing defect right now.
- F-14 — Pick lime as the only primary green; retire forest-green 🟡 The pervasive brand inconsistency. Lime is the brand; forest-green leaks from old design tokens onto every primary CTA. One swap, every page feels coordinated.
- F-15 — "Projekt archivieren" red → neutral/outline 🟢 Wrong affordance for a reversible action. Will visibly change real-user behaviour (more confident archiving). Trivial CSS change.
- F-02 —
/admin/teamsearch input overlapping placeholder bug 🟢 Plainly broken text. Fix in admin-team.tsx. - F-04 —
fristen.field.project.chooseraw key on/deadlines/new🟢 Leaking key in a primary form. Add the i18n key. - F-07 — Activity log
project_type_changed/ "Type case → litigation" 🟡 Dashboard is the landing page; the activity widget is the most-read surface. Same-class fix as t-paliad-037, just for newer events. - F-05 + F-06 —
lang="de"on date and time inputs 🟢mm/dd/yyyyand09:00 AMin a German UI is jarring. Single attribute fix, two places. - F-12 + F-26 — "Akte" → "Projekt" on /deadlines + /appointments filters/columns 🟢 Last residue of the rename. Quick relabel, tightens the vocabulary.
- F-11 — Office values lowercased no-umlaut on /projects/{id}/team 🟢
duesseldorf,munichrendered raw; offices module already has the localized labels. - F-08 — Project tabs use
href="#"🟡 Tabs aren't real links. Middle-click + open-in-new-tab don't work. Common power-user gesture; fix is one change in the tab component.
Honourable mentions (#11–15)
- F-16 — Type pills calmer colors 🟡
- F-22 — Settings notification checkbox layout 🟢
- F-09 —
?view=treeURL parameter respected 🟢 - F-13 —
L-2026-001Siemens AG ./.separator on/appointments🟢 - F-03 —
/api/departments?include=members500 regression 🟡 (Functional bug, not pure polish — flagged because it's recurring.)
Suggested batching
- PR-A "stale firm name + activity log + i18n leaks" — F-01, F-04, F-07, F-12, F-21, F-35.
- PR-B "format + locale" — F-05, F-06.
- PR-C "brand consistency sweep" — F-14, F-15, F-31, F-30.
- PR-D "rename residue + small i18n cleanups" — F-11, F-17, F-18, F-19, F-26, F-44, F-45.
- PR-E "single-page bug fixes" — F-02 (standalone), F-09 (standalone), F-08 (standalone), F-03 (standalone).
Everything else (F-23 onwards) can land alongside whichever batch is most adjacent.
Cross-cutting observations
- Two greens is the single biggest visual gain available right now. F-14 alone makes the app feel "designed" rather than "drifting".
- i18n leak class keeps reappearing (Bug 4 in 2026-04-25 smoke fixed
some keys; t-paliad-037 fixed
.allkeys; this audit finds.choosekeys,project_type_changedevent types, "Deadline updated" event titles, and "Note zu deadline" mixed-language narrative). Worth a one-time scan that greps every component for raw template strings without i18n wrapping — could surface a dozen others I missed. - Date/time format leakage comes from native HTML5 inputs ignoring the
page's
lang. One attribute set in one shared component fixes it everywhere. - Mobile tables clip silently. Card layout on
<768pxis the canonical fix and would help/projects,/deadlines,/appointments,/admin/teamall at once. - Brand: lime is the brand color, but most "primary" CTAs in the codebase use a darker green. The lime-vs-forest split is roughly: lime = "create new" actions on the working surface (Akte, Frist, Termin, Notiz); forest = knowledge-platform "submit" actions (vorschlagen, suchen, Login). The split is implicit and surprising — pick one and document the rule.
Out of scope — flagged for separate work
- CLAUDE.md doc drift: project doc says Phase I (Notizen) is "pending"
but
/projects/{id}/notesships a working textarea + list. Either Phase I shipped without doc update, or the placeholder ships ahead of full Phase I. Worth a quick verification + doc fix. /api/departments?include=members500 is a functional regression, not pure polish — flagged to head as a side-channel bug to triage outside this audit's batches.- Empty-state CTAs (F-43 and others) could be a separate "empty state pass" task across the app.
Acceptance
- Doc committed.
- 41 screenshots in
tests/screenshots-polish-2026-04-27/. - Top 10 ranked with rationale and effort buckets.
- Head greenlights individual implementation tasks separately.