diff --git a/docs/audit-polish-2026-04-27.md b/docs/audit-polish-2026-04-27.md new file mode 100644 index 0000000..ed35da5 --- /dev/null +++ b/docs/audit-polish-2026-04-27.md @@ -0,0 +1,440 @@ +# 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* `` 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 ``. +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 +- `/projects` REFERENZ + CLIENTMATTER cells render blank when empty. +- `/admin/team` WEITERE STANDORTE renders "—". +- `/projects/{id}/deadlines` REGEL renders "—". +- `/appointments` ORT 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 `` 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 `` 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 `
` 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. + +1. **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.** +2. **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. +3. **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. +4. **F-02 — `/admin/team` search input overlapping placeholder bug** 🟢 + Plainly broken text. Fix in admin-team.tsx. +5. **F-04 — `fristen.field.project.choose` raw key on `/deadlines/new`** 🟢 + Leaking key in a primary form. Add the i18n key. +6. **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. +7. **F-05 + F-06 — `lang="de"` on date and time inputs** 🟢 + `mm/dd/yyyy` and `09:00 AM` in a German UI is jarring. Single attribute + fix, two places. +8. **F-12 + F-26 — "Akte" → "Projekt" on /deadlines + /appointments + filters/columns** 🟢 + Last residue of the rename. Quick relabel, tightens the vocabulary. +9. **F-11 — Office values lowercased no-umlaut on /projects/{id}/team** 🟢 + `duesseldorf`, `munich` rendered raw; offices module already has the + localized labels. +10. **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) + +11. **F-16 — Type pills calmer colors** 🟡 +12. **F-22 — Settings notification checkbox layout** 🟢 +13. **F-09 — `?view=tree` URL parameter respected** 🟢 +14. **F-13 — `L-2026-001Siemens AG ./.` separator on `/appointments`** 🟢 +15. **F-03 — `/api/departments?include=members` 500 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 `.all` keys; this audit finds `.choose` keys, + `project_type_changed` event 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 `<768px` is the canonical + fix and would help `/projects`, `/deadlines`, `/appointments`, `/admin/team` + all 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}/notes` ships 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=members` 500** 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 + +- [x] Doc committed. +- [x] 41 screenshots in `tests/screenshots-polish-2026-04-27/`. +- [x] Top 10 ranked with rationale and effort buckets. +- [ ] Head greenlights individual implementation tasks separately. diff --git a/tests/screenshots-polish-2026-04-27/01-dashboard-1280-viewport.png b/tests/screenshots-polish-2026-04-27/01-dashboard-1280-viewport.png new file mode 100644 index 0000000..fc4b236 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/01-dashboard-1280-viewport.png differ diff --git a/tests/screenshots-polish-2026-04-27/01-dashboard-1280.png b/tests/screenshots-polish-2026-04-27/01-dashboard-1280.png new file mode 100644 index 0000000..69fd3dc Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/01-dashboard-1280.png differ diff --git a/tests/screenshots-polish-2026-04-27/01-dashboard-375.png b/tests/screenshots-polish-2026-04-27/01-dashboard-375.png new file mode 100644 index 0000000..9b0c923 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/01-dashboard-375.png differ diff --git a/tests/screenshots-polish-2026-04-27/01-dashboard-768.png b/tests/screenshots-polish-2026-04-27/01-dashboard-768.png new file mode 100644 index 0000000..6695833 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/01-dashboard-768.png differ diff --git a/tests/screenshots-polish-2026-04-27/02-agenda-1280-viewport.png b/tests/screenshots-polish-2026-04-27/02-agenda-1280-viewport.png new file mode 100644 index 0000000..ed364dd Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/02-agenda-1280-viewport.png differ diff --git a/tests/screenshots-polish-2026-04-27/02-agenda-1280.png b/tests/screenshots-polish-2026-04-27/02-agenda-1280.png new file mode 100644 index 0000000..2fc8a02 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/02-agenda-1280.png differ diff --git a/tests/screenshots-polish-2026-04-27/03-team-1280.png b/tests/screenshots-polish-2026-04-27/03-team-1280.png new file mode 100644 index 0000000..99f98cc Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/03-team-1280.png differ diff --git a/tests/screenshots-polish-2026-04-27/04-projects-list-1280.png b/tests/screenshots-polish-2026-04-27/04-projects-list-1280.png new file mode 100644 index 0000000..f78be84 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/04-projects-list-1280.png differ diff --git a/tests/screenshots-polish-2026-04-27/05-projects-tree-1280.png b/tests/screenshots-polish-2026-04-27/05-projects-tree-1280.png new file mode 100644 index 0000000..f78be84 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/05-projects-tree-1280.png differ diff --git a/tests/screenshots-polish-2026-04-27/05b-projects-tree-actual.png b/tests/screenshots-polish-2026-04-27/05b-projects-tree-actual.png new file mode 100644 index 0000000..bd3ff56 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/05b-projects-tree-actual.png differ diff --git a/tests/screenshots-polish-2026-04-27/06-project-detail-1280.png b/tests/screenshots-polish-2026-04-27/06-project-detail-1280.png new file mode 100644 index 0000000..82a3922 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/06-project-detail-1280.png differ diff --git a/tests/screenshots-polish-2026-04-27/07-project-team-1280.png b/tests/screenshots-polish-2026-04-27/07-project-team-1280.png new file mode 100644 index 0000000..21e7669 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/07-project-team-1280.png differ diff --git a/tests/screenshots-polish-2026-04-27/08-project-untergeordnet-1280.png b/tests/screenshots-polish-2026-04-27/08-project-untergeordnet-1280.png new file mode 100644 index 0000000..b6e50fa Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/08-project-untergeordnet-1280.png differ diff --git a/tests/screenshots-polish-2026-04-27/09-project-parties-1280.png b/tests/screenshots-polish-2026-04-27/09-project-parties-1280.png new file mode 100644 index 0000000..fbfc724 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/09-project-parties-1280.png differ diff --git a/tests/screenshots-polish-2026-04-27/10-project-deadlines-tab.png b/tests/screenshots-polish-2026-04-27/10-project-deadlines-tab.png new file mode 100644 index 0000000..1a0cdc4 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/10-project-deadlines-tab.png differ diff --git a/tests/screenshots-polish-2026-04-27/11-project-termine-tab.png b/tests/screenshots-polish-2026-04-27/11-project-termine-tab.png new file mode 100644 index 0000000..e61de53 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/11-project-termine-tab.png differ diff --git a/tests/screenshots-polish-2026-04-27/12-project-notizen-tab.png b/tests/screenshots-polish-2026-04-27/12-project-notizen-tab.png new file mode 100644 index 0000000..09b3bb7 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/12-project-notizen-tab.png differ diff --git a/tests/screenshots-polish-2026-04-27/13-project-checklists-tab.png b/tests/screenshots-polish-2026-04-27/13-project-checklists-tab.png new file mode 100644 index 0000000..c638a21 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/13-project-checklists-tab.png differ diff --git a/tests/screenshots-polish-2026-04-27/14-projects-new.png b/tests/screenshots-polish-2026-04-27/14-projects-new.png new file mode 100644 index 0000000..3d9170e Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/14-projects-new.png differ diff --git a/tests/screenshots-polish-2026-04-27/15-deadlines-list.png b/tests/screenshots-polish-2026-04-27/15-deadlines-list.png new file mode 100644 index 0000000..95a2536 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/15-deadlines-list.png differ diff --git a/tests/screenshots-polish-2026-04-27/16-deadline-new.png b/tests/screenshots-polish-2026-04-27/16-deadline-new.png new file mode 100644 index 0000000..a00fe49 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/16-deadline-new.png differ diff --git a/tests/screenshots-polish-2026-04-27/17-appointments-list.png b/tests/screenshots-polish-2026-04-27/17-appointments-list.png new file mode 100644 index 0000000..041f6fa Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/17-appointments-list.png differ diff --git a/tests/screenshots-polish-2026-04-27/18-fristenrechner.png b/tests/screenshots-polish-2026-04-27/18-fristenrechner.png new file mode 100644 index 0000000..4fc4b4b Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/18-fristenrechner.png differ diff --git a/tests/screenshots-polish-2026-04-27/19-kostenrechner.png b/tests/screenshots-polish-2026-04-27/19-kostenrechner.png new file mode 100644 index 0000000..2b4d545 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/19-kostenrechner.png differ diff --git a/tests/screenshots-polish-2026-04-27/20-gebuehrentabellen.png b/tests/screenshots-polish-2026-04-27/20-gebuehrentabellen.png new file mode 100644 index 0000000..0dd93f0 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/20-gebuehrentabellen.png differ diff --git a/tests/screenshots-polish-2026-04-27/21-checklists.png b/tests/screenshots-polish-2026-04-27/21-checklists.png new file mode 100644 index 0000000..b566e83 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/21-checklists.png differ diff --git a/tests/screenshots-polish-2026-04-27/22-glossary.png b/tests/screenshots-polish-2026-04-27/22-glossary.png new file mode 100644 index 0000000..5935c8b Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/22-glossary.png differ diff --git a/tests/screenshots-polish-2026-04-27/23-courts.png b/tests/screenshots-polish-2026-04-27/23-courts.png new file mode 100644 index 0000000..5a5fe3c Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/23-courts.png differ diff --git a/tests/screenshots-polish-2026-04-27/24-links.png b/tests/screenshots-polish-2026-04-27/24-links.png new file mode 100644 index 0000000..92078f0 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/24-links.png differ diff --git a/tests/screenshots-polish-2026-04-27/25-downloads.png b/tests/screenshots-polish-2026-04-27/25-downloads.png new file mode 100644 index 0000000..4c53bc9 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/25-downloads.png differ diff --git a/tests/screenshots-polish-2026-04-27/26-changelog.png b/tests/screenshots-polish-2026-04-27/26-changelog.png new file mode 100644 index 0000000..eb4a2c2 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/26-changelog.png differ diff --git a/tests/screenshots-polish-2026-04-27/27-settings.png b/tests/screenshots-polish-2026-04-27/27-settings.png new file mode 100644 index 0000000..5746121 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/27-settings.png differ diff --git a/tests/screenshots-polish-2026-04-27/28-settings-notifications.png b/tests/screenshots-polish-2026-04-27/28-settings-notifications.png new file mode 100644 index 0000000..c83b18e Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/28-settings-notifications.png differ diff --git a/tests/screenshots-polish-2026-04-27/29-admin.png b/tests/screenshots-polish-2026-04-27/29-admin.png new file mode 100644 index 0000000..1ae7d5f Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/29-admin.png differ diff --git a/tests/screenshots-polish-2026-04-27/30-admin-team.png b/tests/screenshots-polish-2026-04-27/30-admin-team.png new file mode 100644 index 0000000..40cd981 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/30-admin-team.png differ diff --git a/tests/screenshots-polish-2026-04-27/31-notfound.png b/tests/screenshots-polish-2026-04-27/31-notfound.png new file mode 100644 index 0000000..b6e50fa Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/31-notfound.png differ diff --git a/tests/screenshots-polish-2026-04-27/32-dashboard-EN.png b/tests/screenshots-polish-2026-04-27/32-dashboard-EN.png new file mode 100644 index 0000000..07ce8ef Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/32-dashboard-EN.png differ diff --git a/tests/screenshots-polish-2026-04-27/33-login.png b/tests/screenshots-polish-2026-04-27/33-login.png new file mode 100644 index 0000000..cb4fa22 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/33-login.png differ diff --git a/tests/screenshots-polish-2026-04-27/34-landing.png b/tests/screenshots-polish-2026-04-27/34-landing.png new file mode 100644 index 0000000..4680d1f Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/34-landing.png differ diff --git a/tests/screenshots-polish-2026-04-27/35-projects-mobile.png b/tests/screenshots-polish-2026-04-27/35-projects-mobile.png new file mode 100644 index 0000000..a32133a Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/35-projects-mobile.png differ diff --git a/tests/screenshots-polish-2026-04-27/36-admin-team-mobile.png b/tests/screenshots-polish-2026-04-27/36-admin-team-mobile.png new file mode 100644 index 0000000..838b1d0 Binary files /dev/null and b/tests/screenshots-polish-2026-04-27/36-admin-team-mobile.png differ