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>
49 lines
6.1 KiB
JSON
49 lines
6.1 KiB
JSON
{
|
|
"version": "1.0",
|
|
"timestamp": "2026-08-11T12:59:01.215Z",
|
|
"phase": "16",
|
|
"phase_name": "ad-gruppen-synchronisation",
|
|
"phase_dir": ".planning/phases/16-ad-gruppen-synchronisation",
|
|
"plan": null,
|
|
"task": null,
|
|
"total_tasks": 0,
|
|
"status": "paused",
|
|
"context": "between-milestones",
|
|
"completed_tasks": [
|
|
{"id": "16-UAT", "name": "Phase-16 UAT: Browser-Durchlauf 5/6/7 bestanden, Test 2 gegen echtes AD, Tests 1/3/4/8 bewusst uebersprungen", "status": "done", "commit": "ba21b0c,234f80b"},
|
|
{"id": "260811-f9i", "name": "KRITISCH: objectGUID-Existenzpruefung fand nie etwas (escapter String statt Rohbytes) — haette beim ersten Sync alle AD-gebundenen Gruppen samt Mitgliedschaften und Modulfreigaben geloescht", "status": "done", "commit": "d2019dc"},
|
|
{"id": "260811-j04", "name": "DOE-Ausschreibungen verlinkten auf die API statt auf die Bekanntmachung; Adapter + Backfill fuer 2846 Zeilen", "status": "done", "commit": "ecf7872"},
|
|
{"id": "15-04", "name": "Fehlender Abschlussbericht nachgezogen, Phase 15 damit 8/8", "status": "done", "commit": "149b5aa"},
|
|
{"id": "ldap-crypto", "name": "LDAP-Bind-Passwort AES-256-GCM verschluesselt, Spalte encryptedBindPassword, Bootstrap-Backfill", "status": "done", "commit": "4f687ea"},
|
|
{"id": "key-hardening", "name": "Stack startet nicht mehr ohne Verschluesselungsschluessel (beide Compose-Dateien)", "status": "done", "commit": "7bda56d"},
|
|
{"id": "key-rename", "name": "CALENDAR_ENCRYPTION_KEY -> TESSERA_ENCRYPTION_KEY mit Rueckfallebene; CryptoService in eigenem globalem Modul", "status": "done", "commit": "f574884"}
|
|
],
|
|
"remaining_tasks": [
|
|
{"id": "backlog-lizenz", "name": "Lizenzpruefung bei der Modulaktivierung — jeder Mandanten-Admin kann sich jedes Modul selbst freischalten", "status": "not_started"},
|
|
{"id": "backlog-settings", "name": "Persoenliche vs. Admin-Einstellungen in Modul-Einstellungsseiten trennen", "status": "not_started"},
|
|
{"id": "backlog-compose", "name": "Compose-Datei auf dem Testserver driftet vom Repository ab", "status": "not_started"},
|
|
{"id": "backlog-envkey", "name": "Vorgabewert entfernen und Schluessel in den Beispiel-Umgebungsdateien dokumentieren", "status": "not_started"}
|
|
],
|
|
"blockers": [
|
|
{"description": "Kein Schreibzugriff im AD (balios.ctl.local) — UAT 1/3/4 der Phase 16 koennen dort nie ausgefuehrt werden", "type": "external", "workaround": "Bewusst als offene Annahme dokumentiert (16-UAT.md, Entscheidung 2026-08-11); A1 stuetzt sich auf die Microsoft-Dokumentation"},
|
|
{"description": "Zugriff auf .env.example / .env.prod.example war in der Sitzung durch Berechtigungen gesperrt", "type": "technical", "workaround": "Dokumentation des Schluessels bleibt im Backlog-Punkt 2026-08-11-verschluesselungsschluessel-vorgabewert.md"}
|
|
],
|
|
"async_jobs": [],
|
|
"human_actions_pending": [
|
|
{"action": "Entscheidung zur Lizenzierung: wer vergibt Lizenzen, was passiert beim Ablauf, braucht es Laufzeiten, wie kommt eine Lizenz in eine Kundeninstallation", "context": "Blockiert den groessten Backlog-Punkt; ohne diese Antworten ist der Rest Spekulation", "blocking": true},
|
|
{"action": "Grundsatzentscheidung, wo persoenliche Einstellungen in Tessera leben (eigene Nutzerseite vs. im Modul abgetrennt)", "context": "Betrifft tender-radar und dkv-fleet gleichermassen — einmal grundsaetzlich statt pro Modul", "blocking": true},
|
|
{"action": "Entscheiden, wie /opt/tessera an die Compose-Datei kommt (Arbeitskopie, CI-Artefakt, oder Abgleich-Skript)", "context": "Vorher klaeren, WARUM die Datei dort von Hand gepflegt wird — sie kann host-spezifische Anpassungen tragen", "blocking": true},
|
|
{"action": "Deploys auf alpha (pull + up -d --force-recreate) macht der User selbst", "context": "Stehende Regel; Konfigurationsdateien dort darf Claude seit 2026-08-11 bearbeiten", "blocking": false}
|
|
],
|
|
"decisions": [
|
|
{"decision": "Phase 16 mit A1 als offener, dokumentierter Annahme abgeschlossen statt einen Wegwerf-Domaenencontroller zu bauen", "rationale": "User hat keinen AD-Schreibzugriff; der eine substanzielle Fehler an der Stelle war bereits gefunden und behoben, der Rest-Erkenntnisgewinn rechtfertigte den Aufwand nicht", "phase": "16"},
|
|
{"decision": "Ein Plattform-Schluessel, umbenannt, statt eines eigenen Schluessels fuer das AD-Bind-Passwort", "rationale": "Zwei Schluessel in derselben .env auf demselben Host erhoehen die Sicherheit nicht, verdoppeln aber was bei Backup und Wiederherstellung schiefgehen kann", "phase": null},
|
|
{"decision": "Alter Schluesselname CALENDAR_ENCRYPTION_KEY bleibt lesbar, mit Veraltet-Warnung", "rationale": "Ein harter Rename haette jede bestehende Installation beim naechsten Start gestoppt — erst recht, seit Compose ohne Schluessel abbricht", "phase": null},
|
|
{"decision": "CryptoService in ein eigenes globales Modul statt in CalendarModule", "rationale": "Vier Module importierten CalendarModule nur fuer die Verschluesselung, was eine Abhaengigkeit vom Kalender vortaeuschte, die es nie gab", "phase": null},
|
|
{"decision": "Backfill der Verschluesselung zur Laufzeit beim Bootstrap statt in der Migration", "rationale": "SQL kann nicht verschluesseln — der Schluessel liegt in der Anwendungsumgebung; die Migration benennt nur die Spalte um", "phase": null}
|
|
],
|
|
"uncommitted_files": [],
|
|
"next_action": "Mit dem User klaeren, welcher der vier Backlog-Punkte drankommt oder ob ein neuer Meilenstein nach v1.2 geplant wird. Die drei groesseren Punkte brauchen zuerst seine Entscheidungen (siehe human_actions_pending), der vierte (Vorgabewert + Doku) ist ohne Rueckfrage machbar.",
|
|
"context_notes": "v1.2 Plattform-Berechtigungen ist inhaltlich fertig: Phase 15 (8/8) und Phase 16 (5/5) abgeschlossen, beide in ROADMAP.md und STATE.md nachgezogen. Kein Phase-Work in Arbeit, Arbeitsverzeichnis sauber, alles auf origin/main. Die Sitzung war UAT-getrieben und hat dabei einen kritischen Fehler gefunden, der ohne den einen ausfuehrbaren Test unbemerkt in Produktion gegangen waere. Roter Faden fuer die Fortsetzung: die vier Backlog-Punkte sind alle 'vor dem Verkauf an externe Kunden', keiner davon draengt im internen Betrieb."
|
|
}
|