3 gleich breite Spalten (8/24) statt vorher 16+8-Split und 12-Restzeile -
Gesamthöhe von 23 auf 15 Zeilen reduziert, passt auf einem 16:9-Bildschirm
ohne vertikales Scrollen. Speicher-Key auf v4 angehoben, damit auch
bestehende Browser-Layouts das neue Standard-Raster bekommen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Ergänzt seed_monat.py: Wartungsplan/Wartungsintervall statt nur Ad-hoc-
Wartungsaufträge, wachsender Kilometerstand je Fahrzeug über 365 Tage,
automatisch ausgelöste Inspektion (15.000 km) und HU/UVV (12 Monate).
Nur für die separate Test-Instanz, kein Produktionsbezug.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Legt synthetische Benutzer/Standorte/Objekte an und simuliert 30 Tage
Kontrollen/Mängel/Wartung/Verleih/Lagerbewegungen. Nur für die separate
Test-Instanz gedacht (eigene DB, kein Produktionsbezug).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Rollenbasiertes, langlebiges Token neben dem normalen JWT-Login-Flow -
für automatisierte Zugriffe/Skripte. Admin wählt bei Erzeugung eine oder
mehrere Rollen, Klartext wird einmalig gezeigt (wie ein Passwort), Token
ist jederzeit deaktivierbar/reaktivierbar.
Architektur: jedes Token bekommt einen Begleit-"Dienstkonto"-Benutzer
(Benutzer.ist_dienstkonto=True, kein echter Login), der die Rollen über
die bestehende benutzer_rolle-Tabelle trägt - dadurch funktionieren
require_roles()/require_permission() und alle Audit-FKs unverändert,
keine bestehende Endpunkt-Dependency musste angepasst werden.
get_current_user() erkennt ein Token am Präfix mabea_pat_ und löst es
über den Hash (SHA-256, kein bcrypt - Token ist bereits hochentropisch)
auf den Begleit-Benutzer auf. Dienstkonten sind aus GET /benutzer
ausgeblendet, damit sie keine Auswahl-Dropdowns verunreinigen.
Neuer Admin-Tab "API-Tokens" (Gruppe System, nur Administration).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
GET /lagerorte war entgegen /lagerplaetze nicht standortgefiltert - Nutzer-
Review deckte das auf. Zusätzlich: standort_id konnte bisher an jedem
Lagerort-Typ gesetzt werden, nur dokumentiert als "nur bei typ=standort
sinnvoll". Jetzt harte 409-Validierung bei POST und PATCH (PATCH prüft die
resultierende Typ/standort_id-Kombination, nicht nur einzeln übergebene
Felder).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Letzte dashboard-nahen Objekt-bezogenen Endpunkte ohne Standort-Filter
geschlossen: kennzahlen() (vier Fehlbestand-Zählungen + Objekte-Gesamtzahl),
bevorstehende_ablaufdaten(), alle_faelligen_wartungen() bekommen optionales
sichtbare_standort_ids. Hintergrund-Job wartung_benachrichtigung.py ruft
weiterhin ohne Filter auf. bevorstehende_qualifikationsablaeufe() bleibt
bewusst unangetastet - rein Personal-bezogen, kein Objekt-/Standort-Konzept.
Damit ist ZUST-004 für alle Objekt-bezogenen Endpunkte durchgezogen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Lagerort.standort_id (Migration 0060, nullable, nur an typ=standort-Knoten
fachlich sinnvoll) löst die bisherige Blockade auf: standort_fuer_lagerort()/
standort_fuer_lagerplatz() laufen die parent_id-Kette hoch bis zum nächsten
Standort-Treffer. Damit jetzt eingeschränkt: GET /lagerplaetze(+bestand),
POST einlagern/auslagern/umlagern (Umlagern prüft Quelle UND Ziel). Admin-UI
zeigt Standort-Auswahl nur bei typ=standort. Lagerbewegung (Objekt-Ebene,
WH-007) bleibt unberührt - anderes Modell, war nie Teil der Blockade.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
CI-Fund: Test nutzte mitarbeiter_user, aber /historie war schon vor
ZUST-004 auf _verantwortliche (Administration/Materialverantwortliche/
Leitung) beschränkt - reiner Mitarbeiter bekam korrekt 403, unabhängig von
der neuen Standort-Prüfung. Kein Code-Bug, nur falsche Testannahme.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
GET /historie prüft Standort-Sichtbarkeit, wenn entitaet_typ+entitaet_id
gesetzt sind (globale Liste ohne Filter bleibt unrestricted). Nutzer-
Entscheidung: Dashboard-Aggregate (Einsatzbereitschaft, Prüftermine)
berücksichtigen jetzt ebenfalls sichtbare Standorte - bewusste Erweiterung
der ursprünglich dokumentierten "V1 zeigt globale Zahlen"-Festlegung.
readiness_snapshot.py bleibt unrestricted (kein Nutzer-Konzept im
Hintergrund-Job). kennzahlen/ablaufdaten/wartungen/qualifikationsablaeufe
bewusst nicht angefasst, eigene Folge-Runde bei Bedarf.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Objekttyp-Art/Zugfahrzeug/Ressourcenbuchung/Wartung/Zählerstand standen
bisher lose in derselben Reihe wie die Pflichtfelder (Bereich/Kategorie/
Name) - eigener umrandeter Block "Akte-Anzeige" mit Hinweis, dass die
Einstellung für alle Objekte dieses Typs gilt, nicht nur eins.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Nutzer-Fund: Wartungsauftrag war für JEDES Objekt anlegbar/sichtbar, auch
reine Bestandsobjekte (Rettungsrucksack), die nur Inventur/Kontrolle
brauchen. Neues Feld Objekttyp.wartung_aktiv (Migration 0059, bestehende
Objekttypen mit Wartungsplan oder ist_zugfahrzeug automatisch aktiviert)
steuert jetzt, ob WartungSection in der Akte überhaupt erscheint - gleiches
Opt-in-Muster wie ressourcenbuchung_aktiv/zaehler_typ.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Nutzer-Fund: Panel war ungeachtet des Objekttyps in jeder Akte sichtbar,
auch bei einem Rettungsrucksack ohne Kilometerstand/Betriebsstunden. Neues
Feld Objekttyp.zaehler_typ (keiner/kilometer/betriebsstunden/beide, Migration
0058, bestehende Fahrzeug-Objekttypen automatisch auf "beide" migriert)
steuert jetzt Sichtbarkeit UND welche Felder das Panel zeigt - gleiches
Opt-in-Muster wie ressourcenbuchung_aktiv (ASSET-012). Admin-UI in
ObjekttypSection.tsx ergänzt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Nutzer-Screenshot-Fund: Notizen/Bereitschaftshistorie/Ressourcenbuchung
werden für JEDES Objekt gerendert, das Desktop-Grid-Template (≥900px) für
Nicht-Fahrzeuge listete diese Grid-Areas aber gar nicht - Kinder ohne
gültige Area landeten im Implicit-Grid und überlappten sich (z.B.
"Hinzufügen"-Button über Bereitschaftshistorie-Text). Zusätzlich: neues
ZaehlerstandPanel (ASSET-009) hatte gar keine Grid-Area zugewiesen, dadurch
zu schmal gerendert (Platzhaltertext abgeschnitten, Zahlen-Spinner
überlappte Text). Beide Templates jetzt vollständig, ZaehlerstandPanel
bekommt eigene Area + Felder untereinander statt in einer Reihe.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
GET /wartungsauftraege, GET /verleihe(+uebergabeliste), PATCH /objekte/{id}/
zaehlerstand und GET /objekte/{id}/uebergabeliste (Aussonderung) bekommen
dieselbe Standort-Sichtbarkeitsprüfung. Lagerbewegungen/Lagerplätze bleiben
bewusst blockiert - Lagerort hat keine FK auf die echte Standort-Tabelle
(eigene, unabhängige Hierarchie), braucht erst eine eigene Entscheidung
bevor ZUST-004 dort anwendbar ist.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
GET /maengel filtert jetzt nach sichtbaren Standorten (Join auf Objekt),
GET /kontrollen/{id} prüft den Standort des zugehörigen Objekts. Gleiches
additives Muster wie Runde 1 (Objekte/Dokumente) - kein Eintrag in
benutzer_standort_zugriff bleibt weiterhin unrestricted.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Beide waren bereits umgesetzt (2026-09-10) - stale DECISION-REQUIRED-Text
stand noch mitten in der Kachel-Beschreibung, obwohl die DoD am Ende längst
die getroffene Entscheidung dokumentierte. Gleicher Fall wie zuvor bei
WH-006/PERS-004/MAINT-008 in dieser Session. Keine Code-Änderung, nur
Backlog-Korrektur.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Korrektur des ursprünglichen Threat-Model-Funds DOC-006: Standort war im
gesamten System nie eine Sicherheitsgrenze für Lesezugriffe (GET /objekte
hatte keinerlei Standort-Prüfung, ZUST-003 gilt nur für granulare
Custom-Rollen-Schreibrechte). Nutzer-Entscheidung: echte Sichtbarkeitsgrenze
einführen statt nur Dokumente zu flicken - neue Tabelle
benutzer_standort_zugriff (M:N, kein Eintrag = weiterhin alles sichtbar,
Rückwärtskompatibilität), OHNE Rollen-Bypass (auch Administration wird bei
Zuordnung eingeschränkt, anders als ZUST-003).
Erste Runde (bewusst nicht alle Endpunkte auf einmal, wie ZUST-003 selbst
vorschreibt): GET /objekte(+code/{id}), GET /dokumente(+download/versionen).
Kontrollen/Mängel/Historie/Dashboard/Wartung/Lager folgen bei Bedarf nach
demselben Muster.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Nutzer-Entscheidung revidiert bisherige Scope-Begrenzung (2026-09-10) auf
Kontrolle/Mangel. Neu: Gerätestatus, Wartungsauftrag, Lagerbewegung laufen
jetzt über eigene Offline-Queues statt bei Verbindungsverlust sofort zu
scheitern. Weiterhin kein genereller Endpunkt-Layer (bleibt abgelehnt) -
fünf eigenständige Queues teilen sich nur die Sync-Mechanik
(offline/draftQueue.ts). Lagerbuchungen bewusst anders: Bestandskonflikte
(4xx) werden weiterhin sofort angezeigt statt erst beim Sync-Versuch,
nur echte Netzwerkfehler landen in der Queue.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Neuer Status per Migration (ALTER TYPE ADD VALUE), gesetzt über den
bestehenden generischen PATCH /objekte/{id}-Endpunkt (Historie-Logging kam
damit automatisch mit). Dashboard blendet ausgesondert wie ausser_dienst
aus. Neuer GET /objekte/{id}/uebergabeliste nutzt denselben PDF-Mechanismus
wie der Verleih-Teil, ohne Verleih-/Externe-Stelle-Bezug. Damit ist
ASSET-013 komplett (Verleih-Teil war bereits 2026-09-12 fertig).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Fahrzeugdetails war nie technisch auf Fahrzeuge beschränkt, aber es gab
keinen Weg, den Zählerstand überhaupt zu setzen (nur Formular-Ersatz-PUT
ohne Validierung, keine Frontend-Anbindung). Neuer PATCH-Endpunkt mit
Monoton-Validierung (Rückwärtslauf nur Administrator), neues
ZaehlerstandPanel in der Akte - bewusst ohne Fahrzeug-Gate, damit
Stromerzeuger/Pumpen denselben Mechanismus nutzen können.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Einsatzfunktion/Einheit gab es bisher nur an Benutzer - eine Person ohne
Systemzugang (Jugendgruppe, externe Helfer) konnte keiner Einheit/Funktion
zugeordnet werden. Migration 0055 ergänzt beide Felder an Person, Admin-Tab
"Personen" bekommt dieselben zwei Auswahlfelder wie "Benutzer". Außerdem
PERS-004-DoD korrigiert (war fälschlich als "komplett neu/fehlt" markiert,
Einsatzfunktion-Konzept existierte bereits für Benutzer).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Prüftermine sind sicherheits-/haftungsrelevant (Nutzer-Vorgabe) - Änderung
bewusst additiv statt Ersetzung: Objektposition.pruefintervall_monate bleibt
Override wie bisher, NUR bei fehlendem Override greift jetzt der
Objekttyp-Standard (objekttyp_pruefart) statt naechste_pruefung leer zu
lassen. Kein Migrations-/Schema-Change, Regressionstest für bestehenden
Pfad ergänzt. Außerdem: WH-006-Ist-Stand-Notiz korrigiert (war als "fehlt
komplett" markiert, ist laut eigenem DoD seit 2026-09-10 fertig).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Reines Druck-PDF (reportlab, kein digitaler Signatur-Workflow) mit
Objektpositionen (Soll/Ist), nach Fach gruppiert wo vorhanden, plus
Unterschriftsfelder für Übergeber/Übernehmer. Aussonderungs-Teil von
ASSET-013 bleibt offen (braucht erst neuen ObjektStatus).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Nutzer-Anforderung: signierbare Materialliste, sobald ein Objekt dauerhaft
den Standort verlässt (Verleih oder Aussonderung). Nur Planung, keine
Umsetzung - Entscheidungen getroffen: neuer ObjektStatus.ausgesondert,
weasyprint für PDF-Erzeugung, Verleih+Aussonderung zusammen in einer Kachel.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
401 bei abgelaufenem Token wurde nirgends erkannt - "eingeloggt" blieb true,
Hard-Reload half nicht, da der abgelaufene Token weiter in localStorage lag
und /auth/me erneut mit 401 scheiterte (gleicher Zustand auf derselben URL).
apiRequest ruft jetzt bei echtem Session-Timeout einen von AuthProvider
registrierten Handler auf, der korrekt auf logout() setzt - Router-Guard
leitet danach automatisch zu /login um.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
flutter analyze/test/build erstmals verifiziert (Build-Host 192.168.1.236,
Flutter 3.47.3). Dabei Bug gefunden: synchronisiere() brach in beiden
Offline-Queues (Kontrolle + Mangel) bei JEDEM unerwarteten Fehler die
komplette Restqueue ab statt nur bei echtem Netzwerkfehler - ein kaputter
Eintrag hätte alle nachfolgenden dauerhaft blockiert. Jetzt nur noch bei
SocketException. Zusätzlich kApiBaseUrl auf --dart-define umgestellt statt
Code-Änderung pro Build, und Test für die neue Mangel-Queue ergänzt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Android-Client zieht die Draft-first-Offline-Queue für Mangelmeldung nach
(bisher nur Kontrolle abgedeckt), inkl. Foto-Upload per Multipart und
eigenem Melde-Screen. Zusätzlich Backend-Threat-Model erstellt und daraus
DOC-006 (IDOR bei Dokument-Download) als Kachel im Backlog angelegt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
Desktop: sortierte Spalten-Tabelle (Code/Name/Standort/Fahrzeug/Status-Badge/
Kontrolle), Filter nach Standort und Status zusätzlich zur Suche. Mobile
bleibt Kartenliste (useIsDesktop, wie ObjektListPage). Verschieben/Fahrzeug/
Duplizieren-Formulare in ObjektAktionenFormulare.tsx ausgelagert, von Zeile
und Karte gemeinsam genutzt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012BmsfwPHiAjwtJetgykazx
android.permission.INTERNET fehlte in AndroidManifest.xml (Standard-
flutter-create-Template setzt sie nicht automatisch) - App konnte
dadurch gar keine Netzwerkverbindung aufbauen ("keine Verbindung zum
Server"), unabhängig vom Backend-Status. mabea-scan hatte die
Permission bereits korrekt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
Vorheriger Edit hatte Zeilen der ursprünglichen
test_akte_buendelt_teilbereiche-Assertions versehentlich in die neue
Testfunktion verschoben (NameError: 'body' nicht definiert). Zeilen
zurück an den richtigen Test gehängt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
Backend/Frontend-Seite: /app-download/info und /app-download/qr.png
bekommen app-Query-Parameter (scan/doku), Download-Seite /app?app=...
mit Umschalter für die beiden eigenständigen Flutter-Apps.
ASSET-012 Nutzer-Feedback: Ressourcenbuchung war in jeder Akte
sichtbar, unabhängig vom Objekttyp - jetzt Opt-in je Objekttyp
(Objekttyp.ressourcenbuchung_aktiv, Migration 0054, Default false),
Admin-Checkbox in ObjekttypSection.tsx, AktePage.tsx zeigt das Panel
nur noch wenn aktiviert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
Objekt-Scan zeigt jetzt Einsatzbereitschafts-Ampel + Gründe, letzte
Kontrolle, offene Mängel (via GET /akte/objekt/{id}, Ladefehler nicht
fatal). Taschenlampe-Toggle im Scan-Screen. Geräte-Exemplar-Code als
Fallback, wenn kein Objekt-Code passt (Geräte-Etiketten waren bisher
gar nicht scanbar).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
Zwei Kacheln waren fälschlich unter denselben IDs geführt wie bereits
vergebene aus der ursprünglichen Master-Prompt-Liste: CSV/XLS-Import
FOUND-007 -> FOUND-014, Fristen-Dienst FOUND-008 -> FOUND-015. Alle
Code-Kommentare/Kachel-Querverweise mitgezogen.
FOUND-008 (Docker/Compose-Setup) als won't-do geschlossen -
widerspricht der bare-metal-Policy für MABEA selbst (CLAUDE.md).
GlitchTip (FOUND-013) nutzt Docker als externe Fremdsoftware auf
einem separaten, optionalen Host - kein Widerspruch.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
Erster echter Test für services/qr_png.py (bisher nie getestet, auch
nicht in ASSET-010) deckte auf: reportlab.graphics.renderPM braucht
einen nativen Rendering-Backend, der auf Python 3.13 nicht lauffähig
installiert war. Hätte auch die ASSET-010-QR-Anzeige im Ausgabe-
Dialog treffen können, war nur nie bemerkt worden. Auf qrcode[pil]
(reiner Python-Encoder, kein natives Backend nötig) umgestellt.
label.py (PDF-Vektor-Labels) ist unverändert, nicht betroffen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
/app zeigt QR-Code + Download-Button + Installationsanleitung ohne
Login (Henne-Ei: die App ist der Login-Client). Backend liefert
GET /app-download/info und /app-download/qr.png (bewusst ohne Auth),
liest version.json vom lokalen downloads_dir, QR über bestehenden
services/qr_png.py. Admin-Hinweis verlinkt jetzt auf /app statt
Version/URL zu duplizieren.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
Portal-Link war fest auf v0.5.apk verlinkt, dadurch nach dem
v0.6.0-Build stale. Liest jetzt zur Laufzeit /downloads/version.json
(dieselbe Quelle wie der In-App-Update-Check) statt einer fest
hinterlegten Versionsnummer im Link - bleibt bei jedem künftigen
APK-Build automatisch aktuell.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
Korrigiert vorherige fehlerhafte Notiz (flutter_app/ im Repo ist ein
getrenntes, ungenutztes Scaffold - nicht der echte Prototyp). Echter
FLUT-001-Code lebt weiterhin nur auf dem Build-Server
(mabea_scan_prototyp), dokumentiert v0.6.0 (flutter_secure_storage
für Token+optionale Zugangsdaten, Auto-Relogin bei 401, Logout) und
den Umzug von /opt/flutter-projects nach /mnt/projekte/flutter
(Symlink) auf 192.168.1.236.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
Token-Speicherung von SharedPreferences (Klartext) auf
flutter_secure_storage (Android Keystore/iOS Keychain) umgestellt.
Optional werden Benutzername/Passwort mitgespeichert (Checkbox auf
dem Login-Screen, Default an, abwählbar - löscht dabei auch
vorhandene gespeicherte Zugangsdaten), damit die App nach Ablauf des
8h-Tokens automatisch neu einloggt statt den Nutzer zurück auf den
Login-Screen zu werfen (ApiClient.versucheAutoRelogin(), greift bei
401 in request()).
Tests auf FakeSecureStorage (In-Memory-Testdouble) statt
SharedPreferences.setMockInitialValues umgestellt.
Kein lokales Flutter-SDK in dieser Umgebung - Änderungen per
manuellem Code-Review statt flutter analyze/test verifiziert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV