# Arbeitskacheln-Backlog — KatS-/BOS-Ressourcenplattform Master-Prompt-Ergebnis (2026-09-05), Phase 1: Epic-Übersicht, vollständige Kachel-Liste, Abhängigkeitsgraph, Priorisierung, MVP-Abgrenzung. Details je Kachel liegen in den epic-eigenen Dateien (`01_foundation.md`, `02_identity.md`, ...), fortlaufend ergänzt. Kachel-Template und Nutzer-Vorgaben zur Methodik: siehe Memory `feedback_arbeitskacheln_methodik.md`. ## DECISION REQUIRED 1. **Verhältnis zu MABEA:** Dieses Backlog beschreibt großteils, was in MABEA (dieses Repo) bereits gebaut ist. Entscheidung: **(a) MABEA-Code weiterverwenden**, Kacheln als nachträgliche Strukturierung/Lückenfüller — nicht (b) Neustart. Begründung: vermeidet Doppelarbeit. 2. **Techstack:** FastAPI/PostgreSQL/React-PWA beibehalten (bereits entschieden, funktioniert, self-hosted-tauglich) statt Resgrid-(.NET)/OpenFleet-(Node) Stack zu übernehmen. 3. **QR-Code-Inhalt-Schema:** **entschieden — URL-Pfad** (`/akte/{ressourcentyp}/{id}`), kein signierter Token, keine Volldaten im QR. 4. **Person/Benutzer-Trennung (PERS-001/002):** MABEA hat aktuell nur `Benutzer` (Login=Person verschmolzen). Echte Trennung ist ein Datenmodell-Bruch — Umfang vorher separat abschätzen, bevor verbindlich eingeplant. 5. ✅ **UNKNOWN-Readiness-Zustand (READY-002) — erledigt (2026-09-05):** war offen, wurde noch am selben Tag live gefixt. Nie kontrollierte Objekte zählen jetzt als `unbekannt` statt fälschlich als „einsatzbereit". Siehe `13_readiness.md`. ## Subagenten je Epic Sieben Subagenten aus dem Subagenten-Repo sind für dieses Projekt bereits installiert (siehe Memory `reference-subagents-repo`), plus `fastapi-expert`/`python-expert` passend zum Techstack. Bei der tatsächlichen UMSETZUNG einer Kachel (nicht bei der Planung hier) sollen die folgenden Subagenten bevorzugt herangezogen werden — als Standard-Zuordnung je Epic, einzelne Kacheln können abweichen: | Epic | Empfohlene Subagenten | |---|---| | 01 Foundation | fastapi-expert, postgres-expert, jwt-expert, docker-expert, openapi-expert | | 02 Identity | postgres-expert (Eindeutigkeits-Constraints), owasp-top10-expert (Path-Traversal bei Codes/Labels) | | 03 Digital File | fastapi-expert (Aggregations-Endpunkt), sql-expert (Joins über viele Tabellen) | | 04 Assets | postgres-expert, sql-expert | | 05 Fleet | fastapi-expert | | 06 Inventory | postgres-expert, sql-expert (Mengen-/Chargenlogik) | | 07 Warehouse | postgres-expert (Hierarchie-Queries, Transaktionen bei Umlagerung) | | 08 Loadout | fastapi-expert, sql-expert | | 09 Inspections | python-expert (Berechnungslogik Intervalle/Ampel) | | 10 Maintenance | python-expert, postgres-expert | | 11 Defects | fastapi-expert | | 12 Personnel | jwt-expert/oauth-oidc-expert (bei PERS-002 Auth-Bezug), owasp-top10-expert | | 13 Readiness | python-expert (Regel-Engine-Logik) | | 14 Documents | owasp-top10-expert (Upload-Sicherheit/MIME-Whitelist, bereits Thema bei DOC-001), fastapi-expert | | 15 Mobile | kein Backend-Subagent zentral (Frontend/PWA-lastig) | | 16 Operations | noch offen, erst bei Angehen des Epics zuordnen | | 17 Zuständigkeit | postgres-expert (n:m-Vererbungslogik) | | 18 Notifications | fastapi-expert, owasp-top10-expert (E-Mail-Injection bei Trigger-Inhalten) | | 19 Satelliten-Server | postgres-expert, sql-expert (Sync Insert/Upsert), docker-expert | **Wie einbeziehen:** vor Implementierungsbeginn einer Kachel kurz prüfen, ob einer der zugeordneten Subagenten als Review-Instanz (nach Fertigstellung) oder als Umsetzungs- Delegation sinnvoll ist — nicht zwingend für jede einzelne Kachel, aber als Standardpfad für sicherheitskritische (owasp/jwt/oauth) und datenbanknahe (postgres/sql) Themen. ## Epic-Übersicht | Epic | Ziel | Priorität | |---|---|---| | 01 Foundation | Technisches Fundament (Repo/DB/Auth/API/Logging/CI) | P0 | | 02 Identity | Objekt-ID/Inventarnummer/Seriennummer/QR/Barcode | P0 | | 03 Digital File | Akte als Aggregations-Entität über alle Teilbereiche | P0 | | 04 Assets | Generisches Ressourcenmodell (Kategorie/Typ/Instanz/Set) | P0 | | 05 Fleet | Fahrzeug-Spezialfelder | P1 | | 06 Inventory | Material (Einzelgerät/Verbrauchsmaterial/Chargen) | P1 | | 07 Warehouse | Lagerplätze, Bestand, Bewegungen | P1 | | 08 Loadout | Soll/Ist-Beladung, Kontrolle | P1 | | 09 Inspections | Prüfungen generisch | P1 | | 10 Maintenance | Wartung | P2 | | 11 Defects | Mängel-Ticket | P1 | | 12 Personnel | Person/Benutzer/Qualifikation | P1 | | 13 Readiness | Zentrale Einsatzbereitschafts-Engine | P1 | | 14 Documents | Dokumentenverwaltung | P2 | | 15 Mobile | QR-Scan-Workflow, PWA | P1 | | 16 Operations | Einsatzverwaltung (Ausblick) | P3 | | 17 Zuständigkeit | Verantwortliche flexibel Standorten/Objekten zuordnen | P0 | | 18 Notifications | Benachrichtigung + Eskalation bei Fehlbestand | P1 | | 19 Satelliten-Server | Autarker Betrieb bei Verbindungsverlust (zurückgestellt) | P3 | ## Stand 2026-09-08: Code-Abgleich Jede Kachel unten wurde gegen den tatsächlichen Code-Stand geprüft (Backend-Endpunkte in `backend/app/api/v1/endpoints/*.py`, Models in `backend/app/models/*.py`, Migrations- Historie `backend/alembic/versions/0001…0025`, Frontend-Seiten/Komponenten in `frontend/src/pages/**` und `frontend/src/components/**`). Status-Werte: ✅ erledigt (im Code klar nachweisbar), 🔶 teilweise (Grundgerüst da, aber Lücke), ⬜ offen (kein Code-Nachweis). Bei vager Beschreibung ohne eindeutigen Code-Fund wurde konservativ ⬜ vergeben statt geraten. **Gesamt: 111 Kacheln — 79 ✅ / 11 🔶 / 21 ⬜.** | Epic | ✅ | 🔶 | ⬜ | Gesamt | Einschätzung | |---|---|---|---|---|---| | 01 Foundation | 7 | 1 | 4 | 12 | Kern (Repo/DB/Auth/API/Config/Tests) fertig, DevOps-Rand (Docker/CI/Backup/Doku) offen | | 02 Identity | 6 | 1 | 3 | 10 | QR/Seriennummer/Inventarnummer fertig, Nummernschemata/Hersteller-Stammdaten/Neuvergabe offen | | 03 Digital File | 7 | 0 | 0 | 7 | vollständig fertig | | 04 Assets | 7 | 1 | 1 | 9 | Kernmodell fertig, AssetSet als eigenes Konzept fehlt | | 05 Fleet | 4 | 1 | 1 | 6 | Kernfelder da, 5-stufiger Status teilweise, Einsatzhistorie offen | | 06 Inventory | 7 | 0 | 0 | 7 | vollständig fertig | | 07 Warehouse | 6 | 1 | 0 | 7 | praktisch komplett, nur eigener Inventur-Workflow fehlt | | 08 Loadout | 6 | 0 | 0 | 6 | vollständig fertig | | 09 Inspections | 2 | 3 | 1 | 6 | kein eigenständiges Prüfarten-Modul, nur Intervall/Termin am Gerät | | 10 Maintenance | 5 | 0 | 1 | 6 | fast vollständig (eigenes Wartungsmodul existiert), nur Ersatzteile/Kosten offen | | 11 Defects | 5 | 0 | 0 | 5 | vollständig fertig | | 12 Personnel | 5 | 0 | 2 | 7 | Qualifikationen/Einheiten da, Person/Benutzer-Trennung + Einsatzfunktionen offen | | 13 Readiness | 3 | 1 | 1 | 5 | Zustände/Dashboard/Regel-Kopplung da, aber feste Logik statt konfigurierbarer Regel-Engine | | 14 Documents | 1 | 0 | 4 | 5 | nur Grundgerüst+Hash, Typen/Versionierung/Kopie-Kennzeichen/Rechte offen | | 15 Mobile | 4 | 1 | 0 | 5 | PWA/QR/Kontroll-Flow da, vollständiges Offline-Grundgerüst nur teilweise | | 16 Operations | 0 | 0 | 3 | 3 | bewusst Platzhalter | | 17 Zuständigkeit | 2 | 0 | 0 | 2 | vollständig fertig | | 18 Notifications | 2 | 0 | 0 | 2 | vollständig fertig | | 19 Satelliten-Server | 0 | 1 | 0 | 1 | nur Datenmodell-Stub (`Systemknoten`), keine Sync-Logik | ## Vollständige Kachel-Liste | ID | Modul | Kachel | Prio | Aufwand | Risiko | Abhängigkeiten | Status | |---|---|---|---|---|---|---|---| | FOUND-001 | Foundation | Repo & Projektstruktur | P0 | S | LOW | — | ✅ | | FOUND-002 | Foundation | DB-Grundgerüst + Migrationen | P0 | S | LOW | FOUND-001 | ✅ (Alembic, 25 Migrationen) | | FOUND-003 | Foundation | Authentication | P0 | M | MEDIUM | FOUND-002 | ✅ (`auth.py` Login/JWT, `core/security.py`) | | FOUND-004 | Foundation | Authorization-Grundgerüst | P0 | M | MEDIUM | FOUND-003 | ✅ (`permission.py` Rollen/Berechtigungen) | | FOUND-005 | Foundation | API-Grundgerüst/Konventionen | P0 | S | LOW | FOUND-002 | ✅ (`api/v1/api.py` Router-Sammlung) | | FOUND-006 | Foundation | Logging & Audit-Grundgerüst | P0 | S | LOW | FOUND-002 | 🔶 (Historie-Modell/Audit-Trail vorhanden, kein strukturiertes Logging-Framework gefunden) | | FOUND-007 | Foundation | Konfigurationsmanagement | P0 | XS | LOW | FOUND-001 | ✅ (`core/app_settings.py`, BaseSettings) | | FOUND-008 | Foundation | Docker/Compose-Setup | P0 | M | MEDIUM | FOUND-001 | ⬜ (kein Dockerfile/docker-compose im Repo gefunden) | | FOUND-009 | Foundation | CI/CD-Grundgerüst | P0 | S | LOW | FOUND-008 | ⬜ (kein `.github/workflows` o.ä. gefunden) | | FOUND-010 | Foundation | Backup-Strategie | P1 | S | MEDIUM | FOUND-002 | ⬜ (kein Backup-Skript/-Dokumentation gefunden) | | FOUND-011 | Foundation | Test-Grundgerüst | P0 | M | LOW | FOUND-002 | ✅ (`backend/pytest.ini`, `backend/tests/`, 28 Testdateien) | | FOUND-012 | Foundation | Dokumentationsgerüst | P1 | XS | LOW | FOUND-001 | ⬜ (kein README im Projektwurzelverzeichnis gefunden) | | IDENT-001 | Identity | Objekt-ID-Schema | P0 | S | LOW | FOUND-002 | ✅ (Objekt-Code-Vergabe, `/objekte/naechster-code`) | | IDENT-002 | Identity | Inventarnummer manuell | P0 | S | LOW | IDENT-001 | ✅ (Objektposition-Code, `objektposition.py`) | | IDENT-003 | Identity | Inventarnummer-Nummernschemata | P1 | M | MEDIUM | IDENT-002 | ⬜ (kein konfigurierbares Schema gefunden, nur fester Code-Zähler) | | IDENT-004 | Identity | Seriennummer + Eindeutigkeitsprüfung | P0 | S | LOW | IDENT-001 | ✅ (`geraet_instanz.py` Seriennummer-Feld/Unique) | | IDENT-005 | Identity | Hersteller/Modell-Stammdaten | P1 | S | LOW | IDENT-004 | ⬜ (kein eigenes Hersteller/Modell-Stammdatenmodell gefunden) | | IDENT-006 | Identity | QR-Code-Erzeugung | P0 | S | LOW | IDENT-001 | ✅ (`label.pdf`-Endpunkte für Objekt/Objektposition) | | IDENT-007 | Identity | QR-Code-Druck (Label) | P0 | S | LOW | IDENT-006 | ✅ (`/objekte/{id}/label.pdf`, `/objektpositionen/{id}/label.pdf`) | | IDENT-008 | Identity | QR-Scan → Akte öffnen | P0 | M | MEDIUM | IDENT-006, FILE-006 | ✅ (`BarcodeScanner.tsx`, Akte-Route `/akte/objekt/{id}`) | | IDENT-009 | Identity | QR-Neuvergabe & -Historie | P2 | S | LOW | IDENT-006 | ⬜ (kein Nachweis für Neuvergabe-Workflow) | | IDENT-010 | Identity | Barcode/GTIN | P3 | S | LOW | IDENT-001 | 🔶 (`BarcodeScanner.tsx` existiert, GTIN-Materialabgleich nicht nachweisbar) | | FILE-001 | Digital File | Akte-Grundgerüst | P0 | M | MEDIUM | IDENT-001 | ✅ (`akte.py`, `services/akte.py`, docstring referenziert FILE-001) | | FILE-002 | Digital File | Akte-Stammdatenbereich | P0 | S | LOW | FILE-001 | ✅ (Teil des Akte-Aggregats) | | FILE-003 | Digital File | Akte-Standortbereich | P0 | S | LOW | FILE-001, WH-001 | ✅ (`admin/StandortSection.tsx`, Akte-Standortdaten) | | FILE-004 | Digital File | Akte-Verantwortlichkeit | P1 | S | LOW | FILE-001, PERS-003 | ✅ (Zuständigkeit im Akte-Aggregat, `zustaendigkeit.py`) | | FILE-005 | Digital File | Akte-Historienbereich | P0 | M | MEDIUM | FILE-001, FOUND-006 | ✅ (`historie.py`, `admin/HistorieSection.tsx`) | | FILE-006 | Digital File | Akte-Übersichtsseite (UI) | P0 | M | LOW | FILE-002..005 | ✅ (`AktePage.tsx`) | | FILE-007 | Digital File | Akte-Audit-Anbindung | P1 | S | LOW | FILE-005 | ✅ (Historie durchgängig in Akte eingebunden) | | ASSET-001 | Assets | AssetCategory | P0 | XS | LOW | FOUND-002 | ✅ (`Kategorie` in `stammdaten.py`) | | ASSET-002 | Assets | AssetType | P0 | S | LOW | ASSET-001 | ✅ (`Objekttyp` in `stammdaten.py`) | | ASSET-003 | Assets | Asset/AssetInstance | P0 | M | MEDIUM | ASSET-002, IDENT-001/002/004 | ✅ (`objekt.py`, `objektposition.py`, `geraet_instanz.py`) | | ASSET-004 | Assets | Asset-Status-Modell | P0 | S | LOW | ASSET-003 | ✅ (`ObjektStatus`, `GeraetStatus`, `ObjektpositionStatus` Enums) | | ASSET-005 | Assets | Asset-Suche & Liste | P1 | S | LOW | ASSET-003 | ✅ (`ObjektListPage.tsx`, `suche.py` Endpunkt) | | ASSET-006 | Assets | Asset-Bewegungshistorie | P1 | S | LOW | ASSET-003, WH-001 | ✅ (`lagerbewegung.py`, `historie.py`) | | ASSET-007 | Assets | AssetSet | P2 | M | MEDIUM | ASSET-003 | ⬜ (kein eigenständiges Set-Konzept über Objekt/Objektposition hinaus gefunden) | | ASSET-008 | Assets | Consumable | P1 | M | MEDIUM | ASSET-002 | 🔶 (Verbrauchsmaterial über `MaterialTyp`/Mengenlogik abgebildet, kein eigenes Consumable-Modell) | | ASSET-009 | Assets | Nutzungszähler (Kilometer/Betriebsstunden generisch) | P1 | S | LOW | ASSET-003 | ✅ (`fahrzeugdetails.py` Kilometerstand, MAINT-002 nutzt es) | | FLEET-001 | Fleet | Fahrzeugtypen | P1 | XS | LOW | ASSET-002 | ✅ (Objekttyp deckt Fahrzeugtypen ab) | | FLEET-002 | Fleet | Fahrzeuge (Kennzeichen/Funkrufname) | P1 | S | LOW | ASSET-003, FLEET-001 | ✅ (`fahrzeugdetails.py`: Kennzeichen, Funkrufname, OPTA/Funkkennung) | | FLEET-003 | Fleet | Kilometerstand (Anwendung von ASSET-009) | P1 | XS | LOW | FLEET-002, ASSET-009 | ✅ (Kilometerstand-Feld + Wartungsintervall-Kopplung) | | FLEET-004 | Fleet | Fahrzeugstatus (5-stufig) | P1 | S | LOW | FLEET-002, READY-002 | 🔶 (`ObjektStatus` hat nur 3 Werte, Einsatzbereitschaft wird separat mit 4 Zuständen berechnet — keine 5-stufige Enum gefunden) | | FLEET-005 | Fleet | Fahrzeug-Dokumente | P2 | XS | LOW | FLEET-002, DOC-001 | ✅ (`Dokument` polymorph, `entitaet_typ` deckt Fahrzeug/Objekt ab) | | FLEET-006 | Fleet | Fahrzeug-Einsatzhistorie (Platzhalter) | P3 | S | MEDIUM | FLEET-002, OPS-002 | ⬜ (kein Einsatz-Modell vorhanden, Operations-Epic ist Platzhalter) | | INV-001 | Inventory | Materialarten/Kategorien | P1 | XS | LOW | ASSET-001 | ✅ (`MaterialTyp`, `Kategorie` in `stammdaten.py`) | | INV-002 | Inventory | Einzelgeräte (SN-pflichtig) | P1 | S | LOW | ASSET-003, IDENT-004 | ✅ (`geraet_instanz.py`) | | INV-003 | Inventory | Verbrauchsmaterial (Mengen) | P1 | S | LOW | ASSET-008 | ✅ (Objektposition Soll-/Istmenge, `Material`) | | INV-004 | Inventory | Chargenverwaltung | P1 | S | MEDIUM | INV-003 | ✅ (`chargennummer` in `objektposition.py`) | | INV-005 | Inventory | Ablaufdaten & Warnschwellen | P1 | S | LOW | INV-004 | ✅ (`ablauf_charge`-Grund, Dashboard-Tile `AblaufdatenTile.tsx`) | | INV-006 | Inventory | Mindestbestände & Fehlbestand | P1 | M | MEDIUM | INV-003, LOAD-001 | ✅ (`fehlbestand.py`, `mindermenge.py`, `fehlbestaende.py`-Endpunkt) | | INV-007 | Inventory | Ausgabe/Rückgabe | P2 | M | MEDIUM | INV-003 | ✅ (`ausgabe.py` Model+Endpunkt, Migration 0021 referenziert INV-007) | | WH-001 | Warehouse | Lager-Stammdaten (Hierarchie) | P1 | S | LOW | FOUND-002 | ✅ (`Lagerort`, Migration 0019/Modell referenziert WH-001) | | WH-002 | Warehouse | Lagerplätze | P1 | S | LOW | WH-001 | ✅ (`Lagerplatz` referenziert WH-002) | | WH-003 | Warehouse | Bestand je Lagerplatz | P1 | M | MEDIUM | WH-002, INV-003 | ✅ (`Bestand`-Modell referenziert WH-003) | | WH-004 | Warehouse | Einlagerung/Auslagerung | P1 | M | MEDIUM | WH-003 | ✅ (`services/lager.py` Ein-/Auslagerungsfunktionen referenzieren WH-004) | | WH-005 | Warehouse | Umlagerung | P1 | S | LOW | WH-004 | ✅ (`/lagerplaetze/.../umlagerung`-Endpunkt referenziert WH-005) | | WH-006 | Warehouse | Inventur & Bestandskorrektur | P2 | M | MEDIUM | WH-003 | 🔶 (Bestandskorrektur über Ein-/Auslagerung möglich, kein eigener Inventur-Workflow/Zählliste gefunden) | | WH-007 | Warehouse | Materialbewegungsprotokoll | P1 | S | LOW | WH-004, FOUND-006 | ✅ (`Materialbewegung`, `lagerbewegung.py`, referenziert WH-007) | | LOAD-001 | Loadout | Soll-Beladung/Beladungsplan | P1 | M | MEDIUM | ASSET-003, INV-002/003 | ✅ (`vorlage.py` Beladungsvorlage, `BeladungsplanerBoard.tsx`) | | LOAD-002 | Loadout | Ist-Beladung | P1 | S | LOW | LOAD-001 | ✅ (Objektposition-Istmenge, `GeraeteInstanzenListe.tsx`) | | LOAD-003 | Loadout | Abweichungserkennung | P1 | S | MEDIUM | LOAD-002 | ✅ (Fehlbestand-Erkennung bei Ist