diff --git a/AGENTS.md b/AGENTS.md index 91b1d33..87bb3d8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -905,3 +905,12 @@ Do not introduce global state management unless needed. entries only after Julian or Christian decide). - After deploy: record `docs/releases/-.md` (`make release-report`) and tag `release-` on the deployed commit. + +## Letztes Release + +- 2026-10-30, Tag `release-2026-10-30` auf `d5b2285`, lokaler Compose-Stack des + Entwicklungsrechners (nicht cj-ki). Urteil: Go mit Auflagen (von Julian + freigegeben trotz rotem Zeittest). Offene Auflagen: Zeitbudget von + `revit-xlsx-scale` klären, generische Fehlertexte bei 400, Autologin-Instanz + nur ohne echte Projektdaten. Protokoll: + `docs/releases/2026-10-30-d5b2285.md`. diff --git a/docs/releases/2026-10-30-d5b2285.md b/docs/releases/2026-10-30-d5b2285.md new file mode 100644 index 0000000..dd7bd63 --- /dev/null +++ b/docs/releases/2026-10-30-d5b2285.md @@ -0,0 +1,54 @@ +# Release 2026-10-30 – d5b2285 + +- **Tag:** `release-2026-10-30` auf `d5b2285` +- **Ziel:** lokaler Compose-Stack (`compose.yaml`) auf dem Entwicklungsrechner + von Julian (`AUTH_DEV_AUTOLOGIN` aktiv, Web auf `0.0.0.0:3001`). Nicht die + Produktivinstanz cj-ki. +- **Delta:** erstes Release mit Gate, kein vorheriger `release-*`-Tag. Inhalt + dieses Stands: Revit-Zuordnungsdialog mit Steckdosen-Höchstwert (R11–R14, + `85cbdbf`..`fd7dcbb`), schlankeres Laufzeit-Image (`be8761a`, `d5b2285`). +- **Urteil:** Go mit Auflagen (nach Regel No-Go wegen rotem Test; Deploy von + Julian am 2026-10-30 ausdrücklich freigegeben). +- **Datenbank:** vor dem Start gesichert, + `data/backups/leistungsbilanz-2026-10-30T22-18-26-932Z.db` (Integrität ok, + 0 FK-Verletzungen). Migration `0018` (`projects.max_sockets_per_circuit`) + lief beim API-Start. + +## Prüfungen + +| Prüfung | Ergebnis | Commit | Hinweise | +|---|---|---|---| +| secrets (gitleaks) | grün | d5b2285 | keine Funde | +| lint | grün | d5b2285 | 0 Fehler, nur bekannte Warnungen | +| test | rot | d5b2285 | 660/664; einziger Fehler `revit-xlsx-scale` Zeitbudget 15 s (gemessen 15,1–15,6 s, dreimal); auf fd7dcbb mit gleichem App-Code grün | +| sast (Semgrep) | grün | d5b2285 | keine Funde | +| audit (npm) | grün | d5b2285 | 6 moderate (drizzle-kit/esbuild, exceljs/uuid), kein High/Critical | +| mutation | grün | d5b2285 | 11/11 erkannt | +| container | grün | d5b2285 | Trivy-Image, Trivy-Config, hadolint; vorher 6 HIGH im mitgelieferten npm, behoben durch `be8761a` | +| security-review | grün | fd7dcbb | frischer Kontext, keine K/H; 2 niedrige behoben (`fd7dcbb`), 1 niedrig offen | +| zap | nicht ausgeführt | – | Instanz mit Autologin ist kein aussagekräftiges Ziel | +| fuzz | nicht ausgeführt | – | keine OpenAPI-Beschreibung | + +## K-Punkte (ASVS-light) + +| Punkt | Bewertung | Beleg | +|---|---|---| +| A1 Login-Pflicht | belegt | `baseline.test.ts` „jede Route verlangt Login“; Mutationen „Login-Pflicht entfernt“, „ungeschützte Route vor dem Auth-Guard“; neue Route in `tests/external-object-assignment-plan-route.test.ts` | +| A2 Identität | belegt | Baseline „gefälschte Identität wird abgelehnt“ | +| A3 Port nicht am Proxy vorbei | offen für diesen Rechner | Entwicklungsinstanz ohne Proxy, Web auf `0.0.0.0:3001` mit Autologin (THREATMODEL D2/R15: nur ohne echte Projektdaten). Für cj-ki belegt (R6) | +| B1/B2 Objektzugriff | nicht anwendbar | THREATMODEL D1 (Julian, 2026-10-17), `idorGap`; fremde IDs eines anderen Projekts abgewehrt, Route-Test „rejects a circuit list of another project“ | +| C1 SQL | belegt | nur Drizzle/gebundene Parameter, Semgrep grün | +| E1 Secrets | belegt | gitleaks grün | +| E2 CORS | belegt | Baseline „CORS lässt fremde Origins nicht zu“, Mutation | +| F1 High/Critical | belegt | `npm audit` ohne High, Container-Scan grün | + +## Auflagen + +1. **Zeittest `revit-xlsx-scale`:** schwankt um das 15-s-Budget. Entscheidung + offen: Budget anpassen oder als Ausnahme in `docs/RELEASE-AUSNAHMEN.md` + eintragen (Julian/Christian). +2. **Fehlertexte bei 400 (niedrig, Security-Review):** + `respondWithProjectCommandError` gibt interne englische Meldungen aus. + Ticket: fachliche Fehlerklasse, Rest generisch beantworten. +3. **Instanz mit Autologin:** auf diesem Rechner nur ohne echte Projektdaten + betreiben oder Web an `127.0.0.1` binden.