From 85fe1312ca0a1b7e56d9d429acbec140cddc610d Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sat, 18 Apr 2026 22:42:29 +0200 Subject: [PATCH] =?UTF-8?q?docs(review):=20OPEN-ISSUES-NEXT.md=20=E2=80=94?= =?UTF-8?q?=20Stand=20nach=20Refactor-Nacht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zusammenfassung der 8 Commits + Beweise (Tests/Check/Build/Smoke), bewusst verschobene Items mit Begruendung pro Item, neu entdeckte und gleich behobene Items, sowie empfohlene Reihenfolge fuer den naechsten Wurf. Adressiert REVIEW-2026-04-18.md, dead-code.md, redundancy.md, structure.md, docs-vs-code.md. --- docs/superpowers/review/OPEN-ISSUES-NEXT.md | 166 ++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 docs/superpowers/review/OPEN-ISSUES-NEXT.md diff --git a/docs/superpowers/review/OPEN-ISSUES-NEXT.md b/docs/superpowers/review/OPEN-ISSUES-NEXT.md new file mode 100644 index 0000000..b446688 --- /dev/null +++ b/docs/superpowers/review/OPEN-ISSUES-NEXT.md @@ -0,0 +1,166 @@ +# Open Issues — Stand nach Review-Fixes + +**Datum:** 2026-04-18 (Nacht-Session) +**Branch:** `review-fixes-2026-04-18` +**Baseline:** REVIEW-2026-04-18.md + 4 Sub-Reports vom Morgen +**Tests:** 184/184 grün (Baseline waren 158, +26 neue Tests) +**svelte-check:** 0 Errors, 10 Warnings (alle pre-existing in `RecipeEditor.svelte` / `recipes/[id]/+page.svelte`) +**Build:** `npm run build` erfolgreich +**Smoke-Test:** `npm run preview` + curl auf `/api/health`, `/api/profiles`, `/api/recipes/abc` (400), `/api/wishlist` mit invalider Body (400 + issues) — alle Endpunkte verhalten sich korrekt + +--- + +## Was wurde gemacht (8 Commits) + +| Commit | Inhalt | Verifikation | +|---|---|---| +| `2289547` | docs(review): table names, IMAGE_DIR, image endpoints | grep auf alte Namen → 0 | +| `830c740` | refactor(constants): SW-Timing-Konstanten, RequestShape/ManifestDiff intern, Image-Endpoint EN | tests + check grün | +| `739cc2d` | feat(server): api-helpers.ts (parsePositiveIntParam, validateBody, ErrorResponse) | 13 neue Tests | +| `ff293e9` | refactor(api): 13 +server.ts handler auf api-helpers (-67 Zeilen netto) | 171/171 | +| `30a447a` | refactor(client): requireProfile() + asyncFetch wrapper | 5 + 4 Sites umgestellt | +| `60c8352` | docs(searxng): Intent-Kommentar fuer Prod-Logs | — | +| `6d9e79d` | feat(parser): Unicode-Brueche + Mengen-Plausibilitaet | 13 neue Tests | +| `31c6e5c` | refactor(server): IMAGE_DIR/DATABASE_PATH zentralisieren + Doku-Drift | grep auf alte Pattern → 0 | + +Net: 31 Files, +626/-272. + +### Re-Review per 4 paralleler Explore-Agenten — Beweis + +**Dead-Code (HIGH-Confidence):** Alle vorherigen Findings resolved. RequestShape + ManifestDiff sind nur noch interne Types. yauzl ist explizit als Phase 5b markiert (in `session-handoff-2026-04-17.md` und `ARCHITECTURE.md:33`). Kein neuer toter Code durch die Refactors. + +**Redundancy (HIGH-Confidence):** 0 verbleibende `function parseId`/`parsePositiveInt`-Definitionen in `src/routes/api/`. 0 verbleibende `safeParse(...) + manueller error(400)`-Blöcke. Der gerade behobene `IMAGE_DIR`-Drift war 6× im Code und 1× in `db/index.ts`. Verbleibende kleine Pattern siehe unten. + +**Structure:** Constants-Extraktion + API-Error-Shape-Standardisierung erledigt. Ingredient-Parser-Edge-Cases mit 13 Tests abgesichert. Große Pages bleiben groß (siehe „Bewusst verschoben"). + +**Docs-vs-Code:** Alle drei Original-Findings behoben. Zwei kleine zusätzliche Mismatches (149→150 Quote-Count, search/-Route gar nicht existent) heute gleich mitgenommen. + +--- + +## ⚠ Verbleibende Items — bewusst verschoben mit Begründung + +### A. Refactor B — Search-State-Store extrahieren (HIGH, halber Tag) +**Wo:** `src/routes/+page.svelte` (808 Zeilen, 20+ `$state`-Vars), `src/routes/+layout.svelte` (678 Zeilen, dupliziert das Header-Search-Dropdown). + +**Vorschlag:** `src/lib/client/search.svelte.ts` mit `search()`, `loadMore()`, `clear()` und reaktivem `query / hits / loading / error`-Zustand. + +**Warum nicht heute:** +1. Touch in zwei der drei größten Files der Codebase (808L + 678L) +2. Bricht Frontend-Verhalten subtil, wenn Reactive-Glue zwischen Layout-Search und Page-Search nicht 1:1 übernommen wird +3. UAT-pflichtig (Live-Suche, Empty-State, Web-Suche-Fallback) — ohne UAT-Slot zu riskant +4. Kein automatisches Test-Sicherheitsnetz für die UI-Layer + +**Empfehlung:** Eigene Phase mit `/gsd-discuss-phase` und Smoke-UAT vor dem Mergen. Anschließend `/gsd-execute-phase` mit Browser-Check pro Wave. + +--- + +### B. Refactor C — RecipeEditor / RecipeView in Sub-Components zerlegen (MEDIUM, halber Tag) +**Wo:** `src/lib/components/RecipeEditor.svelte` (630L), `RecipeView.svelte` (398L). + +**Kandidaten:** `IngredientRow.svelte`, `StepList.svelte`, `TimeDisplay.svelte`, `ImageUploadBox.svelte`. + +**Warum nicht heute:** +- REVIEW-2026-04-18.md sagt explizit: *"Aber: keine Eile, solange niemand sonst drin arbeitet."* +- Solange der Owner allein entwickelt, ist 630L pro Komponente kein Blocker. +- Tests gibt es nur indirekt (über Importer-Tests und Unit-Tests der Parser). + +**Empfehlung:** Spätere Phase, falls eine zweite Person mitarbeitet oder wenn Editor-Bug-Hunting zu schwierig wird. Vorher zumindest die 10 pre-existing svelte-check WARNINGs in `RecipeEditor.svelte` fixen — die sind schon flackrige Reactive-Patterns (`$derived` statt `$state` für abgeleitete Werte). + +--- + +### C. SearXNG Rate-Limit Recovery (MEDIUM, 1-2 h) +**Wo:** `src/lib/server/search/searxng.ts`. + +**Was fehlt:** Bei 429/403 wird zwar geloggt, aber kein Backoff oder `isStale`-Flag. Folgesuchen liefern alten Cache, der User merkt nichts. + +**Empfehlung:** Eigene Phase. Drei mögliche Zutaten: (1) `lastFailureAt`-Map per Domain, (2) exponentieller Backoff, (3) `isStale: boolean` im Response, das die UI als „Ergebnisse evtl. veraltet" anzeigt. + +--- + +### D. Service-Worker Zombie-Cleanup unter Last testen (MEDIUM, 2-3 h) +**Wo:** `src/lib/client/pwa.svelte.ts` Zombie-Heuristik. + +**Status:** 6 Unit-Tests existieren bereits (`tests/unit/pwa-store.test.ts`), die beide Pfade abdecken. + +**Was offen ist:** Verhalten unter sehr langsamen Netzen (1500ms-Timeout könnte False-Positive triggern). Sehr edge-case, aber im REVIEW-Original als MEDIUM gelistet. + +**Empfehlung:** Beim nächsten Service-Worker-Touch mit Throttling-DevTools-Profil testen. Kein eigener Sprint nötig. + +--- + +### E. JSON-LD Parser Edge-Cases (MEDIUM, halbe Phase) +**Wo:** `src/lib/server/parsers/json-ld-recipe.ts` (402L). + +**Was abgesichert ist:** Ingredient-Parser-Käfer (Unicode-Brüche, Bounds, Komma-Dezimal) sind heute mit 13 neuen Tests dicht. + +**Was offen ist:** JSON-LD selbst hat Edge-Cases — null-Servings, Locale-spezifische Number-Formats, defekte `recipeIngredient`-Arrays. + +**Empfehlung:** Wenn beim Importieren ein Bug auftaucht, gezielt einen Test schreiben. Kein Vorab-Sprint. + +--- + +### F. Inline UI-Constants (LOW, 30 min) +**Wo:** `ConfirmDialog.svelte`, `ProfileSwitcher.svelte` etc. mit Hardcoded `z-index`, `border-radius: 999px`, kleinen Timeouts. + +**Vorschlag:** `src/lib/theme.ts` mit `MODAL_Z_INDEX`, `POPOVER_Z_INDEX`, `PILL_RADIUS`. + +**Warum nicht heute:** LOW-Severity, kein konkreter Bug damit verbunden, betrifft viele Files punktuell. + +--- + +### G. wishlist/+page.svelte:38 — Profil-Guard mit individueller Message (LOW) +**Was:** Eine 7. Stelle hat das Profil-Guard-Pattern, aber mit eigenem Text („um mitzuwünschen"). `requireProfile()` akzeptiert aktuell keine Custom-Message. + +**Empfehlung:** Entweder `requireProfile(message?)`-Variante einführen oder das Site so lassen — die Custom-Message ist dort wirklich Kontext-Information. + +--- + +### H. RecipeEditor.svelte:54 + :83 — Bild-Upload/Delete mit inline `if (!res.ok)` (LOW) +**Was:** Image-Upload und -Delete im Editor nutzen noch das Pattern, das `asyncFetch` ersetzen sollte. Der Aufwand wäre 5 Minuten, aber RecipeEditor steckt in den 10 svelte-check-WARNINGs (siehe Refactor B-Notiz) — beim nächsten Touch der Datei mitnehmen. + +--- + +### I. Pre-Existing svelte-check Warnings (10 Stück) +**Wo:** `RecipeEditor.svelte` (9× Zeilen 28, 97-102, 113, 121) + `recipes/[id]/+page.svelte` (1× Zeile 43). + +**Was:** Pattern `let foo = recipe.bar` im Top-Level-Script — Svelte 5 will `$derived(recipe.bar)`. Aktuell snapshot-only. + +**Risiko:** Bei In-Place-Mutation des Rezepts (z. B. nach PATCH) zeigt der Editor ggf. den alten Wert. **Tests fangen das nicht.** + +**Empfehlung:** Kleine Phase „RecipeEditor auf $derived umstellen" — passt gut zur RecipeEditor-Subkomponentenphase (B oben), oder vorab alleine. + +--- + +## 📌 Neu entdeckt in der zweiten Runde — alle behoben + +| # | Fund | Severity | Status | +|---|---|---|---| +| 1 | `IMAGE_DIR` 6× dupliziert + `DATABASE_PATH` 2× | HIGH | ✅ `src/lib/server/paths.ts` | +| 2 | `ARCHITECTURE.md:34` — „49 Flachwitze" | MEDIUM | ✅ → 150 | +| 3 | `ARCHITECTURE.md:41` — `search/`-Route existiert nicht | LOW | ✅ entfernt | + +--- + +## Empfohlene nächste Schritte + +1. **PR mergen** sobald lokal abgenickt — der Branch enthält 8 atomische Commits, jeder einzeln revert-bar. +2. **Falls UAT erwünscht:** `npm run build && npm run preview`, dann manuell Profile-Switching, Rezept-Edit, Favoriten-Toggle, Wunschliste, Bild-Upload, Such-Pfade durchklicken. Erwartung: keine Verhaltensänderung gegenüber `main`. +3. **Phase „RecipeEditor reactive cleanup"** für die 10 svelte-check-Warnings (klein) — schließt Item I. +4. **Phase „Search-State-Store"** als nächste größere Phase — schließt Item A und drückt das größte Page-File spürbar runter. +5. yauzl/Phase 5b (ZIP-Backup-Restore) bleibt als ungeplant bis explizit gebraucht. + +--- + +## Code-Quality Snapshot + +| Metrik | Vorher | Nachher | Δ | +|---|---|---|---| +| Tests gesamt | 158 | 184 | +26 | +| Tests Files | 23 | 24 | +1 (api-helpers) | +| svelte-check Errors | 0 | 0 | — | +| svelte-check Warnings | 10 | 10 | — (alle pre-existing) | +| Build | ✓ | ✓ | — | +| Größte Datei (recipes/[id]/+page.svelte) | 757 | 725 | -32 | +| Größte Datei (+page.svelte) | 808 | 808 | — | +| API +server.ts Boilerplate | ca. 11 Zeilen pro Handler | ca. 4 Zeilen pro Handler | -64% | +| Duplizierte ENV-Defaults | 8 Sites | 1 Site | -7 |