96432a6a7b
No phase work in flight: Phase 15 (8/8) and Phase 16 (5/5) are both closed and the roadmap reflects it. The handoff therefore sits at project level rather than in a phase directory. Records four anti-patterns discovered through actual failure this session, two of them marked blocking: the tautological test that let the objectGUID defect through review, and the fact that /opt/tessera is not a checkout, so compose changes in this repository never reach the test server. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
122 lines
7.2 KiB
Markdown
122 lines
7.2 KiB
Markdown
---
|
|
context: default
|
|
phase: 16-ad-gruppen-synchronisation
|
|
task: null
|
|
total_tasks: 0
|
|
status: between-milestones
|
|
last_updated: 2026-08-11T12:59:01.215Z
|
|
---
|
|
|
|
## Critical Anti-Patterns
|
|
|
|
| Pattern | Description | Severity | Prevention Mechanism |
|
|
|---------|-------------|----------|---------------------|
|
|
| Tautologischer Test | Der Test der objectGUID-Suche baute seinen Erwartungswert mit **derselben** Hilfsfunktion, die der Produktionscode benutzte. Er bestaetigte damit, dass die Funktion zu sich selbst passt — nicht, dass ein Verzeichnis den Filter versteht. Der Fehler ueberlebte Review und Tests und haette beim ersten echten Sync alle AD-gebundenen Gruppen geloescht. | blocking | Tests gegen externe Systeme muessen die **Form** des Aufrufs pruefen (Buffer statt String, Objekt statt interpoliertem Text), nicht seinen mit Produktionscode erzeugten Inhalt. Siehe `ldap.service.spec.ts`, die beiden Tests am Ende des syncBoundGroupsForTenant-Blocks. |
|
|
| HTTP 200 als Funktionsbeleg | `oeffentlichevergabe.de/ui/...` ist eine Single-Page-App und antwortet auf JEDE Kennung mit 200 und identischen 1309 Bytes, auch auf `NONSENSE123`. Ein Statuscode-Test haette "funktioniert" gemeldet. | advisory | Bei SPA-Zielen den gerenderten Inhalt pruefen (Playwright), nie den Statuscode. |
|
|
| Image-Datum als Aktualitaets-Beleg | Das Web-Image trug den 7. August und sah veraltet aus. Tatsaechlich hatten sich die Web-Quellen seither nicht geaendert; Docker-Layer-Caching erzeugt ein bit-identisches Image mit altem Erstellungsdatum. | advisory | Vor einer Aussage ueber Rueckstand `git log -- apps/web` pruefen, nicht das Image-Datum. |
|
|
| Server-Compose ist kein Checkout | `/opt/tessera` ist keine Git-Arbeitskopie. Aenderungen an Compose-Dateien im Repository kommen dort nie an; der Deploy holt nur Images. | blocking | Aenderungen an `docker-compose*.yml` wirken NICHT auf alpha. Was dort gelten soll, muss zusaetzlich in `/opt/tessera/docker-compose.yml` eingetragen werden (erlaubt, mit Sicherung). Siehe Backlog `2026-08-11-compose-datei-auf-server-driftet.md`. |
|
|
|
|
<current_state>
|
|
v1.2 Plattform-Berechtigungen ist inhaltlich fertig. Phase 15 steht auf 8/8,
|
|
Phase 16 auf 5/5, beide in ROADMAP.md und STATE.md nachgezogen. Kein Phase-Work
|
|
in Arbeit, Arbeitsverzeichnis sauber, alles auf origin/main (`f38b9f2`).
|
|
|
|
Die Sitzung war UAT-getrieben: der Browser-Durchlauf zu Phase 16 hat einen
|
|
kritischen Fehler in der Loescherkennung gefunden, der ohne den einen
|
|
ausfuehrbaren Test unbemerkt in Produktion gegangen waere.
|
|
</current_state>
|
|
|
|
<completed_work>
|
|
|
|
- Phase-16-UAT: Tests 5, 6, 7 im Browser bestanden; Test 2 read-only gegen das
|
|
echte AD; Tests 1, 3, 4, 8 auf Entscheidung des Users uebersprungen
|
|
- **KRITISCH behoben** (`d2019dc`): objectGUID-Existenzpruefung baute ihren
|
|
Filter als escapten String; ldapts wandelt das nicht in Rohbytes. Beide
|
|
Suchen der Pruefung teilten sich den Filter, damit haette der erste echte
|
|
Sync jede AD-gebundene Gruppe samt Mitgliedschaften und Modulfreigaben
|
|
geloescht. Jetzt EqualityFilter mit rohem Buffer, am echten AD gemessen.
|
|
- DOE-Bekanntmachungslinks repariert (`ecf7872`) inkl. Backfill von 2846 Zeilen
|
|
- Fehlender Abschlussbericht 15-04 nachgezogen (`149b5aa`) — Phase 15 damit 8/8
|
|
- LDAP-Bind-Passwort verschluesselt (`4f687ea`), Stack startet nicht mehr ohne
|
|
Schluessel (`7bda56d`), Schluessel umbenannt mit Rueckfallebene (`f574884`)
|
|
- Vier Backlog-Punkte geschrieben, zwei alte geschlossen
|
|
</completed_work>
|
|
|
|
<remaining_work>
|
|
|
|
Vier Backlog-Punkte, alle unter `.planning/todos/pending/`:
|
|
|
|
1. `2026-08-11-modulaktivierung-ohne-lizenzpruefung.md` — gross, Produktfragen offen
|
|
2. `2026-08-11-tender-radar-einstellungen-mischen-rollen.md` — mittel, Grundsatzfrage offen
|
|
3. `2026-08-11-compose-datei-auf-server-driftet.md` — mittel, Weg offen
|
|
4. `2026-08-11-verschluesselungsschluessel-vorgabewert.md` — klein, ohne Rueckfrage machbar
|
|
|
|
Offen ausserdem: ob nach v1.2 ein neuer Meilenstein geplant wird.
|
|
</remaining_work>
|
|
|
|
<decisions_made>
|
|
|
|
- Phase 16 mit A1 (objectGUID uebersteht Umbenennung) als offener, dokumentierter
|
|
Annahme abgeschlossen — der User hat keinen AD-Schreibzugriff, und der eine
|
|
substanzielle Fehler war bereits gefunden
|
|
- Ein Plattform-Schluessel statt eines eigenen fuer das AD-Bind-Passwort: zwei
|
|
Schluessel in derselben .env auf demselben Host erhoehen die Sicherheit nicht
|
|
- Alter Schluesselname bleibt lesbar mit Veraltet-Warnung — ein harter Rename
|
|
haette jede bestehende Installation gestoppt
|
|
- Verschluesselungs-Backfill zur Laufzeit statt in der Migration: SQL kann nicht
|
|
verschluesseln, der Schluessel liegt in der Anwendungsumgebung
|
|
</decisions_made>
|
|
|
|
<blockers>
|
|
- Kein AD-Schreibzugriff: UAT 1/3/4 der Phase 16 sind dort dauerhaft nicht
|
|
ausfuehrbar. Als Annahme dokumentiert, kein offener Arbeitsauftrag.
|
|
- `.env.example` / `.env.prod.example` waren in der Sitzung durch Berechtigungen
|
|
gesperrt — die Dokumentation des Schluessels haengt daran.
|
|
</blockers>
|
|
|
|
## Required Reading (in order)
|
|
|
|
1. `.planning/STATE.md` — Position, Quick-Task-Tabelle mit den Fixes dieser Sitzung
|
|
2. `.planning/phases/16-ad-gruppen-synchronisation/16-UAT.md` — Abschnitt
|
|
"Entscheidung 2026-08-11", warum vier Tests uebersprungen sind
|
|
3. `.planning/quick/260811-f9i-*/SUMMARY.md` — der kritische Fund und warum er
|
|
durch Review und Tests kam
|
|
4. `.planning/todos/pending/` — die vier offenen Punkte
|
|
|
|
## Infrastructure State
|
|
|
|
- **alpha** (192.168.13.12, https://alpha.tessera.ctl.de): API-Image mit allen
|
|
Fixes, Migrationen `20260811120000_doe_notice_url_backfill` und
|
|
`20260811140000_encrypt_ldap_bind_password` angewandt. Web-Image vom 7.8. —
|
|
korrekt, die Web-Quellen sind seit dem 6.8. unveraendert.
|
|
- **`/opt/tessera/.env`**: traegt `TESSERA_ENCRYPTION_KEY` UND den alten
|
|
`CALENDAR_ENCRYPTION_KEY` mit gleichem Wert. Sicherung `.env.bak.20260811`.
|
|
Die alte Zeile kann weg, sobald kein Rueckfall auf aeltere Images mehr denkbar ist.
|
|
- **`/opt/tessera/docker-compose.yml`**: von Hand um die neue Variable ergaenzt,
|
|
Sicherung `docker-compose.yml.bak.20260811`. Driftet vom Repository ab.
|
|
- **Testdaten auf alpha**: 405 Benutzer und die AD-gebundene Gruppe `Claude_VT`
|
|
(9 Mitglieder) aus dem Sync vom 11.8. Der User wirft vor dem Go-live ohnehin
|
|
alles raus.
|
|
- **Deploy-Regel**: `pull`/`up`/`restart` macht der User. Konfigurationsdateien
|
|
auf dem Server darf Claude bearbeiten (seit 2026-08-11), mit Sicherung vorher.
|
|
|
|
<context>
|
|
Der rote Faden der Sitzung war, dass genau ein ausfuehrbarer Test (UAT 2, weil
|
|
read-only) den einen Fehler gefunden hat, den alle Reviews und 500+ Unit-Tests
|
|
durchgelassen hatten. Die uebersprungenen Tests sind bewusst uebersprungen, nicht
|
|
vergessen — die Begruendung steht in 16-UAT.md.
|
|
|
|
Die vier Backlog-Punkte sind allesamt "vor dem Verkauf an externe Kunden".
|
|
Intern draengt keiner davon. Drei brauchen zuerst Entscheidungen des Users, der
|
|
vierte ist reine Umsetzung.
|
|
</context>
|
|
|
|
<next_action>
|
|
Mit dem User klaeren, was drankommt: einer der vier Backlog-Punkte oder die
|
|
Planung eines neuen Meilensteins nach v1.2. Ohne seine Entscheidungen sind die
|
|
drei groesseren Punkte nicht sinnvoll zu starten — der kleine
|
|
(Vorgabewert entfernen, Schluessel in den Beispiel-Umgebungsdateien
|
|
dokumentieren) laesst sich sofort umsetzen, sobald der Dateizugriff auf die
|
|
`.env*`-Vorlagen moeglich ist.
|
|
</next_action>
|