"""Pusht Meilensteinplan 12 Monate als Confluence-Seite 27.""" import urllib.request, json, ssl, urllib.parse from pathlib import Path secrets = {} with open("project-audit/.secrets", "r", encoding="utf-8-sig") as f: for line in f: if "=" in line and not line.startswith("#"): k, v = line.strip().split("=", 1) secrets[k.strip()] = v.strip() TOKEN = secrets.get("CONFLUENCE_TOKEN", "") BASE = "https://arija-confluence.jaas.service.deutschebahn.com/rest/api" SPACE = "BES" PARENT = "581013135" TITLE = "27. Meilensteinplan 12 Monate (Jun 2026 - Mai 2027)" ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE html = """

Meilensteinplan pathOS — 12 Monate

Stand: 2026-05-12 | Status: ENTWURF
Vision: pathOS als Kernplattform eines integrierten InfraGO-Bestellportals
Prioritäten: Stabilität → Regulatorik → Kunden-Features
Kapazität: ~400 Issues/Monat (alle Teams), ~35 Personen

4 Phasen, 13 Meilensteine: Stabilisieren → Normalbetrieb + Regulatorik → Skalieren + Reorg → Integrieren + Vision

Grafische Übersicht: Timeline

""" html += """ """ html += """ """ html += """ """ html += """
Meilenstein Jun Jul Aug Sep Okt Nov Dez Jan Feb Mär Apr Mai
Phase 1: STABILISIEREN
M1: Spring Boot 4 ⚠
M2: Bug-Rate <25%
M3: Führungswechsel
Phase 2: NORMALBETRIEB + REGULATORIK
M4: SL Silber Plus ⚠
M5: Abrechnung TTT
M6: NAÄ produktiv
M7: OpsDev formiert
Phase 3: SKALIEREN + REORG
M8: FplJ 28 ⚠
M9: Rechnungsbeginn TTT ⚠
M10: Reorg abgeschlossen
Phase 4: INTEGRIEREN + VISION
M11: TrassenOrder-Integr.
M12: Plattform-Vision
M13: Kundenzufriedenheit

Legende: ★ = Deadline | ⚠ = Harte externe Deadline | MUSS HOCH Feature Strategie Reorg

""" html += """

Phase 1: STABILISIEREN (Jun – Jul 2026)

Ziel

Technische Schulden abbauen, Hypercare beenden, Führungswechsel vorbereiten

M1: Spring Boot 4 abgeschlossen (30. Jun 2026) ⚠

WasWerStatus
SV, AV, IFP auf Spring Boot 4CIB (Saurav, Hans-Henning)🔄 In Arbeit
CI, AV-Trasse auf Spring Boot 4Zero (O2CZERO-7043)🔄 In Arbeit
Alle Services auf Java 21AlleTeilweise
Regressionstests nach UpgradeQA + TeamsOffen

Risiko: EOL 3.5 ist Juni 2026 — kein Security-Support mehr danach. MUSS-Termin.

M2: Bug-Rate Portal unter 25% (31. Jul 2026)

WasWerStatus
Entkopplung Zuglaufpunkte/Zugcharakteristik (Hauptursache)404Offen
Fehlermeldungen-Konzept umsetzen404Offen
E2E-Tests (Playwright) für Top-10-Flows404Offen
Testumgebung mit TPN dauerhaft verfügbar404 + OPsOffen

M3: Führungswechsel + Hypercare-Ende (Jul 2026)

WasWerStatus
Neue Führung eingesetztManagementOffen
Hypercare-Kriterien definiert und erfülltPO + BOOffen
Übergang zu Normalbetrieb dokumentiertAlleOffen
Support-Prozesse definiert (Eskalation, SLAs)BSSUPPORT + OPsOffen
""" html += """

Phase 2: NORMALBETRIEB + REGULATORIK (Aug – Nov 2026)

Ziel

Vertragliche Pflichten erfüllen, Abrechnung stabilisieren, Team-Reorg starten

M4: Service Level Silber Plus (31. Aug 2026) ⚠

WasWerStatus
Netcool-Anbindung produktivOPs🔄 In Arbeit
Monitoring-Konzept abgeschlossenOPs + Zero🔄 In Arbeit
Disaster-Recovery-Test 3 bestandenOPs🔄 Validierung
Deployment-Automatisierung (Smoketests)OPs/DevOps🔄 In Arbeit
Secret-Rotation implementiertOPsOffen
Kubernetes-Namespaces umgestelltOPs🔄 In Arbeit

Risiko: Vertragsverletzung bei Versäumnis. Keine Verhandlungsmasse.

M5: Abrechnung TTT produktionsreif (31. Okt 2026)

WasWerStatus
20h-Zug Abrechnung (TTTSOL-2149) entblocktCIB❌ Blocked
Zugtrasse mit Umleitung ohne VT-Wechsel (TTTSOL-2147)CIBOffen
Abrechnung fremde Infrastruktur (TTTSOL-2148)CIBOffen
Neue Zugnummer Umleitungsfall (TTTSOL-2035)CIB🔄 In Arbeit
VDV-Erweiterung für AC Trasse (strategisch)CIB + ZeroOffen
Alle 41 Abrechnungs-Tickets priorisiertCIB POOffen

Rechnungsbeginn TTT ist Januar 2027. Bis Oktober müssen kritische Fälle gelöst sein. Nov/Dez = Buffer für Regressionstests.

M6: NAÄ implizite Annahme produktiv (30. Sep 2026)

WasWerStatus
O2CCIB-6931 assigned und implementiertCIB⚠ Geschoben
Prozess-Design mit Fachbereich abgestimmtCIB BAOffen
E2E-Test NAÄ-SzenarioCIB + 404Offen

M7: Team-Reorg Phase 1 — OpsDev formiert (30. Sep 2026)

WasWerStatus
OpsDev-Team definiert (~6 Personen)Management + LeadsOffen
OpsDev-Lead benanntManagementOffen
Jan Lubenow Wissenstransfer (50% abgeschlossen)DevOps⚠ Kritisch
Bug-Triage-Prozess definiertOpsDev-LeadOffen
OPs-Rotation beendet (feste Zuordnung)ManagementOffen
""" html += """

Phase 3: SKALIEREN + REORG (Dez 2026 – Feb 2027)

Ziel

Fahrplanwechsel absichern, Team-Umstellung abschließen, Plattform-Denken etablieren

M8: Fahrplanwechsel FplJ 28 (Dez 2026) ⚠

WasWerStatus
GelV-Erweiterungen (TTT-Meilenstein)CIB + ZeroOffen
OTN-Vergabe Fpl 2027 (TTTSOL-1683)CIB🔄 In Arbeit
ujBau FunktionalitätAlle🔄 In Arbeit
FplJ-28-spezifische Validierungen getestetQAOffen
Daten-Partitionierung (Performance)CIB/ZeroOffen

Risiko: Fahrplanwechsel ist harter externer Termin. Kein Verschieben möglich.

M9: Rechnungsbeginn TTT (Jan 2027) ⚠

WasWerStatus
Alle kritischen Abrechnungsfälle gelöst (aus M5)CIBAbhängig von M5
Rechnungslauf erfolgreich getestet (Staging)CIB + QAOffen
Monitoring für Abrechnungsfehler aktivOPs/OpsDevOffen
Fallback-Prozess bei Abrechnungsfehlern definiertCIB + BOOffen

M10: Team-Reorg abgeschlossen (31. Jan 2027)

WasWerStatus
2 fachliche Teams formiert ("Bestellen" + "Verarbeiten")ManagementOffen
Service-Ownership klar zugeordnetTeam-LeadsOffen
PO-Struktur definiertManagementOffen
Wissenstransfer abgeschlossenAlleOffen
Erste Sprints in neuer Struktur erfolgreichTeamsOffen
Metriken definiert (Bug-Rate, Durchlaufzeit, Deploy-Freq.)BO + LeadsOffen

Reorg NACH Fahrplanwechsel abschließen — nicht während des kritischen Zeitraums umbauen.

""" html += """

Phase 4: INTEGRIEREN + VISION (Feb – Mai 2027)

Ziel

TrassenOrder-Learnings integrieren, Plattform-Architektur vorbereiten, Kundenzufriedenheit steigern

M11: TrassenOrder-Integration definiert (28. Feb 2027)

WasWerStatus
TrassenOrder Livegang evaluiert (Q4 2026)TraPo + BOOffen
Abgrenzung pathOS/TrassenOrder dokumentiertPOs + ArchitekturOffen
API-Vertrag zwischen pathOS und TrassenOrderCIB/Zero + TraPoOffen
Entscheidung: GelV bei pathOS oder TraPo?BO + ManagementOffen
Übernahme-Szenario TraPo → pathOS-Team bewertetManagementOffen

M12: Plattform-Architektur-Vision (31. März 2027)

WasWerStatus
Architektur-Vision "Integriertes Bestellportal" dokumentiertArchitektur + BOOffen
Kernkomponenten als integrierbare Module identifiziertArchitekturOffen
Schnittstellen-Strategie (API-First) definiertArchitektur + TeamsOffen
Roadmap für Anlage + Nebenleistungen (nächste 12M)BO + POsOffen
TPN-Ablösung Zeitplan konkretisiertPOs + KundenOffen

M13: Kundenzufriedenheit messbar verbessert (Mai 2027)

WasWerStatus
Bug-Rate Portal unter 15% (von 33%)Team "Bestellen"Offen
Vorprüfung Portal produktivCIB + 404Offen
Expertenmodus verfügbar404Offen
Übersichtsseite Vorgänge live404Offen
Kundenfeedback-Loop etabliertPO + UXOffen
NPS oder CSAT Baseline gemessenPO + BOOffen
""" html += """

Kritischer Pfad & Abhängigkeiten

PfadAbhängigkeitKonsequenz bei Verzögerung
M1 → M4Spring Boot 4 muss fertig sein für SL Silber+ (Security-Compliance)Vertragsverletzung
M5 → M9Abrechnung muss bis Okt stehen für Rechnungsbeginn JanFalsche Rechnungen an Kunden
M3 → M7 → M10Führungswechsel ermöglicht Reorg, Reorg nach FplJ abschließenProduktivitätsverlust
M8 (extern)Fahrplanwechsel ist Fixpunkt — alles andere drumherum planenFahrplan gefährdet

Risiko-Matrix

RisikoWahrscheinlichkeitImpactMitigation
Abrechnung bleibt blocked (20h-Zug)HOCHKRITISCHEskalation an TTT-Programm, Workaround
Bug-Rate 404 steigt weiterHOCHHOCHEntkopplung Zuglaufpunkte priorisieren
SL Silber+ Deadline gerissenMittelHOCHFrüh mit UKA abstimmen, Teilabnahme?
Reorg destabilisiert TeamsMittelHOCHSukzessiv, nicht Big Bang. Nach FplJ.
Jan Lubenow fällt aus (SPOF)NiedrigKRITISCHWissenstransfer ab sofort priorisieren
TrassenOrder scheitert/pivotiertMittelMITTELpathOS bleibt autark, GelV intern weiter
Spring Boot 4 nicht rechtzeitigNiedrigKRITISCHFokus, keine Ablenkung

Reorg-Zeitplan (sukzessiv)

ZeitraumSchrittRisiko
Jul 2026Führungswechsel, Vision kommunizierenNiedrig
Aug-Sep 2026OpsDev-Team formieren (aus OPs + DevOps-Teilen)Mittel
Okt 2026OPs-Rotation beenden, feste ZuordnungNiedrig
Nov 2026Fachliche Teams vorbereiten (Service-Mapping, Wissenstransfer)Mittel
Jan 2027Umstellung auf 2 fachliche Teams ("Bestellen" + "Verarbeiten")Hoch
Feb 2027Erste Sprints in neuer Struktur, NachjustierungMittel
März 2027TrassenOrder-Team-Integration bewertenMittel

Metriken zur Erfolgsmessung

MetrikBaseline (Mai 2026)Ziel Sep 2026Ziel Jan 2027Ziel Mai 2027
Bug-Rate Portal33%25%20%<15%
Bug-Rate Gesamt20%18%15%<12%
Deployment-Frequenz? (messen!)1x/Woche2x/WocheTäglich möglich
Mean Time to Recovery? (messen!)<4h<2h<1h
Offene Highest-Tickets8+<5<30
SPOF-Index (>30%)2 (Jan, Steven)100
KundenzufriedenheitNicht gemessenBaseline+10 Pkt+20 Pkt

Offene Entscheidungen

#EntscheidungDeadlineWer
1Wer wird neue Führung?Jun 2026Management
2OpsDev-Lead: Intern oder extern?Jul 2026Management
3SV-Monolith: Aufteilen oder einem Team zuordnen?Okt 2026Architektur + BO
4PO-Struktur: 1 pro Team oder übergreifend?Nov 2026BO
5TrassenOrder: Eigenes Team oder Integration?Feb 2027BO + Management
6GelV-Ownership: pathOS oder TraPo?Feb 2027BO
7Nächste Domäne nach Trasse (Anlage? Nebenleistungen?)März 2027BO + Strategie

Erstellt im Rahmen des pathOS Portfolio-Audits. Kontakt: Andre Knie

""" # Push to Confluence def api_request(url, method="GET", data=None): req = urllib.request.Request(url, method=method) req.add_header("Authorization", f"Bearer {TOKEN}") req.add_header("Content-Type", "application/json") if data: req.data = json.dumps(data).encode("utf-8") return json.loads(urllib.request.urlopen(req, context=ctx, timeout=30).read().decode("utf-8")) # Check if page exists search_url = f"{BASE}/content?spaceKey={SPACE}&title={urllib.parse.quote(TITLE)}&type=page" req = urllib.request.Request(search_url) req.add_header("Authorization", f"Bearer {TOKEN}") resp = urllib.request.urlopen(req, context=ctx, timeout=30) search_data = json.loads(resp.read().decode("utf-8")) if search_data.get("results"): # Update existing page page_id = search_data["results"][0]["id"] ver_url = f"{BASE}/content/{page_id}?expand=version" req2 = urllib.request.Request(ver_url) req2.add_header("Authorization", f"Bearer {TOKEN}") ver_data = json.loads(urllib.request.urlopen(req2, context=ctx, timeout=30).read().decode("utf-8")) version = ver_data["version"]["number"] + 1 body = json.dumps({ "version": {"number": version}, "title": TITLE, "type": "page", "body": {"storage": {"value": html, "representation": "storage"}} }).encode("utf-8") req3 = urllib.request.Request(f"{BASE}/content/{page_id}", method="PUT", data=body) req3.add_header("Authorization", f"Bearer {TOKEN}") req3.add_header("Content-Type", "application/json") result = json.loads(urllib.request.urlopen(req3, context=ctx, timeout=30).read().decode("utf-8")) print(f"Aktualisiert: https://arija-confluence.jaas.service.deutschebahn.com/pages/viewpage.action?pageId={result['id']}") else: # Create new page body = json.dumps({ "type": "page", "title": TITLE, "space": {"key": SPACE}, "ancestors": [{"id": PARENT}], "body": {"storage": {"value": html, "representation": "storage"}} }).encode("utf-8") req3 = urllib.request.Request(f"{BASE}/content", method="POST", data=body) req3.add_header("Authorization", f"Bearer {TOKEN}") req3.add_header("Content-Type", "application/json") result = json.loads(urllib.request.urlopen(req3, context=ctx, timeout=30).read().decode("utf-8")) print(f"Erstellt: https://arija-confluence.jaas.service.deutschebahn.com/pages/viewpage.action?pageId={result['id']}")