docs(progress): Spinner-Hang-Fix dokumentiert — Zustands-Selector war Dashboard-loads-forever-Ursache (#381)
This commit is contained in:
+2
-1
@@ -88,7 +88,7 @@ Phase P Notizen-App oder UI-Backlog-Module 2-16.
|
|||||||
**OFFENE THREADS (alles Weitere hängt hier, nichts geht verloren):**
|
**OFFENE THREADS (alles Weitere hängt hier, nichts geht verloren):**
|
||||||
1. **UI-Backlog Module 10-16** (Reihenfolge nach Business-Nutzen): 10 Policies (4) → 11 Graph-RAG (4) → 12 Companies (9) → 13 Public-Share (3) → 14 Guests (3) → 15 External-Agent (3) → 16 Ownership-Transfer (1). Muster + Architektur-Regel: siehe Roadmap-Abschnitt "UI-Backlog" (Plugin-Module via Manifest, Core-Module statisch; Referenz: Marketplace=Plugin, Approvals=Core).
|
1. **UI-Backlog Module 10-16** (Reihenfolge nach Business-Nutzen): 10 Policies (4) → 11 Graph-RAG (4) → 12 Companies (9) → 13 Public-Share (3) → 14 Guests (3) → 15 External-Agent (3) → 16 Ownership-Transfer (1). Muster + Architektur-Regel: siehe Roadmap-Abschnitt "UI-Backlog" (Plugin-Module via Manifest, Core-Module statisch; Referenz: Marketplace=Plugin, Approvals=Core).
|
||||||
2. **Re-Audit ausstehend:** Externer Prüfer prueft leocrm-reaudit.zip (Stand b58c96f, liegt beim User). Bei neuen Findings: erst die fixen. Hinweis: ZIP enthaelt NICHT die UI-Module 2-8 — bei Bedarf frischen ZIP erstellen (git archive HEAD).
|
2. **Re-Audit ausstehend:** Externer Prüfer prueft leocrm-reaudit.zip (Stand b58c96f, liegt beim User). Bei neuen Findings: erst die fixen. Hinweis: ZIP enthaelt NICHT die UI-Module 2-8 — bei Bedarf frischen ZIP erstellen (git archive HEAD).
|
||||||
3. **Traefik no-cache-Header fuer index.html** (User-Angebot offen, prevents stale JS-Chunks nach Deploys — siehe Incident "Dashboard loads forever").
|
3. **Traefik no-cache-Header fuer index.html** (User-Angebot offen, prevents stale JS-Chunks nach Deploys). HINWEIS: Der "Dashboard loads forever"-Incident wurde 2026-09-14 aufgeklaert — es war der Zustands-Selector-Bug (#381), kein Caching-Problem. Der no-cache-Header bleibt trotzdem sinnvoll gegen stale Chunks nach Deploys.
|
||||||
4. **Server-Entlastung** (User-Thema offen): Cron gegen alte Browser-Prozesse (Incident: 3 Zombie-Chromium, 500+ h CPU) und/oder VPS-Upgrade-Diskussion (22 Container auf 7,6 GB).
|
4. **Server-Entlastung** (User-Thema offen): Cron gegen alte Browser-Prozesse (Incident: 3 Zombie-Chromium, 500+ h CPU) und/oder VPS-Upgrade-Diskussion (22 Container auf 7,6 GB).
|
||||||
5. **Phase O UI-Overhaul:** offen 1.2 Kontakte-Drag-Drop in Ordner, 1.3 MoveDialog.
|
5. **Phase O UI-Overhaul:** offen 1.2 Kontakte-Drag-Drop in Ordner, 1.3 MoveDialog.
|
||||||
6. **Phase P Notizen-App** (P1-P5, user-abgestimmt, Roadmap-Details stehen).
|
6. **Phase P Notizen-App** (P1-P5, user-abgestimmt, Roadmap-Details stehen).
|
||||||
@@ -114,6 +114,7 @@ Phase P Notizen-App oder UI-Backlog-Module 2-16.
|
|||||||
| Bug | Issue | Fix | Verifikation (Live-Messung 2026-09-14) |
|
| Bug | Issue | Fix | Verifikation (Live-Messung 2026-09-14) |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| Jeder Outbox-Event-Publish crashte im Webhook-Dispatcher mit `Neither 'AnnotatedColumn' nor 'Comparator' object has an attribute 'any'` → 158 failed Events (`file.deleted`, 2026-08-27) | [#380](https://forgejo.media-on.de/Leopoldadmin/leocrm/issues/380) | `Webhook.events` ist JSONB-Column (KEINE Relationship): `.any()` an 2 Stellen (webhook_dispatcher.py, webhook_service.py) ersetzt durch `cast(events, JSONB).contains([event])` (Commit 50d6733) | pytest test_webhooks.py 6/6 (SQL: `CAST(webhooks.events AS JSONB) @> ...`); Full Deploy Health 200; Live: `replay-all` → 158 replayed, danach stats `{published:158, failed:0}` (vorher `{failed:158}`) |
|
| Jeder Outbox-Event-Publish crashte im Webhook-Dispatcher mit `Neither 'AnnotatedColumn' nor 'Comparator' object has an attribute 'any'` → 158 failed Events (`file.deleted`, 2026-08-27) | [#380](https://forgejo.media-on.de/Leopoldadmin/leocrm/issues/380) | `Webhook.events` ist JSONB-Column (KEINE Relationship): `.any()` an 2 Stellen (webhook_dispatcher.py, webhook_service.py) ersetzt durch `cast(events, JSONB).contains([event])` (Commit 50d6733) | pytest test_webhooks.py 6/6 (SQL: `CAST(webhooks.events AS JSONB) @> ...`); Full Deploy Health 200; Live: `replay-all` → 158 replayed, danach stats `{published:158, failed:0}` (vorher `{failed:158}`) |
|
||||||
|
| Alle Core-Lazy-Routen im AppShell-Baum hingen ewig im Route-Suspense-Spinner ("Dashboard loads forever"-Incident) bei Direkt-Aufruf/Reload | [#381](https://forgejo.media-on.de/Leopoldadmin/leocrm/issues/381) | Root Cause via Bisekt: `useWorkspaceStore(s => s.moduleMenuOrder())` + `s.visibleModuleKeys()` erzeugten bei jedem getSnapshot NEUE Map/Set-Objekte → useSyncExternalStore-Render-Loop → Suspense-Commits landeten nie. Fix: stabile `context`-Referenz selektieren + useMemo-Ableitung (Commit 3fd0c69) | Bisekt-Beweis: Min-AppShell rendert alles, +Sidebar → Hang; Import-Bisect: Chunk resolved aber kein Commit. Live PROD: /dashboard frischer Kontext `h1='Dashboard', spinner=false` (vorher hängender Spinner); /outbox echter Login: h1='Event Outbox', Published 158, Failed 0, 35 Registry-Karten, mainTextLen 1699 |
|
||||||
|
|
||||||
## Produktions-Bugfixes (2026-08-27)
|
## Produktions-Bugfixes (2026-08-27)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user