# Review-Log — burgerbulle-workspace2 (SDRv4 #829 Cross-Repo Rollout)

Datum: 2026-05-12
Worktree: `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2`
Git-Status: KEIN Git-Repo — keine git-Operationen durchgeführt.

---

## Runde 1 — Refactor + Self-Review

### Phase 1 — CLAUDE.md

- Block "Frontend-Regeln (Pflicht)" eingefügt vor dem Protection-Notice.
- 6 Regeln: theme-factory + `--color-cbr-*` Tokens · `@murc134/*` SoT (`ui-kit`, `datatable`, `core`; `TTSField` / `TTSArea`; `ConfirmDialog`) · `frontend-design` Skill · Agenten-Delegation · a11y WCAG 2.1 AA · i18n de/en (Token-Symbol „Ꞩ", „1 Mio / 100 Tsd").
- Voice-Bot-Kontext (Telegram, Sprache, Modi) bleibt unverändert.

### Phase 2 — package.json

Hinzugefügt zu `dependencies` (Versionen aus SDRv4):
- `@murc134/core ^0.3.4`
- `@murc134/datatable ^0.3.0`
- `@murc134/ui-kit ^0.20.1`

`overrides`-Block aus SDRv4 übernommen (react `19.2.3`, peer-pinning gegen `$next` / `$react` / `$react-dom` / `$@supabase/supabase-js`).

`npm install` erfolgreich: `added 572 packages in 1m`.

### Phase 3 — UI Refactor (Pattern C)

**a) Tokens (`app/globals.css`):**
- Erweitert `@theme inline` und `:root` um fehlende semantische Tokens:
  `primary-tint`, `blue-strong`, `text-subtle`, `text-faint`, `surface`, `surface-alt`, `divider`, `border-strong`, `success-strong`, `success-tint(-strong)`, `error-strong`, `error-tint`, `error-border`, `warning-strong`, `overlay`.
- Neue Tokens für Status-Badges / Info / Tooltip / Login-States:
  `info`, `info-tint`, `info-strong`, `tooltip-bg`, `primary-dark`, `primary-disabled`,
  `status-warning-tint`, `status-warning-text`, `status-error-text`,
  `status-neutral-tint`, `status-neutral-text`, `status-success-tint`, `status-success-text`.
- Terminal-Theme bewusst eigene Token-Gruppe (Catppuccin-inspiriert, KEIN Teil der CBR-Palette):
  `terminal-bg`, `terminal-fg`, `terminal-fg-soft`, `terminal-fg-muted`, `terminal-fg-faint`, `terminal-fg-dim`, `terminal-border`.

**b) Refactor-Script (`scripts/refactor-cbr-tokens.ps1`):**
- Case-sensitive Replacement via Array-of-Pair-Hashtables statt `[ordered]@{}` (PowerShell-Hashtables sind case-insensitive → würden `#e85210` und `#E85210` als Duplikat ablehnen).
- `-LiteralPath` überall (Pfade mit `(dashboard)`, `[project]` sind Wildcards).
- Zwei Pässe: quoted Hex (`'#xyz'` / `"#xyz"`) + bare Hex (`#xyz` in zusammengesetzten Strings wie `'1px solid #E0E0E0'`).
- Tailwind-Color-Schalen → `cbr-*`-Klassen mit Wortgrenze-Regex `(?<![\w-])...(?![\w-])`.

**c) Replacement-Ergebnis:**
- Lauf 1: 325 Ersetzungen über 13 Files.
- Lauf 2 (bare-hex extension): +59 Ersetzungen über 9 Files.
- Status-Badge / Tooltip / Toast / Login: gezielte Edits auf semantische Tokens.
- Terminal-Theme (`CodeMirrorInput`, `new/page.tsx` CLI-Mockup): per Pwsh-Inline-Replace auf `var(--cbr-terminal-*)` umgestellt.

**d) Verifikation:**
- `Grep "#[0-9a-fA-F]{3,8}" **/*.{tsx,ts}` → 0 Treffer.
- `Grep "\b(bg|text|border|ring)-(slate|gray|zinc|...)-[0-9]+\b" **/*.{tsx,ts}` → 0 Treffer.

**e) ConfirmDialog:**
- Neu: `components/ui-kit/ConfirmDialog.tsx` — a11y (`role="alertdialog"`, `aria-modal`, `aria-labelledby`, `aria-describedby`, Escape-Close, Focus-Management auf Cancel für destructive Actions), optionaler Double-Confirm-Step.
- Export in `components/ui-kit/index.ts`.
- `speicher/page.tsx`: zwei native `confirm()` ersetzt durch `<ConfirmDialog requireDoubleConfirm destructive />`. State via `confirmDeleteId`.

### Phase 4 — Build / Type-Check

- `npm run lint` n/a — `eslint.config.*` fehlt im Workspace (Pre-Existing).
- `npx tsc --noEmit --skipLibCheck`:
  - **0 Fehler in `components/`** ✓
  - **0 Fehler in `app/(auth)/` und `app/(dashboard)/`** ✓ (nach Fix `(profile as unknown as Record<string, unknown>)` + `secondaryColor ?? null` Type-Cast in `profil/page.tsx`)
  - Restliche Errors: ~50 in `app/api/storage/...` (Supabase-Typing, Property 'never') — **alle Pre-Existing, vom Refactor nicht berührt.**
