docs(backlog): FOUND-ID-Kollision behoben, FOUND-008 won't-do
CI / backend-tests (push) Successful in 3m16s
CI / frontend-build (push) Successful in 21s

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
This commit is contained in:
patrickandClaude Sonnet 5 committed 2026-09-10 21:09:30 +02:00
1 parent f93798e3f3
commit 6f3589f4e0
6 files changed
+29 -22

No files matched your search

+4 -4
View File
@@ -127,10 +127,10 @@ vergeben statt geraten.
| 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-Audit-Trail + `app/core/logging_config.py` einheitliches Log-Format) |
| FOUND-007 | Foundation | CSV/XLS-Import/Export Objektstammdaten (neu, Referenz: HiOrg-Server) | P2 | M | MEDIUM | ASSET-003 | ✅ (`app/services/import_export.py`, CSV für Objekt+GeraetInstanz, kein XLS) |
| FOUND-008 | Foundation | Generischer Fristen-Dienst (neu, Refactoring) | P3 | M | LOW | INV-005, PERS-007, MAINT-002 | ✅ (`app/services/fristen.py`, Normalisierungsschicht mit Dringlichkeits-Ampel) |
| FOUND-014 | Foundation | CSV/XLS-Import/Export Objektstammdaten (neu, Referenz: HiOrg-Server) | P2 | M | MEDIUM | ASSET-003 | ✅ (`app/services/import_export.py`, CSV für Objekt+GeraetInstanz, kein XLS) |
| FOUND-015 | Foundation | Generischer Fristen-Dienst (neu, Refactoring) | P3 | M | LOW | INV-005, PERS-007, MAINT-002 | ✅ (`app/services/fristen.py`, Normalisierungsschicht mit Dringlichkeits-Ampel) |
| 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-008 | Foundation | Docker/Compose-Setup | P0 | M | MEDIUM | FOUND-001 | ❌ won't-do (2026-09-10) — widerspricht CLAUDE.md-Policy „kein Docker-Zwang" für MABEA selbst; MABEA läuft vollständig bare-metal (systemd, nginx, kein Container). GlitchTip (FOUND-013) nutzt Docker, aber als externe Fremdsoftware auf einem separaten, optionalen Host — kein Widerspruch. |
| FOUND-009 | Foundation | CI/CD-Grundgerüst | P0 | S | LOW | FOUND-008 | ✅ (`.gitea/workflows/ci.yml` - Backend-Tests + Frontend-Build/Tests, vorheriger Abgleich hat nur `.github/` geprüft) |
| FOUND-010 | Foundation | Backup-Strategie | P1 | S | MEDIUM | FOUND-002 | ✅ (`deploy/backup_datenbank.sh` + systemd-Timer-Vorlagen, taeglich mit Rotation) |
| FOUND-011 | Foundation | Test-Grundgerüst | P0 | M | LOW | FOUND-002 | ✅ (`backend/pytest.ini`+`backend/tests/`, seit 2026-09-08 auch `frontend/vitest.config.ts`+`src/**/*.test.ts(x)`, beide in CI) |
@@ -302,7 +302,7 @@ eigenes Modul (MAINT-\*, MABEA hat nur Prüfung, keine Wartung)**.
| Datei | Enthält Details für |
|---|---|
| `01_foundation.md` | FOUND-001 … FOUND-008 (001-006 vollständig/teilweise, FOUND-007/008 offen/ungeplant, Referenz HiOrg-Server, 2026-09-09) |
| `01_foundation.md` | FOUND-001 … FOUND-015 (001-006/013/014/015 umgesetzt, FOUND-008 won't-do 2026-09-10, FOUND-014/015 ursprünglich fälschlich als FOUND-007/008 nummeriert, Referenz HiOrg-Server 2026-09-09) |
| `02_identity.md` | IDENT-001, 002, 004, 005 … 010 |
| `03_digital_file.md` | FILE-001 … FILE-009 (alle ✅ umgesetzt) |
| `04_assets.md` | ASSET-001 … ASSET-010 (ASSET-009 nachträglich ergänzt, ASSET-010 ✅ umgesetzt 2026-09-10) |
+19 -12
View File
@@ -1,8 +1,12 @@
# Epic 01 — Foundation
Details zu FOUND-001 … FOUND-008. FOUND-007/008 ergänzt am 2026-09-09 aus
HiOrg-Server-Vergleich, offen/ungeplant. Übersichtstabelle mit allen FOUND-Kacheln (auch die noch
nicht detaillierten) siehe `00_index.md`.
Details zu FOUND-001 … FOUND-006, FOUND-014/015, FOUND-013. FOUND-014/015
ergänzt am 2026-09-09 aus HiOrg-Server-Vergleich (ursprünglich fälschlich
als FOUND-007/008 nummeriert — kollidierte mit den bereits vergebenen IDs
für Konfigurationsmanagement/Docker-Compose aus der ursprünglichen
Master-Prompt-Liste, am 2026-09-10 auf FOUND-014/015 korrigiert).
Übersichtstabelle mit allen FOUND-Kacheln (auch die noch nicht
detaillierten) siehe `00_index.md`.
---
@@ -129,7 +133,7 @@ nicht detaillierten) siehe `00_index.md`.
- **Tests:** Log-Eintrag wird bei simulierter Aktion erzeugt und ist abrufbar.
- **DoD:** mind. ein reales Ereignis (z.B. Login) wird bereits geloggt.
## FOUND-007 — CSV/XLS-Import/Export für Objekt- und Materialstammdaten (P2, neu,
## FOUND-014 — CSV/XLS-Import/Export für Objekt- und Materialstammdaten (P2, neu,
Scope geklärt 2026-09-09)
- **Ziel:** Massenpflege von Objekt- UND Materialstammdaten statt Einzelanlage per
@@ -180,7 +184,7 @@ nicht detaillierten) siehe `00_index.md`.
Import/Export für praktisch alle Datentypen (CSV/XLS/vCard/iCal) — MABEA hat dafür
jetzt einen CSV-Mechanismus für die beiden wichtigsten Ebenen.
## FOUND-008 — Generischer Fristen-Dienst (P3, neu, Schnittstelle geklärt 2026-09-09)
## FOUND-015 — Generischer Fristen-Dienst (P3, neu, Schnittstelle geklärt 2026-09-09)
- **Ziel:** EINE Berechnungslogik für „läuft etwas bald ab/wird etwas bald fällig"
statt mehrfach separat implementiert.
@@ -301,10 +305,13 @@ nicht detaillierten) siehe `00_index.md`.
---
**MABEA-Ist-Stand-Abgleich:** FOUND-001…006 sind in MABEA vollständig vorhanden
(FastAPI-Grundgerüst, Alembic-Migrationen, JWT-Login, `require_roles()`-Dependency,
einheitliches Fehlerformat + `/docs`, `historie`-Tabelle als Audit-Log). FOUND-007…012
(Konfiguration/Docker/CI/Backup/Tests/Doku) ebenfalls größtenteils vorhanden
(`app_settings.py`, `.env`, Gitea-CI `ci.yml`, `pytest`, README/DEVLOG). FOUND-013
(Error-Tracking) als einzige echte Lücke identifiziert und geplant (2026-09-10),
Umsetzung hängt an einer noch offenen Zielserver-Entscheidung.
**MABEA-Ist-Stand-Abgleich (aktualisiert 2026-09-10):** FOUND-001…006 sind in
MABEA vollständig vorhanden (FastAPI-Grundgerüst, Alembic-Migrationen,
JWT-Login, `require_roles()`-Dependency, einheitliches Fehlerformat +
`/docs`, `historie`-Tabelle als Audit-Log). FOUND-007/009…012
(Konfiguration/CI/Backup/Tests/Doku) ebenfalls vorhanden (`app_settings.py`,
`.env`, Gitea-CI `ci.yml`, `pytest`, README/DEVLOG). FOUND-008
(Docker/Compose) bewusst **won't-do** — widerspricht der bare-metal-Policy
für MABEA selbst (CLAUDE.md). FOUND-013 (Error-Tracking) erledigt
(optionales Install-Script statt fester Zielserver-Festlegung). FOUND-014
(CSV/XLS-Import) und FOUND-015 (Fristen-Dienst) erledigt.
+2 -2
View File
@@ -26,7 +26,7 @@ Details zu INSP-001 … INSP-006 (vollständig).
Nutzer): additiver Phasenplan statt Big-Bang-Umbau.** Ein vollständiger
Ersatz der bestehenden `GeraetInstanz.status`/`pruefdatum`/`naechste_pruefung`-
und `Fahrzeugdetails.naechste_hu`/`naechste_uvv`-Felder hätte Dashboard-
Prüftermine, den Fristen-Dienst (FOUND-008) und ASSET-010 (Custody nutzt
Prüftermine, den Fristen-Dienst (FOUND-015) und ASSET-010 (Custody nutzt
`naechste_pruefung`) mitbetroffen — deutlich höheres Regressionsrisiko als
nötig für den geäußerten Bedarf. Stattdessen:
- **Phase 1 (umgesetzt 2026-09-10):** `pruefart`/`objekttyp_pruefart`/
@@ -150,7 +150,7 @@ Details zu INSP-001 … INSP-006 (vollständig).
gueltig/bald_ablaufend/abgelaufen): `fehlgeschlagen` (jüngste `Pruefung` hat
`ergebnis=nicht_bestanden` — **unabhängig vom Datum**, das ist exakt die
ursprünglich fehlende FAILED-Fähigkeit), sonst `ok`/`bald`/`kritisch`/
`ueberfaellig` aus `app/services/fristen.py:ampel_aus_tagen()` (FOUND-008,
`ueberfaellig` aus `app/services/fristen.py:ampel_aus_tagen()` (FOUND-015,
wiederverwendet statt dupliziert) bezogen auf `GeraetInstanz.naechste_pruefung`.
`GET /geraete/{id}/pruefungs-ampel`. Nur für Geräte (Phase 1), Fahrzeug-
HU/UVV-Ampel bleibt vorerst beim bestehenden Dashboard-Mechanismus.
+1 -1
View File
@@ -41,7 +41,7 @@ künstlich zu trennen.
statt eines eigenen Notiz-Modells — deckt den geäußerten Bedarf ab, ohne
FILE-009 (AkteNotiz) zu duplizieren. Verbrauchsmaterial-Nachbestellung nicht
umgesetzt (kein konkreter Bedarf dafür geäußert, kann bei Bedarf als eigene
Ausbaustufe nachgezogen werden — z.B. Verknüpfung zu FOUND-007-Import oder
Ausbaustufe nachgezogen werden — z.B. Verknüpfung zu FOUND-014-Import oder
einer neuen Nachbestell-Liste).
- **DoD:** ✅ Debriefing-Notiz umgesetzt (2026-09-10), zusammen mit OPS-001.
Nachbestellungs-Funktion bewusst nicht umgesetzt (kein Bedarf geäußert).
+1 -1
View File
@@ -30,7 +30,7 @@ class FristTreffer(BaseModel):
def ampel_aus_tagen(verbleibende_tage: int, warnzeitraum_tage: int) -> Dringlichkeit:
"""FOUND-008: gemeinsamer Schwellenwert für alle datumsbasierten Fristen
"""FOUND-015: gemeinsamer Schwellenwert für alle datumsbasierten Fristen
(Charge-Ablauf, Qualifikations-Ablauf, zeitbasierte Wartungsintervalle) -
"kritisch" ab einem Viertel des jeweiligen Warnzeitraums, nicht fix in Tagen
(60 Tage Vorlauf bei Qualifikationen brauchen einen anderen Kritisch-Punkt
+2 -2
View File
@@ -70,7 +70,7 @@ async def exportiere_objekte(db: AsyncSession) -> str:
async def importiere_objekte(
db: AsyncSession, inhalt: str, *, commit: bool
) -> tuple[int, int, list[ImportZeile]]:
"""FOUND-007: Upsert über `code` - existiert der Code, wird aktualisiert,
"""FOUND-014: Upsert über `code` - existiert der Code, wird aktualisiert,
sonst neu angelegt (bewusst ohne Beladungsvorlage - Excel-Rucksacklisten
haben selten eine 1:1-Vorlagen-Zuordnung, Positionen kommen ggf. separat
über den Geräte-Import oder die UI)."""
@@ -193,7 +193,7 @@ async def exportiere_geraete(db: AsyncSession) -> str:
async def importiere_geraete(
db: AsyncSession, inhalt: str, *, commit: bool
) -> tuple[int, int, list[ImportZeile]]:
"""FOUND-007: Objektposition wird bei Bedarf automatisch angelegt (Sollmenge
"""FOUND-014: Objektposition wird bei Bedarf automatisch angelegt (Sollmenge
= Anzahl importierter Geräte-Zeilen für dieselbe Objekt/Material-Kombination
- Zusatzposition ohne Vorlagenbezug, sollmenge_override ist dort Pflicht).
Duplikat-Erkennung über Seriennummer je Objektposition (Karte 14: gleiche SN