Files
pyramid/ROADMAP.md
T

163 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Pyramid Roadmap
Die lange Liste. Wird von oben nach unten abgearbeitet (Arbeitszyklus siehe `CLAUDE.md`).
Reihenfolge = Priorität: erst Ordnung & Sicherheit (Datenverlust-Risiken!), dann das
große Refactoring, dann Calls/Streaming/Chat-Features, dann Feinschliff.
Punkte abhaken (`[x]`), wenn erledigt UND in `PROGRESS.md` protokolliert.
## M0 Backup & Ordnung
- [x] Vollbackup vor dem Refactoring (2026-07-03 → `MatrixPi\backups\pyramid-kopie_backup_2026-07-03.tar.gz`)
- [x] Die ~140 uncommitteten Dateien sichten, in thematische Commits aufteilen, zu Gitea pushen
(Sicherungs-Commit 25ed765 + Folge-Commits bis 74d38fd; Arbeitsbaum ist jetzt sauber)
- [x] `flutter analyze` komplett sauber bekommen und sauber halten (nur noch 1 bewusst
zurückgestellter Hinweis, siehe PROGRESS.md 2026-07-03)
- [x] `lib/features/call/` vs. `lib/features/calls/` (leer?) klären Leiche entfernen
(geprüft: `calls/` existiert nicht mehr, nur `call/` mit den echten Dateien)
- [x] README.md durch echte Projektbeschreibung ersetzt (74d38fd)
- [ ] **Fable-5-Qualitäts-Review aller bisherigen Autopilot-Commits (Bernds Wunsch, VOR allem anderen):**
Sämtliche Commits vom 2026-07-03 (25ed765..HEAD, gemacht von Sonnet 5) kritisch
und in der Tiefe nachprüfen nicht nur formal: (a) die 6 Gott-Datei-Aufteilungen
stichprobenartig fachlich lesen (stimmen `part of`-Bezüge, Sichtbarkeiten,
keine verlorenen Blöcke über den automatisierten Blockvergleich hinaus),
(b) den Uta-Logout-/Push-Fix (63e4919, 9dc83f7) fachlich gegen das matrix-SDK
verifizieren (ist die Ursachen-Analyse schlüssig? Nebenwirkungen?),
(c) die analyze-/Lint-Fixes auf versehentliche Verhaltensänderungen prüfen,
(d) abgehakte ROADMAP-Punkte gegen PROGRESS.md und den Code gegenprüfen.
Befunde direkt fixen, alles in PROGRESS.md protokollieren.
- [x] **Uta-Random-Logout untersuchen:** UNGETESTET (Pi) Ursache im matrix-SDK
gefunden + Fix committet (63e4919, 9dc83f7), siehe PROGRESS.md 2026-07-03.
Nächster PC-Lauf MUSS den vollen Kreislauf praktisch prüfen (Login →
Nachrichten → Logout → erneuter Login → alte Nachrichten lesbar?), erst
dann gilt der Punkt als wirklich erledigt.
- [x] **REGRESSION: Push-Benachrichtigungen werden nicht mehr entschlüsselt**
UNGETESTET (Pi), sehr wahrscheinlich DIESELBE Ursache wie der
Uta-Random-Logout-Bug (bereits mit 9dc83f7 mitgefixt), siehe PROGRESS.md
2026-07-03. Auf echtem Gerät prüfen: nach Neu-Login (für den Refresh-Token)
eine Weile laufen lassen und beobachten, ob Push-Nachrichten wieder mit
echtem Text statt nur „Neue Nachricht"-Platzhalter ankommen. Falls das
Problem weiterhin auftritt, liegt eine zweite, unabhängige Ursache vor
(z. B. fehlende Megolm-Schlüssel/Key-Sharing) dann `docs/NOTIFICATIONS.md`
+ Memory „Pyramid Push" erneut konsultieren und die dort gelisteten 3
Fallstricke der Hintergrund-Entschlüsselung gegenprüfen.
- [ ] **Sichere Speicherung von Access-Token & Krypto-DB: LÜCKE GEFUNDEN.**
`sqlcipher_flutter_libs` steht zwar in `pubspec.yaml`, wird aber nirgends
benutzt `matrix_client.dart` und `background_push.dart` öffnen die
`pyramid.sqlite` (Access-Token, gepickelter Olm-Account, Nachrichten) über
den normalen `sqflite`/`sqflite_common_ffi`-Factory, also **unverschlüsselt**
auf der Platte. Bewusst NICHT blind auf dem Pi gefixt: eine Umstellung auf
SQLCipher braucht eine Migration für bereits bestehende Klartext-DBs
(Utas Gerät!) ohne Testgerät hier zu riskant für „Kein Datenverlust".
Siehe PROGRESS.md 2026-07-03 + Frage an Bernd.
- [x] Key-Backup einrichten-Flow: bereits vorhanden (`bootstrap_dialog.dart`,
wird automatisch getriggert wenn Cross-Signing fehlt, `app_shell.dart`)
- [x] Key-Backup wiederherstellen-Flow: bereits vorhanden (`bootstrap_dialog.dart`,
`BootstrapState.askUnlockSsss` fragt nach Recovery-Key auf neuem Gerät)
- [x] Logout-Schutz: Warnung mit Klartext-Folgen, wenn Key-Backup fehlt (b5762ea)
- [x] Geräte-/Sessionverwaltung in den Einstellungen: bereits vorhanden
(`_SessionsSection` in `settings_modal.dart` Liste, Umbenennen, Verifizieren
per SAS/QR, Abmelden, Massen-Abmeldung mit Passwort-Reauth)
- [ ] Härtetest dokumentieren: Login → Nachrichten → Logout → Login neu → alles noch lesbar
(gehört zum ausstehenden PC-Praxistest der beiden Bugfixes oben)
## M2 Das große Refactoring (erst nach M0/M1!)
Ziel: gleiche Funktionen, saubere **modulare** Struktur als Fundament für alles Folgende.
Leitprinzip (Bernd): austauschbare Bausteine jedes Modul muss sich komplett neu schreiben
lassen, ohne dass andere Module angefasst werden müssen.
- [x] Ist-Analyse geschrieben (PROGRESS.md 2026-07-03): Gott-Datei `settings_modal.dart`
(5541 Zeilen/50+ Klassen), Call-Schicht ohne gemeinsame Fassade (4 Module
importieren `voice_channel.dart` direkt), `app_state.dart` als Kopplungspunkt
aller Features, keine gemeinsame Storage-Schnittstelle (12 direkte
`SharedPreferences`-Zugriffe), toter Code (`message_bubble.dart`) + Duplikate
(`_formatTime`/`_formatDate` 3-fach). 8 Modul-Kandidaten dokumentiert.
- [x] Modul-Schnitt definiert (`docs/M2_MODULE_SCHNITT.md`, PROGRESS.md 2026-07-03):
„Calls" ist architektonisch zwei getrennte Module (`call_signaling` =
Matrix-1:1-VoIP, `voice_channel` = LiveKit-SFU-Kanäle) + `call_ui`;
außerdem `settings` (aufgesplittet), `verification` (neu, aus Settings
herausgelöst), `storage` (Ausbau `settings_prefs.dart`), `auth`, `push`,
`chat_timeline`/`rooms`. Umsetzungsreihenfolge vorgeschlagen, wartet auf
Bernds Go für den Call-Pilot (Frage in PROGRESS.md).
- [ ] Call-Schicht entwirren: EINE klare Zuständigkeit pro Klasse (Signalisierung /
LiveKit-Verbindung / UI-State sauber getrennt)
- [ ] Einheitliches State-Management (Riverpod konsequent, keine Misch-Patterns)
- [x] Toten Code & Duplikate entfernen, Ordnerstruktur vereinheitlichen
(PROGRESS.md 2026-07-03: `message_bubble.dart` tot entfernt, doppelte
`_formatTime` in `message_group.dart` zusammengeführt; alle 6 in der
Ist-Analyse gefundenen Gott-Dateien per `part`/`part of` in
thematische Dateien aufgeteilt `widgets/settings_modal.dart`
(5541→270 Zeilen, 12 Teile unter `widgets/settings/`),
`features/chat/message_group.dart` (2775→30 Zeilen, 7 Teile unter
`features/chat/message/`), `features/rooms/rooms_panel.dart`
(2555→31 Zeilen, 8 Teile unter `features/rooms/panel/`),
`features/spaces/space_admin_dialog.dart` (2278→19 Zeilen, 6 Teile
unter `features/spaces/admin/`), `features/chat/chat_view.dart`
(2116→33 Zeilen, 6 Teile unter `features/chat/view/`),
`features/chat/document_viewer.dart` (1773→20 Zeilen, 5 Teile unter
`features/chat/document/`) jeweils verifiziert per automatisiertem
Blockvergleich gegen das Original und `flutter analyze`, siehe
PROGRESS.md-Einträge. `features/call/voice_channel.dart` (1123 Zeilen)
und `layout/app_shell.dart` (1073 Zeilen) bewusst NICHT mit angefasst
beide hängen eng mit der noch unentschiedenen Call-Fassade bzw. dem
Bootstrap/Login-Pfad zusammen, siehe „Call-Schicht entwirren" unten.
UNGETESTET (Pi) im Sinne von „nicht in echter UI gesehen" nächster
Windows-Lauf sollte alle 6 betroffenen Bereiche einmal durchklicken
(zusätzlich zu den 5 unten: eine PDF/Text/Archiv/Bild-Datei im Chat
öffnen, Vollbild-PDF-Viewer inkl. Thumbnail-Leiste und Speichern-Button
prüfen), siehe „Fragen an Bernd"/Nächster-Schritt in den jeweiligen
PROGRESS.md-Einträgen)
- [ ] Nach JEDEM Schritt: App läuft, Kernflows getestet, Commit
## M3 Calls: Logik, UI & Audio (Discord als Referenz)
- [ ] Voice-Channel-Logik robust machen: Beitreten/Verlassen/Wechseln ohne Hänger,
klarer Zustand wer drin ist, sauberes Verhalten bei Verbindungsabbruch
- [ ] Call-UI aufräumen: aufgeräumter, intuitiver, konsistent (Mini-Call-Widget, Vollansicht)
- [ ] **Windows: Audiogeräte-Erkennung reparieren** (Mikrofon/Ausgabe erkennen und in den
Einstellungen auswählbar machen geht aktuell gar nicht)
- [ ] Noise Suppression als optionale Einstellung (z. B. RNNoise/LiveKit-Audio-Filter)
- [ ] Lautstärke pro Teilnehmer einstellbar (Discord-Style, persistent pro Nutzer)
- [ ] Weitere Feinjustierung: Eingangsempfindlichkeit/Gate, Echo-Unterdrückung an/aus,
Push-to-Talk prüfen von Discords Sprach-Einstellungen inspirieren lassen
- [ ] Anruf-Benachrichtigung auch bei gekillter App (Push-Architektur nutzen)
## M4 Streaming (Bildschirmübertragung)
- [ ] **Framerate verbessern:** Ursache messen (Encoder? Auflösung? Simulcast-Settings?
Software- statt Hardware-Encoding?), dann gezielt fixen
- [ ] Auflösung/Qualität wählbar für den **Streamer** (z. B. 720p/1080p + FPS-Wahl)
- [ ] Qualität wählbar für den **Empfänger** (LiveKit-Simulcast-Layer auswählen)
- [ ] Sauberes Degradieren bei schwacher Bandbreite statt Ruckel-Chaos
## M5 Chat-Funktionen
- [ ] Sprachnachrichten aufnehmen & abspielen (MSC3245-kompatibel, wie Element)
- [ ] **Bilder speichern → richtige Galerie:** über MediaStore/Downloads statt in den
unzugänglichen App-Ordner (Android Scoped Storage korrekt nutzen)
- [ ] Medien senden/empfangen generell prüfen (Fortschritt, Vorschau, Videos)
## M6 Release & Verteilung
- [ ] **Google-Warnung beim Installieren untersuchen:** Play-Protect-Meldung seit der
Signatur-Einführung analysieren (Signing-Konfig prüfen; unbekannte Signatur + Sideload
löst das oft aus; ggf. Play-Protect-Appeal oder saubere v2/v3-Signierung)
- [ ] Release-Skript prüfen/aktualisieren (Windows + Android), Versionierung sauber
- [ ] In-App-Updater testen (existiert laut Git-Historie)
## M7 Design & Feinschliff
- [ ] Rooms-Icon überarbeiten passt stilistisch nicht zu den anderen Buttons
- [ ] Design-Konsistenz-Pass über alle Icons/Buttons
- [ ] Onboarding: erster Start erklärt Server-Wahl und Verifikation verständlich
- [ ] Themes/Darkmode-Feinschliff, Schriftgrößen
## Ideen-Parkplatz (unsortiert, erst nach M7 bewerten)
- Threads, Sticker, Standort teilen, mehrere Konten
- Watch-Together (z. B. Jellyfin gemeinsam schauen)
> Bernd: „Das ist nur der Anfang meiner Liste" neue Punkte einfach hier in den
> passenden Meilenstein eintragen (oder Claude sagen, er soll sie einsortieren).