Files
tessera-ctl/.planning/.continue-here.md
T
schalli 96432a6a7b
Tessera CI/CD / Lint & Type Check (push) Successful in 46s
Tessera CI/CD / Tests (push) Successful in 47s
Tessera CI/CD / Build & Publish Images (push) Successful in 6s
wip: session paused between milestones, v1.2 complete
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>
2026-08-11 15:01:00 +02:00

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/:

  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>
- 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.

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.
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.

<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>