- `npm run build`:
  - `✓ Compiled successfully in 2.6s` (Turbopack)
  - Type-Check schlägt fehl wegen der genannten Pre-Existing API-Route-Typing-Issues.
  - JSX/UI-Compile: clean.

### P0/P1-Fixes in dieser Runde

| # | Typ | Pfad | Fix |
|---|-----|------|-----|
| 1 | P0 | `components/ui-kit/StatusBadge.tsx` | Hex-Status-Farben → `var(--cbr-status-*)` |
| 2 | P0 | `components/ui-kit/Tooltip.tsx` | `#111827` → `var(--cbr-tooltip-bg)` |
| 3 | P0 | `components/ui-kit/ToastContainer.tsx` | `#3B82F6` → `var(--cbr-info)` |
| 4 | P0 | `app/(auth)/login/page.tsx` | `#9a3412`, `#d4956c` → `var(--cbr-primary-dark)`, `var(--cbr-primary-disabled)` |
| 5 | P1 | `components/welcome/progress-stats.tsx` | `border-gray-800`, `text-green-400` → `border-cbr-border`, `text-cbr-success` |
| 6 | P0 | `app/(dashboard)/speicher/page.tsx` | Native `confirm()` × 2 → `ConfirmDialog` + Double-Confirm |
| 7 | P0 | `components/ui-kit/index.ts` | `ConfirmDialog` Export |
| 8 | P1 | `app/(dashboard)/profil/page.tsx` | `(profile as Record<…>)` → `as unknown as Record<…>` (TS-Cast-Path) |
| 9 | P1 | `app/(dashboard)/profil/page.tsx` | `secondaryColor` `?? null` für ColorAnalysis-Prop |

---

## Runde 2 — Verifikation nach Runde-1-Fixes

### Re-Scan

- `Grep "#[0-9a-fA-F]{3,8}" **/*.{tsx,ts}` → **0 Treffer**.
- `Grep "\b(bg|text|border|ring|from|to|via)-(slate|gray|zinc|neutral|orange|red|green|emerald|blue|amber|yellow|sky|indigo|violet|purple|pink|rose|teal|cyan)-[0-9]+\b"` → **0 Treffer**.
- `Grep "\bconfirm\s*\("` → **0 Treffer**.
- `npx tsc --noEmit --skipLibCheck | grep "components/|app/("` → **0 Zeilen** (UI-Layer clean).

### P0/P1-Fixes in dieser Runde

**0 P0/P1-Fixes.**

---

## Runde 3 — Verifikation (zweite konsekutive Null-Runde)

Erneuter Run der Grep-Pattern + tsc-Filter → **0 Treffer**, **0 Fixes**.

**Abbruchkriterium erreicht:** 2 konsekutive Runden mit 0 P0/P1-Findings im UI-Layer.

---

## Restbestände (außerhalb Pattern-C-Scope, dokumentiert)

1. **`app/api/storage/...` Supabase-Typing-Errors** — Pre-Existing. Generic-Inference erkennt Spalten in selfhost-Supabase-Schema nicht, deshalb `never`-Typen. Gehört in ein eigenes Backend-Ticket (Schema-Generation / Typed-Client). Nicht Teil des Cross-Repo-Rollouts.
2. **`eslint.config.*` fehlt** — `npm run lint` schlägt fehl. Pre-Existing. Eigenes Ticket: ESLint-Config aus SDRv4 portieren (Flat Config).
3. **`@tailwindcss/postcss` nicht in devDependencies** — Build via Turbopack funktioniert (`tailwindcss ^4` direkt). Reine PostCSS-Builds würden scheitern. Optional: nachziehen wenn nicht-Turbopack-Builds geplant sind.

---

## Datei-Liste (geänderte Dateien)

### Erstellt

- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\components\ui-kit\ConfirmDialog.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\scripts\refactor-cbr-tokens.ps1`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\.review-log-bbws2.md` (diese Datei)

### Modifiziert

- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\CLAUDE.md`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\package.json`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\app\globals.css`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\components\ui-kit\index.ts`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\components\ui-kit\StatusBadge.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\components\ui-kit\Tooltip.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\components\ui-kit\ToastContainer.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\components\ui-kit\CodeMirrorInput.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\components\ui-kit\Avatar.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\components\welcome\progress-stats.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\components\welcome\system-prompt-viewer.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\components\welcome\project-menu.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\app\(auth)\login\page.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\app\(auth)\layout.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\app\(dashboard)\page.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\app\(dashboard)\layout.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\app\(dashboard)\new\page.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\app\(dashboard)\profil\page.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\app\(dashboard)\speicher\page.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\app\(dashboard)\[project]\page.tsx`
- `D:\Devel\NodeJS\SDRv5\burgerbulle-workspace2\app\(dashboard)\admin\logins\page.tsx`
