wip: Sitzung pausiert — Proxmox-Modul gebaut, ein Befund der Abnahme offen, 14 Commits ungepusht

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-23 15:17:19 +02:00
parent c1afd66586
commit 6530ae503b
2 changed files with 131 additions and 132 deletions
+103 -108
View File
@@ -4,151 +4,146 @@ phase: null
task: null task: null
total_tasks: null total_tasks: null
status: paused status: paused
last_updated: 2026-09-22T14:15:00.000Z last_updated: 2026-09-23T13:15:42.473Z
--- ---
<current_state> <current_state>
Kein laufender Meilenstein. Alle 18 Phasen sind abgeschlossen; seit der Freigabe Kein laufender Meilenstein; die Arbeit laeuft als Quick-Tasks. **Version 1.3.1 ist am
1.2.0 laeuft die Arbeit als Quick-Tasks. **Version 1.3.0 wurde am 22.09.2026 23.09. freigegeben** (Tag `v1.3.1` auf `ad004b2`, Abbilder `live` + `v1.3.1`, Gitea-Release
freigegeben** (Tag `v1.3.0` auf `d146234`, Abbilder `live` und `v1.3.0`, mit beiden Desktop-Paketen).
Gitea-Release mit `Tessera-Setup-1.3.0.exe` und `Tessera-1.3.0.AppImage`).
`main == origin/main` auf `1315f37`, Arbeitsbaum sauber, CI gruen. Der lokale **14 Commits liegen lokal und sind NICHT gepusht.** Arbeitsbaum sauber. Der lokale Stack
Docker-Stack laeuft mit genau diesem Stand (web, api, db). laeuft mit dem Proxmox-Stand (web, api, db neu gebaut).
Unterbrochen wurde NICHT mitten in einer Aufgabe — alle acht Auftraege dieser Unterbrochen wurde NICHT mitten in einer Aufgabe: das Proxmox-Modul ist vollstaendig gebaut,
Sitzung sind fertig, nachgewiesen und gepusht. Der naechste Auftrag (Proxmox) geprueft und die drei Befunde aus dem Rundgang sind behoben. Offen ist EIN Befund aus der
ist inhaltlich geklaert, wartet aber auf Zugangsdaten des Nutzers. Abnahme (siehe Restarbeit) und der Push.
</current_state> </current_state>
<completed_work> <completed_work>
Diese Sitzung (21.09. abends bis 22.09. nachmittags): Diese Sitzung (22.09. abends bis 23.09. nachmittags):
- quick-260921-pi9 — Dashboard-Widget „Bilderrahmen" (Upload oder https-Adresse, Diashow, Grossansicht) - **quick-260922-vdk** — Dashboard-Raster misst seine Breite auch aus dem Leerzustand heraus.
- quick-260921-qd3 — Dashboard-Widget „XFrame" (Webseite als Rahmen, Sandbox ohne Top-Navigation) Meldung kam aus dem **Linux-Client**; Ursache war ein `useEffect(..., [])`, das den
- quick-260922-frg — Tray-Update-Eintrag nennt den Grund einer fehlgeschlagenen Pruefung, Klick prueft erneut, Pruefung alle 4 h ResizeObserver nie anhaengte, wenn das Dashboard beim Einhaengen leer war. Breite blieb auf
- fast `747a4d4` — Download-Knoepfe im Desktop-Client oeffnen den System-Browser (waren ohne Funktion) dem Startwert 1200 -> rechts ein toter Streifen. Im echten AppImage gegengemessen.
- quick-260922-ge2 — XFrame: Ausschnitt waehlen und einpassen, Zoom, „Nur anzeigen" - **Platte aufgeraeumt** — 3,6 GB frei -> 66 GB. Nur Wegwerf-Sachen (Docker-Build-Cache 27,9 GB,
- **Freigabe 1.3.0** — CHANGELOG abgeschlossen, `live` vorgezogen, Tag gepusht, drei CI-Laeufe gruen 58 verwaiste Image-Schichten 43,3 GB, verwaiste CI-Volumes).
- quick-260922-hk4 — Bilderrahmen-Bilder in den Dateibereich `user-files` statt in die Datenbank, automatischer Umzug beim Start, Selbstheilung aus der alten Spalte - **Freigabe 1.3.1** — CHANGELOG abgeschlossen, `live` vorgezogen, Tag gepusht.
- quick-260922-m1h — Widget-Typen an EINER Stelle, Katalog aus der Registry + Modulfilter, Kachel kennt ihr Modul - **quick-260923-ad9** — Dashboard-Reiter: mehrere Dashboards je Benutzer, per Ziehen sortierbar,
der erste ist der Standard. Bestand wandert per Migration in den ersten Reiter.
- **quick-260923-dhh** — Proxmox-Modul (PVE/PBS/PMG), nur beobachten, sieben Aufgaben.
- **quick-260923-ku6** — drei Befunde aus dem Proxmox-Rundgang behoben.
Jeder Punkt wurde im Browser (Playwright-MCP) gegen den lokalen Stack geprueft; Jeder Punkt wurde im Browser bzw. im echten Client geprueft; die Protokolle stehen in den
die Pruefprotokolle stehen in den jeweiligen SUMMARY.md unter `.planning/quick/`. jeweiligen SUMMARY.md unter `.planning/quick/`.
</completed_work> </completed_work>
<remaining_work> <remaining_work>
1. **Proxmox-Modul** (PVE, PBS, PMG) — **nur beobachten**, keine Eingriffe. 1. **Offener Befund der Abnahme (zuerst):** `sumOrNull` in
Seite: Server anbinden, VMs/Container mit CPU, Arbeitsspeicher, Plattenplatz `apps/api/src/proxmox/proxmox-normalize.ts` liefert bei EINEM fehlenden Teilwert die halbe
und Erreichbarkeit; bei PBS Sicherungslaeufe und Pruefstatus, bei PMG die Summe statt `null` — also einen stillen Falschwert genau dort, wo die Feldnamen am
Mail-Zahlen (zugestellt, gefiltert, blockiert, Quarantaene). schlechtesten belegt sind (PMG, Annahme A5). Ein Test fuer „nur eine Haelfte vorhanden“
2. **Proxmox-Kachel** — kompakte Fassung ueber den neuen Weg (drei Stellen, fehlt bisher ganz.
siehe unten). Vorschlag fuer den Inhalt steht in der Sitzung: Ampel je Server 2. **Kleinbefund:** „Jetzt aktualisieren“ auf der Proxmox-Modulseite wird allen mit
+ drei Balken; PBS: Alter der letzten Sicherung, Pruefergebnis, freier Platz; Modulzugriff gezeigt; der Endpunkt verlangt aber ADMIN/SUPER_ADMIN. Bei anderen passiert
PMG: Tageszahlen in einer Zeile. Idee fuer spaeter: eine Sammelkachel beim Klick nichts.
„Alles in Ordnung?" mit einer Zeile je Server. 3. **Push** (14 Commits) und CI abwarten.
4. **Proxmox-Dashboard-Kachel** als eigener kleiner Auftrag ueber den Weg aus 260922-m1h
(`WIDGET_TYPES` + `WIDGET_MODULE_SLUGS` + `registerWidget`).
5. **Freigabe 1.4.0**, sobald Reiter und Proxmox auf alpha bestaetigt sind (neue Funktionen,
also Minor, nicht Patch).
</remaining_work> </remaining_work>
<decisions_made> <decisions_made>
- **Bilder auf die Festplatte, nicht in die Datenbank** — Grund ist die Sicherung - **Proxmox: nur beobachten.** Einzige nicht-lesende Anfrage ist die Ticket-Anmeldung; sie liegt
(`pg_dump` von Hand; 30 Bilder à 5 MiB je Benutzer waeren 150 MB pro Benutzer an genau einer Stelle und `proxmox-nur-lesen.spec.ts` zaehlt sie gegen eine benannte Konstante.
im Abzug), nicht die Geschwindigkeit, und die Einheitlichkeit mit Avataren - **Keine SSRF-Adresssperre** — Proxmox steht per Definition im internen Netz, eine Sperre wuerde
(`user-files/avatars`) und DKV-Exporten. jede echte Adresse blockieren. Schutz ist, dass nur ein Administrator Adressen eintraegt.
- **Zweistufige Umstellung:** Spalte `data` bleibt vorerst stehen; `getBytes` - **PMG nur Benutzer/Passwort** (Recherche A1, Forenbeleg). Faellt beim Test auf, wenn es doch
stellt eine fehlende Datei daraus wieder her. DROP erst, wenn alpha UND live Token kann — dann nachruesten.
einmal mit dieser Version gelaufen sind — Todo liegt unter - **Zertifikats-Ausnahme je Serverzeile**, niemals global.
`.planning/todos/pending/2026-09-22-dashboard-image-data-spalte-entfernen.md`. - **Dashboard-Reiter:** der erste Reiter ist der Standard; „als Favorit festlegen“ heisst nach
- **Proxmox: nur beobachten**, Zugriff ueber die normale Modulfreigabe vorn ziehen. Kein zusaetzliches Kennzeichen.
(Nutzeransage 22.09.). - **Dashboard-Raster:** belegter Platz bleibt gesperrt, nichts weicht aus. Nutzeransage 22.09.
- **Kacheln gesperrter Module erscheinen gar nicht erst im Katalog** - **KEIN Umbau der Proxmox-Modulseite.** Der Nutzer hat den Wunsch nach mehr Detailgrad und
(Nutzeransage 22.09.) — so umgesetzt in m1h. Statusfarben am 23.09. ausdruecklich zurueckgezogen („vergiss das letzte, was ich geschrieben
- **Basic-Auth am Proxy vor alpha bleibt** (Nutzerentscheidung). Aus dem habe“). **Nicht von selbst wieder aufgreifen.**
Firmennetz greift eine Ausnahme; von aussen 401, und der Client sagt das seit
frg selbst. **Nicht erneut vorschlagen, das Thema ist entschieden.**
</decisions_made> </decisions_made>
<blockers> <blockers>
- Proxmox braucht Zugangsdaten und Serveradressen des Nutzers (API-Token, nur - Die Proxmox-Feldnamen bei PBS und PMG sind nicht aus erster Quelle belegt (A2/A3/A5). Nur der
lesend, z. B. Rolle `PVEAuditor`). Der Nutzer legt sie morgen an. Planung und Test des Nutzers auf alpha gegen echte Server klaert das. Die Auswertung ist deshalb nachsichtig
Modulskelett koennen vorher entstehen, die Anbindung nicht getestet werden. gebaut, und jede Feldnamenliste liegt als EINE benannte Konstante in `proxmox-normalize.ts`.
- Live steht moeglicherweise noch auf 1.3.0: der Nutzer hat gezogen, bevor die `live`-Abbilder
fertig waren (Tag-Lauf war zuerst rot). Ein zweiter `pull` steht aus, unbestaetigt.
</blockers> </blockers>
## Required Reading (in order) ## Required Reading (in order)
1. `.planning/quick/260922-m1h-dashboard-widgets-ein-modul-bringt-seine/260922-m1h-SUMMARY.md` — Abschnitt „So fuegt man kuenftig eine Modul-Kachel hinzu": drei Stellen statt sieben. 1. `.planning/quick/260923-dhh-proxmox-modul-pve-pbs-und-pmg-anbinden-n/260923-dhh-VERIFICATION.md`
2. `docs/anleitung-entwicklung.md` — Modul-Walkthrough (Backend + Frontend) und der neue Abschnitt „Eine Kachel zum Modul". — der offene Befund steht dort mit Reproduktion.
3. `.planning/quick/260922-hk4-bilderrahmen-bilder-auf-die-festplatte/260922-hk4-SUMMARY.md` — Dateiablage, wenn das Proxmox-Modul jemals Dateien speichert. 2. `.planning/quick/260923-dhh-.../260923-dhh-RESEARCH.md` — Annahmen-Log A1…A5, die einzige
4. `.planning/STATE.md` — Abschnitte „Current Position" und die letzten Zeilen der Quick-Tabelle. Stelle, an der steht, was an der Proxmox-Anbindung belegt und was abgeleitet ist.
3. `.planning/quick/260923-ku6-.../260923-ku6-SUMMARY.md` — die Merge-Regel des Verbindungstests
(Formular vs. gespeichert, Geheimnisfelder).
4. `.planning/STATE.md` — Abschnitt „Current Position“ und die letzten Zeilen der Quick-Tabelle.
## Critical Anti-Patterns (do NOT repeat these) ## Critical Anti-Patterns (do NOT repeat these)
- [ANTI-PATTERN]: Planannahmen ueber den Bestand ungeprueft uebernehmen → m1h: der Plan - [ANTI-PATTERN]: Im Desktop-Client gegen `getBoundingClientRect()`/`getComputedStyle()` messen →
behauptete, `apps/web` importiere `@tessera/shared` bereits; es gab KEINE 260922-vdk: die Werte blieben auf dem ALTEN Stand, obwohl `style.width` bereits richtig war.
Abhaengigkeit, und zwei Kommentare hielten das als Absicht fest. Der Executor WebKitGTK friert die Animationsuhr ein, wenn das Fenster im Hintergrund liegt, und die
hat vor der ersten Zeile Code nachgemessen (Bau, Produktions-Abbild, natives `width`-Uebergangsanimation bleibt stehen. **Mitigation:** im Client gegen die GESETZTEN Werte
Type-Stripping unter `node:24-alpine`) statt der Annahme zu folgen. messen (`style.width`, `style.transform`) oder gegen die React-Eigenschaften aus dem Fiber.
**Mitigation:** jede Plan-Behauptung ueber vorhandene Abhaengigkeiten oder - [ANTI-PATTERN]: Ein Bestaetigungsfenster nur ueber `[role="dialog"]` suchen → der Loeschen-Dialog
Muster vor dem Umsetzen einmal am Code pruefen. der Reiter traegt `role="alertdialog"`; die Pruefung sah „es passiert nichts“, obwohl das Fenster
- [ANTI-PATTERN]: Vorschau und Darstellung mit unterschiedlichen Layoutmassen → offen war. **Mitigation:** auf beide Rollen abfragen.
ge2: die Kachel nutzte eine andere Rahmenhoehe als die Vorschau, wodurch Seiten - [ANTI-PATTERN]: Nach dem Tag sofort auf dem Server `pull` ausfuehren → eine Freigabe loest DREI
mit fensterhoehen-abhaengigem Layout (`vh`) an anderer Stelle lagen als Pipelines aus; faellt der Tag-Lauf um (bei 1.3.1: ein flackernder Test mit 5-Sekunden-Grenze),
ausgewaehlt. **Mitigation:** Auswahl und Darstellung immer gegen dieselben werden Abbild-Bau und Desktop-Pakete UEBERSPRUNGEN, und `pull` holt still den alten Stand.
Masse rechnen. **Mitigation:** erst pruefen, dass die Abbilder `live`/`beta` einen neuen Zeitstempel tragen,
- [ANTI-PATTERN]: `position: fixed` in einer Dashboard-Kachel → pi9: die dann ziehen. Todo zum flackernden Test liegt unter `.planning/todos/pending/`.
Grossansicht blieb auf die Kachelflaeche beschraenkt, weil `react-grid-item` - [ANTI-PATTERN]: Eine Vermutung ueber die Ursache aus einem Bildausschnitt ableiten → beim
eine CSS-`transform` traegt und damit zum Bezugsrahmen wird. Raster-Fehler fuehrte der erste Verdacht („eine Nachbarkachel blockiert“) in die Irre; erst das
**Mitigation:** Overlays aus einer Kachel per `createPortal` in `document.body` volle Fenster und das Rueckrechnen der Spaltenbreite (51,5 px, letzte Spalte 13) haben die echte
rendern (Muster: Kalender-Tooltip, jetzt auch `picture-frame-lightbox.tsx`). Ursache gezeigt. **Mitigation:** bei Bildbefunden das GANZE Fenster anfordern, nicht den
- [ANTI-PATTERN]: Playwright klickt in einem per `transform` skalierten iframe Ausschnitt, und die Geometrie nachrechnen.
nicht → ge2. **Mitigation:** Klickpunkt umrechnen und per
`elementFromPoint` + `mouse.click` pruefen; ist eine Werkzeuggrenze, kein Produktfehler.
## Infrastructure State ## Infrastructure State
- **Lokaler Stack:** `docker compose` mit web, api, db laeuft auf dem Stand - **Lokaler Stack:** `docker compose` mit web, api, db, gebaut auf dem Proxmox-Stand.
`1315f37` (`up -d --build` am 22.09. nachmittags). `up` allein baut NICHT neu. `up` allein baut NICHT neu. DB ohne Host-Port — Prisma vom Host ueber die Container-IP
DB ohne Host-Port — Prisma vom Host ueber die Container-IP
(`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' tessera-ctl-db-1`, (`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' tessera-ctl-db-1`,
`tessera:tessera_dev`). `tessera:tessera_dev`).
- **Testdaten lokal:** im Admin-Dashboard stehen ein Bilderrahmen (zwei Bilder) - **Proxmox-Nachbau:** Node-Skript mit selbstsigniertem Zertifikat im Scratchpad
und ein XFrame auf `example.com` mit Ausschnitt. Harmlos, darf bleiben. (`scratchpad/fake-proxmox.mjs`, Port 8006, aus dem api-Container ueber `172.21.0.1` erreichbar).
- **alpha** (`alpha.tessera.ctl.de`) wurde am 22.09. auf `80a0d23` gezogen; die Laeuft noch; `/tmp` ueberlebt keinen Neustart, das Skript ist aber schnell neu gebaut.
spaeteren Commits (hk4, m1h) sind dort noch nicht drauf. Basic-Auth am Proxy Endpunkte: `/api2/json/cluster/resources`, `/status/datastore-usage`,
bleibt — von aussen 401, deshalb Messungen gegen alpha nur am Proxy vorbei `/admin/datastore/{name}/snapshots`, `/statistics/mail`, `POST /access/ticket`.
(auf dem Testserver `docker compose exec api` gegen `localhost:3001` oder - **Lokale Testdaten (duerfen weg):** zwei Proxmox-Server in der DB („Nachbau PVE“ und
Host-Port 3000). „Nachbau kaputth“, letzterer absichtlich unerreichbar), Proxmox im Marktplatz aktiviert,
- **Live** (`tessera.ctl.de`) laeuft noch auf 1.2.0; der Pull auf 1.3.0 steht beim im Admin-Dashboard ein Reiter „Dashboard“ mit 5 Kacheln.
Nutzer aus. - **alpha** (`alpha.tessera.ctl.de`): Stand 1.3.1-Beta; Reiter und Proxmox fehlen dort noch,
- **Desktop-Client:** neuester CI-Stempel `5aa577a` (Lauf 405). Der Nutzer muss weil nicht gepusht.
ihn einmal per Browser installieren, danach laeuft das Update ueber das Tray. - **Live** (`tessera.ctl.de`): 1.3.1 freigegeben; ob der Server sie wirklich zieht, ist offen.
<context> <context>
Die Sitzung war eine lange Kette kleiner, vollstaendig abgeschlossener Auftraege. Der rote Faden: erst ein gemeldeter Fehler aus dem Linux-Client (Kachel liess sich nicht ganz
Der rote Faden am Ende: Der Nutzer will als naechstes ein Proxmox-Modul, das nach rechts ziehen), der sich als Breitenmessung entpuppte; dann Freigabe; dann zwei Wuensche des
zusaetzlich als Kachel auf dem Dashboard erscheint — und kuenftig sollen weitere Nutzers nacheinander — Dashboard-Reiter und das Proxmox-Modul. Beim Proxmox-Modul ist die
Module dasselbe tun. Deshalb wurde zuerst das Fundament geraeumt (m1h), damit Besonderheit, dass hier KEIN echter Server steht: deshalb wurde ein Nachbau gebaut, die Auswertung
eine Modul-Kachel drei Handgriffe kostet statt sieben und Kacheln gesperrter bewusst nachsichtig ausgelegt und jede Feldnamenliste an genau eine Stelle gelegt, damit der
Module automatisch verschwinden. Das Geruest dafuer (`WIDGET_MODULE_SLUGS`, Nutzer sie nach seinem Test auf alpha in einem Griff korrigieren kann.
serverseitiger Filter in `dashboard.service.ts`) ist vorhanden und noch leer;
Proxmox waere der erste Eintrag.
Fuer Proxmox selbst ist vorgemerkt: Serveradressen traegt nur ein Administrator
ein (damit ist die Adresse eine bewusste Freigabe statt beliebiger Eingabe), fuer
genau diese Adressen werden Zertifikatsfehler toleriert (Muster:
`favorites/icon-discovery.service.ts`, undici-Dispatcher — Nodes globales `fetch`
ignoriert ihn), Zugangsdaten verschluesselt per `CryptoService` (Muster
`ldap-config.service.ts`), Abfrage im Hintergrund je Mandant nach dem Muster
`dkv-scheduler.service.ts` (`onApplicationBootstrap`, nicht `onModuleInit`).
</context> </context>
<next_action> <next_action>
Start with: Proxmox-Modul planen (`/gsd-quick` mit eigenem Plan wie bei ge2/hk4) — Start with: den offenen Befund der Abnahme beheben — `sumOrNull` in
Datenmodell fuer Serverzugaenge (Adresse, Typ `pve|pbs|pmg`, verschluesselter `apps/api/src/proxmox/proxmox-normalize.ts` muss `null` liefern, sobald EIN Teilwert fehlt
Token), Abfrage im Hintergrund je Mandant, Modulskelett nach (heute `(a ?? 0) + (b ?? 0)`), plus ein Test fuer „nur eine Haelfte vorhanden“. Gleich mit
`docs/anleitung-entwicklung.md`, Seite mit Serverliste und Auslastung. Die erledigen: „Jetzt aktualisieren“ nur fuer ADMIN/SUPER_ADMIN anzeigen. Danach Tore laufen lassen,
Kachel kommt danach als eigener kleiner Auftrag ueber den neuen Weg. Vorher beim committen, die 14 Commits pushen und die CI abwarten.
Nutzer abholen: Serveradressen und die lesenden API-Token.
</next_action> </next_action>
+28 -24
View File
@@ -1,45 +1,49 @@
{ {
"version": "1.0", "version": "1.0",
"timestamp": "2026-09-22T14:15:00.000Z", "timestamp": "2026-09-23T13:15:42.473Z",
"phase": null, "phase": null,
"phase_name": "kein laufender Meilenstein — Quick-Tasks nach der Freigabe 1.3.0", "phase_name": "kein laufender Meilenstein — Quick-Tasks; zuletzt Proxmox-Modul",
"phase_dir": null, "phase_dir": null,
"plan": null, "plan": null,
"task": null, "task": null,
"total_tasks": null, "total_tasks": null,
"status": "paused", "status": "paused",
"completed_tasks": [ "completed_tasks": [
{"id": 1, "name": "quick-260921-pi9 Bilderrahmen-Widget", "status": "done", "commit": "737974b,c080580,c3b4597,8bf3601"}, {"id": 1, "name": "quick-260922-vdk Dashboard-Raster misst seine Breite auch aus dem Leerzustand", "status": "done", "commit": "d9f2af3,cf67c8a,39b1f74"},
{"id": 2, "name": "quick-260921-qd3 XFrame-Widget", "status": "done", "commit": "d63d9f5,20a9eb2"}, {"id": 2, "name": "Freigabe 1.3.1 (CHANGELOG, live-Zweig, Tag v1.3.1, Gitea-Release, Desktop-Pakete)", "status": "done", "commit": "ad004b2 (Tag v1.3.1)"},
{"id": 3, "name": "quick-260922-frg Tray-Update nennt den Grund, prueft alle 4 h", "status": "done", "commit": "d73aad1"}, {"id": 3, "name": "Todo notiert: flackernder Test tenant-selector blockierte die Freigabe", "status": "done", "commit": "fcad460"},
{"id": 4, "name": "fast Download-Knoepfe im Desktop-Client", "status": "done", "commit": "747a4d4"}, {"id": 4, "name": "quick-260923-ad9 Dashboard-Reiter (mehrere Dashboards, Ziehen sortiert, erster ist Standard)", "status": "done", "commit": "9c51823,df7a5e7,d34f682,05feaa3,58ce88e,0094a60"},
{"id": 5, "name": "quick-260922-ge2 XFrame-Ausschnitt, Zoom, Nur anzeigen", "status": "done", "commit": "445b1d3,30fdd99,cf70a19"}, {"id": 5, "name": "quick-260923-dhh Proxmox-Modul PVE/PBS/PMG, nur beobachten", "status": "done", "commit": "3a1bfd9,4f8a368,998aba9,fccaf8d,723cf68,06fcdc0,3091b04"},
{"id": 6, "name": "Freigabe 1.3.0", "status": "done", "commit": "d146234 (Tag v1.3.0)"}, {"id": 6, "name": "quick-260923-ku6 drei Befunde aus dem Proxmox-Rundgang behoben", "status": "done", "commit": "710034c,f1bb7f7,a9e0d5b"},
{"id": 7, "name": "quick-260922-hk4 Bilder in den Dateibereich statt in die Datenbank", "status": "done", "commit": "9039cea,8cbfb8b,82472ee"}, {"id": 7, "name": "Platte aufgeraeumt (Docker-Build-Cache, verwaiste Images, CI-Volumes)", "status": "done", "commit": null}
{"id": 8, "name": "quick-260922-m1h Modul bringt seine Kachel selbst mit", "status": "done", "commit": "56c07c3,8be0725"}
], ],
"remaining_tasks": [ "remaining_tasks": [
{"id": 9, "name": "Proxmox-Modul (PVE/PBS/PMG), nur beobachten — Plan schreiben und bauen", "status": "not_started"}, {"id": 8, "name": "OFFENER BEFUND der Abnahme: sumOrNull in normalizePmg liefert bei EINEM fehlenden Teilwert die halbe Summe statt null (stiller Falschwert)", "status": "not_started"},
{"id": 10, "name": "Proxmox-Kachel (kompakte Version) ueber den neuen Weg", "status": "not_started"} {"id": 9, "name": "Kleinbefund: 'Jetzt aktualisieren' wird allen mit Modulzugriff gezeigt, der Endpunkt verlangt aber ADMIN — Klick bleibt bei anderen wirkungslos", "status": "not_started"},
{"id": 10, "name": "Push (14 Commits liegen lokal) und CI abwarten", "status": "not_started"},
{"id": 11, "name": "Proxmox-Dashboard-Kachel als eigener Auftrag (Weg aus quick-260922-m1h)", "status": "not_started"},
{"id": 12, "name": "Freigabe 1.4.0, wenn Reiter und Proxmox auf alpha bestaetigt sind", "status": "not_started"}
], ],
"blockers": [ "blockers": [
{"description": "Proxmox braucht Zugangsdaten des Nutzers (API-Token, nur lesend) und die Server-Adressen", "type": "human_action", "workaround": "Nutzer legt sie morgen an; Planung und Geruest koennen vorher entstehen"} {"description": "Proxmox-Feldnamen bei PBS und PMG sind nicht aus erster Quelle belegt (Annahmen A2/A3/A5) — nur der Test des Nutzers gegen echte Server klaert das", "type": "external", "workaround": "Auswertung ist nachsichtig gebaut: fehlendes/anders benanntes Feld -> 'unbekannt', nie Absturz. Feldnamenlisten liegen je als EINE benannte Konstante in proxmox-normalize.ts"},
{"description": "Der Nutzer prueft Proxmox selbst auf alpha gegen seine echten Server; hier gibt es keinen echten PVE/PBS/PMG", "type": "human_action", "workaround": "Lokal laeuft ein selbst gebauter Nachbau (HTTPS, selbstsigniert) im Scratchpad — siehe context_notes"}
], ],
"async_jobs": [], "async_jobs": [],
"human_actions_pending": [ "human_actions_pending": [
{"action": "Live-Server auf 1.3.0 ziehen (docker compose -f docker-compose.prod.yml pull && up -d --force-recreate api web)", "context": "Version 1.3.0 ist freigegeben, Abbilder live/v1.3.0 liegen bereit", "blocking": false}, {"action": "Live-Server auf 1.3.1 ziehen und in der Seitenleiste 'v1.3.1 · Live' pruefen", "context": "Der Nutzer hat am 23.09. zu frueh gezogen (der Tag-Lauf war wegen eines flackernden Tests rot, die live-Abbilder entstanden erst um 07:37/07:38 nach dem Neustart). Er meldete danach '1.3.0' — ein zweiter pull steht aus, unbestaetigt.", "blocking": false},
{"action": "Neuen Desktop-Client einmal per Browser installieren", "context": "Danach laeuft das Update ueber das Tray-Symbol; Live hatte den Updater bis 1.2.0 nicht", "blocking": false}, {"action": "Nach dem Push: alpha ziehen und die Dashboard-Reiter ausprobieren", "context": "Reiter liegen seit 0094a60 in der Beta, CI war gruen. Datenbankaenderung laeuft beim API-Start automatisch mit.", "blocking": false},
{"action": "Proxmox-API-Token (nur lesend, z. B. Rolle PVEAuditor) fuer PVE, PBS und PMG anlegen und die Server-Adressen bereithalten", "context": "Voraussetzung fuer das naechste Modul; der Nutzer macht das morgen", "blocking": true} {"action": "Proxmox auf alpha einrichten: Server anlegen (Adresse, Token oder Benutzer/Passwort), Zertifikats-Ausnahme setzen, 'Verbindung testen'", "context": "Erst dieser Test klaert die offenen Feldnamen-Annahmen. Nur-Lese-Rolle: PVE PVEAuditor; bei PBS und PMG die jeweils lesende Rolle.", "blocking": false}
], ],
"decisions": [ "decisions": [
{"decision": "Bilderrahmen-Bilder liegen im Dateibereich user-files, nicht als bytea in der Datenbank", "rationale": "Sicherung laeuft per pg_dump von Hand; 30 Bilder a 5 MiB je Benutzer waeren 150 MB pro Benutzer im Abzug. Geschwindigkeit war NICHT das Argument. Dazu Einheitlichkeit mit Avataren und DKV-Exporten.", "phase": null}, {"decision": "Proxmox: nur beobachten, keine Eingriffe — einzige nicht-lesende Anfrage ist die Ticket-Anmeldung, maschinell begrenzt durch proxmox-nur-lesen.spec.ts", "rationale": "Ausdrueckliche Nutzeransage 22./23.09.", "phase": null},
{"decision": "Spalte data bleibt vorerst stehen, DROP erst nach nachgewiesenem Lauf auf alpha und live", "rationale": "Zweistufige Umstellung; getBytes stellt eine fehlende Datei aus data wieder her (alter pg_dump + leeres Volume).", "phase": null}, {"decision": "Keine SSRF-Adresssperre nach Vorbild isPublicHttpUrl", "rationale": "Proxmox steht per Definition im internen Netz — eine Sperre wuerde jede echte Adresse blockieren. Schutz ist stattdessen, dass nur ein Administrator Adressen eintraegt.", "phase": null},
{"decision": "Widget-Typen an EINER Stelle (packages/shared), Katalog filtert nach Modulzugriff", "rationale": "Vorarbeit fuer Proxmox und weitere Modul-Kacheln; vorher sieben Hartkodierungen je Kachel.", "phase": null}, {"decision": "PMG nur Benutzer/Passwort, kein API-Token", "rationale": "Recherche A1: PMG kennt offenbar keine Token (Forenbeleg, keine Primaerquelle). Faellt beim Test auf, wenn es doch geht — dann nachruesten.", "phase": null},
{"decision": "Proxmox zunaechst NUR beobachten, keine Eingriffe; Zugriff ueber die normale Modulfreigabe", "rationale": "Ausdrueckliche Ansage des Nutzers am 22.09.", "phase": null}, {"decision": "Zertifikats-Ausnahme je Serverzeile, niemals global", "rationale": "Muster LdapConfig.tlsRejectUnauthorized + undici-Dispatcher aus favorites/icon-discovery.service.ts", "phase": null},
{"decision": "Kacheln gesperrter Module erscheinen gar nicht erst im Katalog", "rationale": "Ausdrueckliche Ansage des Nutzers am 22.09.", "phase": null}, {"decision": "Dashboard-Reiter: der ERSTE Reiter ist der Standard, 'als Favorit festlegen' = nach vorn ziehen; kein zusaetzliches Kennzeichen", "rationale": "Nutzer praezisierte sich selbst mit 'bzw.' — verschiebbare Reiter, erster ist Standard", "phase": null},
{"decision": "Basic-Auth am Proxy vor alpha bleibt", "rationale": "Entscheidung des Nutzers; aus dem Firmennetz greift eine Ausnahme. Nicht mehr ansprechen.", "phase": null} {"decision": "Dashboard-Raster: belegter Platz bleibt gesperrt, nichts weicht aus (preventCollision bleibt)", "rationale": "Ausdrueckliche Nutzeransage 22.09.: 'Da wo schon ein widget ist, soll keins hinkommen, nichts verschieben.'", "phase": null},
{"decision": "KEIN Umbau der Proxmox-Modulseite (Detailgrad/Statusfarben)", "rationale": "Der Nutzer hat den Wunsch am 23.09. ausdruecklich zurueckgezogen: 'vergiss das letzte, was ich geschrieben habe'. Nicht von selbst wieder aufgreifen.", "phase": null}
], ],
"uncommitted_files": [], "uncommitted_files": [],
"next_action": "Proxmox-Modul planen: Prisma-Modelle fuer Serverzugaenge (Adresse, Typ pve|pbs|pmg, Token verschluesselt per CryptoService), Poller je Mandant nach dem Muster dkv-scheduler (onApplicationBootstrap), Modul-Skelett nach docs/anleitung-entwicklung.md, danach die Kachel ueber den neuen Weg (WIDGET_TYPES + WIDGET_MODULE_SLUGS + registerWidget).", "next_action": "Den offenen Befund der Abnahme beheben: sumOrNull in apps/api/src/proxmox/proxmox-normalize.ts muss null liefern, sobald EIN Teilwert fehlt (heute: (a ?? 0) + (b ?? 0), also halbe Summe als vollstaendige Zahl). Test fuer 'nur eine Haelfte vorhanden' ergaenzen (fehlt heute in proxmox-normalize.spec.ts). Gleich mit erledigen: 'Jetzt aktualisieren' nur fuer ADMIN/SUPER_ADMIN anzeigen. Danach Tore laufen lassen, committen, pushen, CI abwarten.",
"context_notes": "Sitzung lief ueber 1,5 Tage: zwei neue Widgets, drei Desktop-Korrekturen, Freigabe 1.3.0, Speicherumstellung, Widget-Aufraeumen. Alles gepusht, main == origin/main auf 1315f37, Arbeitsbaum sauber, CI gruen. Der lokale Docker-Stack laeuft mit dem aktuellen Stand; Testfavoriten/Test-Widgets im Admin-Dashboard sind lokal stehen geblieben (harmlos). Naechster Schritt ist inhaltlich klar, haengt aber an den Zugangsdaten des Nutzers." "context_notes": "Sitzung vom 22.09. abends bis 23.09. nachmittags. Reihenfolge: Raster-Breitenfehler (im ECHTEN Linux-Client nachgemessen, nicht im Browser) -> Platte aufgeraeumt (3,6 GB frei -> 66 GB) -> Freigabe 1.3.1 -> Dashboard-Reiter -> Proxmox-Modul. 14 Commits liegen lokal und sind NICHT gepusht. Lokale Umgebung: Container laufen mit dem Proxmox-Stand; im lokalen Dashboard des Admin liegt ein Reiter 'Dashboard' mit 5 Kacheln; in der lokalen DB stehen ZWEI Test-Proxmox-Server ('Nachbau PVE' auf https://172.21.0.1:8006 und 'Nachbau kaputth' auf Port 9999, letzterer absichtlich unerreichbar) und das Proxmox-Modul ist im Marktplatz aktiviert — alles Testdaten, duerfen weg. Der Proxmox-Nachbau (Node-Skript + selbstsigniertes Zertifikat) liegt im Scratchpad unter /tmp/claude-1000/-home-vicolab-projects-tessera-ctl/3048d06f-c57f-475e-a181-e61dc35ebe9a/scratchpad/fake-proxmox.mjs und laeuft dort noch; /tmp ueberlebt einen Neustart nicht, das Skript ist aber in 20 Zeilen neu gebaut (Endpunkte: /api2/json/cluster/resources, /status/datastore-usage, /admin/datastore/{name}/snapshots, /statistics/mail, POST /access/ticket)."
} }