diff --git a/.planning/STATE.md b/.planning/STATE.md index 6d9b9c7..3359ef5 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -1,19 +1,20 @@ --- -gsd_state_version: 1.0 +gsd_state_version: "1.0" milestone: v1.2 -milestone_name: Plattform-Berechtigungen current_phase: 17 current_phase_name: eigene-ausschreibungs-quellen-je-nutzer status: verified -stopped_at: "WINDOWS #14 und #15 am 2026-09-09 auf alpha abgenommen und geschlossen. Der Sync legt die vier kollidierenden Konten jetzt an (ohne Adresse, erster Anspruch behaelt sie) und meldet das in verstaendlichem Deutsch statt in Prisma-Text; Benutzerliste und Mitgliedersuche vertragen Konten ohne Adresse. Die Matrix-Suche laesst die nicht getroffene Achse stehen, in allen vier geprueften Faellen, Regression #6c intakt. Das Ledger ist damit erstmals ohne offene Punkte: 15 behoben, 1 zurueckgestellt (#12, kein Alarm-Postfach vorhanden). Ebenfalls zurueckgestellt bleibt Abnahmeplan 02-05 (Mandantentrennung, intern zweitrangig)." -last_updated: "2026-09-09T08:45:00.000Z" +stopped_at: "Quick Task 260909-cx0 abgeschlossen: user-files-Volume ergaenzt (WINDOWS #17 bleibt offen bis Server-Uebernahme), CLAUDE.md-Technik-Block auf installierten Stand korrigiert" +last_updated: "2026-09-09T10:00:00.000Z" last_activity: 2026-09-09 -last_activity_desc: Ledger ohne offene Punkte; Mandanten-Branding auf Wunsch des Users zurueckgestellt +last_activity_desc: Dateisicherung nachgeruestet, Versionsangaben in CLAUDE.md auf den installierten Stand gebracht +state_head: c80704957a5518e316a53edc0b8d7e98052a9750 progress: total_phases: 17 completed_phases: 17 total_plans: 83 completed_plans: 83 +milestone_name: Plattform-Berechtigungen --- # Project State @@ -288,6 +289,7 @@ Recent decisions affecting current work: - [Phase ?]: [17-03]: createRssFeed-Antwort traegt kein isPlatformWide (nur GET mappt es) — Komponente leitet es lokal aus dem verwendeten scope ab (Rule 1) - [Phase ?]: [17-03]: Anzeige-Rollenpruefung auf settings/page.tsx ueber useAuthStore (unbekannt/erlaubt/verweigert); verbindliche Pruefung bleibt serverseitig - [Phase ?]: [17-03]: REQUIREMENTS.md SRC-01..05 nachtraeglich ergaenzt — Luecke aus 17-01/17-02, dort schon in SUMMARY-Frontmatter gefuehrt +- [Phase 17]: [260909-cx0]: Benanntes Volume user-files statt Bind-Mount (uid-1001-Eigentuemerschaft aus dem Image) ### Pitfalls & Anti-Patterns @@ -335,6 +337,7 @@ None yet. - [Roadmap v1.1]: Whether AI-AG NetServer / cosinex VMP search pages require JS rendering is unverified — needs a Phase 13 start-of-phase spike before committing to playwright. - Phase 14 Plan 03 (14-03): Task 4 human-verify OPEN — needs a real portal-alert mailbox (incl. Exchange/EWS live path) from the operator before INGEST-05's Exchange path is production-ready. Tasks 1-3 complete and committed (4d6fbb1, 8983231, 1be6b15, 48e1252); API 387/387, web 144/144 green. - ~~Phase 15 Plan 06 (15-06): manueller Browser-Durchklick nicht ausgefuehrt~~ — ERLEDIGT 2026-09-07, Gegenprobe WINDOWS.md unrun-verify #1 nachgeholt und bestanden +- [260909-cx0] WINDOWS #17 (user-files-Volume) bleibt offen: Repository-Fix committet, aber /opt/tessera/docker-compose.yml auf alpha weicht ab und muss vom Nutzer manuell um dieselben zwei Zeilen ergaenzt werden (vorher sichern), danach Container neu erstellen und Ledger schliessen (gsd-tools windows fixed 17) ### Quick Tasks Completed @@ -363,6 +366,8 @@ None yet. | 21 | Verschluesselungsschluessel in den Beispiel-Umgebungsdateien dokumentiert: .env.example hatte gar keinen Eintrag, .env.prod.example nannte noch den alten Namen CALENDAR_ENCRYPTION_KEY. Compose-Teil des Backlog-Punkts war bereits mit 7bda56d erledigt (Vorgabewert raus, :?-Abbruch statt Ersatzwert) | 2026-08-11 | 379606e | — | | 260907-let | Verbindungstest fuer das Postfach im Ausschreibungs-Radar nachgeruestet (WINDOWS #16): POST /modules/tender-radar/email-config/test plus Knopf "Verbindung testen" im Formular unter Meine Quellen. Nutzt die vorhandene testConnection() beider Inbox-Provider, Muster vom DKV-Modul. userId ausschliesslich aus dem Auth-Kontext (eigener IDOR-Test mit Koeder-userId), leerer Benutzername oder leeres Passwort faellt auf die gespeicherten verschluesselten Zugangsdaten desselben Nutzers zurueck, keine Zugangsdaten in Logs oder Antwort. Verifiziert: 646/646 API- und 228/228 Web-Tests, beide Typpruefungen sauber, Sprachschluessel-Gate von rot auf gruen. Offen: Browser-Abnahme gegen ein echtes Postfach (Ende-der-Phase, braucht Neubau durch den User) | 2026-09-07 | c4db3b2 | [260907-let-verbindungstest-fuer-das-postfach-im-aus](./quick/260907-let-verbindungstest-fuer-das-postfach-im-aus/) | | 260909-ab3 | Zwei Befunde aus der Live-Pruefung behoben. **#14:** Die Suche in der Freigaben-Matrix filterte beide Achsen mit demselben Begriff und leerte dadurch die jeweils andere — jetzt bleibt die nicht getroffene Achse vollstaendig stehen, die Gruppensuche unter internem UND AD-Namen (#6c) ist per Regressionstest gesichert. **#15:** AD-Konten mit bereits vergebener Mailadresse werden nun angelegt, nur ohne Adresse (Produktentscheidung des Users vom 2026-09-09; der erste Anspruch behaelt die Adresse), auf BEIDEN Wegen — Sync und Einzelimport. Rohe Prisma-Texte gehen nur noch ins Log, der Bericht zeigt drei verstaendliche deutsche Abschnitte. **Sicherheitsfund nebenbei geschlossen (T-Q3-01):** der Update-Zweig schrieb die Mailadresse bedingungslos um, ein Verzeichniseintrag haette so die Adresse einer echten Person uebernehmen und deren Passwort-Reset empfangen koennen. `User.email` ist jetzt optional (Migration geschrieben, laeuft beim naechsten API-Start automatisch mit). Verifiziert 8/8: 651/651 API- und 233/233 Web-Tests, beide Typpruefungen sauber; die Sicherheitspruefung wurde durch Rueckbau falsifiziert (ohne Besitzpruefung schlaegt der Test fehl). **Am 2026-09-09 im Browser abgenommen, beide Ledger-Punkte geschlossen** (Bericht: 260909-ab3-UAT-2026-09-09.md) | 2026-09-09 | 2167046 | [260909-ab3-matrix-suche-und-sync-meldungen-reparier](./quick/260909-ab3-matrix-suche-und-sync-meldungen-reparier/) | +| 260909-cx0 | Hochgeladene Dateien (Avatare, DKV-Exporte) ueberlebten kein `--force-recreate` des api-Containers (WINDOWS #17) — lagen nur in der fluechtigen Container-Schicht, keine Compose-Datei mountete `/app/user-files`. Jetzt benanntes Docker-Volume `user-files` in `docker-compose.yml` und `docker-compose.prod.yml` (Eigentuemerschaft uid 1001 aus dem Image, kein Bind-Mount), Betriebshandbuch Kapitel 6/7 entsprechend nachgezogen. Zweiter, unabhaengiger Punkt: CLAUDE.md nannte fuer die Technik-Tabelle noch die 2026-06/07-Empfehlung (Next.js 16.2.x, Prisma 7.8.x, Keycloak, Redis, TanStack Query, shadcn/ui, Playwright, Husky, lint-staged) statt des installierten Stands — jetzt korrigiert auf Next.js 15.5.19, Prisma 6.19.3 etc., nie uebernommene Empfehlungen in eigenem Abschnitt "Recommended But Not Adopted", `.planning/research/STACK.md` nur mit Hinweiszeile ergaenzt. Keine Abhaengigkeit aktualisiert. **WINDOWS #17 bleibt offen** — die Aenderung erreicht die laufende Installation auf alpha nicht, `/opt/tessera/docker-compose.yml` weicht vom Repository ab und muss vom Nutzer selbst ergaenzt werden | 2026-09-09 | dab72eb,c807049 | [260909-cx0-dateisicherung-nachruesten-und-versionsa](./quick/260909-cx0-dateisicherung-nachruesten-und-versionsa/) | +| 260909-cx0 | Dateisicherung nachgeruestet und Versionsangaben geradegezogen. **user-files** liegt jetzt in einem benannten Volume (docker-compose.yml und .prod.yml) — vorher lag der Ordner nur in der fluechtigen Container-Schicht, hochgeladene Profilbilder und DKV-Exporte waeren bei jedem --force-recreate weg gewesen. Benanntes Volume statt Bind-Mount, weil das Image /app/user-files an uid 1001 uebereignet; ein frisch angelegtes Host-Verzeichnis gehoert root und haette aus dem Datenverlust einen kaputten Upload gemacht. docker-compose.dev.yml blieb bewusst unveraendert (Compose fuehrt Mount-Listen ueber das Ziel zusammen). **CLAUDE.md** nennt jetzt die installierten Fassungen statt der urspruenglich empfohlenen (Next.js 15.5.19 statt 16, Prisma 6.19.3 statt 7); neu ist ein Abschnitt 'Recommended But Not Adopted', der sechs nie eingebaute Empfehlungen benennt — darunter Keycloak, Redis und shadcn/ui. Der Block ist generiert, deshalb traegt er einen Herkunftsvermerk und die Recherchedatei eine datierte Hinweiszeile; ihre Zahlen blieben unangetastet. Keine Abhaengigkeit angefasst (per git diff gegengeprueft). **WINDOWS #17 bleibt offen**, bis der User dieselbe Volume-Zeile in /opt/tessera/docker-compose.yml nachtraegt — die Serverdatei weicht vom Repository ab | 2026-09-09 | c807049 | [260909-cx0-dateisicherung-nachruesten-und-versionsa](./quick/260909-cx0-dateisicherung-nachruesten-und-versionsa/) | ## Deferred Items @@ -402,7 +407,7 @@ sind. Kein Anlass, sie vorher erneut vorzulegen. ## Session Continuity -Last session: 2026-09-09T08:45:00.000Z -Stopped at: Nichts in Arbeit, nichts offen, nichts vorgemerkt. Das Broken-Windows-Ledger ist leer (15 behoben, 1 zurueckgestellt). Zurueckgestellt sind: WINDOWS #12 (kein Postfach fuer Ausschreibungs-Alarme vorhanden), Abnahmeplan 02-05 (Mandantentrennung, solange Tessera nur intern laeuft), das Mandanten-Branding (Entscheidung des Users vom 2026-09-09) und die Lizenzpruefung bei der Modulaktivierung (ruht bis alle Module intern laufen). Damit gibt es derzeit KEINEN vorgemerkten naechsten Schritt — der naechste Anstoss kommt vom User. +Last session: 2026-09-09T07:38:54.774Z +Stopped at: Quick Task 260909-cx0 abgeschlossen: user-files-Volume ergaenzt (WINDOWS #17 bleibt offen bis Server-Uebernahme), CLAUDE.md-Technik-Block auf installierten Stand korrigiert Resume file: None Last activity: 2026-09-09 - Ledger geschlossen, Mandanten-Branding zurueckgestellt diff --git a/.planning/quick/260909-cx0-dateisicherung-nachruesten-und-versionsa/260909-cx0-SUMMARY.md b/.planning/quick/260909-cx0-dateisicherung-nachruesten-und-versionsa/260909-cx0-SUMMARY.md new file mode 100644 index 0000000..eeb3d10 --- /dev/null +++ b/.planning/quick/260909-cx0-dateisicherung-nachruesten-und-versionsa/260909-cx0-SUMMARY.md @@ -0,0 +1,174 @@ +--- +phase: quick-260909-cx0 +plan: 01 +subsystem: infra +tags: [docker-compose, docker-volume, backup, documentation, stack-versions] + +requires: [] +provides: + - "Benanntes Docker-Volume `user-files`, gemountet auf `/app/user-files` im Dienst `api`, in `docker-compose.yml` und `docker-compose.prod.yml`" + - "Betriebshandbuch-Kapitel 6/7 beschreiben den Speicher korrekt als dauerhaft und weisen auf die abweichende Serverdatei hin" + - "CLAUDE.md Technik-Block zeigt den installierten Stand statt der 2026-06/07-Empfehlung, mit eigenem Abschnitt fuer nie uebernommene Empfehlungen" + - ".planning/research/STACK.md traegt eine datierte Hinweiszeile ohne Zahlenaenderung" +affects: [dokumentation, betrieb, onboarding] + +actuals: + tokens: 5226 + tasks: 2 + commits: 2 +plan_head_before: dab72eb^ + +tech-stack: + added: [] + patterns: ["Benanntes Docker-Volume statt Bind-Mount fuer Container-interne Schreibverzeichnisse mit fester uid-Eigentuemerschaft"] + +key-files: + created: [] + modified: + - docker-compose.yml + - docker-compose.prod.yml + - docs/anleitung-betrieb.md + - CLAUDE.md + - .planning/research/STACK.md + +key-decisions: + - "Benanntes Volume user-files statt Bind-Mount: das Image legt /app/user-files an und uebereignet es uid 1001, ein leeres benanntes Volume uebernimmt das beim ersten Mounten, ein frisch von Docker erzeugtes Host-Verzeichnis gehoert dagegen root" + - "docker-compose.dev.yml bleibt unveraendert, da Compose Mount-Listen ueber das Ziel zusammenfuehrt und die Kombination Basis+Dev den neuen Mount automatisch mittraegt" + - "Nie uebernommene Empfehlungen (Keycloak, Redis, TanStack Query, shadcn/ui, Playwright, Husky, lint-staged) sowie zwei veraltete Hauptversionen (Next.js, Prisma) stehen in CLAUDE.md jetzt in einer Aufzaehlung statt in den Ist-Tabellen" + - "STACK.md bleibt als datiertes Rechercheergebnis unveraendert, nur eine Hinweiszeile ergaenzt - keine Regeneration wuerde die korrigierten CLAUDE.md-Zahlen zurueckholen, ohne dass jemand die Herkunftsvermerke sieht" + +requirements-completed: [WINDOWS-17] + +coverage: + - id: D1 + description: "Alle drei gerenderten Compose-Konfigurationen (Basis, Prod, Basis+Dev) mounten fuer den Dienst api genau ein benanntes Volume user-files auf /app/user-files; Betriebshandbuch nennt die Mount-Zeile woertlich" + requirement: "WINDOWS-17" + verification: + - kind: other + ref: "node -e Skript aus PLAN.md Task 1 — docker compose config --format json fuer Basis/Prod/Basis+Dev plus String-Suche im Betriebshandbuch" + status: pass + human_judgment: false + - id: D2 + description: "CLAUDE.md nennt den tatsaechlich installierten Stand (Next.js 15.5.19, Prisma 6.19.3 etc.), keine nie eingebaute Technik mehr als Ist-Tabellenzeile, package.json/pnpm-lock.yaml unveraendert" + verification: + - kind: other + ref: "node -e Skript aus PLAN.md Task 2 — Zeilenpruefung auf 15.5.19/6.19.3 plus Ausschlusspruefung; git diff --exit-code auf alle package.json/pnpm-lock.yaml" + status: pass + human_judgment: false + - id: D3 + description: "Lokaler Beweis, dass hochgeladene Dateien ein --force-recreate ueberleben, und Uebernahme der Mount-Zeilen auf /opt/tessera/docker-compose.yml auf alpha" + verification: [] + human_judgment: true + rationale: "Beide Pruefungen erfordern einen Neubau der Container (lokal bzw. auf alpha) durch den Nutzer selbst - ausserhalb dieses Ausfuehrungsschritts, siehe execution_notes/constraints des Plans" + +duration: 12min +completed: 2026-09-09 +status: complete +--- + +# Quick Task 260909-cx0: Dateisicherung nachgeruestet und Versionsangaben korrigiert Summary + +**Hochgeladene Dateien liegen jetzt in einem benannten Docker-Volume statt in der fluechtigen Container-Schicht, und CLAUDE.md nennt die tatsaechlich installierten Paketversionen statt der 2026-06/07-Empfehlung.** + +## Performance + +- **Duration:** ca. 12 min +- **Started:** 2026-09-09T07:25:00Z (ungefaehr, kein exakter Start-Zeitstempel erfasst) +- **Completed:** 2026-09-09T07:37:39Z +- **Tasks:** 2/2 +- **Files modified:** 5 + +## Accomplishments + +- WINDOWS #17 (Datenverlust bei `--force-recreate`) im Repository behoben: `docker-compose.yml` und `docker-compose.prod.yml` mounten `/app/user-files` im Dienst `api` jetzt auf das benannte Volume `user-files` +- Betriebshandbuch (`docs/anleitung-betrieb.md`) Kapitel 6 beschreibt den Speicher korrekt als dauerhaft, nennt die Mount-Zeile woertlich zum Kopieren und weist ausdruecklich auf die vom Repository abweichende `/opt/tessera/docker-compose.yml` hin; Kapitel 7 Fehlertabelle passt dazu +- `CLAUDE.md` zeigt jetzt den installierten Stand (Next.js 15.5.19, Prisma 6.19.3, NestJS 11.1.27, Express 5.2.1, Node `node:24-alpine`, Vitest je App, Docker/Compose als gemessene Wirtseigenschaft, eigenes Auth-Stack statt Keycloak) statt der alten Empfehlung +- Nie uebernommene Empfehlungen (Keycloak, Redis, TanStack Query, shadcn/ui, Playwright, Husky, lint-staged) sowie zwei veraltete Hauptversionen (Next.js 16 statt 15, Prisma 7 statt 6) stehen jetzt sichtbar in einer eigenen Aufzaehlung "Recommended But Not Adopted" statt als Ist-Tabellenzeile +- `.planning/research/STACK.md` traegt eine datierte Hinweiszeile, Zahlen darin unveraendert + +## Task Commits + +Each task was committed atomically: + +1. **Task 1: user-files dauerhaft speichern und das Betriebshandbuch nachziehen (WINDOWS #17)** - `dab72eb` (fix) +2. **Task 2: Versionsangaben in CLAUDE.md auf den installierten Stand bringen** - `c807049` (docs) + +_Kein separater Plan-Metadaten-Commit gemaess Konstellation dieses Ausfuehrungsschritts (SUMMARY.md/STATE.md werden vom Orchestrator committet)._ + +## Files Created/Modified + +- `docker-compose.yml` - `api`-Dienst mountet `user-files:/app/user-files`, Top-Level-Volume `user-files` ergaenzt +- `docker-compose.prod.yml` - identisch zu `docker-compose.yml` +- `docs/anleitung-betrieb.md` - Kapitel 6 (Datenhaltung, Mount-Zeile, Server-Hinweis) und Kapitel 7 (Fehlertabelle) korrigiert, Schreibfehler "daürhafte" behoben +- `CLAUDE.md` - Technik-Block zwischen `GSD:stack-start`/`GSD:stack-end` auf installierten Stand gebracht, neuer Abschnitt "Recommended But Not Adopted", Herkunftsvermerk, angepasste Alternatives Considered/Version Pinning Strategy/Sources/Multi-Tenancy Strategy +- `.planning/research/STACK.md` - Hinweiszeile unter der Ueberschrift "v1.0 Base Stack (reference — unchanged)", sonst unveraendert + +## Die tatsaechlich eingetragene Mount-Zeile (zum Kopieren auf den Server) + +In beiden Compose-Dateien beim Dienst `api` (vor `healthcheck:`): + +```yaml + volumes: + - user-files:/app/user-files +``` + +Im Top-Level-Block `volumes:` (neben `pgdata:`): + +```yaml +volumes: + pgdata: + user-files: +``` + +Genau diese zwei Aenderungen (Dienst-Zeile + Top-Level-Eintrag) muss der Nutzer selbst in `/opt/tessera/docker-compose.yml` eintragen, um die Reparatur auf alpha wirksam zu machen (vorher sichern). + +## Ergebnis der beiden Tore, vor und nach der Arbeit + +**Tor 1 (Task 1, Mount):** Vor der Aenderung: `docker compose config --format json` fuer Basis, Prod und Basis+Dev meldete dreimal `FEHLT`, das Betriebshandbuch enthielt die Mount-Zeile nicht — Ruckgabewert 1. Nach der Aenderung: alle drei Konfigurationen melden `OK volume:user-files`, das Betriebshandbuch enthaelt die Zeile — Ruckgabewert 0. Selbst ausgefuehrt und bestaetigt (siehe Ausfuehrungsprotokoll dieses Schritts). + +**Tor 2 (Task 2, Versionen):** Vor der Aenderung: Next.js-Zeile nannte 16.2.x (nicht 15.5.19), Prisma-Zeile nannte 7.8.x (nicht 6.19.3), acht Tabellenzeilen fuehrten nie eingebaute Technik als Ist-Zeile — Ruckgabewert 1. Nach der Aenderung: alle drei Teilpruefungen `OK`, Ruckgabewert 0. Der Abhaengigkeits-Guard (`git diff --exit-code` auf alle `package.json` und `pnpm-lock.yaml`) war vor und nach der Arbeit gruen (Ruckgabewert 0) — bestaetigt, dass keine Abhaengigkeit angefasst wurde. + +## Beim Nachschlagen gefundene Abweichungen von der Versionstabelle des Plans + +Keine. Die eigene Pruefung gegen `pnpm-lock.yaml` (`importers:`-Abschnitt), die Compose-/Dockerfiles und die lokal gemessenen Docker-/Compose-Versionen (Docker 29.8.0, Compose v5.5.1) deckt sich in jedem Punkt mit der im Plan-`objective` dokumentierten Tabelle vom 2026-09-09. Keine Abweichung zu vermerken. + +## Decisions Made + +- Benanntes Volume statt Bind-Mount fuer `user-files` — Begruendung: Eigentuemerschaft. Das Image legt `/app/user-files` an und uebereignet es uid 1001 (`apps/api/Dockerfile:23-26`), der Prozess laeuft als dieser Nutzer (`:36`). Ein leeres benanntes Volume uebernimmt beim ersten Mounten Inhalt und Eigentuemerschaft des Image-Verzeichnisses; ein von Docker frisch angelegtes Host-Verzeichnis gehoert dagegen root und wuerde ohne eine zusaetzliche manuelle Uebereignung durch den Betreiber zu kaputten Uploads fuehren. +- `docker-compose.dev.yml` bewusst nicht angefasst — Compose fuehrt Mount-Listen ueber das Ziel zusammen, die Kombination Basis+Dev traegt den neuen Mount automatisch mit (selbst am gerenderten Ergebnis geprueft). +- Nie uebernommene Empfehlungen und veraltete Hauptversionen in CLAUDE.md aus den Ist-Tabellen entfernt und in einen eigenen, deutlich benannten Aufzaehlungs-Abschnitt verschoben, statt sie dort stehen zu lassen wo "ist eingebaut" impliziert wuerde. +- `.planning/research/STACK.md` inhaltlich nicht angetastet (nur eine Hinweiszeile) — es ist ein datiertes Rechercheergebnis, keine Live-Dokumentation. + +## Deviations from Plan + +None - plan executed exactly as written. + +## Issues Encountered + +None. + +## User Setup Required + +**Reparatur auf alpha steht noch aus.** `/opt/tessera/docker-compose.yml` auf dem Testserver ist keine Arbeitskopie dieses Repositorys — sie wurde dort von Hand bearbeitet und weicht ab; ein Deploy holt ausschliesslich Images und fasst diese Datei nicht an. Diese Reparatur erreicht die laufende Installation deshalb **nicht von selbst**. + +**Naechster Schritt (durch den Nutzer):** +1. `/opt/tessera/docker-compose.yml` sichern. +2. Die beiden oben genannten Zeilen (Dienst-Mount + Top-Level-Volume) dort eintragen. +3. Container einmal neu erstellen. +4. Pruefen: `docker inspect tessera-api-1` → unter `Mounts` muss `/app/user-files` erscheinen. +5. Erst danach den Ledger-Eintrag schliessen: `gsd-tools windows fixed 17`. + +Bis dahin bleibt **WINDOWS #17 im Ledger offen** — dieser Ausfuehrungsschritt hat ihn absichtlich nicht geschlossen, weil die Luecke auf der laufenden Installation weiterbesteht. + +Zusaetzlich, falls gewuenscht (keine Voraussetzung fuer den Server-Schritt): lokaler Beweis, dass Dateien einen `--force-recreate` ueberleben (Container mit den geaenderten Compose-Dateien neu erstellen, Profilbild hochladen, `docker compose up -d --force-recreate api`, Seite neu laden — Bild muss noch da sein). + +## Next Phase Readiness + +- Kein Blocker fuer weitere Arbeit. WINDOWS #17 bleibt bewusst offen, bis der Nutzer die Serverdatei ergaenzt hat. +- CLAUDE.md und `docs/anleitung-entwicklung.md` wurden gegengelesen: keine Versionsangabe der beiden Dokumente widerspricht der jeweils anderen mehr. + +--- +*Quick Task: 260909-cx0* +*Completed: 2026-09-09* + +## Self-Check: PASSED