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>
7.2 KiB
context, phase, task, total_tasks, status, last_updated
| context | phase | task | total_tasks | status | last_updated |
|---|---|---|---|---|---|
| default | 16-ad-gruppen-synchronisation | null | 0 | between-milestones | 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/:
2026-08-11-modulaktivierung-ohne-lizenzpruefung.md— gross, Produktfragen offen2026-08-11-tender-radar-einstellungen-mischen-rollen.md— mittel, Grundsatzfrage offen2026-08-11-compose-datei-auf-server-driftet.md— mittel, Weg offen2026-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>
Required Reading (in order)
.planning/STATE.md— Position, Quick-Task-Tabelle mit den Fixes dieser Sitzung.planning/phases/16-ad-gruppen-synchronisation/16-UAT.md— Abschnitt "Entscheidung 2026-08-11", warum vier Tests uebersprungen sind.planning/quick/260811-f9i-*/SUMMARY.md— der kritische Fund und warum er durch Review und Tests kam.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_backfillund20260811140000_encrypt_ldap_bind_passwordangewandt. Web-Image vom 7.8. — korrekt, die Web-Quellen sind seit dem 6.8. unveraendert. /opt/tessera/.env: traegtTESSERA_ENCRYPTION_KEYUND den altenCALENDAR_ENCRYPTION_KEYmit 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, Sicherungdocker-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/restartmacht der User. Konfigurationsdateien auf dem Server darf Claude bearbeiten (seit 2026-08-11), mit Sicherung vorher.
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.
<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>