Compare commits

...
Author SHA1 Message Date
patrickandClaude Sonnet 5.5 579a68cf53 archive-kanban: Board in main uebernehmen
CI / Web (pdf-viewer) (push) Failing after 40s
CI / Web (pdf-viewer) (pull_request) Failing after 2m48s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 38s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m21s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Skipped
CI / Web (shl) (push) Failing after 8s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Failing after 30s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Failing after 33s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 34s
CI / Web (dms-browser) (pull_request) Failing after 50s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 46s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 48s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 15s
CI / Web (shl) (pull_request) Failing after 43s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 2s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Failing after 1m45s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Web (dms-browser) (push) Failing after 1m0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Failing after 1m47s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Failing after 39s
Stand von chore/ai-kanban-security-folgetickets. Die Historie dieses Branches hat keinen gemeinsamen
Vorfahren mit main, daher als Snapshot. _shared enthaelt CSS/JS der
Kanban-Ansicht (identisch in allen Board-Branches).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 23:12:17 +01:00
patrick 998aaf964c Merge pull request 'connect: DATEV-Export in connect-app registrieren' (#429) from feat/connect-datev-registrieren into main
CI / Core-Modul (Build/Vet/Test) (push) Successful in 38s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web (pdf-viewer) (push) Failing after 40s
CI / Web (dms-browser) (push) Failing after 54s
CI / Web (shl) (push) Failing after 8s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 43s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Failing after 29s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
2026-10-30 00:24:20 +01:00
patrickandClaude Sonnet 5.5 976878136f Merge main in feat/connect-datev-registrieren
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 19m25s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 2s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 44s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 44s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 14s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 44s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / Web (dms-browser) (pull_request) Failing after 55s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 19m26s
CI / Web (shl) (push) Failing after 9s
CI / Web (pdf-viewer) (push) Failing after 37s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 2s
CI / Web (shl) (pull_request) Failing after 8s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 46s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m20s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
CI / Web (dms-browser) (push) Failing after 1m1s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Failing after 41s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 18m53s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-30 00:24:14 +01:00
patrick dc8f6476ab Merge pull request 'connect/statusapi: Rolle aus dem Token an die Policy' (#428) from fix/statusapi-rolle into main
CI / Web (shl) (push) Failing after 9s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 50s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 50s
CI / Web (dms-browser) (push) Failing after 1m1s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 49s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
2026-10-30 00:23:50 +01:00
patrick bc95515d98 Merge pull request 'workflow, connect: bearerauth aus common' (#427) from refactor/bearerauth-common into main
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
common Versions-Tag / tag (push) Successful in 19m12s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 15s
CI / Web (dms-browser) (push) Failing after 52s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web (pdf-viewer) (push) Failing after 35s
CI / Web (shl) (push) Failing after 7s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 42s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 42s
2026-10-30 00:23:48 +01:00
patrickandClaude Sonnet 5.5 753af35888 connect: DATEV-Export in connect-app registriert, mit Rechtepruefung
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 51s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 14s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 18m46s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 18m59s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 42s
CI / Web (dms-browser) (pull_request) Failing after 58s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 15s
CI / Web (shl) (pull_request) Failing after 9s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 43s
CI / Web (pdf-viewer) (pull_request) Failing after 43s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 2s
CI / Web (pdf-viewer) (push) Failing after 36s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 18m38s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 39s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (shl) (push) Failing after 7s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 46s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m16s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 3s
/datev/exports braucht connect.datev.write (POST) bzw. connect.datev.read
(GET) mit der Rolle aus X-User-Role. Registriert nur mit
NEXARCH_CONNECT_APP_ARCHIVE_URL; die DATEV-Uebertragung bleibt aus.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-30 00:23:17 +01:00
patrickandClaude Sonnet 5.5 422e96cc20 connect/statusapi: Rolle aus X-User-Role an die Policy
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 2s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 18m56s
CI / Web (pdf-viewer) (push) Failing after 40s
CI / Web (pdf-viewer) (pull_request) Failing after 38s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 41s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 42s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 36s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Failing after 29s
CI / Web (dms-browser) (push) Failing after 57s
CI / Web (dms-browser) (pull_request) Failing after 50s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 40s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web (shl) (push) Failing after 8s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 18m52s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 5s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m17s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 18m24s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (pull_request) Failing after 9s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 2s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 14s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
Bisher fragte statusapi mit fester Rolle user. bearerauth setzt X-User-Role
aus dem Token; ohne Header bleibt es bei user.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 23:42:16 +01:00
patrickandClaude Sonnet 5.5 df9581cf45 workflow, connect: bearerauth aus common/bearerauth
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Failing after 29s
CI / Web (dms-browser) (push) Failing after 52s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 18m45s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 38s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 39s
CI / Web (dms-browser) (pull_request) Failing after 55s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 38s
CI / Web (shl) (push) Failing after 8s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 18m28s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 4s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m13s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 2s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 18m16s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 2s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
common Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 19m7s
Workflow-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 18m10s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 12s
CI / Web (pdf-viewer) (pull_request) Failing after 39s
CI / Web (shl) (pull_request) Failing after 7s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 14s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m1s
CI / Web (pdf-viewer) (push) Failing after 37s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 2s
Die beiden gleichen Kopien entfallen; common v0.2.2. Das Testpflicht-Muster
fuer bearerauth wandert vom workflow-Gate in das common-Gate.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 23:41:06 +01:00
patrick 1da0985ee9 Merge pull request 'docs: Arbeitskarten Portal-Betrieb 131' (#425) from docs/arbeitskarten-131 into main
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Failing after 29s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 13s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 39s
CI / Web (dms-browser) (push) Failing after 51s
CI / Web (pdf-viewer) (push) Failing after 39s
CI / Web (shl) (push) Failing after 7s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
2026-10-29 15:48:44 +01:00
patrick 550b8fad37 Merge pull request 'common: bearerauth aus workflow und connect' (#426) from feat/common-bearerauth into main
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
common Versions-Tag / tag (push) Successful in 17m49s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m1s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 25s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web (pdf-viewer) (push) Failing after 49s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web (dms-browser) (push) Failing after 1m25s
CI / Web (shl) (push) Failing after 7s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 49s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
2026-10-29 15:48:42 +01:00
patrickandClaude Sonnet 5.5 fb191e6a7e common: bearerauth aus workflow und connect
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
common Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
Beide Module halten dieselbe Middleware (nur der Kommentar unterscheidet
sich). Hier liegt die gemeinsame Fassung; workflow und connect stellen
nach dem Tag in einem Folge-PR um.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 15:41:41 +01:00
patrickandClaude Sonnet 5.5 8db62327dc docs: Arbeitskarten D-02, D-03 aktualisiert, D-08 und D-09 ergaenzt
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 15:37:03 +01:00
patrick 52a6a4bfd7 Merge pull request 'deploy: Skript zum Einrichten des Portals auf 131' (#424) from feat/skript-131-portal into main
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 19s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m5s
CI / Web (dms-browser) (push) Failing after 1m27s
CI / Web (shl) (push) Failing after 12s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web (pdf-viewer) (push) Failing after 1m5s
2026-10-29 11:17:23 +01:00
patrickandClaude Sonnet 5.5 d7172a1699 deploy: npm ci bei abweichender Lockdatei, shl nutzt node_modules der App
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
Account auf 131 hat Next 14.2.35, die Quelle braucht 16.3.5 (--webpack
unbekannt). Abhaengigkeiten werden jetzt per Lockdatei-Hash erneuert,
shl/node_modules wird auf die der App verlinkt (eine React-Instanz).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 10:58:13 +01:00
patrickandClaude Sonnet 5.5 154f3fc505 deploy: shl bekommt node_modules-Link, sonst findet der Portal-Build react nicht
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
Auf 131 hat /opt/nexarch-web/portal/web/shl kein node_modules; der rsync
laesst node_modules aus. Typpruefung scheiterte mit TS2307 'react'.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 10:55:30 +01:00
patrickandClaude Sonnet 5.5 638150450d deploy: Skript zum Einrichten des Portals auf 131
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Env-Datei, Unit, nginx-Block 8450, nft-Regel, Audience portal, CORS am Core
und Neubau von Portal und Login in einem idempotenten Lauf mit Sicherungen.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 00:00:29 +01:00
patrick 21e2e34940 Merge pull request 'portal: Betriebszustand an den Modul-Kacheln' (#423) from feat/portal-kachel-status into main
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web (shl) (push) Failing after 11s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 21s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web (dms-browser) (push) Failing after 1m29s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 1m4s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m11s
2026-10-28 23:57:41 +01:00
patrickandClaude Sonnet 5.5 63dc5c5a6f portal: Betriebszustand an den Modul-Kacheln
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Die Kachel zeigt Punkt und Text, wenn die Statusseite ein Pruefziel kennt,
dessen Name dem Modul-Schluessel oder der Bezeichnung entspricht. Ohne
Berechtigung (403) oder ohne Statusquelle bleibt die Kachel unveraendert.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 23:56:02 +01:00
patrick 44c0919724 Merge pull request 'account: nach der Anmeldung direkt ins Portal' (#422) from feat/login-zum-portal into main
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 18s
CI / Web (pdf-viewer) (push) Failing after 1m3s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web (shl) (push) Failing after 14s
CI / Web (dms-browser) (push) Failing after 1m23s
2026-10-28 23:49:57 +01:00
patrickandClaude Sonnet 5.5 e5e5a5a4ed account: nach der Anmeldung direkt ins Portal, gueltige Sitzung ueberspringt das Formular
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
NEXT_PUBLIC_PORTAL_URL ist das Ziel (ohne Wert wie bisher /profile). Das
Profil bekommt einen Link zum Portal.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 23:47:00 +01:00
patrick 303c5cfcae Merge pull request 'docs: Arbeitskarten D-05 und D-07' (#421) from docs/arbeitskarten-d07 into main
CI / Web (dms-browser) (push) Failing after 1m26s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m10s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 6s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 24s
CI / Web (pdf-viewer) (push) Failing after 1m1s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 6s
CI / Web (shl) (push) Failing after 13s
2026-10-28 23:31:55 +01:00
patrickandClaude Sonnet 5.5 81ecfe8d86 docs: Arbeitskarten D-05 aktualisiert, D-07 (Issue 369) neu
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 23:30:54 +01:00
patrick 9bb138166d Merge pull request 'connect: Bearer-Pruefung in connect-app und Frontends' (#419) from feat/connect-bearer into main
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m6s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m12s
CI / Web (dms-browser) (push) Failing after 1m26s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 6s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 20s
CI / Web (pdf-viewer) (push) Failing after 1m1s
CI / Web (shl) (push) Failing after 15s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
2026-10-28 23:30:24 +01:00
patrickandClaude Sonnet 5.5 1de1da433f Merge main in feat/connect-bearer
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 26m10s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m0s
CI / Web (shl) (push) Failing after 17s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 26m46s
CI / Web (pdf-viewer) (pull_request) Failing after 1m6s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
CI / Web (shl) (pull_request) Failing after 11s
CI / Web (pdf-viewer) (push) Failing after 1m13s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 1m3s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m51s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 18s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 28s
CI / Web (dms-browser) (push) Failing after 1m27s
CI / Web (dms-browser) (pull_request) Failing after 1m38s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 25m41s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 51s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 23:30:01 +01:00
patrick 1b095507f3 Merge pull request 'RBAC #369: Rolle aus dem Token, Policy-Pruefung fail-closed' (#420) from fix/rbac-role-failclosed into main
CI / Web (pdf-viewer) (push) Failing after 1m3s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m7s
CI / Web (shl) (push) Failing after 12s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 24s
CI / Web (dms-browser) (push) Failing after 1m26s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 55s
2026-10-28 23:29:22 +01:00
patrick a2832c5b53 Merge pull request 'SEC: RBAC-Pruefung in ai-search, workflow-tasks, connect-setup (#369)' (#418) from fix/issue-369-rbac into main
CI / Web (shl) (push) Failing after 16s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m6s
CI / Web (pdf-viewer) (push) Failing after 1m0s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m17s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web (dms-browser) (push) Failing after 1m27s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 20s
2026-10-28 23:29:04 +01:00
patrick 87bed4d213 Merge pull request 'shl: gemeinsamer Bearer-Helfer fuer Frontends' (#417) from refactor/shl-bearer into main
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Web (pdf-viewer) (push) Failing after 1m4s
CI / Web (shl) (push) Failing after 13s
CI / Web (dms-browser) (push) Failing after 1m22s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 26s
2026-10-28 23:29:02 +01:00
patrickandClaude Sonnet 5.5 bfbb375649 connect bearerauth: X-User-Role nur aus dem Token
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m16s
CI / Web (pdf-viewer) (push) Failing after 1m3s
CI / Web (pdf-viewer) (pull_request) Failing after 59s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m51s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 25m50s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 21s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 22s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 1m4s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 24m33s
CI / Web (dms-browser) (pull_request) Failing after 1m39s
CI / Web (shl) (push) Failing after 11s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 1m27s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
CI / Web (shl) (pull_request) Failing after 12s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 52s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 24m39s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m1s
Gleiche Aenderung wie workflow/internal/bearerauth, damit die Rechtepruefung
aus #418 die echte Rolle bekommt.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 23:09:17 +01:00
patrickandClaude Sonnet 5.5 698f0490f2 RBAC #369: Rolle aus dem Token durchreichen, Policy-Pruefung fail-closed
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 5s
CI / Web (shl) (pull_request) Failing after 13s
Workflow-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 24m45s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m52s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 21s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 25s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 1m2s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m2s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 24m26s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web (pdf-viewer) (push) Failing after 1m2s
CI / Web (shl) (push) Failing after 16s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m6s
CI / Web (pdf-viewer) (pull_request) Failing after 55s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 24m43s
AI-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 24m42s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 1m23s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 1m0s
CI / Web (dms-browser) (pull_request) Failing after 1m32s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 25m10s
workflow bearerauth setzt X-User-Role nur aus den Claims (Client-Header werden
entfernt); taskapi und connectorsetupapi fragen mit dieser Rolle, Default user.
Migration 0029: connect.setup.write nur fuer tenant_admin.
ai-app, workflow-app, connect-app starten ohne POLICY_URL nicht mehr, ausser
mit NEXARCH_<MODUL>_APP_POLICY_DISABLED=1.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 23:08:57 +01:00
patrickandClaude Sonnet 5.5 3f83038203 connect: Bearer-Pruefung in connect-app, Frontends connect-*, datev-export, dms2-import per Sitzung
CI / Web (shl) (push) Failing after 8s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 40s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 22m20s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m54s
CI / Web (dms-browser) (pull_request) Failing after 55s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 2s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 16s
CI / Web (pdf-viewer) (pull_request) Failing after 38s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 2s
CI / Web (dms-browser) (push) Failing after 49s
CI / Web (pdf-viewer) (push) Failing after 37s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web (shl) (pull_request) Failing after 8s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 42s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 41s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 1m3s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 23m56s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 23m46s
connect/internal/bearerauth (wie workflow): verifiziertes Core-Token setzt
X-User-Id/X-Tenant-Slug, ohne Token nur mit NEXARCH_CONNECT_APP_ALLOW_HEADER_AUTH=1.
Mit JWKS ist NEXARCH_CONNECT_APP_TENANT_SLUG Pflicht (Mandant der Datenbank).
common auf v0.2.1 (moduleauth). Frontends nutzen createBearerClient("connect").

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 22:44:50 +01:00
patrickandClaude Sonnet 5.5 0a4c0aaf92 SEC: RBAC-Pruefung in ai-search, workflow-tasks, connect-setup (#369)
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 37s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 13s
AI-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 15m54s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 38s
Workflow-Pflichttest-Gate / pflichttest-gate (pull_request) Failing after 22m6s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 15m49s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 38s
CI / Web (pdf-viewer) (pull_request) Failing after 38s
CI / Web (shl) (pull_request) Failing after 8s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 16m2s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 37s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 2s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 16m18s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 56s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 2s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 53s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Failing after 53s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
CI / Web (shl) (push) Failing after 8s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m13s
- semanticsearchapi: ai.search.read per policyclient (WithPolicy), Tenant aus
  dem Anfragekoerper, nach Service-Token-Pruefung
- taskapi: workflow.task.read (GET /tasks) und workflow.task.write (PATCH
  status); Paket jetzt in cmd/workflow-app verdrahtet (lag bisher nur im
  a11y-Fixture) und damit hinter bearerauth
- connectorsetupapi: connect.setup.read/write je Route
- Migration 0029 (up/down): neue Rechte fuer user und tenant_admin
- Wiring: NEXARCH_{AI,WORKFLOW,CONNECT}_APP_POLICY_URL/_POLICY_SERVICE_TOKEN;
  ohne URL Warnung und keine Pruefung (Uebergang), URL ohne Token Startfehler;
  connect-app setzt die bestehende statusapi-Pruefung damit ebenfalls scharf
- Tests je API: 403 bei Ablehnung, 200 bei Freigabe, 503 bei Ausfall, Policy
  wird ohne Identitaet/Service-Token nicht befragt
- MODULE_REGISTRY: ai_search_chat, workflow_tasks, connect_setup (+ Icons,
  Portal-Rechteliste)
- Doku: BETRIEB-PORTAL.md, ENG-11 Umgebungsvariablen

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 22:36:43 +01:00
patrickandClaude Sonnet 5.5 e2d941287f shl: createBearerClient und bearerHeader statt vier kopierter http/forward-Dateien
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / Web (shl) (push) Failing after 8s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 36s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 13s
CI / Web (dms-browser) (pull_request) Failing after 47s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 15m45s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 40s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 12s
CI / Web (shl) (pull_request) Failing after 9s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 3s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 51s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 15m39s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 53s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m16s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 2s
CI / Web (pdf-viewer) (push) Failing after 40s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Failing after 40s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 15m22s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
workflow-approvals, workflow-tasks, workflow-cases und routing-rules hatten
identische lib/http.ts und lib/forward.ts; mail-search eine fuenfte Variante.
Verhalten unveraendert.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 22:22:37 +01:00
patrick ddda4b93a7 Merge pull request 'mail-search: Akte-Kontext per Bearer' (#416) from feat/mailsearch-bearer into main
CI / Web (dms-browser) (push) Failing after 48s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 38s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 2s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 39s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 13s
CI / Web (shl) (push) Failing after 8s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 2s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 5s
2026-10-28 22:16:00 +01:00
patrick 237403e27d Merge pull request 'workflow: Pflichttest-Gate fuer bearerauth' (#415) from feat/workflow-gate-bearerauth into main
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 51s
CI / Web (dms-browser) (push) Failing after 54s
CI / Web (shl) (push) Failing after 8s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 4s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 38s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 2s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
CI / Web (pdf-viewer) (push) Failing after 39s
2026-10-28 22:15:58 +01:00
patrickandClaude Sonnet 5.5 db11334b21 mail-search: Akte-Kontext per Bearer (Audience workflow)
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 36s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 3s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m20s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 2s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
CI / Web (dms-browser) (push) Failing after 59s
CI / Web (pdf-viewer) (pull_request) Failing after 35s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 16m5s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 14m57s
CI / Web (pdf-viewer) (push) Failing after 42s
CI / Web (shl) (pull_request) Failing after 7s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 16m44s
CI / Web (shl) (push) Failing after 8s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 39s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 12s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 48s
CI / Web (dms-browser) (pull_request) Failing after 49s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
Die BFF-Route reicht mit Bearer nur das Token weiter; user/tenant aus der
URL gelten nur noch ohne Token. Der Client sendet das Token ueber eine
zweite Sitzung (module workflow), sobald NEXT_PUBLIC_CORE_API_BASE gesetzt ist.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 22:07:18 +01:00
patrickandClaude Sonnet 5.5 9bfe2e891b workflow: Pflichttest-Gate deckt internal/bearerauth ab
CI / Web (shl) (pull_request) Failing after 8s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 50s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 51s
CI / Web (pdf-viewer) (push) Failing after 38s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 14m55s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 13s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 12s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Failing after 28s
Workflow-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 14m49s
CI / Web (pdf-viewer) (pull_request) Failing after 39s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 14m44s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 14m59s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (push) Failing after 7s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 36s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m12s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 39s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
CI / Web (dms-browser) (pull_request) Failing after 55s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 27s
Aenderungen an bearerauth (Durchsetzungspunkt fuer Bearer-Token der Frontends)
brauchen jetzt eine begleitende _test.go im selben Package.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 17:33:10 +01:00
patrick 57b3e2125e Merge pull request 'docs: Workflow-Demo und Bearer-Betrieb auf 204' (#414) from docs/betrieb-demo-bearer into main
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 39s
CI / Web (dms-browser) (push) Failing after 54s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 2s
CI / Web (shl) (push) Failing after 7s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 13s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 4s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 36s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 2s
2026-10-28 17:32:27 +01:00
patrickandClaude Sonnet 5.5 dbf0877789 docs: Workflow-Demo und Bearer-Betrieb auf 204
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 40s
CI / Web (pdf-viewer) (push) Failing after 40s
CI / Web (pdf-viewer) (pull_request) Failing after 37s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 2s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 12s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 14m20s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 5s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 37s
CI / Web (dms-browser) (push) Failing after 49s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 46s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 2s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m8s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 14m28s
CI / Web (shl) (push) Failing after 9s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 14m20s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 13s
CI / Web (dms-browser) (pull_request) Failing after 49s
CI / Web (shl) (pull_request) Failing after 8s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 16:12:40 +01:00
patrick 701fb4e2c4 Merge pull request 'web: Modul-Tokens mit explizitem Zielmodul (NEXT_PUBLIC_TOKEN_MODULE)' (#413) from feat/frontends-token-module into main
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
CI / Web (pdf-viewer) (push) Failing after 36s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 40s
CI / Web (dms-browser) (push) Failing after 52s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web (shl) (push) Failing after 7s
2026-10-28 16:05:23 +01:00
patrickandClaude Sonnet 5.5 c5474111f9 web: Modul-Tokens mit explizitem Zielmodul anfordern (NEXT_PUBLIC_TOKEN_MODULE, Standard dms)
CI / Web (dms-browser) (push) Failing after 52s
CI / Web (pdf-viewer) (push) Failing after 35s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 40s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web (shl) (pull_request) Failing after 8s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 3s
CI / Web (pdf-viewer) (pull_request) Failing after 40s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 12s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 2s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 14m22s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 14m26s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (push) Failing after 8s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 14m2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 37s
CI / Web (dms-browser) (pull_request) Failing after 48s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 13s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 49s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m15s
Vorbereitung auf mehrere NEXARCH_ACCOUNT_MODULE_AUDIENCES: der Core lehnt
Token-Anfragen ohne ?module ab, sobald mehr als eine Audience konfiguriert ist.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 15:59:16 +01:00
patrick 21838e87d0 Merge pull request 'Frontends auf Bearer: Portal-BFF, workflow-approvals, workflow-tasks' (#412) from feat/frontends-bearer into main
CI / Web (dms-browser) (push) Failing after 49s
CI / Web (pdf-viewer) (push) Failing after 38s
CI / Web (shl) (push) Failing after 9s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 36s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 12s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 2s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
2026-10-28 15:05:38 +01:00
patrickandClaude Sonnet 5.5 77b46945f2 workflow-cases, routing-rules: Sitzung und Bearer statt X-User-Id aus der URL
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 13m50s
CI / Web (dms-browser) (push) Failing after 54s
CI / Web (shl) (push) Failing after 8s
CI / Web (pdf-viewer) (push) Failing after 37s
CI / Web (dms-browser) (pull_request) Failing after 47s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 2s
CI / Web (pdf-viewer) (pull_request) Failing after 36s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 47s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 13m33s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 2s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 13m40s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 12s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 36s
CI / Web (shl) (pull_request) Failing after 7s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 40s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m19s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 15:05:34 +01:00
patrickandClaude Sonnet 5.5 0032aa7d81 workflow-approvals, workflow-tasks: Sitzung und Bearer statt X-User-Id aus der URL
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Failing after 56s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 13m30s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 46s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 13s
CI / Web (pdf-viewer) (pull_request) Failing after 47s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 12s
CI / Web (pdf-viewer) (push) Failing after 35s
CI / Web (shl) (pull_request) Failing after 8s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 13m41s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m15s
CI / Web (shl) (push) Failing after 7s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 37s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 39s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 2s
CI / Web (dms-browser) (push) Failing after 49s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 13m36s
Mit NEXT_PUBLIC_CORE_API_BASE holen die Frontends ein workflow-Token ueber die
Sitzung und senden Authorization; die BFF-Routen reichen es weiter und ignorieren
userId/tenant aus der URL. Ohne die Variable bleibt der Uebergangsweg.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 15:02:14 +01:00
patrickandClaude Sonnet 5.5 07b4ccbda5 portal: Workflow-Aufruf per Bearer (X-Workflow-Token), X-User-Id nur noch als Uebergang
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 14:59:43 +01:00
patrick 92dd8d33ca Merge pull request 'docs/deploy: Portal-Betrieb 131/204 aufnehmen' (#411) from docs/betrieb-portal into main
CI / Web (pdf-viewer) (push) Failing after 37s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Web (shl) (push) Failing after 8s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 40s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / Web (dms-browser) (push) Failing after 52s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 13s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
2026-10-28 14:55:50 +01:00
patrickandClaude Sonnet 5.5 6da280f91d docs/deploy: Portal-Betrieb 131/204, Unit-Vorlage, nginx-Proxy fuer 204
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web (pdf-viewer) (push) Failing after 38s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 13m6s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 13m12s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 41s
CI / Web (dms-browser) (push) Failing after 53s
CI / Web (shl) (push) Failing after 8s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 13m24s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 42s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 12s
CI / Web (shl) (pull_request) Failing after 8s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 45s
CI / Web (pdf-viewer) (pull_request) Failing after 35s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
CI / Web (dms-browser) (pull_request) Failing after 49s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m12s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 14:53:31 +01:00
patrick a16d8cef66 Merge pull request 'account-api: DB-Start mit Backoff, Fehlerklassifizierung, Restart-Limits' (#410) from fix/account-api-start into main
CI / Web (shl) (push) Failing after 8s
CI / Web (dms-browser) (push) Failing after 57s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 13s
CI / Web (pdf-viewer) (push) Failing after 35s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 2s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 30s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 40s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
2026-10-28 14:52:59 +01:00
patrick 6d3a4f8e56 Merge pull request 'Portal: moderne Oberflaeche - Kacheln mit Icons, Favoriten, Befehlsleiste, Zustaende' (#409) from feat/portal-ui-1 into main
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Web (pdf-viewer) (push) Failing after 38s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 38s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web (dms-browser) (push) Failing after 51s
CI / Web (shl) (push) Failing after 8s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
2026-10-28 14:52:56 +01:00
patrickandClaude Sonnet 5.5 e428de553d account-api: DB-Start mit Backoff und Fehlerklassifizierung, systemd-Restart-Limits
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 3s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web (shl) (push) Failing after 7s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 13s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m21s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 13m17s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m15s
CI / Web (pdf-viewer) (push) Failing after 38s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 53s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 37s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 13m17s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Failing after 39s
CI / Web (shl) (pull_request) Failing after 7s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 2s
CI / Web (dms-browser) (push) Failing after 53s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 14s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 39s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Failing after 49s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 12m42s
Dauerhafte Fehler (28P01, 28000, 3D000) beenden mit Exit 2 und klarer Meldung,
transiente Fehler werden bis NEXARCH_ACCOUNT_DB_STARTUP_TIMEOUT_SECONDS wiederholt.
Unit-Template: RestartSec, StartLimit, RestartPreventExitStatus=2.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 14:22:40 +01:00
patrickandClaude Sonnet 5.5 142d213178 portal: Befehlsleiste (Strg+K) mit Modulsprung und Dokumentsuche, Texte DE/EN, README
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Failing after 1m2s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 20m57s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 15m11s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 20s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m37s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
CI / Web (shl) (pull_request) Failing after 11s
CI / Web (dms-browser) (pull_request) Failing after 1m31s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 25s
CI / Web (pdf-viewer) (push) Failing after 1m19s
CI / Web (shl) (push) Failing after 14s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 4s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 14m31s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 2m3s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 6s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 1m1s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m28s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 12m53s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 12:32:12 +01:00
patrickandClaude Sonnet 5.5 2d582c5b08 portal: Favoriten, Zuletzt benutzt, einklappbare Gruppen, Reihenfolge nach Modulzahl
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 12:29:23 +01:00
patrickandClaude Sonnet 5.5 50b55a2c81 portal: visuelle Basis (Kacheln, Icons, Skeleton, Fehlerkarte), Tokens und Skip-Link-CSS in shl
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 12:26:57 +01:00
patrick e5b37b6278 Merge pull request 'workflow: Bearer-Token statt freier X-User-Id (B-06)' (#408) from feat/workflow-bearer into main
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 20s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 1m23s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 56s
CI / Web (pdf-viewer) (push) Failing after 1m7s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 58s
CI / Web (shl) (push) Failing after 11s
2026-10-28 12:16:35 +01:00
patrick ae9dca26b0 Merge pull request 'mail: moduleauth aus common v0.2.1' (#407) from refactor/mail-moduleauth into main
CI / Web (dms-browser) (push) Failing after 1m21s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 57s
CI / Web (shl) (push) Failing after 12s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
Mail-Schnittstellen-Vertragstests / contract-tests (push) Successful in 17m40s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 22s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 48s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m0s
2026-10-28 12:16:29 +01:00
patrickandClaude Sonnet 5.5 0d07b79b04 workflow: Bearer-Token-Pruefung vor den APIs (Uebergangsschalter fuer X-User-Id)
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 17m44s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Web (pdf-viewer) (push) Failing after 1m6s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Failing after 33s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 16m39s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m19s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 20s
CI / Web (pdf-viewer) (pull_request) Failing after 56s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 21s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 5s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 1m6s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 5s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 17m11s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 59s
CI / Web (dms-browser) (pull_request) Failing after 1m27s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 1m2s
CI / Web (dms-browser) (push) Failing after 1m25s
CI / Web (shl) (push) Failing after 11s
CI / Web (shl) (pull_request) Failing after 14s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m45s
Workflow-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 17m29s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:38:57 +01:00
patrickandClaude Sonnet 5.5 8b9d0f8316 mail: moduleauth aus common v0.2.1
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Core-Modul (Build/Vet/Test) (pull_request) Successful in 1m0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m43s
CI / Web (dms-browser) (push) Failing after 1m20s
CI / Web (dms-browser) (pull_request) Failing after 1m14s
CI / Web (pdf-viewer) (pull_request) Failing after 57s
Mail-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 16m43s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 17m22s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 25s
CI / Web (shl) (pull_request) Failing after 12s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 2s
CI / Web (pdf-viewer) (push) Failing after 59s
Mail-Schnittstellen-Vertragstests / contract-tests (push) Successful in 17m7s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 22s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 56s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 56s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
Mail-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 16m53s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (push) Failing after 11s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 6s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m1s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 5m49s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 17m20s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:37:35 +01:00
patrick a9e2cfc29a Merge pull request 'workflow: migrate aus common v0.2.0' (#406) from refactor/workflow-migrate into main
CI / Web (dms-browser) (push) Failing after 1m21s
CI / Web (pdf-viewer) (push) Failing after 56s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 1s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 23s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m5s
CI / Web (shl) (push) Failing after 12s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 53s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
2026-10-28 11:34:05 +01:00
patrick c830edcede Merge pull request 'ai: migrate aus common v0.2.0' (#405) from refactor/ai-migrate into main
CI / Web (shl) (push) Failing after 11s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 58s
CI / Web (pdf-viewer) (push) Failing after 57s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 23s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m4s
CI / Web (dms-browser) (push) Failing after 1m23s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
2026-10-28 11:33:58 +01:00
patrick b0ec72b119 Merge pull request 'connect: migrate aus common v0.2.0' (#404) from refactor/connect-migrate into main
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m2s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 25s
CI / Web (pdf-viewer) (push) Failing after 1m0s
CI / Web (dms-browser) (push) Failing after 1m23s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 54s
CI / Web (shl) (push) Failing after 12s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
2026-10-28 11:33:51 +01:00
patrick bf01806aa0 Merge pull request 'dms: migrate aus common v0.2.0' (#403) from refactor/dms-migrate into main
CI / Core-Modul (Build/Vet/Test) (push) Successful in 59s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web (shl) (push) Failing after 10s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 57s
CI / Web (pdf-viewer) (push) Failing after 59s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 22s
CI / Web (dms-browser) (push) Failing after 1m22s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
2026-10-28 11:33:45 +01:00
patrick e1fdc9e833 Merge pull request 'workflow: testdb aus common' (#393) from refactor/workflow-testdb into main
Workflow-Schnittstellen-Vertragstests / contract-tests (push) Successful in 16m10s
CI / Web (dms-browser) (push) Failing after 1m25s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 20s
CI / Web (pdf-viewer) (push) Failing after 55s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m0s
CI / Web (shl) (push) Failing after 14s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m1s
2026-10-28 11:33:37 +01:00
patrick 3f3715ee08 Merge pull request 'connect: testdb aus common' (#392) from refactor/connect-testdb into main
CI / Core-Modul (Build/Vet/Test) (push) Failing after 57s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
Connect-Schnittstellen-Vertragstests / contract-tests (push) Successful in 16m0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 6m17s
CI / Web (pdf-viewer) (push) Failing after 59s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 20s
CI / Web (dms-browser) (push) Failing after 1m16s
CI / Web (shl) (push) Failing after 13s
2026-10-28 11:33:31 +01:00
patrick 28381ef9b0 Merge pull request 'ai: testdb aus common' (#391) from refactor/ai-testdb into main
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 21s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m0s
CI / Web (shl) (push) Failing after 13s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 50s
AI-Schnittstellen-Vertragstests / contract-tests (push) Successful in 15m34s
CI / Web (pdf-viewer) (push) Failing after 1m3s
CI / Web (dms-browser) (push) Failing after 1m24s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
2026-10-28 11:33:25 +01:00
patrick 4b6d2df36b Merge pull request 'dms: testdb aus common' (#390) from refactor/dms-testdb into main
CI / Web (dms-browser) (push) Failing after 1m20s
CI / Web (pdf-viewer) (push) Failing after 54s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m29s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Web (shl) (push) Failing after 9s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 17s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 59s
2026-10-28 11:33:17 +01:00
patrick c22ad6e8ca Merge pull request 'CI: Wegwerf-Postgres je Lauf fuer DB-Tests (A-08) und CODEOWNERS fuer common/ (A-09)' (#398) from feat/ci-db-cluster into main
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web (pdf-viewer) (push) Failing after 1m0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 17s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web (dms-browser) (push) Failing after 1m22s
CI / Web (shl) (push) Failing after 14s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 58s
2026-10-28 11:32:56 +01:00
patrick ff79bf7514 Merge pull request 'portal: Zielmodul portal beim Token-Abruf (B-05)' (#397) from feat/portal-token-modul into main
CI / Web (pdf-viewer) (push) Failing after 57s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 6s
CI / Web (dms-browser) (push) Failing after 1m23s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 59s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (push) Failing after 13s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 18s
2026-10-28 11:32:50 +01:00
patrick 75ef51e412 Merge pull request 'docs: Arbeitskarten Stand 2026-10-28' (#395) from docs/arbeitskarten-stand into main
CI / Web (pdf-viewer) (push) Failing after 55s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 18s
CI / Web (dms-browser) (push) Failing after 1m28s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 57s
CI / Web (shl) (push) Failing after 14s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
2026-10-28 11:32:45 +01:00
patrick d2d420c71e Merge pull request 'docs: Vorbildsysteme (Mail + DMS) in PRODUKTARCHITEKTUR, DEVLOGs' (#380) from docs/vorbildsysteme-devlogs into main
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 21s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Web (shl) (push) Failing after 12s
CI / Web (dms-browser) (push) Failing after 1m23s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web (pdf-viewer) (push) Failing after 54s
2026-10-28 11:32:40 +01:00
patrick 2d12a6ab98 Merge pull request 'fix(workflow): contracttest an moduleadapter.NewServer-Signatur angepasst' (#374) from fix/workflow-contracttest-verifier into main
CI / Web (dms-browser) (push) Failing after 1m21s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m4s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 6s
CI / Web (pdf-viewer) (push) Failing after 57s
CI / Web (shl) (push) Failing after 11s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 25s
Workflow-Schnittstellen-Vertragstests / contract-tests (push) Successful in 15m5s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m26s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
2026-10-28 11:32:34 +01:00
patrick e0c0f7c537 Merge pull request 'refactor: Prüfgate-Pakete nach Funktion benannt, migration* gruppiert' (#373) from refactor/struktur-pakete into main
CI / Web (shl) (push) Failing after 14s
CI / Web (dms-browser) (push) Failing after 1m34s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 59s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 21s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m11s
CI / Web (pdf-viewer) (push) Failing after 1m1s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
2026-10-28 11:32:29 +01:00
patrick f5b8e7db7c Merge pull request 'mail: Vertragstest repariert, qa05/qa09-Gates skippen ohne .git/Root-Modul' (#400) from fix/mail-vertragstest into main
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m1s
Mail-Schnittstellen-Vertragstests / contract-tests (push) Successful in 14m47s
CI / Web (dms-browser) (push) Failing after 1m29s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 57s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 20s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (push) Failing after 13s
CI / Web (pdf-viewer) (push) Failing after 57s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
2026-10-28 11:32:14 +01:00
patrick 50c32b6ef8 Merge pull request 'archtest: searchchatapi-a11y-fixture mit archtest:allow (behebt TestAllHTTPServersUseHTTPHarden)' (#399) from fix/root-archtest-reichweite into main
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 19s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Successful in 1m1s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web (dms-browser) (push) Failing after 1m28s
CI / Web (shl) (push) Failing after 13s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Web (pdf-viewer) (push) Failing after 58s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m0s
2026-10-28 11:32:09 +01:00
patrick 4d790fe925 Merge pull request 'dms/upload: MIME-Sniff gegen deklarierten Typ statt gegen Positivliste (Office/TIFF-Uploads)' (#401) from fix/dms-upload-sniff into main
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 59s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 25s
CI / Web (shl) (push) Failing after 14s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m21s
CI / Web (dms-browser) (push) Failing after 1m32s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / Web (pdf-viewer) (push) Failing after 56s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 6s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
2026-10-28 11:32:03 +01:00
patrick a458ff6f95 Merge pull request 'dms: Audit-Log-Schreiben fuer nexarch_app-Login-Rollen (Migration 0036) + Test repariert' (#402) from fix/dms-audit-sequence-grant into main
CI / Web (dms-browser) (push) Failing after 1m21s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m3s
CI / Web (shl) (push) Failing after 16s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 1m45s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 22s
2026-10-28 11:31:57 +01:00
patrickandClaude Sonnet 5.5 642510bff2 workflow: migrate aus common v0.2.0 (Tabellenname bleibt unveraendert)
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 52s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m50s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / Web (shl) (push) Failing after 13s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 20s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 14m58s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m0s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m18s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 2s
CI / Web (shl) (pull_request) Failing after 13s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 14m18s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Failing after 1m22s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 58s
CI / Web (pdf-viewer) (pull_request) Failing after 57s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 14m30s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 4s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / Web (dms-browser) (push) Failing after 1m24s
Workflow-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 15m9s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 21s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
CI / Web (pdf-viewer) (push) Failing after 1m5s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:22:55 +01:00
patrickandClaude Sonnet 5.5 88d9704469 dms: migrate aus common v0.2.0 (Tabellenname bleibt unveraendert)
CI / Web (pdf-viewer) (push) Failing after 1m8s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 59s
CI / Web (pdf-viewer) (pull_request) Failing after 1m2s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 1m29s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 2m7s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 13m25s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 20s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 13m26s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 58s
CI / Web (shl) (push) Failing after 11s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
CI / Web (shl) (pull_request) Failing after 13s
CI / Web (dms-browser) (pull_request) Failing after 1m19s
CI / Web (dms-browser) (push) Failing after 1m22s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 6s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 14m17s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 59s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 28s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:22:02 +01:00
patrickandClaude Sonnet 5.5 3c2bc971e1 ai: migrate aus common v0.2.0 (Tabellenname bleibt unveraendert)
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 20s
CI / Web (dms-browser) (pull_request) Failing after 1m26s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 13m56s
CI / Web (dms-browser) (push) Failing after 1m22s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 59s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 14m0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 57s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m4s
CI / Web (shl) (pull_request) Failing after 12s
AI-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 13m49s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 2s
CI / Web (pdf-viewer) (pull_request) Failing after 1m5s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 58s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m51s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 22s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 13m47s
CI / Web (pdf-viewer) (push) Failing after 1m0s
CI / Web (shl) (push) Failing after 14s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:21:06 +01:00
patrickandClaude Sonnet 5.5 1bdcff0f75 connect: migrate aus common v0.2.0 (Tabellenname bleibt unveraendert)
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 13m46s
CI / Web (dms-browser) (pull_request) Failing after 1m18s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 21s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Failing after 32s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 20s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 13m28s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 50s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m3s
CI / Web (pdf-viewer) (pull_request) Failing after 1m4s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web (pdf-viewer) (push) Failing after 1m2s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / Web (shl) (pull_request) Failing after 13s
CI / Web (shl) (push) Failing after 11s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m7s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 4s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m1s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 13m37s
CI / Web (dms-browser) (push) Failing after 1m23s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m53s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 5s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:20:50 +01:00
patrick bec1fb3cae Merge pull request 'Root-Modul: apierror und httpharden aus common v0.1.0' (#396) from refactor/root-common into main
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
2026-10-28 10:41:53 +01:00
patrick b2c1a67728 Merge pull request 'workflow: svcauth, tenantregistryclient aus common v0.1.0' (#389) from refactor/workflow-common into main
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
Workflow-Schnittstellen-Vertragstests / contract-tests (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
2026-10-28 10:41:45 +01:00
patrick 95582ad09d Merge pull request 'connect: auditclient, httpclient, policyclient aus common v0.1.0' (#388) from refactor/connect-common into main
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
Connect-Schnittstellen-Vertragstests / contract-tests (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
2026-10-28 10:41:39 +01:00
patrick a0f9aaef4c Merge pull request 'ai: auditclient, httpclient, loadtest, svcauth, tenantregistryclient aus common v0.1.0' (#387) from refactor/ai-common into main
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
2026-10-28 10:41:32 +01:00
patrick a443911e6a Merge pull request 'mail: httpclient, loadtest, policyclient aus common v0.1.0' (#386) from refactor/mail-common into main
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
Mail-Schnittstellen-Vertragstests / contract-tests (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
2026-10-28 10:41:26 +01:00
patrick fbb41235c0 Merge pull request 'dms: apierror, httpclient, tenantregistryclient aus common v0.1.0' (#384) from refactor/dms-common-klein into main
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
2026-10-28 10:41:19 +01:00
patrick 5b93ae8cae Merge pull request 'archive: Pilot-Umstellung auf common v0.1.0' (#383) from refactor/archive-common-pilot into main
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Archive-Schnittstellen-Vertragstests / contract-tests (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
2026-10-28 10:41:12 +01:00
patrick ad00c6258d Merge pull request 'common: moduleauth (Modul-Token-Verifier + Bearer-Middleware)' (#394) from feat/common-moduleauth into main
common Versions-Tag / tag (push) Successful in 13m39s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
2026-10-28 10:41:06 +01:00
patrick 2e9ec88b81 Merge pull request 'common v0.2.0: migrate mit Tabellenname als Parameter' (#385) from feat/common-migrate-v02 into main
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
common Versions-Tag / tag (push) Successful in 13m48s
2026-10-28 10:40:59 +01:00
patrickandClaude Sonnet 5.5 5f1d43caf1 CI-Cluster: Admin-DSN auf Datenbank postgres (Root-Tests ersetzen /postgres? im DSN)
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 10:28:26 +01:00
patrickandClaude Sonnet 5.5 0d1721f169 dms: USAGE auf audit_log_id_seq fuer nexarch_app (Migration 0036), Test mit Schema-Rechten
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 10:28:10 +01:00
patrickandClaude Sonnet 5.5 4e16d8b155 dms/upload: Sniff-Ergebnis gegen deklarierten Typ pruefen statt gegen die Positivliste
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 10:26:14 +01:00
patrickandClaude Sonnet 5.5 63d7e01948 mail: Vertragstest (Anhang-Content-Type, zwei Endpunkt-Faelle), Gate-Tests ohne .git/Root-Modul skippen
CI / Web (pdf-viewer) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Mail-Schnittstellen-Vertragstests / contract-tests (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Mail-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Mail-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 10:22:49 +01:00
patrickandClaude Sonnet 5.5 59c0b0a2d1 ai: archtest:allow fuer searchchatapi-a11y-fixture (wie die Schwester-Fixtures)
AI-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 10:21:22 +01:00
patrickandClaude Sonnet 5.5 631dd4080e CI: Wegwerf-Postgres je Lauf fuer DB-Tests, CODEOWNERS fuer common/
CI / Web (dms-browser) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 10:19:58 +01:00
patrickandClaude Sonnet 5.5 7df4cd573f portal: Zielmodul beim Token-Abruf (NEXT_PUBLIC_TOKEN_MODULE), Betriebsdoku
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 10:19:06 +01:00
patrickandClaude Sonnet 5.5 07eb74cadf Root-Modul: apierror und httpharden aus common v0.1.0
CI / Web (dms-browser) (push) Failing after 1m26s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 21s
CI / Web (pdf-viewer) (pull_request) Failing after 1m2s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (shl) (pull_request) Failing after 11s
CI / Web (shl) (push) Failing after 11s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 1m3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 19s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 5s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 13m12s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m0s
CI / Web (dms-browser) (pull_request) Failing after 1m27s
Core-Schnittstellen-Vertragstests / contract-tests (push) Successful in 12m23s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 09:37:03 +01:00
patrickandClaude Sonnet 5.5 8d68895eac docs: Arbeitskarten auf Stand 2026-10-28
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Failing after 1m26s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 12m30s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 3m9s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 59s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 22s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m55s
CI / Web (dms-browser) (push) Failing after 1m28s
CI / Web (shl) (push) Failing after 9s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 12m46s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 59s
CI / Web (shl) (pull_request) Failing after 10s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 58s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 21s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m0s
CI / Web (pdf-viewer) (pull_request) Failing after 1m0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:50:59 +01:00
patrickandClaude Sonnet 5.5 51b639625f common/moduleauth: Modul-Token-Verifier (Ed25519, JWKS) und Bearer-Middleware
CI / Web (dms-browser) (pull_request) Failing after 1m16s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m1s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
CI / Web (pdf-viewer) (pull_request) Failing after 57s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 18s
CI / Web (shl) (push) Failing after 11s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 52s
CI / Web (shl) (pull_request) Failing after 11s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 57s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 21s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Failing after 21m17s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 55s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 12m16s
CI / Web (pdf-viewer) (push) Failing after 57s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m58s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / Web (dms-browser) (push) Failing after 1m18s
common Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 11m57s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 12m19s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Failing after 31s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:40:30 +01:00
patrickandClaude Sonnet 5.5 678bd01335 workflow: testdb aus common statt interner Kopie
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web (pdf-viewer) (pull_request) Failing after 59s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m1s
CI / Web (shl) (pull_request) Failing after 13s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 24s
CI / Web (dms-browser) (push) Failing after 1m23s
CI / Web (pdf-viewer) (push) Failing after 59s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 2m6s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 3m51s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 11m41s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 11m50s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
Workflow-Schnittstellen-Vertragstests / contract-tests (pull_request) Failing after 41s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 56s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Web (shl) (push) Failing after 13s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 56s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 21s
Workflow-Schnittstellen-Vertragstests / contract-tests (push) Failing after 59s
CI / Web (dms-browser) (pull_request) Failing after 1m17s
Workflow-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 11m18s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:38:24 +01:00
patrickandClaude Sonnet 5.5 f5f0bd8673 connect: testdb aus common statt interner Kopie
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 58s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 11m40s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m10s
Connect-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 12m3s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 57s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m49s
CI / Web (dms-browser) (push) Failing after 1m23s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 24s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 1m11s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 55s
CI / Web (shl) (push) Failing after 13s
CI / Web (dms-browser) (pull_request) Failing after 1m25s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 11m49s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 22s
CI / Web (pdf-viewer) (pull_request) Failing after 54s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 3m23s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Connect-Schnittstellen-Vertragstests / contract-tests (push) Successful in 10m42s
CI / Web (shl) (pull_request) Failing after 11s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:38:01 +01:00
patrickandClaude Sonnet 5.5 0854d7b040 ai: testdb aus common statt interner Kopie
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 1m12s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / Web (pdf-viewer) (pull_request) Failing after 1m0s
CI / Web (dms-browser) (push) Failing after 1m21s
CI / Web (shl) (push) Failing after 10s
CI / Web (dms-browser) (pull_request) Failing after 1m30s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 3m9s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 19s
AI-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 11m55s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 57s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 11m59s
AI-Schnittstellen-Vertragstests / contract-tests (push) Successful in 10m0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 11m12s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 2m57s
CI / Web (shl) (pull_request) Failing after 11s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m6s
AI-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 12m17s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 21s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m48s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 52s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:37:39 +01:00
patrickandClaude Sonnet 5.5 0c6a943440 dms: testdb aus common statt interner Kopie
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 1m22s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / Web (pdf-viewer) (pull_request) Failing after 57s
CI / Web (shl) (pull_request) Failing after 12s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 21s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Web (shl) (push) Failing after 11s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m46s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 1m6s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m2s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
CI / Web (dms-browser) (pull_request) Failing after 1m22s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 3m16s
CI / Web (pdf-viewer) (push) Failing after 53s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 10m56s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 11m44s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 11m24s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 22s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:37:00 +01:00
patrickandClaude Sonnet 5.5 eaffcaf885 workflow: svcauth, tenantregistryclient aus common v0.1.0
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 7s
CI / Web (dms-browser) (pull_request) Failing after 1m24s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 8s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 9m47s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 3m26s
Workflow-Schnittstellen-Vertragstests / contract-tests (pull_request) Failing after 57s
CI / Web (shl) (pull_request) Failing after 11s
CI / Web (dms-browser) (push) Failing after 1m31s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 30s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / Web (pdf-viewer) (pull_request) Failing after 57s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 11m29s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m6s
CI / Web (pdf-viewer) (push) Failing after 1m3s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 4m11s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 10m30s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 10m25s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 23s
CI / Web (shl) (push) Failing after 14s
Workflow-Schnittstellen-Vertragstests / contract-tests (push) Failing after 41s
Workflow-Pflichttest-Gate / pflichttest-gate (pull_request) Failing after 1m13s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m57s
Das Pflichttest-Gate von workflow verweist nicht mehr auf die geloeschten
Pakete (common hat ein eigenes Gate).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:33:55 +01:00
patrickandClaude Sonnet 5.5 7958102870 connect: auditclient, httpclient, policyclient aus common v0.1.0
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
Connect-Schnittstellen-Vertragstests / contract-tests (push) Successful in 10m0s
CI / Web (shl) (pull_request) Failing after 15s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 25s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 3m28s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m4s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 1m0s
CI / Web (dms-browser) (push) Failing after 1m31s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 45s
Connect-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 11m18s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Web (shl) (push) Failing after 12s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 2m4s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 25s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 10m25s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 1m2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 10m55s
CI / Web (pdf-viewer) (pull_request) Failing after 1m4s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Web (dms-browser) (pull_request) Failing after 1m33s
auditclient und policyclient aus der Liste in check-security-test-coverage.sh
entfernt (Pakete liegen jetzt in common, dort durch das common-Gate gedeckt).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:33:13 +01:00
patrickandClaude Sonnet 5.5 ff5113f0b2 ai: auditclient, httpclient, loadtest, svcauth, tenantregistryclient aus common v0.1.0
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 24s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 50s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 2m1s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 6s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 2s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 23s
CI / Web (pdf-viewer) (push) Failing after 1m6s
CI / Web (dms-browser) (pull_request) Failing after 1m31s
CI / Web (shl) (pull_request) Failing after 11s
CI / Web (pdf-viewer) (pull_request) Failing after 1m2s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Failing after 7m19s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 10m32s
CI / Web (shl) (push) Failing after 14s
CI / Web (dms-browser) (push) Failing after 1m32s
AI-Pflichttest-Gate / pflichttest-gate (pull_request) Failing after 44s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 5s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 51s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 13m10s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m7s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m2s
Das Pflichttest-Gate von ai verweist nicht mehr auf das geloeschte
svcauth-Paket (common hat ein eigenes Gate).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:32:34 +01:00
patrickandClaude Sonnet 5.5 27681f31be mail: httpclient, loadtest, policyclient aus common v0.1.0
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 9m7s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m8s
Mail-Schnittstellen-Vertragstests / contract-tests (pull_request) Failing after 45s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 1m9s
Mail-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 9m36s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m5s
CI / Web (dms-browser) (push) Failing after 1m32s
CI / Web (pdf-viewer) (pull_request) Failing after 1m8s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
CI / Web (dms-browser) (pull_request) Failing after 1m34s
Mail-Schnittstellen-Vertragstests / contract-tests (push) Failing after 1m3s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / Web (shl) (push) Failing after 14s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 22s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 1m4s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 5s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 23s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 9m13s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 55s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 2m5s
CI / Web (shl) (pull_request) Failing after 12s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 3m9s
Der Waechtertest gegen http.DefaultClient liegt jetzt in internal/archtest.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:29:11 +01:00
patrickandClaude Sonnet 5.5 f8905e9c64 common/migrate v0.2.0: Tabellenname als Parameter (migrate.New), Tag-Workflow mit common/MINOR
CI / Web (dms-browser) (push) Failing after 1m28s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 2m46s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / Web (dms-browser) (pull_request) Failing after 1m27s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 2m56s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 2s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 20s
CI / Web (pdf-viewer) (pull_request) Failing after 1m2s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 9m12s
CI / Web (pdf-viewer) (push) Failing after 1m8s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m2s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 25s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 3m4s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 3m3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 5s
common Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 9m21s
CI / Web (shl) (push) Failing after 15s
CI / Web (shl) (pull_request) Failing after 13s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m57s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m4s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:26:27 +01:00
patrickandClaude Sonnet 5.5 0df4696e8c dms: apierror, httpclient, tenantregistryclient aus common v0.1.0
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m7s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 3m4s
CI / Web (pdf-viewer) (push) Failing after 1m2s
CI / Web (shl) (push) Failing after 14s
CI / Web (dms-browser) (push) Failing after 1m34s
CI / Web (pdf-viewer) (pull_request) Failing after 1m2s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 2m39s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 23s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m9s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 21s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / Web (shl) (pull_request) Failing after 12s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 8m37s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Failing after 1m30s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 2m46s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 2s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 5s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 2m49s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 2m6s
Die common-Fassung von apierror enthaelt die 5xx-Behebung (Text verborgen,
Korrelations-ID). Der Waechtertest gegen http.DefaultClient liegt jetzt in
internal/archtest.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:23:56 +01:00
patrickandClaude Sonnet 5.5 de90c3d935 archive: gemeinsame Pakete aus common v0.1.0 statt interner Kopien
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 3m11s
CI / Web (dms-browser) (push) Failing after 1m40s
CI / Web (shl) (pull_request) Failing after 13s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 2m41s
Archive-Pflichttest-Gate / pflichttest-gate (pull_request) Failing after 2m57s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 2m1s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 5s
CI / Web (shl) (push) Failing after 13s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
Archive-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 3m7s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 6s
CI / Web (pdf-viewer) (push) Failing after 1m4s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 2m39s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m1s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 2m42s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Failing after 33s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 2m41s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m5s
CI / Web (dms-browser) (pull_request) Failing after 1m43s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 20s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 26s
CI / Web (pdf-viewer) (pull_request) Failing after 1m9s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
Archive-Schnittstellen-Vertragstests / contract-tests (push) Successful in 8m26s
apierror, auditclient, httpclient, httpharden, svcauth und tenantregistryclient
kommen aus gitea.perlbach24.de/scripte/nexarch/common. Der Wächtertest gegen
http.DefaultClient liegt jetzt in internal/archtest.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:19:13 +01:00
patrick 184a219c8a Merge pull request 'SHL-04: AccountBar-Dopplung aufgeloest' (#372) from feature/shl-03-accountbar-dedup into main
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
2026-10-27 23:07:29 +01:00
patrick 118a524cec Merge pull request 'Portal: Gruppen, Arbeitsvorrat, Betriebsblock, Mandant aus Sitzung' (#382) from feature/portal-ausbau into feature/shl-03-accountbar-dedup
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
2026-10-27 23:06:34 +01:00
patrickandClaude Sonnet 5.5 ab826dac3c portal: Betriebsblock (Systemstatus, Kennzahlen-Summe), Caches und Policy aus den Route-Dateien ausgelagert
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:05:44 +01:00
patrickandClaude Sonnet 5.5 d5acbe1029 portal: Gruppen, Arbeitsvorrat, Mandant aus Sitzung, URL-Override; Arbeitskarten
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:02:36 +01:00
patrickandClaude Sonnet 5.5 6b42de39b9 portal: README mit Umgebungsvariablen und Verhalten der Route
CI / Web (dms-browser) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 22:59:03 +01:00
patrickandClaude Sonnet 5.5 fd4a0568a3 portal: visible-modules prueft Modul-Token (Mandant/Rolle aus Claims), 30s-Cache je Mandant/Rolle
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 22:49:22 +01:00
patrickandClaude Sonnet 5.5 65cc0ac7bf portal: AccountBar mit Benutzer/Rolle/Mandant, kein Neuladen der Module beim Sprachwechsel
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 22:46:35 +01:00
patrickandClaude Sonnet 5.5 bc47c1331b SHL-04: AccountBar zeigt Benutzer, Rolle und Mandant aus der Sitzung
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 22:31:17 +01:00
patrick b775de651b Merge pull request 'common/testdb: AdminDSN mit REQUIRE_DB + DB-Test-Workflow' (#381) from feat/common-requiredb into main
CI / Web (dms-browser) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
common Versions-Tag / tag (push) Successful in 7m50s
CI / Web (shl) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
2026-10-27 18:15:39 +01:00
patrick 8db663b7db Merge pull request 'feat(common): parametrisiertes Pflichttest-Gate für common/' (#379) from feat/common-pflichttestgate into main
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
common Versions-Tag / tag (push) Successful in 7m1s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
2026-10-27 18:15:30 +01:00
patrick 0b90c8b339 Merge pull request 'feat: versioniertes Modul common/ (ohne Verbraucher)' (#378) from feat/common-modul into main
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
common Versions-Tag / tag (push) Successful in 7m23s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
2026-10-27 18:15:03 +01:00
patrickandClaude Sonnet 5.5 3f4ac77b1e common/testdb: AdminDSN mit REQUIRE_DB, DB-Test-Workflow fuer Runner nexarch-test
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 17:58:25 +01:00
patrickandClaude Sonnet 5.5 843825abff docs: Vorbildsysteme (Mail + DMS) in PRODUKTARCHITEKTUR, DEVLOGs nachgezogen
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
Abschnitt 1a: Mail (archivmail, MailPiler), DMS (paperless-ngx, Alfresco,
Docspell, ecoDMS, archivdms); weitere Vergleichsprojekte als offen markiert.
DEVLOG.md, dms/DEVLOG.md, web/shl/DEVLOG.md: Session-Protokolle.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 15:47:35 +01:00
patrickandClaude Sonnet 5.5 0c8b3fe2b3 feat(common): parametrisiertes Pflichttest-Gate, Gate fuer common/ selbst
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
common Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CheckDiff(changed, patterns): gleiche Logik wie die Modul-Gates, Pfadmuster
vom Aufrufer. cmd/pflichttestgate + Workflow decken svcauth,
tenantregistryclient, auditclient, policyclient, apierror, httpharden ab.
README: Auswirkungsliste und Minor-Version bei Breaking Changes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 15:25:26 +01:00
patrickandClaude Sonnet 5.5 4f07bc73a2 feat: versioniertes Modul common/ (ohne Verbraucher)
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
Pakete: apierror, auditclient, httpclient, httpharden, loadtest, migrate,
policyclient, svcauth, tenantregistryclient, testdb. Code stammt aus den
bisher byte-gleichen Modulkopien (ohne Kommentare/Importpfade verglichen).
migrate/testdb brauchen pgx v5.9.2.

Auslieferung per Git-Tag common/vX.Y.Z (Workflow common-tag.yml, setzt nach
Merge in main den naechsten Patch-Tag nach Build/Vet/Test). Kein replace,
damit Module einzeln baubar bleiben. Verbraucher werden in Folge-PRs
umgestellt.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 14:40:46 +01:00
patrickandClaude Sonnet 5.5 35911bfd6f fix(workflow): contracttest an moduleadapter.NewServer-Signatur angepasst
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 35s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 24s
CI / Web (dms-browser) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m3s
CI / Web (shl) (push) Failing after 14s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Workflow-Schnittstellen-Vertragstests / contract-tests (push) Successful in 6m47s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Failing after 1m1s
Workflow-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Workflow-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 1m25s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
NewServer verlangt seit ENG-06 einen TenantVerifier; der Vertragstest
rief noch mit drei Argumenten auf, go vet schlug fehl. Stub wie beim
backchannel-Vertragstest (alwaysValidVerifier).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 12:54:20 +01:00
patrickandClaude Sonnet 5.5 4497da760d style: gofmt in drei beruehrten Dateien (reine Formatierung, schon auf main unformatiert)
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 56s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 51s
CI / Web (dms-browser) (pull_request) Failing after 1m36s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (shl) (push) Failing after 14s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m3s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 2m53s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Failing after 1m29s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 4s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Failing after 33s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 3s
CI / Web (shl) (pull_request) Failing after 17s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 2m0s
AI-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 2m35s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 23s
CI / Web (pdf-viewer) (push) Failing after 1m8s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 2m46s
Workflow-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 2m36s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 4s
CI / Web (pdf-viewer) (pull_request) Failing after 1m14s
Archive-Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 2m38s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 1m5s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 12:51:57 +01:00
patrickandClaude Sonnet 5.5 5b8c20777d refactor: Pruefgate-Pakete nach Funktion benannt, migration* gruppiert
- dms/ai/workflow: qa0x-Pakete nach internal/gates/<thema> verschoben, Paketname = Thema
- internal/migration{acl,audit,...} -> internal/migration/{acl,audit,...}
- Importpfade, Gate-Skripte und zwei relative Migrationspfade angepasst
- keine Logikaenderung; mail-Gates bewusst unveraendert (pfadabhaengig)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 12:44:21 +01:00
patrickandClaude Sonnet 5 2518160c92 SHL-04: AccountBar-Dopplung aufgeloest (duenne Wrapper statt kopierter JSX)
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
Fable-Review auf Code-Dopplung (P1). web/dms-browser, web/dms-upload,
web/pdf-viewer hatten byteidentische components/AccountBar.tsx. Darstellung
jetzt einmal in web/shl/components/AccountBar.tsx (visible/onLogout als
Props). Die drei App-lokalen Dateien bleiben als duenne 10-Zeilen-Wrapper
bestehen (loesen authMode()/getSession() aus dem jeweils eigenen,
unterschiedlichen lib/http.ts auf) statt komplett zu verschwinden --
direktes Reichen der onLogout-Funktion von layout.tsx (Server Component)
an die shl-Komponente verletzt sonst die RSC-Props-Grenze ("Event handlers
cannot be passed to Client Component props"), erst beim Build entdeckt
und korrigiert.

next build + npx vitest run auf allen 3 Apps gruen (Testhost 131).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-19 23:17:02 +02:00
587 changed files with 11792 additions and 3624 deletions

No files matched your search

+2
View File
@@ -0,0 +1,2 @@
# common/ ist modulübergreifend: Änderungen brauchen Review (Auswirkungsliste im PR)
/common/ @patrick
@@ -0,0 +1,23 @@
name: common Pflichttest-Gate
on:
pull_request:
paths:
- "common/**"
jobs:
pflichttest-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-go@v5
with:
go-version: "1.25"
- name: Gate bauen
working-directory: common
run: go build -o /tmp/pflichttestgate ./cmd/pflichttestgate
- name: Geänderte Dateien gegen Pflichttest-Regel pruefen
run: |
git diff --name-only "origin/${{ github.base_ref }}...HEAD" -- common/ | /tmp/pflichttestgate
+33
View File
@@ -0,0 +1,33 @@
name: common Versions-Tag
on:
push:
branches: [main]
paths:
- "common/**"
jobs:
tag:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-go@v5
with:
go-version: "1.25"
- name: Build, Vet, Test
working-directory: common
run: |
go build ./...
go vet ./...
go test ./... -count=1
- name: Naechsten Tag setzen
run: |
minor=$(tr -d '[:space:]' < common/MINOR)
last=$(git tag -l "common/v0.${minor}.*" --sort=-v:refname | head -n1)
if [ -z "$last" ]; then next="common/v0.${minor}.0"; else
patch=${last##*.}; base=${last%.*}; next="${base}.$((patch + 1))"
fi
git tag "$next"
git push origin "$next"
+37
View File
@@ -0,0 +1,37 @@
name: DB-Integrationstests
on:
pull_request:
paths:
- "common/**"
- "archive/**"
- "ai/**"
- "connect/**"
- "scripts/ci-pg-cluster.sh"
- ".gitea/workflows/db-tests.yml"
jobs:
db-tests:
runs-on: nexarch-test
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.25"
- name: Wegwerf-Postgres starten
run: scripts/ci-pg-cluster.sh start
- name: common
working-directory: common
run: go test ./... -count=1 -p 1
- name: archive
working-directory: archive
run: go test ./... -count=1 -p 1
- name: ai
working-directory: ai
run: go test ./... -count=1 -p 1
- name: connect
working-directory: connect
run: go test ./... -count=1 -p 1
- name: Wegwerf-Postgres stoppen
if: always()
run: scripts/ci-pg-cluster.sh stop
+564
View File
@@ -604,3 +604,567 @@ Keine Commits in dieser Session.
- scripts/qa02-foundation-gate.sh | 2 +-
---
## 2026-10-19 12:07 – 12:07 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/audit-log/app/page.tsx | 6 +++---
- web/dms-browser/app/layout.tsx | 6 +++---
- web/lic-admin/app/page.tsx | 18 +++++++++---------
- web/portal/app/layout.tsx | 12 ++----------
- web/portal/app/page.tsx | 4 ++--
- web/shl/components/ModuleNavShell.tsx | 18 +++++++++++++++---
- web/shl/components/Shell.tsx | 2 ++
- web/shl/index.ts | 2 +-
- web/shl/tokens/tokens.ts | 24 ++++++++++++++++++++++++
- web/status-page/app/page.tsx | 12 ++++++------
- web/tenant-admin/app/page.tsx | 8 ++++----
---
## 2026-10-19 12:08 – 12:08 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/audit-log/app/page.tsx | 6 +++---
- web/dms-browser/app/layout.tsx | 6 +++---
- web/lic-admin/app/page.tsx | 18 +++++++++---------
- web/portal/app/layout.tsx | 12 ++----------
- web/portal/app/page.tsx | 4 ++--
- web/shl/components/ModuleNavShell.tsx | 18 +++++++++++++++---
- web/shl/components/Shell.tsx | 2 ++
- web/shl/index.ts | 2 +-
- web/shl/tokens/tokens.ts | 24 ++++++++++++++++++++++++
- web/status-page/app/page.tsx | 12 ++++++------
- web/tenant-admin/app/page.tsx | 8 ++++----
---
## 2026-10-19 12:14 – 12:15 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/audit-log/app/page.tsx | 6 +++---
- web/dms-browser/app/layout.tsx | 6 +++---
- web/lic-admin/app/page.tsx | 18 +++++++++---------
- web/portal/app/layout.tsx | 12 ++----------
- web/portal/app/page.tsx | 4 ++--
- web/shl/components/ModuleNavShell.tsx | 18 +++++++++++++++---
- web/shl/components/Shell.tsx | 2 ++
- web/shl/index.ts | 2 +-
- web/shl/tokens/tokens.ts | 24 ++++++++++++++++++++++++
- web/status-page/app/page.tsx | 12 ++++++------
- web/tenant-admin/app/page.tsx | 8 ++++----
---
## 2026-10-19 12:29 – 12:30 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- dms/internal/upload/service.go | 38 ++++++++++++++++++++++++++++++---
- dms/internal/upload/service_test.go | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
---
## 2026-10-19 12:31 – 12:31 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- dms/internal/upload/service.go | 25 ++++++++++++++++++++++++-
- dms/internal/upload/service_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++
---
## 2026-10-19 12:44 – 12:53 (8m)
**Beschreibung:** Claude Code Session
**Projekt:** banking
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- dms/internal/upload/service.go | 25 ++++++++++++++++++++++++-
- dms/internal/upload/service_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++
---
## 2026-10-19 12:54 – 12:54 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- dms/internal/upload/service.go | 25 ++++++++++++++++++++++++-
- dms/internal/upload/service_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++
---
## 2026-10-19 13:47 – 13:50 (2m)
**Beschreibung:** Claude Code Session
**Projekt:** banking
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/mail-postfach/app/layout.tsx | 8 +++++---
- web/shl/components/ModuleNavShell.tsx | 4 ++++
---
## 2026-10-19 14:49 – 14:50 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** archivmail
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- MIGRATIONSKONZEPT.md | 2 +-
- PRODUKTARCHITEKTUR.md | 2 +-
- SICHERHEITSKONZEPT.md | 16 ++++++++--------
- SKALIERUNGSKONZEPT.md | 2 +-
- STORAGE-KONZEPT.md | 4 ++--
- dms/internal/searchsync/searchsync_test.go | 4 ++--
- web/portal/app/ModuleGrid.test.tsx | 3 ++-
- web/portal/app/ModuleGrid.tsx | 17 +----------------
- web/portal/lib/modules.test.ts | 4 +++-
- web/shl/components/ModuleNavShell.tsx | 27 +++++++++++++++++++--------
- web/shl/index.ts | 2 +-
---
## 2026-10-19 14:58 – 23:11 (8h 12m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-20 04:03 – 04:03 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-20 04:03 – 04:03 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-20 04:03 – 04:03 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-20 04:03 – 04:03 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-20 04:03 – 04:03 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 11:18 – 11:18 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 11:20 – 11:20 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 11:54 – 11:54 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 11:55 – 11:55 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 11:57 – 11:57 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 11:58 – 11:58 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 12:37 – 12:38 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 12:38 – 12:38 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 12:40 – 12:40 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 12:42 – 12:42 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 12:42 – 12:44 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 12:47 – 12:52 (4m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 12:53 – 12:54 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 12:55 – 12:56 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 13:00 – 13:01 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** Trad-Bot
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 13:35 – 13:39 (4m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 13:42 – 13:52 (10m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 13:53 – 13:53 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 13:54 – 14:06 (12m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 14:08 – 14:41 (32m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 15:03 – 15:25 (22m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
## 2026-10-27 15:27 – 15:43 (15m)
**Beschreibung:** Claude Code Session
**Projekt:** nexarch
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- web/dms-browser/components/AccountBar.tsx | 14 +++++++-------
- web/dms-upload/components/AccountBar.tsx | 14 +++++++-------
- web/pdf-viewer/components/AccountBar.tsx | 14 +++++++-------
- web/shl/components/AccountBar.tsx | 22 ++++++++++++++++++++++
- web/shl/index.ts | 3 +++
---
+13
View File
@@ -6,6 +6,17 @@ Stand: 2026-08-26. Zusammenführung aller bisherigen Entscheidungen aus `nexarch
NEXARCH ist die Nachfolgeplattform von **archivmail** (E-Mail-Archivierung) und **archivdms** (Dokumentenmanagement) — nicht als Umbenennung, sondern als modulare Neuentwicklung unter der Positionierung **"Next Generation Information Management"**: E-Mails, Dokumente, digitale Archivierung, OCR, Volltextsuche, Workflows, Compliance, Integrationen, KI — als ein zusammenhängendes System, nicht als zwei getrennte Werkzeuge nebeneinander.
## 1a. Vorbildsysteme
NEXARCH vereint die Stärken bestehender Systeme und vermeidet deren bekannte Schwächen (Details: `dms-kanban/known-issues-archivdms.md`, `dms-kanban/known-issues-archivmail.md`).
| Bereich | Vorbildsysteme |
|---|---|
| Mail | **archivmail** (eigenes Produkt, Vorgänger), **MailPiler** |
| DMS | **paperless-ngx**, **Alfresco**, **Docspell**, **ecoDMS**, **archivdms** (eigenes Produkt, Vorgänger) |
Weitere Vergleichsprojekte (z. B. OpenKM, Nuxeo, Mayan EDMS, Seafile) sind noch zu prüfen. Für das DMS-Modul siehe auch `dms/README.md`.
## 2. Architekturprinzip
**Ein modularer Monolith aus sieben eigenständigen, aber koordinierten Diensten** — kein Microservice-Zwang, aber klare Dienstgrenzen mit eigenem Datenmodell, eigenem Go-Binary, eigenem Kanban-Board:
@@ -64,6 +75,8 @@ Kein Modul kopiert die Daten eines anderen — stattdessen ein wiederkehrendes *
Gemeinsamer Nenner aller drei: **Referenz statt Kopie, Adapter statt Direktkopplung.**
Go-`internal/`-Pakete sind zwischen den Modulen nicht sichtbar; identische Querschnittspakete liegen deshalb im versionierten Modul `common/` (Git-Tags `common/vX.Y.Z`, siehe `common/README.md`). So bleiben Module einzeln baubar (Docker, eigenes Repo, Partner-Build). Fachlich verschiedene Pakete (`audittrail`, `cutoverstage`, `crypto`) bleiben modul-lokal.
Dasselbe Prinzip gilt auch innerhalb eines Moduls, auf Code-Ebene: Hauptdateien/Entry-Points bleiben klein, Fachlogik wandert in eigene Module. Vor einer neuen Funktions-/Modul-Datei wird geprüft, ob dieselbe Funktionalität nicht schon woanders existiert (auch modulübergreifend, z. B. in Core) — keine doppelten Funktionsdateien. Das eigene Kanban-Planungswerkzeug wurde nach genau diesem Muster korrigiert (sieben `kanban.html` enthielten identisches JS/CSS als Volltext-Duplikat, damals in `_shared/kanban.js`/`kanban.css` ausgelagert) — die Boards selbst sind inzwischen komplett aus dem Repo entfernt (Ticket-Historie liegt in der Gitea-PR-Historie), das Prinzip "keine doppelten Funktionsdateien" gilt unverändert für den eigentlichen NEXARCH-Code.
## 6. Technische Architektur (Kurzfassung, Details in eigenen Dokumenten)
+40
View File
@@ -0,0 +1,40 @@
:root {
--bg: #0B0F17; --card: #131A26; --card2: #18212F; --border: #253044;
--fg: #E6EDF7; --muted: #93A1B8; --primary: #3B82F6;
}
* { box-sizing: border-box; }
body { margin: 0; background: var(--bg); color: var(--fg); font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
header { position: sticky; top: 0; z-index: 20; background: rgba(11,15,23,.92); backdrop-filter: blur(8px); border-bottom: 1px solid var(--border); padding: 14px 20px; }
.row { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
h1 { font-size: 17px; margin: 0 14px 0 0; letter-spacing: -.01em; }
.sub { color: var(--muted); font-size: 12px; }
input, select, button { background: var(--card2); color: var(--fg); border: 1px solid var(--border); border-radius: 8px; padding: 7px 10px; font-size: 12px; font-family: inherit; }
input:focus, select:focus { outline: 1px solid var(--primary); }
button { cursor: pointer; }
button:hover { border-color: var(--primary); }
button.primary { background: rgba(59,130,246,.14); color: #93BBFB; border-color: rgba(59,130,246,.3); }
.stats { display: flex; gap: 14px; font-size: 11px; color: var(--muted); margin-top: 8px; flex-wrap: wrap; }
.stats b { color: var(--fg); }
.board { display: grid; grid-template-columns: repeat(5, minmax(240px, 1fr)); gap: 12px; padding: 16px 20px 40px; align-items: start; overflow-x: auto; }
.col { background: var(--card); border: 1px solid var(--border); border-radius: 12px; min-height: 160px; padding: 10px; }
.col.over { border-color: var(--primary); background: #16203042; }
.col h2 { font-size: 12px; margin: 2px 4px 10px; display: flex; justify-content: space-between; align-items: center; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }
.count { background: var(--card2); border: 1px solid var(--border); border-radius: 999px; padding: 1px 7px; font-size: 10px; color: var(--fg); }
.card { background: var(--card2); border: 1px solid var(--border); border-radius: 10px; padding: 10px; margin-bottom: 8px; cursor: grab; }
.card:hover { border-color: #3a4a66; }
.card.dragging { opacity: .45; }
.card .code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 10px; color: var(--muted); }
.card .title { font-size: 13px; margin: 4px 0 7px; line-height: 1.35; }
.tag { display: inline-block; font-size: 10px; padding: 2px 7px; border-radius: 999px; background: #202b3d; color: var(--muted); margin-right: 4px; margin-top: 3px; }
.tag.blocked { background: rgba(245,158,11,.15); color: #FBBF24; }
.tag.ready { background: rgba(34,197,94,.15); color: #4ADE80; }
.tag.wave { background: rgba(59,130,246,.14); color: #93BBFB; }
dialog { background: var(--card); color: var(--fg); border: 1px solid var(--border); border-radius: 14px; max-width: 860px; width: 94%; padding: 0; }
dialog::backdrop { background: rgba(0,0,0,.72); }
.dlg-head { padding: 18px 20px; border-bottom: 1px solid var(--border); display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; }
.dlg-body { padding: 18px 20px 24px; max-height: 66vh; overflow: auto; }
pre { background: #0E1420; border: 1px solid var(--border); border-radius: 10px; padding: 14px; font-size: 11px; line-height: 1.6; white-space: pre-wrap; word-break: break-word; color: #C7D3E5; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
h3 { font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); margin: 18px 0 8px; }
ul { margin: 0; padding-left: 18px; font-size: 13px; color: #C7D3E5; line-height: 1.6; }
.chip { font-family: ui-monospace, Menlo, monospace; font-size: 11px; border: 1px solid var(--border); border-radius: 6px; padding: 2px 6px; margin: 0 4px 4px 0; display: inline-block; color: var(--muted); }
.empty { color: #55627a; font-size: 11px; text-align: center; padding: 14px 0; }
+152
View File
@@ -0,0 +1,152 @@
(function () {
var DATA = JSON.parse(document.getElementById('data').textContent);
var COLUMNS = ['Backlog', 'Bereit', 'In Arbeit', 'Prüfung', 'Fertig'];
var KEY = 'kanban-status-v1:' + location.pathname;
var state = {};
try { state = JSON.parse(localStorage.getItem(KEY) || '{}') || {}; } catch (e) { state = {}; }
var onlyReady = false;
function statusOf(t) { return state[t.code] || t.status || 'Backlog'; }
function isDone(code) { return statusOf(byCode[code] || { code: code }) === 'Fertig'; }
var byCode = {};
DATA.tickets.forEach(function (t) { byCode[t.code] = t; });
function ready(t) { return (t.dependsOn || []).every(function (d) { return isDone(d); }); }
function save() { localStorage.setItem(KEY, JSON.stringify(state)); }
// Filter befüllen
var fEpic = document.getElementById('fEpic'), fRole = document.getElementById('fRole'), fWave = document.getElementById('fWave');
DATA.epics.forEach(function (e) { var o = document.createElement('option'); o.value = e.key; o.textContent = e.emoji + ' ' + e.name; fEpic.appendChild(o); });
Array.from(new Set(DATA.tickets.map(function (t) { return t.role; }))).sort().forEach(function (r) { var o = document.createElement('option'); o.value = r; o.textContent = r; fRole.appendChild(o); });
var maxWave = Math.max.apply(null, DATA.tickets.map(function (t) { return t.wave; }));
for (var w = 1; w <= maxWave; w++) { var o = document.createElement('option'); o.value = String(w); o.textContent = 'Welle ' + w; fWave.appendChild(o); }
function visible() {
var q = document.getElementById('q').value.trim().toLowerCase();
return DATA.tickets.filter(function (t) {
if (fEpic.value && t.epic !== fEpic.value) return false;
if (fRole.value && t.role !== fRole.value) return false;
if (fWave.value && String(t.wave) !== fWave.value) return false;
if (onlyReady && (!ready(t) || statusOf(t) === 'Fertig')) return false;
if (q) {
var hay = (t.code + ' ' + t.title + ' ' + t.tech + ' ' + t.description).toLowerCase();
if (hay.indexOf(q) === -1) return false;
}
return true;
});
}
function render() {
var board = document.getElementById('board');
board.innerHTML = '';
var list = visible();
COLUMNS.forEach(function (col) {
var el = document.createElement('div');
el.className = 'col';
el.dataset.col = col;
var items = list.filter(function (t) { return statusOf(t) === col; });
var h = document.createElement('h2');
h.innerHTML = '<span>' + col + '</span><span class="count">' + items.length + '</span>';
el.appendChild(h);
if (!items.length) { var e = document.createElement('div'); e.className = 'empty'; e.textContent = '– leer –'; el.appendChild(e); }
items.forEach(function (t) { el.appendChild(card(t)); });
el.addEventListener('dragover', function (ev) { ev.preventDefault(); el.classList.add('over'); });
el.addEventListener('dragleave', function () { el.classList.remove('over'); });
el.addEventListener('drop', function (ev) {
ev.preventDefault(); el.classList.remove('over');
var code = ev.dataTransfer.getData('text/plain');
if (!code) return;
state[code] = col; save(); render();
});
board.appendChild(el);
});
stats(list);
}
function card(t) {
var d = document.createElement('div');
d.className = 'card';
d.draggable = true;
var blocked = !ready(t);
d.innerHTML = '<div class="code">' + t.code + ' · ' + t.estimateDays + ' PT</div>' +
'<div class="title">' + esc(t.title) + '</div>' +
'<span class="tag wave">Welle ' + t.wave + '</span>' +
'<span class="tag">' + t.role + '</span>' +
'<span class="tag">' + t.complexity + '</span>' +
(blocked ? '<span class="tag blocked">wartet auf ' + t.dependsOn.filter(function (c) { return !isDone(c); }).join(', ') + '</span>' : '<span class="tag ready">startbar</span>');
d.addEventListener('dragstart', function (ev) { ev.dataTransfer.setData('text/plain', t.code); d.classList.add('dragging'); });
d.addEventListener('dragend', function () { d.classList.remove('dragging'); });
d.addEventListener('click', function () { openDlg(t); });
return d;
}
function esc(s) { return String(s).replace(/[&<>]/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;' }[c]; }); }
function stats(list) {
var done = DATA.tickets.filter(function (t) { return statusOf(t) === 'Fertig'; });
var donePT = done.reduce(function (a, t) { return a + t.estimateDays; }, 0);
var readyNow = DATA.tickets.filter(function (t) { return ready(t) && statusOf(t) !== 'Fertig'; }).length;
document.getElementById('stats').innerHTML =
'<span><b>' + DATA.tickets.length + '</b> Kacheln</span>' +
'<span>sichtbar: <b>' + list.length + '</b></span>' +
'<span>fertig: <b>' + done.length + '</b> (' + donePT + ' von ' + DATA.totalDays + ' PT)</span>' +
'<span>jetzt startbar: <b>' + readyNow + '</b></span>' +
'<span>Wellen: <b>' + maxWave + '</b></span>';
}
var dlg = document.getElementById('dlg');
var current = null;
function openDlg(t) {
current = t;
document.getElementById('dCode').textContent = t.code + ' · ' + t.epicName;
document.getElementById('dTitle').textContent = t.title;
document.getElementById('dMeta').innerHTML =
'<span class="tag wave">Welle ' + t.wave + '</span><span class="tag">' + t.role + '</span><span class="tag">' + t.complexity + '</span><span class="tag">' + t.estimateDays + ' PT</span><span class="tag">' + statusOf(t) + '</span>';
document.getElementById('dDesc').textContent = t.description;
chips('dDeps', t.dependsOn);
chips('dNext', t.unlocks);
items('dAcc', t.akzeptanz);
items('dChk', t.pruefungen);
document.getElementById('dPrompt').textContent = t.prompt;
dlg.showModal();
}
function chips(id, arr) {
var el = document.getElementById(id);
el.innerHTML = (arr && arr.length) ? arr.map(function (c) { return '<span class="chip">' + c + (byCode[c] ? ' – ' + esc(byCode[c].title) : '') + '</span>'; }).join('') : '<span class="empty" style="padding:0">keine</span>';
}
function items(id, arr) {
document.getElementById(id).innerHTML = (arr || []).map(function (a) { return '<li>' + esc(a) + '</li>'; }).join('');
}
document.getElementById('closeBtn').onclick = function () { dlg.close(); };
document.getElementById('copyBtn').onclick = function () {
if (!current) return;
var btn = this;
navigator.clipboard.writeText(current.prompt).then(function () {
btn.textContent = 'Kopiert ✓';
setTimeout(function () { btn.textContent = 'Prompt kopieren'; }, 1800);
});
};
document.getElementById('q').addEventListener('input', render);
[fEpic, fRole, fWave].forEach(function (s) { s.addEventListener('change', render); });
document.getElementById('onlyReady').onclick = function () {
onlyReady = !onlyReady;
this.style.borderColor = onlyReady ? 'var(--primary)' : 'var(--border)';
this.textContent = onlyReady ? 'Filter: nur startbare' : 'Nur startbare';
render();
};
document.getElementById('resetBtn').onclick = function () {
if (confirm('Alle lokalen Statusänderungen verwerfen?')) { state = {}; save(); render(); }
};
document.getElementById('exportBtn').onclick = function () {
var rows = [['Code', 'Titel', 'Status']].concat(DATA.tickets.map(function (t) { return [t.code, t.title, statusOf(t)]; }));
var csv = rows.map(function (r) { return r.map(function (c) { return '"' + String(c).replace(/"/g, '""') + '"'; }).join(','); }).join('\n');
var a = document.createElement('a');
a.href = URL.createObjectURL(new Blob(['\ufeff' + csv], { type: 'text/csv;charset=utf-8' }));
a.download = 'kanban-stand.csv';
a.click();
};
render();
})();
+41 -16
View File
@@ -41,9 +41,10 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/semanticsearchapi"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/summarize"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/summaryapi"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/tenantregistryclient"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/threadsummarize"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/vectorindex"
"gitea.perlbach24.de/scripte/nexarch/common/policyclient"
"gitea.perlbach24.de/scripte/nexarch/common/tenantregistryclient"
)
const workerPollInterval = 2 * time.Second
@@ -52,13 +53,24 @@ const defaultListenAddr = "127.0.0.1:9600"
const defaultModel = "default"
type config struct {
dsn string
serviceToken string
addr string
model string
moduleURLs map[string]string
coreBaseURL string
coreServiceToken string
dsn string
serviceToken string
addr string
model string
moduleURLs map[string]string
coreBaseURL string
coreServiceToken string
policyURL string
policyServiceToken string
policyDisabled bool
}
// policyClient liefert nil nur mit NEXARCH_AI_APP_POLICY_DISABLED=1.
func (c config) policyClient() *policyclient.Client {
if c.policyURL == "" {
return nil
}
return policyclient.New(c.policyURL, c.policyServiceToken)
}
// parseModuleBaseURLs liest "modul=url,modul2=url2" (EXT-05: je Modul eine
@@ -84,13 +96,19 @@ func parseModuleBaseURLs(raw string) map[string]string {
// Programmabbruchs weiter unten im Code.
func loadConfig(getenv func(string) string) (config, error) {
cfg := config{
dsn: getenv("NEXARCH_AI_APP_TENANT_DSN"),
serviceToken: getenv("NEXARCH_AI_APP_SERVICE_TOKEN"),
addr: getenv("NEXARCH_AI_APP_LISTEN_ADDR"),
model: getenv("NEXARCH_AI_APP_MODEL"),
moduleURLs: parseModuleBaseURLs(getenv("NEXARCH_AI_APP_MODULE_BASE_URLS")),
coreBaseURL: getenv("NEXARCH_AI_APP_CORE_BASE_URL"),
coreServiceToken: getenv("NEXARCH_AI_APP_CORE_SERVICE_TOKEN"),
dsn: getenv("NEXARCH_AI_APP_TENANT_DSN"),
serviceToken: getenv("NEXARCH_AI_APP_SERVICE_TOKEN"),
addr: getenv("NEXARCH_AI_APP_LISTEN_ADDR"),
model: getenv("NEXARCH_AI_APP_MODEL"),
moduleURLs: parseModuleBaseURLs(getenv("NEXARCH_AI_APP_MODULE_BASE_URLS")),
coreBaseURL: getenv("NEXARCH_AI_APP_CORE_BASE_URL"),
coreServiceToken: getenv("NEXARCH_AI_APP_CORE_SERVICE_TOKEN"),
policyURL: getenv("NEXARCH_AI_APP_POLICY_URL"),
policyServiceToken: getenv("NEXARCH_AI_APP_POLICY_SERVICE_TOKEN"),
policyDisabled: getenv("NEXARCH_AI_APP_POLICY_DISABLED") == "1",
}
if cfg.policyURL != "" && cfg.policyServiceToken == "" {
return config{}, errors.New("ai-app: NEXARCH_AI_APP_POLICY_SERVICE_TOKEN ist erforderlich, wenn NEXARCH_AI_APP_POLICY_URL gesetzt ist")
}
if cfg.dsn == "" {
return config{}, errors.New("ai-app: NEXARCH_AI_APP_TENANT_DSN ist erforderlich")
@@ -98,6 +116,9 @@ func loadConfig(getenv func(string) string) (config, error) {
if cfg.serviceToken == "" {
return config{}, errors.New("ai-app: NEXARCH_AI_APP_SERVICE_TOKEN ist erforderlich")
}
if cfg.policyURL == "" && !cfg.policyDisabled {
return config{}, errors.New("ai-app: NEXARCH_AI_APP_POLICY_URL ist erforderlich (oder NEXARCH_AI_APP_POLICY_DISABLED=1 als Uebergang)")
}
if cfg.addr == "" {
cfg.addr = defaultListenAddr
}
@@ -129,7 +150,11 @@ func build(pool *pgxpool.Pool, cfg config, prov provider.Provider, workerID stri
).RegisterRoutes(mux)
searchSvc := semanticsearch.New(prov, vectorindex.New(pool), cfg.model)
semanticsearchapi.NewServer(searchSvc, cfg.serviceToken).RegisterRoutes(mux)
policy := cfg.policyClient()
if policy == nil {
log.Print("ai-app: WARNUNG: Rechtepruefung ai.search.read deaktiviert (NEXARCH_AI_APP_POLICY_DISABLED=1)")
}
semanticsearchapi.NewServer(searchSvc, cfg.serviceToken).WithPolicy(policy).RegisterRoutes(mux)
chunkStore := vectorindex.New(pool)
docchatapi.NewServer(
+43 -2
View File
@@ -17,7 +17,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider/mock"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/queue"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
// AK3 + AK4: eine fehlende Pflicht-Umgebungsvariable liefert einen klaren
@@ -44,10 +44,36 @@ func TestLoadConfig_MissingRequiredVars(t *testing.T) {
}
}
func TestLoadConfig_Defaults(t *testing.T) {
// Issue #369: Policy-URL ohne Service-Token darf nicht still ohne
// Rechtepruefung starten.
func TestLoadConfig_PolicyURLRequiresServiceToken(t *testing.T) {
env := map[string]string{
"NEXARCH_AI_APP_TENANT_DSN": "postgres://x",
"NEXARCH_AI_APP_SERVICE_TOKEN": "tok",
"NEXARCH_AI_APP_POLICY_URL": "http://127.0.0.1:8093",
}
get := func(k string) string { return env[k] }
if _, err := loadConfig(get); err == nil || !strings.Contains(err.Error(), "NEXARCH_AI_APP_POLICY_SERVICE_TOKEN") {
t.Fatalf("erwartete fehler zur fehlenden NEXARCH_AI_APP_POLICY_SERVICE_TOKEN, bekam %v", err)
}
env["NEXARCH_AI_APP_POLICY_SERVICE_TOKEN"] = "policy-tok"
cfg, err := loadConfig(get)
if err != nil {
t.Fatalf("unerwarteter fehler: %v", err)
}
if cfg.policyClient() == nil {
t.Fatal("policy-client muss bei gesetzter URL aktiv sein")
}
if (config{}).policyClient() != nil {
t.Fatal("ohne URL darf kein policy-client entstehen")
}
}
func TestLoadConfig_Defaults(t *testing.T) {
env := map[string]string{
"NEXARCH_AI_APP_TENANT_DSN": "postgres://x",
"NEXARCH_AI_APP_SERVICE_TOKEN": "tok",
"NEXARCH_AI_APP_POLICY_DISABLED": "1",
}
cfg, err := loadConfig(func(k string) string { return env[k] })
if err != nil {
@@ -184,3 +210,18 @@ func TestBuild_QueueWorkerProcessesJobWithQuota(t *testing.T) {
t.Errorf("quota-zaehlerstand = %d, want 1 (GOV-04-Verbrauchszaehlung nicht verdrahtet)", value)
}
}
func TestLoadConfig_PolicyRequiredUnlessDisabled(t *testing.T) {
env := map[string]string{
"NEXARCH_AI_APP_TENANT_DSN": "postgres://x",
"NEXARCH_AI_APP_SERVICE_TOKEN": "tok",
}
get := func(k string) string { return env[k] }
if _, err := loadConfig(get); err == nil || !strings.Contains(err.Error(), "NEXARCH_AI_APP_POLICY_URL") {
t.Fatalf("erwartete fehler zur fehlenden NEXARCH_AI_APP_POLICY_URL, bekam %v", err)
}
env["NEXARCH_AI_APP_POLICY_DISABLED"] = "1"
if _, err := loadConfig(get); err != nil {
t.Fatalf("mit POLICY_DISABLED=1 darf der Start nicht scheitern: %v", err)
}
}
+2 -1
View File
@@ -19,7 +19,7 @@ import (
)
const (
fixtureTenant = "beispiel-mandant"
fixtureTenant = "beispiel-mandant"
fixtureSourceType = "dms_document"
fixtureSourceID = "beispiel-dokument-1"
)
@@ -77,5 +77,6 @@ func main() {
docchatapi.NewServer(chatSvc, "test-token").RegisterRoutes(mux)
log.Println("searchchatapi-mockserver listening on 127.0.0.1:19603")
// archtest:allow Einmaliges lokales pa11y-Testwerkzeug, kein Produktdienst
log.Fatal(http.ListenAndServe("127.0.0.1:19603", mux))
}
+4 -1
View File
@@ -4,7 +4,10 @@ go 1.25.0
toolchain go1.25.13
require github.com/jackc/pgx/v5 v5.11.0
require (
gitea.perlbach24.de/scripte/nexarch/common v0.2.0
github.com/jackc/pgx/v5 v5.11.0
)
require (
github.com/jackc/pgpassfile v1.0.0 // indirect
+2
View File
@@ -1,3 +1,5 @@
gitea.perlbach24.de/scripte/nexarch/common v0.2.0 h1:gcOjoOvUkT0Zmqq3m7WQp1MfXSgmzrGTF2E/+NkO2bw=
gitea.perlbach24.de/scripte/nexarch/common v0.2.0/go.mod h1:CiEImG++QMt1xZqSMeDJhPiB7sfWTLZOwjS6OY/Iguc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-72
View File
@@ -1,72 +0,0 @@
// Package auditclient ist ein schlanker HTTP-Client fuer Core AUD-08
// (internal/audit, POST /audit/ingest). AI ist ein physisch getrenntes
// Go-Modul und kann Cores internal/audit daher nicht direkt importieren -
// nur ueber dessen HTTP-Schnittstelle. Gleiches Muster wie
// connect/internal/auditclient (ENG-06) und archive/internal/auditclient.
package auditclient
import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/httpclient"
)
type Client struct {
BaseURL string
ServiceToken string
HTTPClient *http.Client
}
func New(baseURL, serviceToken string) *Client {
return &Client{BaseURL: baseURL, ServiceToken: serviceToken, HTTPClient: httpclient.Default()}
}
type ingestRequest struct {
TenantSlug string `json:"tenant_slug"`
Actor string `json:"actor"`
Action string `json:"action"`
Target string `json:"target"`
Metadata map[string]any `json:"metadata"`
}
// Ingest meldet EIN Audit-Ereignis an Core. Absichtlich keine
// Update-/Delete-Methode: der Ingest-Endpunkt (AUD-08) ruft denselben
// alleinigen, anfuegenden Schreibpfad wie core-interne Aufrufer auf
// (audit.Log.Record), gegen den Core selbst per Datenbank-Trigger jede
// nachtraegliche Aenderung/Loeschung verweigert (AUD-02).
func (c *Client) Ingest(ctx context.Context, tenantSlug, actor, action, target string, metadata map[string]any) error {
body, err := json.Marshal(ingestRequest{
TenantSlug: tenantSlug, Actor: actor, Action: action, Target: target, Metadata: metadata,
})
if err != nil {
return fmt.Errorf("auditclient: request kodieren: %w", err)
}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.BaseURL+"/audit/ingest", bytes.NewReader(body))
if err != nil {
return fmt.Errorf("auditclient: request bauen: %w", err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Service-Token", c.ServiceToken)
resp, err := c.httpClient().Do(req)
if err != nil {
return fmt.Errorf("auditclient: aufruf fehlgeschlagen: %w", err)
}
defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusAccepted {
return fmt.Errorf("auditclient: unerwarteter status %d", resp.StatusCode)
}
return nil
}
func (c *Client) httpClient() *http.Client {
if c.HTTPClient != nil {
return c.HTTPClient
}
return httpclient.Default()
}
@@ -1,48 +0,0 @@
package auditclient
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
)
func TestIngest_SendsExpectedRequest(t *testing.T) {
var gotToken string
var gotBody ingestRequest
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
gotToken = r.Header.Get("X-Service-Token")
_ = json.NewDecoder(r.Body).Decode(&gotBody)
w.WriteHeader(http.StatusAccepted)
}))
defer srv.Close()
c := New(srv.URL, "test-token")
err := c.Ingest(context.Background(), "tenant_a", "svc:ai", "ai.decision.classify", "doc:1",
map[string]any{"model": "llama3", "prompt_version": 2})
if err != nil {
t.Fatalf("Ingest: %v", err)
}
if gotToken != "test-token" {
t.Errorf("token = %q, want test-token", gotToken)
}
if gotBody.Action != "ai.decision.classify" || gotBody.Target != "doc:1" {
t.Errorf("unerwarteter request: %+v", gotBody)
}
if gotBody.Metadata["model"] != "llama3" {
t.Errorf("metadata.model = %v, want llama3", gotBody.Metadata["model"])
}
}
func TestIngest_UnexpectedStatusIsError(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "zugriff verweigert", http.StatusForbidden)
}))
defer srv.Close()
c := New(srv.URL, "test-token")
if err := c.Ingest(context.Background(), "tenant_a", "svc:ai", "ai.decision.classify", "doc:1", nil); err == nil {
t.Fatal("erwartet fehler bei status 403, habe nil")
}
}
+1 -1
View File
@@ -9,11 +9,11 @@ import (
"strings"
"testing"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/auditclient"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/decisionaudit"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider/mock"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider/ollama"
"gitea.perlbach24.de/scripte/nexarch/common/auditclient"
)
var testSchema = Schema{Categories: []string{"rechnung", "vertrag", "kuendigung"}}
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"testing"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newStore(t *testing.T) *Store {
@@ -9,7 +9,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/moduletype"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
// --- Vertrag 1: GOV-01 registrierter Objekttyp (moduletype.ObjectType) ---
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"testing"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newRecorder(t *testing.T) *Recorder {
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"context"
"fmt"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/auditclient"
"gitea.perlbach24.de/scripte/nexarch/common/auditclient"
)
// Decision ist eine einzelne, abgeschlossene KI-gestuetzte Entscheidung
@@ -7,7 +7,7 @@ import (
"net/http/httptest"
"testing"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/auditclient"
"gitea.perlbach24.de/scripte/nexarch/common/auditclient"
)
type recordedRequest struct {
@@ -7,10 +7,10 @@ import (
"testing"
"time"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/loadtest"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider/ollama"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/semanticsearch"
"gitea.perlbach24.de/scripte/nexarch/common/loadtest"
)
// QA-08 Pruefung 1 (AK1): echte parallele Chat-Anfragen gegen den realen,
+1 -1
View File
@@ -12,8 +12,8 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/docchat"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/semanticsearch"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/svcauth"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/vectorindex"
"gitea.perlbach24.de/scripte/nexarch/common/svcauth"
)
type Server struct {
+1 -1
View File
@@ -11,7 +11,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/classify"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
"github.com/jackc/pgx/v5/pgxpool"
)
+1 -1
View File
@@ -14,7 +14,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/queue"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newPool(t *testing.T) *pgxpool.Pool {
+1 -1
View File
@@ -15,7 +15,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/extractvalidate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/invoiceextract"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/svcauth"
"gitea.perlbach24.de/scripte/nexarch/common/svcauth"
)
type Server struct {
@@ -15,7 +15,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/extractmapping"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/metadatapushclient"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/svcauth"
"gitea.perlbach24.de/scripte/nexarch/common/svcauth"
)
type Server struct {
@@ -13,7 +13,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/extractmapping"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/metadatapushclient"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newMappingRegistry(t *testing.T) *extractmapping.Registry {
@@ -10,7 +10,7 @@ import (
"testing"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newRegistry(t *testing.T) *Registry {
@@ -1,10 +1,10 @@
// Package qa03gate ist das Prüfgate für QA-03: misst Klassifizierungs- und
// Package classification ist das Prüfgate für QA-03: misst Klassifizierungs- und
// Extraktionsgenauigkeit am Referenzkorpus (QA-01, ai/internal/refcorpus)
// und belegt die Wirkung von Korrektur-Feedback auf künftige Vorschläge.
// Reines Prüfgate — ruft nur bestehende, bereits gemergte Pakete auf
// (classify CLS-02, extract EXT-05-Grundlage, correction/historysuggest
// CLS-05), ohne deren Code zu ändern.
package qa03gate
package classification
import (
"context"
@@ -1,9 +1,9 @@
// Package qa05gate ist das Prüfgate für QA-05 (Datenschutz- &
// Package governance ist das Prüfgate für QA-05 (Datenschutz- &
// Governance-Prüfung). Es bringt keine neue Fachlogik ein, sondern führt
// GOV-02/GOV-03/GOV-05 end-to-end gegen eine echte Postgres-Wegwerf-DB bzw.
// einen Mock-Core zusammen, um die drei QA-05-Akzeptanzkriterien in der
// Praxis (nicht nur auf Store-Ebene) nachzuweisen.
package qa05gate
package governance
import (
"context"
@@ -16,7 +16,6 @@ import (
"github.com/jackc/pgx/v5/pgxpool"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/auditclient"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/decisionaudit"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider"
@@ -24,7 +23,8 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider/openai"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/residency"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/tenantfeature"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/auditclient"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
// realPool liefert einen frischen, migrierten Pool auf der Wegwerf-DB aus
@@ -36,7 +36,7 @@ func realPool(t *testing.T) *pgxpool.Pool {
t.Skip("TEST_TENANT_DSN nicht gesetzt, Integrationstest übersprungen")
}
pool := testdb.Pool(t, dsn)
migrationsDir, err := filepath.Abs("../../migrations")
migrationsDir, err := filepath.Abs("../../../migrations")
if err != nil {
t.Fatalf("migrationsverzeichnis: %v", err)
}
@@ -1,4 +1,4 @@
// Package qa04gate ist das Prüfgate für QA-04: es misst Suchqualität,
// Package searchquality ist das Prüfgate für QA-04: es misst Suchqualität,
// RAG-Antwortgüte und Quellenverweis-Nachvollziehbarkeit auf einem festen,
// synthetischen Testkorpus (SEM-01..06 bereits gemergt) und ändert keines der
// geprüften Pakete. Der Korpus stammt aus refcorpus (QA-01), die "Einbettung"
@@ -7,7 +7,7 @@
// einem externen Modell abhängt. Reine Termfrequenz ohne IDF-Gewichtung wurde
// probiert und verworfen: seltene, fachlich entscheidende Wörter (z.B.
// "Gesamtbetrag") gingen gegen häufige, generische Wörter unter.
package qa04gate
package searchquality
import (
"context"
@@ -231,4 +231,3 @@ func (p *embedProvider) Chat(ctx context.Context, req provider.ChatRequest) (pro
func (p *embedProvider) Complete(ctx context.Context, req provider.CompletionRequest) (provider.CompletionResponse, error) {
return provider.CompletionResponse{}, errors.New("qa04gate: Complete wird vom Prüfgate nicht genutzt")
}
@@ -1,4 +1,4 @@
package qa04gate
package searchquality
import (
"context"
@@ -1,4 +1,4 @@
package qa04gate
package searchquality
// testQuestion ist eine feste Testfrage des QA-04-Prüfgates gegen den
// refcorpus-Testkorpus (QA-01). erwarteteSourceID ist leer, wenn die Frage
-25
View File
@@ -1,25 +0,0 @@
// Package httpclient liefert den HTTP-Client fuer ausgehende Dienstaufrufe
// (Kopie des Musters aus connect/internal/httpclient, ENG-06): Zeitlimit
// statt endlosem Warten, keine Weiterleitungen (ein Service-Token wuerde
// sonst an das Weiterleitungsziel mitgesendet).
package httpclient
import (
"net/http"
"time"
)
const DefaultTimeout = 15 * time.Second
var shared = New(DefaultTimeout)
func Default() *http.Client { return shared }
func New(timeout time.Duration) *http.Client {
return &http.Client{
Timeout: timeout,
CheckRedirect: func(*http.Request, []*http.Request) error {
return http.ErrUseLastResponse
},
}
}
-29
View File
@@ -1,29 +0,0 @@
package httpclient
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestNew_DoesNotFollowRedirects(t *testing.T) {
target := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
t.Fatal("weiterleitungsziel haette nie erreicht werden duerfen")
}))
defer target.Close()
redirector := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, target.URL, http.StatusFound)
}))
defer redirector.Close()
resp, err := Default().Get(redirector.URL)
if err != nil {
t.Fatalf("Get: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusFound {
t.Fatalf("status = %d, want %d (keine weiterleitung gefolgt)", resp.StatusCode, http.StatusFound)
}
}
-138
View File
@@ -1,138 +0,0 @@
// Package loadtest implementiert die fuer QA-07/QA-08 gemeinsam genutzte
// Last- und Leistungsmessung: parallele Sessions ausfuehren, Latenzen
// aufzeichnen, Durchsatz bestimmen. k6/vegeta sind auf diesem Rechner nicht
// installierbar (Projektregel: keine zusaetzlichen Toolchains/Dienste
// installieren) — echter Ersatz ohne externe Abhaengigkeit: reale
// nebenlaeufige Aufrufe ueber die Go-Standardbibliothek, gegen den echten,
// in dieser Sitzung gebauten Code. Eigenstaendige Kopie aus
// mail/internal/loadtest, da Go-Module keine internal/-Pakete teilen.
package loadtest
import (
"context"
"os"
"runtime"
"sort"
"strconv"
"strings"
"sync"
"time"
)
// Result fasst Latenz- und Durchsatzwerte eines Lasttest-Laufs zusammen.
type Result struct {
Protocol string
Concurrency int
Sessions int
Errors int
Duration time.Duration
Latencies []time.Duration // aufsteigend sortiert
}
// Throughput liefert Sessions pro Sekunde über die Gesamtlaufzeit.
func (r Result) Throughput() float64 {
if r.Duration <= 0 {
return 0
}
return float64(r.Sessions) / r.Duration.Seconds()
}
// Percentile liefert die Latenz am p-ten Perzentil (0.0–1.0).
func (r Result) Percentile(p float64) time.Duration {
if len(r.Latencies) == 0 {
return 0
}
idx := int(p * float64(len(r.Latencies)-1))
if idx < 0 {
idx = 0
}
if idx >= len(r.Latencies) {
idx = len(r.Latencies) - 1
}
return r.Latencies[idx]
}
// Max liefert die höchste gemessene Latenz.
func (r Result) Max() time.Duration {
if len(r.Latencies) == 0 {
return 0
}
return r.Latencies[len(r.Latencies)-1]
}
// Run führt totalSessions Sessions über maximal concurrency parallele
// Worker aus und misst je Session die Latenz von sessionFunc.
func Run(ctx context.Context, protocol string, concurrency, totalSessions int, sessionFunc func(ctx context.Context) error) Result {
var mu sync.Mutex
latencies := make([]time.Duration, 0, totalSessions)
errCount := 0
sem := make(chan struct{}, concurrency)
var wg sync.WaitGroup
start := time.Now()
for i := 0; i < totalSessions; i++ {
sem <- struct{}{}
wg.Add(1)
go func() {
defer wg.Done()
defer func() { <-sem }()
t0 := time.Now()
err := sessionFunc(ctx)
elapsed := time.Since(t0)
mu.Lock()
latencies = append(latencies, elapsed)
if err != nil {
errCount++
}
mu.Unlock()
}()
}
wg.Wait()
duration := time.Since(start)
sort.Slice(latencies, func(i, j int) bool { return latencies[i] < latencies[j] })
return Result{
Protocol: protocol,
Concurrency: concurrency,
Sessions: totalSessions,
Errors: errCount,
Duration: duration,
Latencies: latencies,
}
}
// ResourceSample ist eine Momentaufnahme des Ressourcenverbrauchs DIESES
// Prozesses: Heap über die Go-Runtime, kumulierte CPU-Zeit über
// /proc/self/stat (Linux, kein externes Werkzeug nötig).
type ResourceSample struct {
HeapAllocBytes uint64
CPUTimeSeconds float64
}
func SampleResources() ResourceSample {
var m runtime.MemStats
runtime.ReadMemStats(&m)
return ResourceSample{HeapAllocBytes: m.HeapAlloc, CPUTimeSeconds: readSelfCPUTimeSeconds()}
}
// readSelfCPUTimeSeconds liefert die kumulierte User+System-CPU-Zeit dieses
// Prozesses in Sekunden. Liefert 0, wenn /proc/self/stat nicht lesbar ist
// (z. B. auf Nicht-Linux-Systemen) — Aufrufer behandeln das als "keine
// CPU-Messung verfügbar", kein harter Fehler.
func readSelfCPUTimeSeconds() float64 {
data, err := os.ReadFile("/proc/self/stat")
if err != nil {
return 0
}
fields := strings.Fields(string(data))
if len(fields) < 15 {
return 0
}
utime, err1 := strconv.ParseFloat(fields[13], 64)
stime, err2 := strconv.ParseFloat(fields[14], 64)
if err1 != nil || err2 != nil {
return 0
}
const clockTicksPerSecond = 100 // Linux-Standard-USER_HZ
return (utime + stime) / clockTicksPerSecond
}
@@ -15,7 +15,7 @@ import (
"net/url"
"sort"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/httpclient"
"gitea.perlbach24.de/scripte/nexarch/common/httpclient"
)
type Client struct {
@@ -81,7 +81,7 @@ func TestPush_UnknownFieldKey_ReportedNotDropped(t *testing.T) {
c := New(srv.URL, "svc-token-123")
result, err := c.Push(context.Background(), "doc-1", "ai", map[string]string{
"rechnungsdatum": "2026-01-15",
"rechnungsdatum": "2026-01-15",
"nicht_existent_feld": "wert",
})
if err != nil {
+11 -205
View File
@@ -1,221 +1,27 @@
// Package migrate implements versioned, revertible SQL migrations (no ORM) — a
// standalone copy of the Core/DMS pattern, since AI is its own Go module
// and cannot import other modules' internal/ packages.
// Package migrate bindet die gemeinsame Migrationslogik aus common an den
// modulspezifischen Fortschrittstabellennamen.
package migrate
import (
"context"
"fmt"
"os"
"path/filepath"
"sort"
"strings"
"github.com/jackc/pgx/v5/pgxpool"
cmigrate "gitea.perlbach24.de/scripte/nexarch/common/migrate"
)
// Migration ist eine einzelne versionierte Migrationsdatei.
type Migration struct {
Version string // Dateiname ohne .up.sql/.down.sql, z.B. "0001_documents"
UpSQL string
DownSQL string
}
type Migration = cmigrate.Migration
// Load liest alle *.up.sql/*.down.sql-Paare aus dir, sortiert nach
// Dateiname (Akzeptanzkriterium: Migrationen sind versioniert).
func Load(dir string) ([]Migration, error) {
entries, err := os.ReadDir(dir)
if err != nil {
return nil, fmt.Errorf("migrationsverzeichnis %q lesen: %w", dir, err)
}
var versions []string
for _, e := range entries {
if e.IsDir() || !strings.HasSuffix(e.Name(), ".up.sql") {
continue
}
versions = append(versions, strings.TrimSuffix(e.Name(), ".up.sql"))
}
sort.Strings(versions)
migrations := make([]Migration, 0, len(versions))
for _, v := range versions {
up, err := os.ReadFile(filepath.Join(dir, v+".up.sql"))
if err != nil {
return nil, fmt.Errorf("migration %q: up.sql lesen: %w", v, err)
}
down, err := os.ReadFile(filepath.Join(dir, v+".down.sql"))
if err != nil {
return nil, fmt.Errorf("migration %q: down.sql lesen (jede Migration braucht ein Rollback): %w", v, err)
}
migrations = append(migrations, Migration{Version: v, UpSQL: string(up), DownSQL: string(down)})
}
return migrations, nil
}
// TrackingTable ist modulspezifisch benannt, damit sich Module in
// derselben Datenbank/demselben Schema nicht gegenseitig den
// Migrationsfortschritt ueberschreiben (FDN-13).
const TrackingTable = "connect_schema_migrations"
const legacyTrackingTable = "schema_migrations"
var migrator = cmigrate.MustNew(TrackingTable)
// ensureTrackingTable legt TrackingTable an. Beim erstmaligen Anlegen wird
// ein vorhandener Bestand aus der frueheren, unqualifizierten
// schema_migrations uebernommen (nur Versionen, die dieses Modul kennt, und
// nur wenn dessen Basisversion dort steht — eine schema_migrations eines
// anderen Moduls oder eines anderen Schemas wird weder gelesen noch
// veraendert). Die alte Tabelle
// bleibt unangetastet.
func ensureTrackingTable(ctx context.Context, pool *pgxpool.Pool, migrations []Migration) error {
tx, err := pool.Begin(ctx)
if err != nil {
return fmt.Errorf("%s anlegen: %w", TrackingTable, err)
}
defer func() { _ = tx.Rollback(ctx) }()
func Load(dir string) ([]Migration, error) { return cmigrate.Load(dir) }
// Serialisiert gleichzeitige Erstanlage/Uebernahme (mehrere App-Instanzen).
if _, err := tx.Exec(ctx, `SELECT pg_advisory_xact_lock(hashtext('connect_schema_migrations'))`); err != nil {
return fmt.Errorf("%s anlegen: %w", TrackingTable, err)
}
var existed bool
if err := tx.QueryRow(ctx, `SELECT to_regclass(current_schema() || '.' || $1::text) IS NOT NULL`, TrackingTable).Scan(&existed); err != nil {
return fmt.Errorf("%s anlegen: %w", TrackingTable, err)
}
if existed {
return tx.Commit(ctx)
}
if _, err := tx.Exec(ctx, `
CREATE TABLE `+TrackingTable+` (
version TEXT PRIMARY KEY,
applied_at TIMESTAMPTZ NOT NULL DEFAULT now()
)
`); err != nil {
return fmt.Errorf("%s anlegen: %w", TrackingTable, err)
}
if len(migrations) > 0 {
var legacy bool
if err := tx.QueryRow(ctx, `SELECT to_regclass(current_schema() || '.' || $1::text) IS NOT NULL`, legacyTrackingTable).Scan(&legacy); err != nil {
return fmt.Errorf("%s pruefen: %w", legacyTrackingTable, err)
}
if legacy {
versions := make([]string, len(migrations))
for i, m := range migrations {
versions[i] = m.Version
}
var hasBase bool
if err := tx.QueryRow(ctx,
`SELECT EXISTS (SELECT 1 FROM `+legacyTrackingTable+` WHERE version = $1)`, versions[0],
).Scan(&hasBase); err != nil {
return fmt.Errorf("%s lesen: %w", legacyTrackingTable, err)
}
if hasBase {
if _, err := tx.Exec(ctx, `
INSERT INTO `+TrackingTable+` (version, applied_at)
SELECT version, applied_at FROM `+legacyTrackingTable+` WHERE version = ANY($1)
`, versions); err != nil {
return fmt.Errorf("bestand aus %s uebernehmen: %w", legacyTrackingTable, err)
}
}
}
}
return tx.Commit(ctx)
func Up(ctx context.Context, pool *pgxpool.Pool, migrations []Migration) ([]string, error) {
return migrator.Up(ctx, pool, migrations)
}
func appliedVersions(ctx context.Context, pool *pgxpool.Pool) (map[string]bool, error) {
rows, err := pool.Query(ctx, `SELECT version FROM `+TrackingTable)
if err != nil {
return nil, fmt.Errorf("angewendete migrationen lesen: %w", err)
}
defer rows.Close()
applied := map[string]bool{}
for rows.Next() {
var v string
if err := rows.Scan(&v); err != nil {
return nil, fmt.Errorf("migrationsversion lesen: %w", err)
}
applied[v] = true
}
return applied, rows.Err()
}
// Up wendet alle noch nicht angewendeten Migrationen in Reihenfolge an
// (Akzeptanzkriterium 2: vorwaerts ausfuehrbar) — bereits angewendete
// werden uebersprungen, damit Up auf einer leeren UND auf einer bestehenden
// DB funktioniert (Pruefung 1).
func Up(ctx context.Context, pool *pgxpool.Pool, migrations []Migration) (applied []string, err error) {
if err := ensureTrackingTable(ctx, pool, migrations); err != nil {
return nil, err
}
already, err := appliedVersions(ctx, pool)
if err != nil {
return nil, err
}
for _, m := range migrations {
if already[m.Version] {
continue
}
tx, err := pool.Begin(ctx)
if err != nil {
return applied, fmt.Errorf("transaktion fuer %q starten: %w", m.Version, err)
}
if _, err := tx.Exec(ctx, m.UpSQL); err != nil {
_ = tx.Rollback(ctx)
return applied, fmt.Errorf("migration %q anwenden: %w", m.Version, err)
}
if _, err := tx.Exec(ctx, `INSERT INTO `+TrackingTable+` (version) VALUES ($1)`, m.Version); err != nil {
_ = tx.Rollback(ctx)
return applied, fmt.Errorf("migration %q als angewendet markieren: %w", m.Version, err)
}
if err := tx.Commit(ctx); err != nil {
return applied, fmt.Errorf("migration %q committen: %w", m.Version, err)
}
applied = append(applied, m.Version)
}
return applied, nil
}
// DownOne macht die zuletzt angewendete Migration rueckgaengig
// (Akzeptanzkriterium 2: rueckwaerts ausfuehrbar) und liefert deren Version,
// oder "" falls keine Migration angewendet war.
func DownOne(ctx context.Context, pool *pgxpool.Pool, migrations []Migration) (version string, err error) {
if err := ensureTrackingTable(ctx, pool, migrations); err != nil {
return "", err
}
already, err := appliedVersions(ctx, pool)
if err != nil {
return "", err
}
var last *Migration
for i := len(migrations) - 1; i >= 0; i-- {
if already[migrations[i].Version] {
last = &migrations[i]
break
}
}
if last == nil {
return "", nil
}
tx, err := pool.Begin(ctx)
if err != nil {
return "", fmt.Errorf("transaktion fuer rollback von %q starten: %w", last.Version, err)
}
if _, err := tx.Exec(ctx, last.DownSQL); err != nil {
_ = tx.Rollback(ctx)
return "", fmt.Errorf("migration %q zurueckrollen: %w", last.Version, err)
}
if _, err := tx.Exec(ctx, `DELETE FROM `+TrackingTable+` WHERE version = $1`, last.Version); err != nil {
_ = tx.Rollback(ctx)
return "", fmt.Errorf("migration %q aus %s entfernen: %w", last.Version, TrackingTable, err)
}
if err := tx.Commit(ctx); err != nil {
return "", fmt.Errorf("rollback von %q committen: %w", last.Version, err)
}
return last.Version, nil
func DownOne(ctx context.Context, pool *pgxpool.Pool, migrations []Migration) (string, error) {
return migrator.DownOne(ctx, pool, migrations)
}
+1 -1
View File
@@ -11,7 +11,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/modelconfig"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
type fakeLister struct {
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"testing"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
// fakeVerifier simuliert Core TEN-01 fuer die Registry-Tests, ohne einen
+1 -1
View File
@@ -10,7 +10,7 @@ import (
"net/http"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/moduletype"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/svcauth"
"gitea.perlbach24.de/scripte/nexarch/common/svcauth"
)
type Server struct {
@@ -12,7 +12,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/moduletype"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
type fakeVerifier struct{ validTenants map[string]bool }
-1
View File
@@ -17,7 +17,6 @@ import (
// sensitivePathPatterns beschreibt die Bereiche aus
// TESTSTRATEGIE-AI.md Abschnitt 3.
var sensitivePathPatterns = []*regexp.Regexp{
regexp.MustCompile(`(^|/)ai/internal/svcauth/`),
regexp.MustCompile(`(^|/)ai/internal/tenantfeature/`),
regexp.MustCompile(`(^|/)ai/internal/semanticsearch/`),
regexp.MustCompile(`(^|/)ai/internal/semanticsearchapi/`),
+5 -5
View File
@@ -1,24 +1,24 @@
// Negativtest des Gates selbst (QA-01 Prüfung 1): ein Diff mit
// geänderter ai/internal/svcauth/svcauth.go ohne begleitende Testdatei
// geänderter ai/internal/tenantfeature/tenantfeature.go ohne begleitende Testdatei
// muss als Verstoß erkannt werden.
package pflichttestgate
import "testing"
func TestCheckDiff_FlagsSensitiveChangeWithoutTest(t *testing.T) {
violations := CheckDiff([]string{"ai/internal/svcauth/svcauth.go"})
violations := CheckDiff([]string{"ai/internal/tenantfeature/tenantfeature.go"})
if len(violations) != 1 {
t.Fatalf("erwartet genau 1 verstoß, habe %d: %+v", len(violations), violations)
}
if violations[0].Package != "ai/internal/svcauth" {
if violations[0].Package != "ai/internal/tenantfeature" {
t.Fatalf("falsches package gemeldet: %+v", violations[0])
}
}
func TestCheckDiff_PassesWhenTestFileAccompanies(t *testing.T) {
violations := CheckDiff([]string{
"ai/internal/svcauth/svcauth.go",
"ai/internal/svcauth/svcauth_test.go",
"ai/internal/tenantfeature/tenantfeature.go",
"ai/internal/tenantfeature/tenantfeature_test.go",
})
if len(violations) != 0 {
t.Fatalf("erwartet keine verstöße, habe: %+v", violations)
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"testing"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newStore(t *testing.T) *Store {
+1 -1
View File
@@ -8,8 +8,8 @@ import (
"time"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/limits"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/loadtest"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider"
"gitea.perlbach24.de/scripte/nexarch/common/loadtest"
)
// QA-08 Pruefung 2 (AK2): realistische parallele Klassifizierungs-/
+1 -1
View File
@@ -14,7 +14,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newPool(t *testing.T) *pgxpool.Pool {
+3 -3
View File
@@ -16,9 +16,9 @@ import (
// eine Zeitueberschreitung real simulieren laesst (respektiert ctx wie ein
// echter HTTP-Client es tun wuerde).
type slowProvider struct {
delay time.Duration
calls atomic.Int64
cancelled atomic.Int64
delay time.Duration
calls atomic.Int64
cancelled atomic.Int64
}
func (s *slowProvider) Chat(ctx context.Context, req provider.ChatRequest) (provider.ChatResponse, error) {
+1 -1
View File
@@ -11,7 +11,7 @@ import (
"github.com/jackc/pgx/v5/pgxpool"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newPool(t *testing.T) *pgxpool.Pool {
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/provider/openai"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/residency"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func setup(t *testing.T) *residency.Store {
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"net/http"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/residency"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/svcauth"
"gitea.perlbach24.de/scripte/nexarch/common/svcauth"
)
type Server struct {
@@ -13,7 +13,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/residency"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/residencyapi"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
const testToken = "test-service-token"
@@ -8,7 +8,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/historysuggest"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newStore(t *testing.T) *Store {
@@ -13,7 +13,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/historysuggest"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/routingfeedback"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/svcauth"
"gitea.perlbach24.de/scripte/nexarch/common/svcauth"
)
type Server struct {
@@ -11,7 +11,7 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/routingfeedback"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
const testToken = "test-service-token"
@@ -11,8 +11,8 @@ import (
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/semanticsearch"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/vectorindex"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newRealPool(t *testing.T) *pgxpool.Pool {
@@ -1,7 +1,8 @@
// Package semanticsearchapi ist die HTTP-Bindung der semantischen Suche
// (SEM-03). Aufrufer ist das anfragende Modul (DMS/Mail), nicht der
// Endnutzer direkt — Service-Token-Pflicht wie moduleadapter (Workflow
// ENG-02), fail closed.
// ENG-02), fail closed. Zusaetzlich (Issue #369) Rechtepruefung
// ai.search.read gegen Core fuer den Mandanten aus dem Anfrage-Koerper.
package semanticsearchapi
import (
@@ -10,18 +11,30 @@ import (
"net/http"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/semanticsearch"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/svcauth"
"gitea.perlbach24.de/scripte/nexarch/common/policyclient"
"gitea.perlbach24.de/scripte/nexarch/common/svcauth"
)
const permissionSearchRead = "ai.search.read"
type Server struct {
svc *semanticsearch.Service
serviceToken string
policy *policyclient.Client
}
func NewServer(svc *semanticsearch.Service, serviceToken string) *Server {
return &Server{svc: svc, serviceToken: serviceToken}
}
// WithPolicy aktiviert die Rechtepruefung gegen Core (POST /authorize).
// Rolle ist fest "user", weil der Modul-zu-Modul-Aufruf keine Nutzerrolle
// transportiert (Uebergang, gleiches Muster wie connect/internal/statusapi).
func (s *Server) WithPolicy(client *policyclient.Client) *Server {
s.policy = client
return s
}
func (s *Server) RegisterRoutes(mux *http.ServeMux) {
mux.HandleFunc("POST /search", s.requireAuth(s.handleSearch))
}
@@ -37,6 +50,22 @@ func (s *Server) requireAuth(next http.HandlerFunc) http.HandlerFunc {
}
}
func (s *Server) permitted(w http.ResponseWriter, r *http.Request, tenantSlug, permission string) bool {
if s.policy == nil {
return true
}
allowed, err := s.policy.Allowed(r.Context(), tenantSlug, "user", permission)
if err != nil {
writeError(w, http.StatusServiceUnavailable, "berechtigungsdienst nicht erreichbar")
return false
}
if !allowed {
writeError(w, http.StatusForbidden, "keine berechtigung")
return false
}
return true
}
type refRequest struct {
SourceType string `json:"source_type"`
SourceID string `json:"source_id"`
@@ -59,6 +88,9 @@ func (s *Server) handleSearch(w http.ResponseWriter, r *http.Request) {
writeError(w, http.StatusBadRequest, "ungueltiger anfrage-koerper")
return
}
if !s.permitted(w, r, req.TenantSlug, permissionSearchRead) {
return
}
refs := make([]semanticsearch.Ref, 0, len(req.AllowedRefs))
for _, ref := range req.AllowedRefs {
@@ -0,0 +1,100 @@
package semanticsearchapi_test
import (
"bytes"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"gitea.perlbach24.de/scripte/nexarch/common/policyclient"
)
// Steht fuer Core's POST /authorize-Vertrag ({"allowed": bool}); prueft
// die echte Kette requireAuth -> permitted -> policyclient -> 403/200.
func newFakePolicyAPI(t *testing.T, allow bool, gotBody *map[string]string) *httptest.Server {
t.Helper()
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/authorize" || r.Header.Get("X-Service-Token") == "" {
t.Fatalf("unerwartete anfrage: %s %s", r.Method, r.URL.Path)
}
if gotBody != nil {
_ = json.NewDecoder(r.Body).Decode(gotBody)
}
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(map[string]bool{"allowed": allow})
}))
}
func searchRequest(t *testing.T) *http.Request {
t.Helper()
body, _ := json.Marshal(map[string]any{
"tenant_slug": "acme",
"query": "test",
"top_k": 5,
"allowed_refs": []map[string]string{{"source_type": "dms_document", "source_id": "doc-1"}},
})
req := httptest.NewRequest(http.MethodPost, "/search", bytes.NewReader(body))
req.Header.Set("X-Service-Token", "geheimes-token")
return req
}
func TestHandleSearch_PolicyDenies_Rejected(t *testing.T) {
var got map[string]string
policyAPI := newFakePolicyAPI(t, false, &got)
defer policyAPI.Close()
mux := http.NewServeMux()
newTestServer().WithPolicy(policyclient.New(policyAPI.URL, "test-token")).RegisterRoutes(mux)
rec := httptest.NewRecorder()
mux.ServeHTTP(rec, searchRequest(t))
if rec.Code != http.StatusForbidden {
t.Fatalf("erwartet 403 ohne berechtigung, bekam %d: %s", rec.Code, rec.Body.String())
}
if got["permission"] != "ai.search.read" || got["tenant"] != "acme" {
t.Fatalf("falsche policy-anfrage: %+v", got)
}
}
func TestHandleSearch_PolicyAllows_Passes(t *testing.T) {
policyAPI := newFakePolicyAPI(t, true, nil)
defer policyAPI.Close()
mux := http.NewServeMux()
newTestServer().WithPolicy(policyclient.New(policyAPI.URL, "test-token")).RegisterRoutes(mux)
rec := httptest.NewRecorder()
mux.ServeHTTP(rec, searchRequest(t))
if rec.Code != http.StatusOK {
t.Fatalf("erwartet 200 mit berechtigung, bekam %d: %s", rec.Code, rec.Body.String())
}
}
func TestHandleSearch_PolicyUnavailable_FailsClosed(t *testing.T) {
policyAPI := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
}))
defer policyAPI.Close()
mux := http.NewServeMux()
newTestServer().WithPolicy(policyclient.New(policyAPI.URL, "test-token")).RegisterRoutes(mux)
rec := httptest.NewRecorder()
mux.ServeHTTP(rec, searchRequest(t))
if rec.Code != http.StatusServiceUnavailable {
t.Fatalf("erwartet 503 bei ausfall des berechtigungsdienstes, bekam %d", rec.Code)
}
}
func TestHandleSearch_PolicyCheckedOnlyAfterServiceToken(t *testing.T) {
policyAPI := newFakePolicyAPI(t, true, nil)
defer policyAPI.Close()
mux := http.NewServeMux()
newTestServer().WithPolicy(policyclient.New(policyAPI.URL, "test-token")).RegisterRoutes(mux)
req := searchRequest(t)
req.Header.Set("X-Service-Token", "falsch")
rec := httptest.NewRecorder()
mux.ServeHTTP(rec, req)
if rec.Code != http.StatusUnauthorized {
t.Fatalf("erwartet 401 bei falschem service-token, bekam %d", rec.Code)
}
}
+1 -1
View File
@@ -10,8 +10,8 @@ import (
"net/http"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/summarize"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/svcauth"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/threadsummarize"
"gitea.perlbach24.de/scripte/nexarch/common/svcauth"
)
type Server struct {
+3 -3
View File
@@ -125,10 +125,10 @@ func wordSet(s string) map[string]bool {
// TypeMetrics fasst die Bewertungen aller Stichproben eines
// Zusammenfassungstyps zusammen (AK1).
type TypeMetrics struct {
Type string
Count int
Type string
Count int
AverageGroundedness float64
FlaggedCount int
FlaggedCount int
}
// AggregateByType berechnet je Zusammenfassungstyp die Kennzahl über alle
-20
View File
@@ -1,20 +0,0 @@
// Package svcauth vergleicht Service-Token in konstanter Zeit (eigene Kopie
// je Modul, siehe workflow/internal/svcauth — Go-Module teilen keine
// internal/-Pakete über Modulgrenzen; Lehre aus RET-14/F-08: Schutz beim
// ersten Entwurf einbauen statt nachzuruesten).
package svcauth
import (
"crypto/sha256"
"crypto/subtle"
)
// Equal vergleicht die SHA-256-Werte beider Eingaben in konstanter Zeit.
// Ein leeres erwartetes Token stimmt nie.
func Equal(got, want string) bool {
if want == "" {
return false
}
g, w := sha256.Sum256([]byte(got)), sha256.Sum256([]byte(want))
return subtle.ConstantTimeCompare(g[:], w[:]) == 1
}
@@ -27,7 +27,6 @@ func (s *stubProvider) Embed(ctx context.Context, req provider.EmbeddingRequest)
return provider.EmbeddingResponse{}, nil
}
// AK1: Konfidenz wird je Vorschlag mitgeliefert.
func TestSuggest_ReturnsConfidencePerSuggestion(t *testing.T) {
p := &stubProvider{response: `[{"tag":"rechnung","confidence":0.9,"reasoning":"enthaelt rechnungsnummer"},{"tag":"steuer","confidence":0.4,"reasoning":"erwaehnt umsatzsteuer"}]`}
@@ -7,7 +7,7 @@ import (
"testing"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newStore(t *testing.T) *Store {
-62
View File
@@ -1,62 +0,0 @@
// Package testdb liefert Integrationstests einen Pool auf ein eigenes,
// frisch angelegtes Schema (search_path = Schema, public). Tabellen, die ein
// Test per CREATE TABLE anlegt, entstehen damit nur in diesem Schema; Pakete,
// Laeufe und parallele Checkouts teilen sich keine Tabellen mehr.
package testdb
import (
"context"
"fmt"
"sync/atomic"
"testing"
"time"
"github.com/jackc/pgx/v5/pgxpool"
)
var seq atomic.Int64
// Pool legt ein Schema an und liefert einen darauf ausgerichteten Pool;
// beides wird per t.Cleanup wieder entfernt.
func Pool(t testing.TB, dsn string) *pgxpool.Pool {
t.Helper()
pool, _ := PoolWithSchema(t, dsn, nil)
return pool
}
// PoolWithSchema wie Pool, zusaetzlich mit dem Schemanamen und der
// Moeglichkeit, die Verbindungskonfiguration anzupassen.
func PoolWithSchema(t testing.TB, dsn string, adjust func(*pgxpool.Config)) (*pgxpool.Pool, string) {
t.Helper()
ctx := context.Background()
admin, err := pgxpool.New(ctx, dsn)
if err != nil {
t.Fatalf("testdb: verbindung: %v", err)
}
schema := fmt.Sprintf("connecttest_%d_%d", time.Now().UnixNano(), seq.Add(1))
if _, err := admin.Exec(ctx, "CREATE SCHEMA "+schema); err != nil {
admin.Close()
t.Fatalf("testdb: schema anlegen: %v", err)
}
cfg, err := pgxpool.ParseConfig(dsn)
if err != nil {
admin.Close()
t.Fatalf("testdb: dsn: %v", err)
}
cfg.ConnConfig.RuntimeParams["search_path"] = schema + ",public"
if adjust != nil {
adjust(cfg)
}
pool, err := pgxpool.NewWithConfig(ctx, cfg)
if err != nil {
admin.Close()
t.Fatalf("testdb: pool: %v", err)
}
t.Cleanup(func() {
pool.Close()
_, _ = admin.Exec(context.Background(), "DROP SCHEMA "+schema+" CASCADE")
admin.Close()
})
return pool, schema
}
@@ -30,9 +30,9 @@ type Thread struct {
// Result ist die Zusammenfassung eines Threads.
type Result struct {
Summary string
MessageCount int
LastMessageID string
Summary string
MessageCount int
LastMessageID string
}
// Options steuert die Zusammenfassung.
+1 -1
View File
@@ -11,8 +11,8 @@ import (
"github.com/jackc/pgx/v5/pgxpool"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/ai/internal/vectorindex"
"gitea.perlbach24.de/scripte/nexarch/common/testdb"
)
func newPool(t *testing.T) *pgxpool.Pool {
+92
View File
@@ -0,0 +1,92 @@
# Archive-Kanban – lokal abarbeiten
40 Arbeitskacheln · 5 Epics · 93 Personentage · 7 Wellen (inkl. Welle 7: Threat-Model-Nachtrag 2026-09-12 — RET-11, RET-12, BAK-09, BAK-10).
Hinweis: Dieses Board ist die alleinige Quelle für Aufbewahrung/WORM/Compliance/Backup. DMS-Board und Mail-Board referenzieren dieses Board extern in der Ausgangslage betroffener Tickets, statt eigene Retention-Logik zu implementieren.
Stand: 2026-08-26
## Weg 1 – Sofort loslegen (empfohlen)
`kanban.html` per Doppelklick im Browser öffnen. Kein Server, kein Internet, keine Installation.
- Kacheln per Drag & Drop zwischen Backlog → Bereit → In Arbeit → Prüfung → Fertig ziehen
- Der Stand wird im Browser gespeichert (localStorage) und bleibt nach dem Schließen erhalten
- Filter nach Epic, Rolle, Welle, Volltext sowie „Nur startbare“ (alle Vorgänger auf Fertig)
- Klick auf eine Kachel öffnet Details inkl. vollem Bau-Prompt und „Prompt kopieren“
- „Stand sichern“ exportiert den aktuellen Status als CSV
Hinweis: Der Stand hängt an Browser und Profil. Für Teamarbeit Weg 2 oder 3 nutzen.
## Weg 2 – Import in ein vorhandenes Werkzeug
`board.csv` (UTF-8 mit BOM, Komma-getrennt) importieren:
| Werkzeug | Weg |
| --- | --- |
| Trello | Board → Menü → Mehr → CSV importieren (Power-Up) |
| Jira | Einstellungen → System → Externes Importieren → CSV, Spalte „Status“ auf den Workflow mappen |
| GitHub Projects | Projekt → … → Import, oder per `gh` CLI aus `board.json` |
| Notion | Datenbank → … → Merge with CSV |
| Linear / Asana / ClickUp | jeweils CSV-Import, Spalten wie oben zuordnen |
Spalten: Code, Titel, Epic, Rolle, Komplexitaet, Aufwand_PT, Welle, Status, Technik,
Beschreibung, Haengt_ab_von, Schaltet_frei, Akzeptanzkriterien, Pruefungen.
## Weg 3 – Dateibasiert in der Entwicklungsumgebung
Der Ordner `tickets/` enthält für jede Kachel eine Markdown-Datei (`RET-01.md` …).
Jede Datei ist ein vollständiger Bau-Prompt – Auftrag, Produkt-DNA, Ausgangslage,
Akzeptanzkriterien, Prüfungen und Abschlussregeln.
- **Obsidian**: Ordner als Vault öffnen, Community-Plugin „Kanban“ installieren, Spalten anlegen und die Notizen einsortieren.
- **VS Code**: Ordner öffnen, Erweiterung „Todo Tree“ oder „Markdown Kanban“ nutzen.
- **Coding-Assistent**: Dateiöffnen, Inhalt kopieren, als Auftrag übergeben. Ein Prompt = eine Kachel = ein Branch.
## Weg 4 – Eigenes Board im Netzwerk (Team)
Selbst gehostet, jeweils mit CSV-Import:
```bash
# Focalboard
docker run -d -p 8000:8000 --name focalboard mattermost/focalboard
# Planka
docker run -d -p 3010:1337 --name planka ghcr.io/plankanban/planka:latest
# Vikunja
docker run -d -p 3456:3456 --name vikunja vikunja/vikunja
```
Danach `board.csv` importieren.
## Reihenfolge der Arbeit
Die Wellen geben an, was parallel laufen darf. Eine Kachel ist startbar,
sobald alle Kacheln unter „Hängt ab von“ auf Fertig stehen.
- **Welle 1** (5 Kacheln): RET-01, CMP-04, BAK-01, BAK-02, QA-01
- **Welle 2** (8 Kacheln): RET-02, RET-04, RET-05, CMP-01, CMP-02, BAK-03, BAK-05, BAK-07
- **Welle 3** (9 Kacheln): RET-03, RET-06, RET-07, CMP-03, CMP-05, BAK-04, BAK-06, ANA-01, QA-06
- **Welle 4** (5 Kacheln): CMP-06, ANA-02, ANA-03, QA-02, QA-04
- **Welle 5** (1 Kachel): QA-03
- **Welle 6** (1 Kachel): QA-05
Kritischer Pfad (16 PT): RET-01 → RET-02 → RET-03 → CMP-06 → QA-03 → QA-05
## Produkt-DNA
### Übernehmen
- **Alfresco**: Retention Policies mit Stichtagsberechnung, revisionssichere Ablage und Aufbewahrungssperre (Legal Hold).
- **Alfresco**: Vier-Augen-Prinzip bei Freigaben, insbesondere bei Löschungen.
- **ecoDMS**: Revisionssicherheit als Grundhaltung – unveränderliches Protokoll, nachvollziehbare Vernichtung.
- **restic/Borg**: Inkrementelle, deduplizierende Sicherung mit eingebauter Verifikation und routinemäßigem Restore-Test.
### Vermeiden
- **Alfresco – schwergewichtige Plattform mit hohem Ressourcenbedarf und trägem Betrieb.**: Schlanker Go-Dienst mit Postgres-Jobqueue statt Java-Anwendungsserver und zusätzlicher Message-Queue-Infrastruktur.
## Arbeitsregeln
Je Kachel ein eigener Branch, schrittweise committen, Branch pushen, dann anhalten.
Kein Merge und kein Deploy ohne ausdrückliche Freigabe.
Code-Struktur: Hauptdateien/Entry-Points klein halten, Fachlogik in eigene Module/Dateien auslagern. Vor dem Anlegen einer neuen Funktions-/Modul-Datei prüfen, ob dieselbe Funktionalität nicht schon in einem anderen Modul (auch modulübergreifend, z. B. Core) existiert — keine doppelten Funktionsdateien, ein Modul/Board referenziert das andere extern statt Code zu kopieren (gleiches Prinzip wie bei den Konsolidierungen IAM/Archive/Workflow/AI/API/UI-Shell, siehe nexarch-state.json).
+247
View File
@@ -0,0 +1,247 @@
Code,Titel,Epic,Rolle,Komplexitaet,Aufwand_PT,Welle,Status,Technik,Beschreibung,Haengt_ab_von,Schaltet_frei,Akzeptanzkriterien,Pruefungen
RET-01,Generisches Retention-Objektmodell,⏳ Retention & WORM,Backend,Mittel,3,1,Fertig,"PostgreSQL, pgx/v5, SQL-Migrationen (kein ORM)","Generisches Datenmodell für aufbewahrungspflichtige Objekte anlegen: Objekttyp, Objekt-Referenz (modulübergreifend über Adapter), Aufbewahrungsklasse, Status. Migrationen versioniert und rückrollbar.",,RET-02 RET-04 RET-05 CMP-01 CMP-02,"Objektmodell bildet beliebige Objekttypen aus DMS und Mail ab, ohne modulspezifische Spalten
Aufbewahrungsklasse ist je Objekt eindeutig zugeordnet und historisierbar
Migration läuft gegen leere Datenbank durch und ist rückrollbar","Migration vorwärts und rückwärts getestet
Testobjekt aus fiktivem DMS- und Mail-Adapter beide korrekt abgebildet
Tenant-Isolation der Kern-Tabellen durch Negativtest belegt"
RET-02,Aufbewahrungsfristen-Engine,⏳ Retention & WORM,Backend,Mittel,3,2,Fertig,"PostgreSQL, Postgres-Jobqueue (geplante Jobs statt Redis)","Fristenmodell je Aufbewahrungsklasse mit Stichtagsberechnung (Beginn, Dauer, Ablaufdatum) und periodischem Job, der ablaufende Objekte ermittelt.",RET-01,RET-03 RET-06 RET-07,"Frist wird je Aufbewahrungsklasse konfiguriert und auf jedes zugeordnete Objekt angewendet
Stichtag wird korrekt aus Beginn- und Dauerangabe berechnet, inklusive Kalenderfällen (Schaltjahr, Monatsende)
Periodischer Job liefert Liste ablaufender Objekte je Tenant","Fristberechnung an Referenzdaten mit bekannten Ablaufdaten geprüft
Job liefert bei leerem Bestand ein leeres, nicht fehlerhaftes Ergebnis
Mehrfachausführung des Jobs erzeugt keine doppelten Einträge"
RET-03,Löschworkflow & Aufbewahrungssperre (Legal Hold),⏳ Retention & WORM,Backend,Mittel,3,3,Fertig,"PostgreSQL, transaktionaler Zustandswechsel","Löschworkflow für abgelaufene Objekte: Freigabe, Vernichtung, Protokolleintrag. Aufbewahrungssperre (Legal Hold) verhindert jede Löschung unabhängig vom Fristablauf.",RET-02,CMP-06 QA-02 CMP-07 QA-07,"Ablauf der Frist löst einen Freigabeprozess aus, keine automatische Sofortlöschung
Aufbewahrungssperre verhindert Löschung auch bei abgelaufener Frist, mit Begründungspflicht beim Setzen
Jede Vernichtung erzeugt einen unveränderlichen Protokolleintrag mit Zeitpunkt und ausführender Person","Objekt mit aktiver Sperre widersteht einem direkten Löschversuch
Protokolleintrag nach Vernichtung ist nachträglich nicht änderbar (DB-Constraint oder Trigger)
Aufheben einer Sperre ist selbst protokolliert"
RET-04,WORM-Speicher-Garantie (Append-only),⏳ Retention & WORM,Backend,Mittel,3,2,Fertig,"Objekt-Storage-Anbindung, Append-only-Schreibpfad","Speicherpfad für archivierte Objektinhalte, der nach dem Schreiben keine Änderung und kein Überschreiben mehr zulässt (Write Once, Read Many).",RET-01,QA-02 RET-11,"Einmal geschriebener Objektinhalt kann nicht überschrieben werden
Loeschung ist ausschliesslich ueber den kontrollierten Loeschworkflow moeglich, nicht ueber die Go-API dieses Pakets (keine Delete-Funktion) - struktureller Schutz auf Anwendungsebene, kein absoluter Schutz gegen root-OS-Zugriff
Prüfsumme je Objekt wird beim Schreiben erzeugt und bei jedem Lesezugriff verglichen","Direkter Überschreibversuch am Speicherpfad wird abgewiesen
Prüfsummenabgleich erkennt eine manipulierte Testdatei zuverlässig
Loeschung ist ueber die Go-API des Pakets technisch unmoeglich (keine Delete-Funktion vorhanden), nicht nur per Konvention verboten"
RET-05,Modul-Adapter-Schnittstelle (DMS/Mail registrieren Objekttypen),⏳ Retention & WORM,Backend,Mittel,3,2,Fertig,"REST-Schnittstelle, Registrierungs-API","Schnittstelle, über die DMS und Mail ihre Objekttypen (Dokument, Mail, Anhang) und die zugehörige Aufbewahrungsklasse bei Archive registrieren, statt eigene Retention-Logik zu bauen.",RET-01,CMP-03 ANA-01 CMP-07 QA-07 RET-12,"Modul kann einen Objekttyp mit Aufbewahrungsklasse und Rückruf-Adresse für Löschbestätigung registrieren
Archive ruft das registrierte Modul beim Vernichten des Objekts zurück, statt selbst Modul-Interna zu kennen
Registrierung ist idempotent und mandantenfähig","Zwei fiktive Module (DMS, Mail) parallel registriert ohne Kollision
Rückruf bei Vernichtung erfolgreich gegen einen Testendpunkt ausgeführt
Erneute Registrierung desselben Objekttyps ändert nichts am bestehenden Zustand"
RET-06,Aufbewahrungsfristen-Konfigurationsoberfläche,⏳ Retention & WORM,Frontend,Mittel,3,3,Fertig,Next.js/React/TypeScript,"Next.js/React-Oberflaeche zur Pflege von Aufbewahrungsklassen und Fristen je Objekttyp und Tenant, inklusive Vorschauliste bald ablaufender Objekte. Backend-API bereits fertig (RET-06-API), RBAC-Provisorium darin durch RET-08 auf echtes RBAC-06 migriert - dieses Ticket ist reiner Frontend-Scope.",RET-02 RET-06-API RET-08,QA-02,"Aufbewahrungsklasse mit Frist lässt sich anlegen, ändern und deaktivieren
Vorschauliste zeigt in den nächsten 30 Tagen ablaufende Objekte
Änderungen an Fristen sind nur berechtigten Rollen zugänglich","Änderung einer Frist wirkt sich nur auf künftige Berechnungen aus, nicht rückwirkend auf bereits protokollierte Vernichtungen
Nicht berechtigte Rolle erhält keinen Zugriff auf die Konfiguration
Vorschauliste stimmt mit dem Ergebnis des periodischen Jobs überein"
RET-07,Fristablauf-Benachrichtigungen,⏳ Retention & WORM,Backend,Einfach,2,3,Fertig,Kopplung an Core CFG-02 (Benachrichtigungs-Dispatcher),"Benachrichtigung verantwortlicher Personen vor Ablauf einer Aufbewahrungsfrist, konfigurierbarer Vorlauf je Aufbewahrungsklasse. Der eigentliche Versand läuft ausschließlich über den zentralen Core-Benachrichtigungs-Dispatcher (CFG-02), erreichbar über den HTTP-Wrapper CFG-05 (Archive kann internal/notifyprefs nicht direkt importieren) – Archive erzeugt nur das Ereignis, versendet keine E-Mail selbst. Empfaenger ist eine konfigurierte zustaendige Rolle (Tenant-Admin), kein Objekt-Owner — RET-01 fuehrt bewusst keine Owner-Beziehung.",RET-02 CFG-05,QA-02,"Benachrichtigung wird im konfigurierten Vorlauf vor Fristablauf als Ereignis an Core CFG-02 (ueber CFG-05) uebergeben, adressiert an eine konfigurierte zustaendige Rolle (Tenant-Admin), nicht selbst versendet
Mehrfachversand derselben Benachrichtigung wird verhindert
Benachrichtigung lässt sich je Aufbewahrungsklasse ein- und ausschalten","Testfrist mit kurzem Vorlauf löst genau eine Benachrichtigung aus
Deaktivierte Benachrichtigung verschickt nachweislich nichts
Fehlgeschlagener Versand wird protokolliert und nicht stillschweigend verworfen"
CMP-01,GoBD-Verfahrensdokumentation,⚖️ Compliance & eDiscovery,Backend,Mittel,3,2,Fertig,"PDF-Export, versionierte Dokumentvorlage","Exportierbare Verfahrensdokumentation gemäß GoBD: Beschreibung der Aufbewahrungs-, Zugriffs- und Löschverfahren, automatisch aus der aktuellen Konfiguration erzeugt.",RET-01,CMP-05 QA-03,"Dokumentation wird automatisiert aus der aktuellen Retention-Konfiguration erzeugt, nicht manuell gepflegt
Export liegt als versioniertes PDF mit Erzeugungsdatum vor
Änderung an Aufbewahrungsklassen spiegelt sich in der nächsten Erzeugung wider","Erzeugtes Dokument enthält alle aktiven Aufbewahrungsklassen mit Fristen
Zwei aufeinanderfolgende Exporte ohne Konfigurationsänderung sind inhaltlich identisch
Export einer zweiten Person als GoBD-tauglich nachvollzogen"
CMP-02,DSGVO-/Datenschutz-Berichte,⚖️ Compliance & eDiscovery,Backend,Mittel,3,2,Fertig,PDF/CSV-Export,"Berichte für Auskunftsersuchen, Verarbeitungsübersichten und Zugriffsnachweise je betroffener Person und Tenant.",RET-01,CMP-05 CMP-07,"Auskunftsbericht listet alle gespeicherten Objekte einer betroffenen Person mit Aufbewahrungsklasse
Verarbeitungsübersicht zeigt Zweck und Rechtsgrundlage je Objekttyp
Export ist mandantenscharf und enthält keine Daten anderer Tenants","Auskunftsbericht für Testperson mit bekanntem Datenbestand stimmt mit erwarteter Liste überein
Bericht für einen Tenant enthält keine Objekte eines anderen Tenants
Export lässt sich als CSV weiterverarbeiten"
CMP-03,eDiscovery-Suche & Export (modulübergreifend),⚖️ Compliance & eDiscovery,Backend,Komplex,4,3,Fertig,"Modulübergreifende Such-API, ZIP-Export mit Prüfsummen","Suche über registrierte Objekttypen aus DMS und Mail hinweg für Rechtsverfahren, mit vollständigem, prüfsummengesichertem Export der Treffer.",RET-05,QA-03,"Suche liefert Treffer aus mehreren registrierten Modulen in einer gemeinsamen Ergebnisliste
Export enthält Originalobjekte, Metadaten und eine Prüfsummenliste je Datei
Suchlauf und Export werden als eigener Vorgang protokolliert (wer, wann, welche Kriterien)","Testsuche über zwei fiktive Module liefert erwartete kombinierte Trefferzahl
Prüfsumme jeder exportierten Datei stimmt nach Entpacken überein
Protokolleintrag zum Suchlauf ist nachträglich nicht veränderbar"
CMP-04,Audit-Trail-Kopplung an Core-Audit-Log,⚖️ Compliance & eDiscovery,Backend,Einfach,2,1,Fertig,REST-Anbindung an NEXARCH Core Audit-Log,"Alle sicherheitsrelevanten Vorgänge in Archive (Fristsetzung, Sperre, Löschung, Export) werden an das zentrale Audit-Log in NEXARCH Core gemeldet, statt ein eigenes Protokoll zu führen.",AUD-01,QA-03,"Jeder sicherheitsrelevante Vorgang erzeugt einen Eintrag im zentralen Audit-Log
Eintrag enthält Tenant, handelnde Person, Vorgang und Zeitstempel
Ausfall des Audit-Log-Dienstes blockiert nicht den Fachvorgang, wird aber sichtbar nachgemeldet","Testvorgänge (Sperre setzen, Löschung, Export) erzeugen je einen nachvollziehbaren Audit-Eintrag
Simulierter Ausfall des Audit-Dienstes verhindert nicht die Fachfunktion
Nachmeldung nach Ausfallende ist vollständig, keine Lücke im Protokoll"
CMP-05,Compliance-Berichts-Oberfläche,⚖️ Compliance & eDiscovery,Frontend,Mittel,3,3,Fertig,Next.js/React/TypeScript,"Oberfläche zum Anfordern, Einsehen und Herunterladen von GoBD-Verfahrensdokumentation und DSGVO-Berichten je Tenant.",CMP-01 CMP-02,QA-03,"Berichte lassen sich mit wenigen Klicks anfordern und herunterladen
Nur berechtigte Rollen sehen Berichte anderer Personen ein
Historie angeforderter Berichte ist je Tenant einsehbar","Anforderung eines Berichts löst den zugehörigen Backend-Export korrekt aus
Nicht berechtigte Rolle erhält keinen Zugriff auf fremde Berichte
Downloadlink eines abgelaufenen Berichts wird abgewiesen"
CMP-06,Vier-Augen-Freigabe für Löschungen,⚖️ Compliance & eDiscovery,Backend,Mittel,3,4,Fertig,"PostgreSQL mit FOR UPDATE-Lock, Timing-safe Vergleich","Löschung abgelaufener Objekte erfordert eine zweite, unabhängige Bestätigung durch eine andere Person, bevor der Löschworkflow ausgeführt wird.",RET-03,QA-03 CMP-07,"Löschung wird erst nach zweiter Bestätigung durch eine von der anfordernden Person verschiedene Rolle ausgeführt
Gleichzeitige Bestätigungsversuche führen nicht zu doppelter Ausführung
Löschbestätigung wird mit einem geheimen, zeitlich begrenzten Bestätigungs-Token abgesichert","Zwei parallele Bestätigungsanfragen auf dasselbe Objekt: genau eine Löschung wird ausgeführt (Lock-Test)
Bestätigung durch dieselbe Person wie die Anforderung wird abgewiesen
Vergleich des Bestätigungs-Tokens erfolgt zeitkonstant und ist gegen Timing-Angriffe getestet"
BAK-01,Datenbank-Backup-Strategie,💾 Backup & Wiederherstellung,Backend,Mittel,3,1,Fertig,"PostgreSQL (pg_dump/pg_basebackup), inkrementelle Sicherung","Automatisierte, inkrementelle Sicherung der PostgreSQL-Datenbank mit Aufbewahrung mehrerer Generationen und Verifikation jeder Sicherung.",,BAK-03 BAK-05 BAK-07 BAK-09,"Vollsicherung und inkrementelle Sicherung laufen automatisiert nach Zeitplan
Jede Sicherung wird nach Abschluss auf Lesbarkeit verifiziert, nicht nur auf Erstellung geprüft
Mehrere Sicherungsgenerationen werden nach konfigurierbarer Regel vorgehalten und alte automatisch entfernt","Sicherung gegen Testdatenbank erfolgreich erstellt und verifiziert
Verifikation erkennt eine absichtlich beschädigte Sicherungsdatei
Rotationsregel entfernt nachweislich nur die ältesten Generationen"
BAK-02,Objekt-Storage-Backup/Snapshots,💾 Backup & Wiederherstellung,Backend,Mittel,3,1,Fertig,"Objekt-Storage-Snapshots, inkrementell und deduplizierend","Automatisierte, deduplizierende Sicherung der im Objekt-Storage abgelegten Dateiinhalte, angelehnt an das restic/Borg-Sicherungskonzept.",,BAK-03 BAK-05 BAK-07 BAK-09,"Sicherung erfasst neue und geänderte Objekte inkrementell, ohne unveränderte Objekte erneut zu übertragen
Sicherung ist deduplizierend, identische Inhalte werden nur einmal gespeichert
Jede Sicherung lässt sich einzeln auf Vollständigkeit prüfen","Zweiter Sicherungslauf nach unverändertem Bestand überträgt keine Daten erneut
Zwei identische Testdateien belegen nachweislich nur einmal Speicherplatz
Vollständigkeitsprüfung erkennt ein fehlendes Objekt in der Sicherung"
BAK-03,Restore-Verfahren,💾 Backup & Wiederherstellung,Backend,Mittel,3,2,Fertig,Atomarer Restore über temporäres Verzeichnis,"Dokumentiertes, wiederholbares Verfahren zur Wiederherstellung von Datenbank und Objekt-Storage aus einer Sicherung, für Notfall wie für Einzelobjekt-Restore.",BAK-01 BAK-02,BAK-04 BAK-06,"Restore stellt Datenbank und Objekt-Storage aus einer gewählten Sicherungsgeneration wieder her
Restore in ein nicht-leeres Zielverzeichnis beschädigt den bestehenden Inhalt nicht, solange der Vorgang nicht bestätigt wird
Restore-Vorgang wird protokolliert (Quelle, Zeitpunkt, Ergebnis)","Restore auf leerem System vollständig und erfolgreich durchgeführt
Restore auf nicht-leeres Zielverzeichnis lässt bei Abbruch den ursprünglichen Inhalt unverändert
Protokolleintrag zum Restore ist vollständig und nachvollziehbar"
BAK-04,Tenant-Backup & -Restore (einzelner Mandant),💾 Backup & Wiederherstellung,Backend,Mittel,3,3,Fertig,Tenant-scharfer Export/Import auf Basis von BAK-03,"Sicherung und Wiederherstellung der Daten eines einzelnen Mandanten, ohne andere Mandanten zu berühren – etwa für Mandanten-Umzug oder isolierte Notfallwiederherstellung.",BAK-03,QA-04,"Sicherung eines Tenants enthält ausschließlich dessen Daten aus Datenbank und Objekt-Storage
Wiederherstellung eines Tenants verändert keine Daten anderer Tenants
Tenant-Sicherung lässt sich unabhängig vom Gesamt-Backup planen und ausführen","Sicherung von Tenant A enthält keine Datensätze von Tenant B (Stichprobe)
Wiederherstellung von Tenant A in eine Testumgebung verändert Tenant B dort nicht
Tenant-Sicherung und -Restore vollständig protokolliert"
BAK-05,Reconciliation (Konsistenzprüfung Storage vs. DB),💾 Backup & Wiederherstellung,Backend,Mittel,3,2,Fertig,"Geplanter Abgleichs-Job, Postgres-Jobqueue","Periodische Prüfung, ob jeder in der Datenbank referenzierte Objekt-Storage-Eintrag tatsächlich existiert und umgekehrt, mit Bericht über Abweichungen.",BAK-01 BAK-02,QA-04,"Job erkennt Datenbankeinträge ohne zugehöriges Objekt im Storage
Job erkennt Objekte im Storage ohne zugehörigen Datenbankeintrag
Abweichungen werden berichtet, nicht automatisch stillschweigend behoben","Absichtlich entferntes Storage-Objekt wird vom Job als Abweichung erkannt
Absichtlich verwaister Datenbankeintrag wird vom Job als Abweichung erkannt
Lauf ohne Abweichungen liefert einen leeren, eindeutig als sauber erkennbaren Bericht"
BAK-06,Restore-Testverfahren,💾 Backup & Wiederherstellung,Backend,Einfach,2,3,Fertig,"Automatisierter, periodischer Restore-Test in Testumgebung","Regelmäßiger, automatisierter Testlauf des Restore-Verfahrens gegen eine isolierte Testumgebung, mit Ergebnisprotokoll als Nachweis der Wiederherstellbarkeit.",BAK-03,QA-04 BAK-10,"Testlauf führt einen vollständigen Restore in eine isolierte Testumgebung durch
Ergebnis (erfolgreich/fehlgeschlagen) wird mit Zeitstempel protokolliert
Fehlgeschlagener Testlauf löst eine sichtbare Warnung aus","Geplanter Testlauf gegen aktuelle Sicherung erfolgreich durchgeführt und protokolliert
Absichtlich beschädigte Sicherung lässt den Testlauf sichtbar fehlschlagen
Protokollhistorie zeigt mehrere zurückliegende Testläufe nachvollziehbar an"
ANA-01,Kennzahlen-Aggregation (modulübergreifend),📊 Kennzahlen & Reporting,Backend,Mittel,3,3,Fertig,Aggregations-Job über registrierte Module,"Zentraler Dienst, der Kennzahlen (Objektbestand, Aufbewahrungsstatus, Löschvorgänge, Speichervolumen) aus allen über RET-05 registrierten Modulen aggregiert.",RET-05,ANA-02 ANA-03 QA-05,"Kennzahlen werden je Tenant und Modul sowie modulübergreifend aggregiert
Aggregation läuft periodisch und liefert konsistente Werte über einen Zeitverlauf
Neues registriertes Modul wird ohne Codeänderung in die Aggregation einbezogen","Aggregation über zwei fiktive Module liefert korrekte Summen- und Einzelwerte
Wiederholte Aggregation ohne Datenänderung liefert stabile Ergebnisse
Neu registriertes drittes Testmodul erscheint automatisch in der nächsten Aggregation"
ANA-02,Auswertungs-Dashboard,📊 Kennzahlen & Reporting,Frontend,Mittel,3,4,Fertig,Next.js/React/TypeScript,"Dashboard zur Visualisierung der aggregierten Kennzahlen mit Filtern nach Tenant, Modul und Zeitraum.",ANA-01,QA-05,"Dashboard zeigt Bestands-, Aufbewahrungs- und Löschkennzahlen je Tenant
Filter nach Modul und Zeitraum funktionieren kombinierbar
Dashboard lädt auch bei großem Datenbestand in angemessener Zeit","Filterkombination liefert dieselben Werte wie eine direkte Abfrage der Aggregation
Dashboard mit synthetisch großem Testbestand bleibt bedienbar
Rollen ohne Berechtigung sehen keine Kennzahlen fremder Tenants"
ANA-03,Lizenz-/Nutzungs-Reports,📊 Kennzahlen & Reporting,Backend,Einfach,2,4,Fertig,CSV/PDF-Export,"Bericht über Nutzung und Lizenzrelevantes je Tenant (Speichervolumen, aktive Objekte, Nutzeranzahl-Bezug), abgestimmt mit dem Lizenzmodell aus NEXARCH Core.",ANA-01,QA-05,"Bericht zeigt lizenzrelevante Nutzungswerte je Tenant für einen wählbaren Zeitraum
Werte stimmen mit der zugrunde liegenden Kennzahlen-Aggregation überein
Export ist als CSV und PDF verfügbar","Bericht für Testzeitraum stimmt mit manuell nachgerechneten Werten überein
Export in beiden Formaten enthält identische Kernwerte
Bericht für Tenant ohne Aktivität liefert nachvollziehbar leere/Null-Werte statt Fehler"
QA-01,Teststrategie Archive,✅ Prüfungen & Qualitätssicherung,Backend,Einfach,2,1,Fertig,"Testplan-Dokument, Testdatensatz-Konzept","Teststrategie für das Archive-Board festlegen: Testebenen, Referenzdatensatz für Retention/WORM/Backup, Verantwortlichkeiten je Prüfgate.",,,"Teststrategie benennt Testebenen (Unit, Integration, Wiederherstellungstest) und deren Verantwortliche
Referenzdatensatz für Retention- und Backup-Tests ist definiert und wiederverwendbar
Strategie ist als Dokument abgelegt und von zweiter Person gegengelesen
Pflichttests für sicherheitsrelevanten Code (Tenant-Scoping, Zugriffsprüfung, Auth-nahe Logik) sind als verbindliches Merge-Gate verankert – kein Merge auf solchen Code ohne Test, analog Core QA-01","Referenzdatensatz lässt sich reproduzierbar in einer Testumgebung aufsetzen
Zweite Person bestätigt schriftlich die Nachvollziehbarkeit der Strategie
Strategie deckt erkennbar alle folgenden Prüfgates ab (Abgleich mit QA-02 bis QA-05)"
QA-02,Prüfgate Retention & WORM,✅ Prüfungen & Qualitätssicherung,Backend,Einfach,2,4,Fertig,Abnahmeprotokoll,"Prüfgate für Fristenengine, Löschworkflow, Aufbewahrungssperre und WORM-Garantie vor Freigabe der Retention-Funktionen.",RET-04 RET-03 RET-06 RET-07,QA-05,"Alle Akzeptanzkriterien von RET-03 und RET-04 sind gegen den Referenzdatensatz nachgewiesen
Versuch, eine gesperrte oder WORM-geschützte Ablage zu umgehen, scheitert nachweislich
Protokoll mit Zielwert, Messwert und Bewertung ist abgelegt","Löschversuch an gesperrtem Objekt schlägt fehl (Wiederholung des RET-03-Tests unter Prüfgate-Bedingungen)
Überschreibversuch am WORM-Speicher schlägt fehl (Wiederholung des RET-04-Tests unter Prüfgate-Bedingungen)
Offene Restrisiken sind schriftlich benannt"
QA-03,Prüfgate Compliance & eDiscovery,✅ Prüfungen & Qualitätssicherung,Backend,Einfach,2,5,Fertig,Abnahmeprotokoll,Prüfgate für eDiscovery-Export und Vier-Augen-Freigabe vor Freigabe der Compliance-Funktionen.,CMP-03 CMP-06 CMP-07 CMP-01 CMP-04 CMP-05,QA-05,"eDiscovery-Export wird gegen den Referenzdatensatz erneut durchgeführt und geprüft
Vier-Augen-Freigabe wird mit zwei unabhängigen Testrollen erneut nachgewiesen
Protokoll mit Zielwert, Messwert und Bewertung ist abgelegt","Export-Prüfsummen stimmen bei wiederholtem Testlauf erneut überein
Löschversuch durch dieselbe Person ohne zweite Bestätigung scheitert erneut
Offene Restrisiken sind schriftlich benannt"
QA-04,Prüfgate Backup & Restore,✅ Prüfungen & Qualitätssicherung,Backend,Einfach,2,4,Fertig,"Abnahmeprotokoll, realer Wiederherstellungstest","Prüfgate für Backup-Strategie und Restore-Verfahren vor Freigabe der Backup-Funktionen, inklusive einem real durchgeführten Wiederherstellungstest.",BAK-06 BAK-04 BAK-05 BAK-07,QA-05,"Restore wird real auf ein leeres Testsystem durchgeführt und dokumentiert
Reconciliation nach Restore zeigt keine Abweichungen zwischen Storage und Datenbank
Protokoll mit Zielwert, Messwert und Bewertung ist abgelegt","Realer Restore-Testlauf erfolgreich und protokolliert
Reconciliation nach dem Testlauf liefert einen sauberen Bericht
Offene Restrisiken sind schriftlich benannt"
QA-05,Abnahme- & Compliance-Prüfung Archive,✅ Prüfungen & Qualitätssicherung,Backend,Einfach,2,6,Fertig,Abnahmeprotokoll,"Gesamtabnahme des Archive-Boards vor Freigabe: Retention/WORM, Compliance/eDiscovery und Backup/Restore müssen alle bestanden sein.",QA-02 QA-03 QA-04 QA-06 QA-07 ANA-01 ANA-02 ANA-03 BAK-08,,"Alle drei fachlichen Prüfgates (QA-02, QA-03, QA-04) sind bestanden
Gesamtprotokoll fasst alle drei Prüfgates mit Ergebnis zusammen
Abnahmeprotokoll ist unterzeichnet","Zusammenfassung aller drei Prüfgates gegen die jeweiligen Einzelprotokolle abgeglichen
Offene Restrisiken aus allen drei Gates sind konsolidiert und schriftlich benannt
Freigabeentscheidung ist dokumentiert"
QA-06,Schnittstellen-Vertragstests,✅ Prüfungen & Qualitätssicherung,Backend,Mittel,3,3,Fertig,"Vertragstests (Consumer-Driven Contracts), CI-Pipeline","Vertragstests für die Modul-Adapter-Schnittstelle (RET-05), über die DMS und Mail Objekte bei der Retention-Engine registrieren – Breaking Changes müssen automatisiert erkannt werden, bevor sie ein konsumierendes Modul stillschweigend bricht.",RET-05,QA-05,"Vertragstests decken RET-05 vollständig ab
Absichtlich brechender Schema-Wechsel lässt Tests fehlschlagen
Tests laufen automatisiert in der CI","Testlauf gegen aktuellen Stand grün
Simulierte Breaking Change erkannt
CI-Integration nachgewiesen"
BAK-07,Aufbewahrungsfrist für Backup-Snapshots,💾 Backup & Wiederherstellung,Backend,Mittel,3,2,Fertig,"PostgreSQL, Postgres-Jobqueue (geplante Jobs statt Redis)","Eigene, von der Dokumenten-Retention (RET-02) unabhängige Aufbewahrungsfrist für Backup-Snapshots selbst – nach restic/Borg-Vorbild eine Prune-Policy (z. B. tägliche Snapshots 14 Tage, wöchentliche 3 Monate, monatliche 1 Jahr – konkrete Staffelung als Konfiguration, nicht hart codiert), damit Backups nicht unbegrenzt wachsen, aber auch nicht zu früh gelöscht werden.",BAK-01 BAK-02,QA-04,"Backup-Snapshots folgen einer konfigurierbaren Prune-Policy (Staffelung nach Alter), unabhängig von RET-02
Snapshot-Löschung nach Ablauf der Frist läuft automatisiert
Eine gültige, nicht abgelaufene Aufbewahrungssperre auf einem Dokument (RET-03/CMP-06) verhindert nicht das Pruning älterer Backup-Snapshots, solange mindestens ein aktueller Snapshot das Dokument noch enthält","Prune-Test mit simulierten Snapshots über mehrere Altersstufen ergibt korrekte Staffelung
Automatisierte Löschung abgelaufener Snapshots im Test nachgewiesen
Legal-Hold-Test bestätigt, dass Pruning nicht mit Dokumenten-Retention kollidiert"
CMP-07,"DSGVO-Löschantrag (Recht auf Löschung, Art. 17)",⚖️ Compliance & eDiscovery,Backend,Mittel,4,4,Fertig,"PostgreSQL, transaktionaler Zustandswechsel, Modul-Adapter-Schnittstelle (RET-05)","Workflow für den Löschantrag einer betroffenen Person (Art. 17 DSGVO): modulübergreifende Suche (CMP-02), Löschung ohne Aufbewahrungspflicht, begründete Ablehnung mit Aufbewahrungspflicht, Freigabe über CMP-06, vollständiges Protokoll je Objekt.",RET-03 RET-05 CMP-02 CMP-06,QA-03,"Löschantrag findet über die Suche aus CMP-02 alle Objekte einer betroffenen Person, mandantenscharf
Jedes gefundene Objekt wird EINZELN entschieden: Löschung oder Ablehnung mit Begründung – niemals eine pauschale Sammelentscheidung
Tatsächliche Löschung durchläuft denselben Vier-Augen-Freigabeprozess wie jede andere Löschung (CMP-06), keine zweite Implementierung
Ergebnis des Löschantrags (je Objekt: gelöscht/abgelehnt+Grund) ist vollständig und dauerhaft protokolliert","Löschantrag für eine Testperson mit gemischtem Datenbestand liefert exakt eine Löschung und eine begründete Ablehnung
Aufbewahrungssperre (Legal Hold) verhindert die Löschung auch bei bereits abgelaufener regulärer Frist
Löschantrag für einen Tenant führt nachweislich zu keiner Aktion an Objekten eines anderen Tenants"
QA-07,Last- & Leistungstest,✅ Prüfungen & Qualitätssicherung,Backend,Mittel,3,6,Fertig,"Lastgenerator, Messprotokoll","Lasttest für Archive unter realistischer Last aus DMS und Mail gleichzeitig – insbesondere Retention-Prüfpfad (RET-03), Modul-Adapter-Registrierung (RET-05) und WORM-Schreibpfad unter Last.",RET-05 RET-03,QA-05,"Definierte Ziel-Latenz für die Retention-/Legal-Hold-Abfrage unter Last eingehalten
WORM-Schreibpfad bleibt unter simulierter Last aus zwei gleichzeitig zugreifenden Modulen (DMS und Mail) korrekt und ohne Datenverlust
Modul-Adapter-Registrierung (RET-05) verkraftet gleichzeitige Registrierung mehrerer Objekttypen ohne Race Condition","Lasttest mit simulierten parallelen Anfragen aus DMS und Mail durchgeführt, Ergebnis dokumentiert
WORM-Schreibpfad unter Last auf Datenverlust/Race Conditions geprüft
Gleichzeitige Registrierung mehrerer Objekttypen bei RET-05 getestet"
BAK-08,Checksum-basierte Objekt-Integritätsprüfung (Scrub-Job),💾 Backup & Wiederherstellung,Backend,Mittel,3,4,Fertig,"Postgres-Jobqueue (FDN-04), SHA-256-Stream-Prüfung, Meldung über Core OPS-05","Periodischer Job, der Stichproben gespeicherter Objekte herunterlädt, deren SHA-256 neu berechnet und mit der in file_revisions.checksum_sha256 (FDN-02) hinterlegten Prüfsumme vergleicht. Ergänzt BAK-05 (reine Existenzprüfung) um Inhalts-Integrität – deckt stille Korruption und Bit-Rot insbesondere auf extern eingebundenem, nicht selbst überwachtem S3-Storage auf.",BAK-05 FDN-04 FDN-09 OPS-05,,"Job zieht periodisch eine konfigurierbare Stichprobe gespeicherter Objekte, lädt sie, berechnet SHA-256 neu und vergleicht mit file_revisions.checksum_sha256 – Abweichung gilt als Befund
Sampling priorisiert alte, unveränderte Objekte (GoBD-Relevanz: still vergammelnde Bytes, die niemand mehr anfasst, fallen sonst erst beim Restore auf); Neu-Schreibvorgänge sind bereits beim Schreiben verifiziert und werden nicht bevorzugt geprüft
Befund wird gemeldet, nicht automatisch repariert – Meldung läuft über Core OPS-05 (Alerting) mit Objekt-Referenz, erwarteter vs. tatsächlicher Prüfsumme und Zeitpunkt
Job läuft über die Postgres-Jobqueue (FDN-04) mit konfigurierbarer Kadenz und Stichprobengröße; Lauf ist idempotent und unterbrechbar ohne inkonsistenten Zustand
Stichprobengröße und Kadenz sind je Betriebsstufe konfigurierbar, damit ein vollständiger Durchlauf über den Bestand in einem dokumentierten Zeitraum abgeschlossen wird (kein täglicher Voll-Download aller Objekte)
Der Job erkennt Abweichungen nur bei Objekten, die gelesen und erneut geprüft werden können. Er ersetzt keine storage-seitige WORM-/Versionierungsstrategie und keine Zugriffs-/Audit-Logs des Storage-Providers (siehe STORAGE-KONZEPT.md Abschnitt 6.1) — bei extern eingebundenem, nicht-kompatiblem Kunden-Storage (Betriebsmodus 3, ohne Versioning/Object Lock/Audit-Logs) bleibt eine Lücke, die BAK-08 technisch nicht schließen kann.","Testobjekt mit absichtlich manipuliertem Byte im Storage wird als Abweichung erkannt und gemeldet (Alert-Eingang über OPS-05 nachgewiesen)
Unverändertes Testobjekt erzeugt keinen Befund (kein False-Positive)
Verschlüsseltes Testobjekt (über FDN-09) wird korrekt gelesen und geprüft – der Job nutzt denselben Decrypt-Pfad wie reguläre Lesezugriffe, vergleicht also Klartext-Prüfsumme, nicht Chiffretext
Test gegen ein simuliertes externes S3-Ziel (nicht selbst überwacht): Korruption dort wird erkannt – genau der Fall, der sonst unsichtbar bleibt
Sampling-Statistik dokumentiert: Anteil alter vs. neuer Objekte in der Stichprobe entspricht der konfigurierten Priorisierung"
RET-06-API,Aufbewahrungsfristen-Konfigurations-Backend,⏳ Retention & WORM,Backend,Mittel,2,3,Fertig,"Go/net/http, PostgreSQL, provisorischer Rollen-Check (kein RBAC-02-HTTP-Wrapper vorhanden)","Backend-API fuer RET-06: Aufbewahrungsklassen anlegen/aendern/deaktivieren, Vorschauliste ablaufender Objekte. Aus RET-06 herausgeloest (Board-Entscheidung: Backend zuerst, Next.js-Frontend als eigenes Folgeticket), damit kein Pseudo-Frontend-Protokoll entsteht.",RET-02,RET-06,"Aufbewahrungsklasse mit Frist lässt sich per API anlegen, ändern und deaktivieren
API liefert Vorschauliste bald ablaufender Objekte, identisch zum periodischen Job
Änderungen an Fristen sind nur mit gültiger Rollen-Kennung zugänglich (provisorischer Check, echter RBAC-02-HTTP-Wrapper folgt als Core-Ticket)","Änderung einer Frist wirkt sich nur auf künftige Berechnungen aus, nicht rückwirkend
Fehlende/falsche Rollen-Kennung erhält 403, gültige Kennung 200 (Negativ- und Positivtest)
Vorschauliste stimmt mit dem Ergebnis des periodischen Jobs überein"
RET-08,RET-06-API auf RBAC-06 migrieren (Provisorium abbauen),⏳ Retention & WORM,Backend,Klein,1,4,Fertig,"Go, HTTP-Client","internal/retentionapi.RequireRole (Header-basiertes Provisorium aus RET-06-API) durch einen echten Aufruf von Core RBAC-06 (POST /authorize, service-token-authentifiziert) ersetzen. Baut das seit RET-06-API dokumentierte Provisorium ab, jetzt da RBAC-06 real existiert und deployed ist.",RBAC-06 RET-06-API,RET-06,"Der RBAC-Check in retentionapi nutzt ausschliesslich RBAC-06 (HTTP), nicht mehr das lokale Header-Provisorium
Bestehende Endpunkte (POST /retention-classes, POST /retention-classes/{class}/deactivate) verhalten sich funktional unveraendert (gleiche AC wie RET-06-API)
Fehlerfall: RBAC-06 nicht erreichbar oder verweigert -> Zugriff wird abgelehnt (fail closed), nicht stillschweigend erlaubt","403-Nachweis erfolgt gegen echte Policy-Rules ueber RBAC-06, nicht mehr nur gegen einen Header-Wert
Bestehende RET-06-API-Tests (Preview stimmt mit periodischem Job ueberein, Deaktivierung wirkt) laufen weiterhin gruen nach der Migration
Ausfall/Nichterreichbarkeit von RBAC-06 fuehrt zu einer Ablehnung (kein Fallback auf offenen Zugriff)"
RET-09,Modul-Adapter-Dienst starten (RET-05 als laufender HTTP-Endpunkt),⏳ Retention & WORM,Backend,Klein,1,5,Fertig,"Go, HTTP","archive/internal/moduleadapter.RegisterHandler (RET-05) existiert als fertiger Go-Handler, laeuft aber nirgends als Dienst. RET-09 startet ihn als eigenstaendigen HTTP-Dienst (main.go + systemd), OHNE neue Archive-Logik - reines Wiring, analog RBAC-06/CFG-05 fuer andere Module.",RET-05,DOC-16 ARC-11,"moduleadapter.RegisterHandler laeuft als eigenstaendiger, ueber systemd verwalteter HTTP-Dienst
Ein externer Client (anderes Modul) kann real POST /register gegen den laufenden Dienst aufrufen
Keine neue Autorisierungs- oder Registrierungslogik - reiner Start des bestehenden Handlers","Dienst startet und bleibt stabil (systemctl status aktiv)
Realer POST /register von einem externen Testclient gegen den laufenden Dienst liefert die erwartete Registrierung (idempotent, wie in RET-05 getestet)
Code-Review: keine Aenderung an moduleadapter.go/handler.go selbst, nur main.go+systemd neu"
RET-10,CORS für RET-06-API (Frontend-Zugriff aus dem Browser),⏳ Retention & WORM,Backend,Klein,1,5,Fertig,"Go, HTTP-Middleware (CORS)","retention-api (RET-06-API) setzt keine CORS-Header - ein echter Browser blockiert den Fetch von RET-06 (Next.js-Frontend, anderer Origin) zum Backend. Real per Sichtpruefung des laufenden RET-06-Frontends gefunden (curl umgeht CORS, Go-/Vitest-Tests pruefen nicht browserseitig), nicht durch die urspruenglichen RET-06/RET-06-API-Pruefungen erfasst.",RET-06-API,,"retention-api setzt Access-Control-Allow-Origin fuer den konfigurierten Frontend-Origin (Umgebungsvariable, kein Wildcard in Produktion)
Preflight-Anfragen (OPTIONS) werden korrekt beantwortet fuer POST/GET-Endpunkte
RET-06-Frontend kann alle vier Endpunkte real aus einem Browser-Kontext (nicht nur curl) erreichen","Realer Browser-Fetch (nicht curl) vom RET-06-Frontend gegen retention-api gelingt, Same-Origin-Policy nicht mehr blockierend
OPTIONS-Preflight liefert korrekte CORS-Header fuer POST /retention-classes
Fetch von einem NICHT konfigurierten Origin wird weiterhin blockiert (kein Wildcard-Leck)"
RET-11,Storage-seitige WORM-Durchsetzung (Object-Lock statt nur Anwendungslogik),⏳ Retention & WORM,Backend,Mittel,2,7,Fertig,"S3 Object Lock / Compliance-Mode, PostgreSQL, Go","RET-04 verhindert Änderung/Überschreiben archivierter Objektinhalte nach dem Schreiben, aber ohne explizite Festlegung, ob dies nur durch Anwendungscode (übersprungen bei direktem Storage-Zugriff) oder durch eine Storage-seitige Garantie (z. B. S3 Object Lock im Compliance-Mode) erzwungen wird. WORM-Objekte über die Object-Lock-Funktion des Storage-Backends selbst sperren, sodass auch ein Zugriff mit vollen Storage-Zugangsdaten unterhalb der Anwendung keine Änderung/Löschung vor Fristablauf erlaubt.",RET-04,,"Jedes WORM-Objekt wird beim Schreiben mit einer Storage-seitigen Object-Lock-Sperre bis zum Ablauf der Aufbewahrungsfrist versehen
Ein Löschversuch mit direkten Storage-Zugangsdaten (unterhalb der Anwendung) schlägt vor Fristablauf fehl, nachweislich durch das Storage-Backend selbst und nicht nur durch Anwendungscode
Nach Fristablauf und regulärer Freigabe (RET-03) ist das Objekt normal löschbar","Test: direkter Löschversuch über die Storage-API (nicht über die NEXARCH-Anwendung) auf ein gesperrtes Objekt schlägt fehl
Test: nach Fristablauf und Freigabe durch RET-03 ist die Löschung über den regulären Workflow möglich
Konfigurationsprüfung: Object-Lock/Compliance-Mode ist für den produktiven Bucket aktiviert, dokumentiert in der Betriebsanleitung"
RET-12,Unabhängige Tenant-Validierung bei Objekttyp-Registrierung durch DMS/Mail,⏳ Retention & WORM,Backend,Mittel,2,7,Fertig,"Service-Credentials (Core API-02), Tenant-Registry-Abgleich (Core TEN-01), Go","RET-05 nimmt Objekttyp- und Aufbewahrungsklassen-Registrierungen von DMS und Mail entgegen. Ohne unabhängige Prüfung würde Archive dem vom registrierenden Modul mitgelieferten Tenant-Kontext blind vertrauen. Jede Registrierung muss den mitgelieferten Tenant-Kontext gegen die Core-Registry (TEN-01) validieren, unabhängig vom Service-Credential-Scope des aufrufenden Moduls – Archive verlässt sich nicht allein auf die Angabe von DMS/Mail.",RET-05,,"Jede Objekttyp-/Aufbewahrungsklassen-Registrierung aus DMS/Mail wird gegen die Core-Registry auf Tenant-Gültigkeit geprüft, bevor sie übernommen wird
Eine Registrierung mit einem nicht existierenden oder falschem Tenant-Kontext wird abgelehnt und protokolliert
Bestehende, korrekte Registrierungsabläufe aus RET-05 funktionieren unverändert","Test: Registrierung mit gültigem, existierendem Tenant-Kontext wird übernommen
Test: Registrierung mit manipuliertem/fremdem Tenant-Kontext wird abgelehnt
Regressionstest: normaler DMS-/Mail-Registrierungsablauf bleibt funktionsfähig"
BAK-09,Envelope-Encryption für Backup-Snapshots (Datenbank & Objekt-Storage),💾 Backup & Wiederherstellung,Backend,Mittel,2,7,Fertig,"Envelope-Encryption (Tenant-KEK aus Core API-10), restic/Borg-artige Sicherung","BAK-01/BAK-02 sichern Datenbank und Objekt-Storage-Inhalte, ohne festzulegen, ob die Sicherungen selbst verschlüsselt sind. Archivierte Objekte sind live über die Tenant-KEK-Hierarchie (Core API-10) verschlüsselt – Backups dürfen kein schwächer geschütztes Abbild derselben Daten sein. Backup-Snapshots über denselben Tenant-KEK verschlüsseln wie die Live-Daten, sodass ein kompromittiertes Backup-Ziel ohne den jeweiligen Tenant-KEK keine verwertbaren Klartextdaten liefert.",BAK-01 BAK-02,,"Backup-Snapshots von Datenbank und Objekt-Storage sind mit dem Tenant-KEK des jeweiligen Mandanten verschlüsselt
Ein Zugriff auf das Backup-Ziel ohne den jeweiligen Tenant-KEK liefert keine verwertbaren Klartextdaten
Wiederherstellung (BAK-03/BAK-04) funktioniert unverändert unter Verwendung des korrekten Tenant-KEK","Test: Backup-Datei ohne Tenant-KEK ist nicht auswertbar (Stichprobe auf Klartext-Reste)
Restore-Test mit korrektem Tenant-KEK stellt die Daten vollständig wieder her
Test: Restore mit falschem/fremdem Tenant-KEK schlägt fehl, statt fremde Daten zu liefern"
BAK-10,Schutzniveau der Restore-Testumgebung (DSGVO-konform),💾 Backup & Wiederherstellung,Backend,Einfach,1,7,Fertig,"Isolierte Testumgebung, Zugriffskontrolle, Betriebsdokument","BAK-06 testet das Restore-Verfahren regelmäßig automatisiert gegen eine isolierte Testumgebung – diese enthält dabei zwangsläufig echte (wiederhergestellte) Mandantendaten. Ohne festgelegtes Schutzniveau könnte die Testumgebung schwächer abgesichert sein als die Produktivumgebung und so zu einem leichteren Angriffsziel für dieselben Daten werden. Schutzniveau der Testumgebung verbindlich festlegen (gleiche Zugriffskontrolle, Netzwerksegmentierung und Löschfrist nach Testlauf wie produktiv) und dokumentieren.",BAK-06,,"Die Restore-Testumgebung unterliegt derselben Zugriffskontrolle und Netzwerksegmentierung wie die Produktivumgebung
Wiederhergestellte Testdaten werden nach Abschluss des Testlaufs und Protokollierung des Ergebnisses gelöscht, nicht dauerhaft vorgehalten
Das Schutzniveau ist im Betriebsdokument zu BAK-06 explizit festgehalten","Prüft Zugriffskontrolle/Netzwerksegmentierung der Testumgebung gegen die Produktivumgebung
Prüft, dass nach einem Testlauf keine wiederhergestellten Daten über die dokumentierte Frist hinaus verbleiben
Prüft, dass das Betriebsdokument das Schutzniveau explizit benennt"
RET-15,Echter End-zu-Ende-Nachweis Storage-Object-Lock auf chattr-fähigem Host,⏳ Retention & WORM,Backend,Einfach,1,9,Backlog,,,,,chattr-faehiger Host/Alternative identifiziert; Loeschversuch auf storage-gesperrtes Objekt schlaegt nachweislich fehl; Ergebnis als Nachtrag zu RET-11 dokumentiert,Test auf identifiziertem Host durchgefuehrt; falls kein Host verfuegbar begruendete Dokumentation
RET-16,STORAGE-KONZEPT.md: Widerspruch ZFS als WORM-Backend klären,⏳ Retention & WORM,Backend,Einfach,0.5,9,Backlog,,,,,Ausnahmevermerk ZFS fuer WORM-Basisverzeichnis ergaenzt; Verweis auf RET-11-Pruefprotokoll; keine sonstigen Aenderungen,Dokument-Review; Diff-Pruefung
CMP-08,Ende-zu-Ende-Nachweis eDiscovery-Adapter (reale Drittmodul-Integration),⚖️ Compliance & eDiscovery,Backend,Mittel,2,9,Backlog,,,,,eDiscovery-Export gegen echte DMS-/Mail-Testinstanzen; Treffer korrekt und pruefsummengesichert; Nachtrag zu QA-03 dokumentiert,Echter Testlauf dokumentiert; Pruefsummen identisch; offene Restrisiken benannt
SEC-01,"Rolle muss aus verifizierter Identität kommen, nicht aus Client-Header",🔒 Sicherheit,Backend,Hoch,3,10,Backlog,"Go, bestehende Authentifizierungs-Infrastruktur (Session/JWT), Next.js (Frontend-Teil)",Rolle wird in retentionapi/kennzahlenapi/complianceapi aus X-User-Role-Header statt verifizierter Identität gelesen (K3); NEXT_PUBLIC_USER_ROLE im Frontend muss entfernt werden.,,SEC-02,"authz.go liest Rolle ausschliesslich aus verifizierter Identitaet (Session/JWT), X-User-Role wird ignoriert/abgelehnt
NEXT_PUBLIC_USER_ROLE aus compliance-reports und retention-admin Frontend entfernt
requested_by speichert nachvollziehbare Nutzeridentitaet statt nur Rollenname
CORS laesst Rollen-Header-basierte Cross-Origin-Zugriffe nicht mehr zu","Angriff mit gefaelschtem X-User-Role Header real nachgestellt und als blockiert nachgewiesen
Legitimer Aufruf mit echter Rolle aus verifizierter Session funktioniert weiterhin
Audit-Log enthaelt tatsaechliche Nutzeridentitaet
Frontend-Build enthaelt NEXT_PUBLIC_USER_ROLE nachweislich nicht mehr"
SEC-02,Tenant-Validierung in kennzahlenapi fehlt (Cross-Tenant-Leseleck),🔒 Sicherheit,Backend,Niedrig,1,10,Backlog,"Go, bestehendes InstanceTenant-Validierungsmuster aus legalholdapi.go","kennzahlenapi/handler.go:45 validiert den Query-Tenant nicht gegen InstanceTenant (H11), ermoeglicht Cross-Tenant-Lesen von Kennzahlen.",,,"handler.go validiert tenant Query-Parameter gegen InstanceTenant nach Muster aus legalholdapi.go
Abweichung fuehrt zu Ablehnung (403), kein stillschweigendes Ignorieren
Bestehende legitime Aufrufe funktionieren unveraendert","Angriff mit fremdem tenant Query-Parameter real nachgestellt und als blockiert nachgewiesen
Legitimer Aufruf mit eigenem tenant liefert weiterhin korrekte Daten
Musterkonsistenz mit legalholdapi.go dokumentiert"
SEC-03,TOCTOU Legal Hold vs. Destroy; Destroy ausserhalb der aeusseren Transaktion,🔒 Sicherheit,Backend,Mittel,2,10,Backlog,"PostgreSQL, pgx/v5, atomare UPDATE-Bedingungen, Transaktionssteuerung","deletionworkflow.go prueft Legal Hold in separatem Query vor dem Loesch-UPDATE (TOCTOU, M1); deletionapproval.go ruft Destroy ausserhalb der aeusseren Transaktion auf.",,,"Legal-Hold-Pruefung ist Teil derselben atomaren UPDATE-Anweisung wie die Statusaenderung
Destroy() laeuft innerhalb derselben Transaktion wie die Antragsfinalisierung
Kein Codepfad mehr, in dem physische Vernichtung und DB-Zustand auseinanderlaufen","TOCTOU-Fenster real nachgestellt (Legal Hold zwischen Pruefung und Update gesetzt) und als blockiert nachgewiesen
Simulierter Fehler nach Destroy() vor Commit nachgestellt, Konsistenz nachgewiesen
Regulaerer Loeschvorgang ohne Hold und ohne Fehler funktioniert weiterhin"
SEC-04,"wormstore: Release/Destroy ohne Legal-Hold-Pruefung, Reihenfolge-Problem",🔒 Sicherheit,Backend,Mittel,2,10,Backlog,"Go, Dateisystemoperationen, Zwei-Phasen-Commit-Muster, Pfad-Validierung","wormstore.go prueft bei Release/Destroy keinen Legal Hold, physische Operation erfolgt vor DB-Commit (M2); filepath.Join ohne Traversal-Check auf key.",,,"Release/Destroy pruefen vor Ausfuehrung aktiven Legal Hold und verweigern bei Treffer
Physische Operation erfolgt erst nach erfolgreichem DB-Commit bzw. Zwei-Phasen-Commit-Muster verhindert inkonsistenten Zwischenzustand
key wird gegen Pfad-Traversal validiert","Release/Destroy mit aktivem Legal Hold real nachgestellt und als blockiert nachgewiesen
Simulierter Absturz zwischen physischer Operation und Commit nachgestellt, kein inkonsistenter Zustand
Traversal-Angriff mit ../ Segmenten real nachgestellt und als blockiert nachgewiesen
Regulaerer Release/Destroy ohne Hold und ohne Traversal funktioniert weiterhin"
SEC-05,"moduleadapter /register: fehlende Tenant-Bindung, optionale Authentifizierung",🔒 Sicherheit,Backend,Mittel,2,10,Backlog,"PostgreSQL, SQL-Migrationen (kein ORM), Go, bestehende Authentifizierungs-Middleware","UNIQUE(module_name, object_type) ohne Tenant-Spalte (M3) erlaubt Cross-Tenant-Kollision bei Registrierung; ALLOW_UNAUTHENTICATED=true schaltet Auth fuer /register und /legal-hold komplett ab.",,,"UNIQUE-Constraint umfasst Tenant-Spalte, zwei Mandanten koennen denselben module_name/object_type unabhaengig registrieren
Migration ueberfuehrt bestehende Registrierungen korrekt, ist rueckrollbar
ALLOW_UNAUTHENTICATED hat in keiner produktionsnahen Konfiguration Standardwert true
/register und /legal-hold verlangen bei deaktiviertem Schalter gueltige Authentifizierung","Cross-Tenant-Kollision bei Registrierung real nachgestellt, nach Fix bestehen beide Registrierungen unabhaengig
Migration vorwaerts und rueckwaerts gegen Datenbank mit bestehenden Testregistrierungen getestet
Aufruf ohne Authentifizierung bei deaktiviertem Schalter real nachgestellt und als blockiert nachgewiesen
Bestehende authentifizierte Registrierungsablaeufe funktionieren weiterhin"
SEC-06,Append-only-Luecken bei mehreren Archive-Tabellen,🔒 Sicherheit,Backend,Mittel,2,10,Backlog,"PostgreSQL, SQL-Migrationen, bestehendes REVOKE/Trigger-Muster aus RET-11/AUD-07","legal_holds hat ON DELETE CASCADE, retention_class_assignments/dsgvo_decision_log/deletion_requests/worm_objects haben trotz Append-only-Anspruch kein DB-seitiges REVOKE/Trigger (M4).",,,"legal_holds verwendet ON DELETE RESTRICT oder eigene Historisierung statt CASCADE
Betroffene vier Tabellen erhalten REVOKE UPDATE/DELETE von App-Rolle plus Trigger mit RAISE WARNING nach RET-11/AUD-07-Muster
Bestehender Code mit UPDATE/DELETE auf worm_objects auf Insert-only-Logik umgestellt","Direkter UPDATE/DELETE-Versuch auf allen vier Tabellen real nachgestellt und als blockiert/protokolliert nachgewiesen
Loeschen eines Objekts mit aktivem Legal Hold real nachgestellt, Kaskaden-Verlust des Hold-Nachweises verhindert
Migration vorwaerts und rueckwaerts gegen Datenbank mit Testdaten getestet
Umgestellter Anwendungscode fuer worm_objects mit regulaerem Statuswechsel-Testfall erfolgreich durchlaufen"
1 Code Titel Epic Rolle Komplexitaet Aufwand_PT Welle Status Technik Beschreibung Haengt_ab_von Schaltet_frei Akzeptanzkriterien Pruefungen
2 RET-01 Generisches Retention-Objektmodell ⏳ Retention & WORM Backend Mittel 3 1 Fertig PostgreSQL, pgx/v5, SQL-Migrationen (kein ORM) Generisches Datenmodell für aufbewahrungspflichtige Objekte anlegen: Objekttyp, Objekt-Referenz (modulübergreifend über Adapter), Aufbewahrungsklasse, Status. Migrationen versioniert und rückrollbar. RET-02 RET-04 RET-05 CMP-01 CMP-02 Objektmodell bildet beliebige Objekttypen aus DMS und Mail ab, ohne modulspezifische Spalten Aufbewahrungsklasse ist je Objekt eindeutig zugeordnet und historisierbar Migration läuft gegen leere Datenbank durch und ist rückrollbar Migration vorwärts und rückwärts getestet Testobjekt aus fiktivem DMS- und Mail-Adapter beide korrekt abgebildet Tenant-Isolation der Kern-Tabellen durch Negativtest belegt
3 RET-02 Aufbewahrungsfristen-Engine ⏳ Retention & WORM Backend Mittel 3 2 Fertig PostgreSQL, Postgres-Jobqueue (geplante Jobs statt Redis) Fristenmodell je Aufbewahrungsklasse mit Stichtagsberechnung (Beginn, Dauer, Ablaufdatum) und periodischem Job, der ablaufende Objekte ermittelt. RET-01 RET-03 RET-06 RET-07 Frist wird je Aufbewahrungsklasse konfiguriert und auf jedes zugeordnete Objekt angewendet Stichtag wird korrekt aus Beginn- und Dauerangabe berechnet, inklusive Kalenderfällen (Schaltjahr, Monatsende) Periodischer Job liefert Liste ablaufender Objekte je Tenant Fristberechnung an Referenzdaten mit bekannten Ablaufdaten geprüft Job liefert bei leerem Bestand ein leeres, nicht fehlerhaftes Ergebnis Mehrfachausführung des Jobs erzeugt keine doppelten Einträge
4 RET-03 Löschworkflow & Aufbewahrungssperre (Legal Hold) ⏳ Retention & WORM Backend Mittel 3 3 Fertig PostgreSQL, transaktionaler Zustandswechsel Löschworkflow für abgelaufene Objekte: Freigabe, Vernichtung, Protokolleintrag. Aufbewahrungssperre (Legal Hold) verhindert jede Löschung unabhängig vom Fristablauf. RET-02 CMP-06 QA-02 CMP-07 QA-07 Ablauf der Frist löst einen Freigabeprozess aus, keine automatische Sofortlöschung Aufbewahrungssperre verhindert Löschung auch bei abgelaufener Frist, mit Begründungspflicht beim Setzen Jede Vernichtung erzeugt einen unveränderlichen Protokolleintrag mit Zeitpunkt und ausführender Person Objekt mit aktiver Sperre widersteht einem direkten Löschversuch Protokolleintrag nach Vernichtung ist nachträglich nicht änderbar (DB-Constraint oder Trigger) Aufheben einer Sperre ist selbst protokolliert
5 RET-04 WORM-Speicher-Garantie (Append-only) ⏳ Retention & WORM Backend Mittel 3 2 Fertig Objekt-Storage-Anbindung, Append-only-Schreibpfad Speicherpfad für archivierte Objektinhalte, der nach dem Schreiben keine Änderung und kein Überschreiben mehr zulässt (Write Once, Read Many). RET-01 QA-02 RET-11 Einmal geschriebener Objektinhalt kann nicht überschrieben werden Loeschung ist ausschliesslich ueber den kontrollierten Loeschworkflow moeglich, nicht ueber die Go-API dieses Pakets (keine Delete-Funktion) - struktureller Schutz auf Anwendungsebene, kein absoluter Schutz gegen root-OS-Zugriff Prüfsumme je Objekt wird beim Schreiben erzeugt und bei jedem Lesezugriff verglichen Direkter Überschreibversuch am Speicherpfad wird abgewiesen Prüfsummenabgleich erkennt eine manipulierte Testdatei zuverlässig Loeschung ist ueber die Go-API des Pakets technisch unmoeglich (keine Delete-Funktion vorhanden), nicht nur per Konvention verboten
6 RET-05 Modul-Adapter-Schnittstelle (DMS/Mail registrieren Objekttypen) ⏳ Retention & WORM Backend Mittel 3 2 Fertig REST-Schnittstelle, Registrierungs-API Schnittstelle, über die DMS und Mail ihre Objekttypen (Dokument, Mail, Anhang) und die zugehörige Aufbewahrungsklasse bei Archive registrieren, statt eigene Retention-Logik zu bauen. RET-01 CMP-03 ANA-01 CMP-07 QA-07 RET-12 Modul kann einen Objekttyp mit Aufbewahrungsklasse und Rückruf-Adresse für Löschbestätigung registrieren Archive ruft das registrierte Modul beim Vernichten des Objekts zurück, statt selbst Modul-Interna zu kennen Registrierung ist idempotent und mandantenfähig Zwei fiktive Module (DMS, Mail) parallel registriert ohne Kollision Rückruf bei Vernichtung erfolgreich gegen einen Testendpunkt ausgeführt Erneute Registrierung desselben Objekttyps ändert nichts am bestehenden Zustand
7 RET-06 Aufbewahrungsfristen-Konfigurationsoberfläche ⏳ Retention & WORM Frontend Mittel 3 3 Fertig Next.js/React/TypeScript Next.js/React-Oberflaeche zur Pflege von Aufbewahrungsklassen und Fristen je Objekttyp und Tenant, inklusive Vorschauliste bald ablaufender Objekte. Backend-API bereits fertig (RET-06-API), RBAC-Provisorium darin durch RET-08 auf echtes RBAC-06 migriert - dieses Ticket ist reiner Frontend-Scope. RET-02 RET-06-API RET-08 QA-02 Aufbewahrungsklasse mit Frist lässt sich anlegen, ändern und deaktivieren Vorschauliste zeigt in den nächsten 30 Tagen ablaufende Objekte Änderungen an Fristen sind nur berechtigten Rollen zugänglich Änderung einer Frist wirkt sich nur auf künftige Berechnungen aus, nicht rückwirkend auf bereits protokollierte Vernichtungen Nicht berechtigte Rolle erhält keinen Zugriff auf die Konfiguration Vorschauliste stimmt mit dem Ergebnis des periodischen Jobs überein
8 RET-07 Fristablauf-Benachrichtigungen ⏳ Retention & WORM Backend Einfach 2 3 Fertig Kopplung an Core CFG-02 (Benachrichtigungs-Dispatcher) Benachrichtigung verantwortlicher Personen vor Ablauf einer Aufbewahrungsfrist, konfigurierbarer Vorlauf je Aufbewahrungsklasse. Der eigentliche Versand läuft ausschließlich über den zentralen Core-Benachrichtigungs-Dispatcher (CFG-02), erreichbar über den HTTP-Wrapper CFG-05 (Archive kann internal/notifyprefs nicht direkt importieren) – Archive erzeugt nur das Ereignis, versendet keine E-Mail selbst. Empfaenger ist eine konfigurierte zustaendige Rolle (Tenant-Admin), kein Objekt-Owner — RET-01 fuehrt bewusst keine Owner-Beziehung. RET-02 CFG-05 QA-02 Benachrichtigung wird im konfigurierten Vorlauf vor Fristablauf als Ereignis an Core CFG-02 (ueber CFG-05) uebergeben, adressiert an eine konfigurierte zustaendige Rolle (Tenant-Admin), nicht selbst versendet Mehrfachversand derselben Benachrichtigung wird verhindert Benachrichtigung lässt sich je Aufbewahrungsklasse ein- und ausschalten Testfrist mit kurzem Vorlauf löst genau eine Benachrichtigung aus Deaktivierte Benachrichtigung verschickt nachweislich nichts Fehlgeschlagener Versand wird protokolliert und nicht stillschweigend verworfen
9 CMP-01 GoBD-Verfahrensdokumentation ⚖️ Compliance & eDiscovery Backend Mittel 3 2 Fertig PDF-Export, versionierte Dokumentvorlage Exportierbare Verfahrensdokumentation gemäß GoBD: Beschreibung der Aufbewahrungs-, Zugriffs- und Löschverfahren, automatisch aus der aktuellen Konfiguration erzeugt. RET-01 CMP-05 QA-03 Dokumentation wird automatisiert aus der aktuellen Retention-Konfiguration erzeugt, nicht manuell gepflegt Export liegt als versioniertes PDF mit Erzeugungsdatum vor Änderung an Aufbewahrungsklassen spiegelt sich in der nächsten Erzeugung wider Erzeugtes Dokument enthält alle aktiven Aufbewahrungsklassen mit Fristen Zwei aufeinanderfolgende Exporte ohne Konfigurationsänderung sind inhaltlich identisch Export einer zweiten Person als GoBD-tauglich nachvollzogen
10 CMP-02 DSGVO-/Datenschutz-Berichte ⚖️ Compliance & eDiscovery Backend Mittel 3 2 Fertig PDF/CSV-Export Berichte für Auskunftsersuchen, Verarbeitungsübersichten und Zugriffsnachweise je betroffener Person und Tenant. RET-01 CMP-05 CMP-07 Auskunftsbericht listet alle gespeicherten Objekte einer betroffenen Person mit Aufbewahrungsklasse Verarbeitungsübersicht zeigt Zweck und Rechtsgrundlage je Objekttyp Export ist mandantenscharf und enthält keine Daten anderer Tenants Auskunftsbericht für Testperson mit bekanntem Datenbestand stimmt mit erwarteter Liste überein Bericht für einen Tenant enthält keine Objekte eines anderen Tenants Export lässt sich als CSV weiterverarbeiten
11 CMP-03 eDiscovery-Suche & Export (modulübergreifend) ⚖️ Compliance & eDiscovery Backend Komplex 4 3 Fertig Modulübergreifende Such-API, ZIP-Export mit Prüfsummen Suche über registrierte Objekttypen aus DMS und Mail hinweg für Rechtsverfahren, mit vollständigem, prüfsummengesichertem Export der Treffer. RET-05 QA-03 Suche liefert Treffer aus mehreren registrierten Modulen in einer gemeinsamen Ergebnisliste Export enthält Originalobjekte, Metadaten und eine Prüfsummenliste je Datei Suchlauf und Export werden als eigener Vorgang protokolliert (wer, wann, welche Kriterien) Testsuche über zwei fiktive Module liefert erwartete kombinierte Trefferzahl Prüfsumme jeder exportierten Datei stimmt nach Entpacken überein Protokolleintrag zum Suchlauf ist nachträglich nicht veränderbar
12 CMP-04 Audit-Trail-Kopplung an Core-Audit-Log ⚖️ Compliance & eDiscovery Backend Einfach 2 1 Fertig REST-Anbindung an NEXARCH Core Audit-Log Alle sicherheitsrelevanten Vorgänge in Archive (Fristsetzung, Sperre, Löschung, Export) werden an das zentrale Audit-Log in NEXARCH Core gemeldet, statt ein eigenes Protokoll zu führen. AUD-01 QA-03 Jeder sicherheitsrelevante Vorgang erzeugt einen Eintrag im zentralen Audit-Log Eintrag enthält Tenant, handelnde Person, Vorgang und Zeitstempel Ausfall des Audit-Log-Dienstes blockiert nicht den Fachvorgang, wird aber sichtbar nachgemeldet Testvorgänge (Sperre setzen, Löschung, Export) erzeugen je einen nachvollziehbaren Audit-Eintrag Simulierter Ausfall des Audit-Dienstes verhindert nicht die Fachfunktion Nachmeldung nach Ausfallende ist vollständig, keine Lücke im Protokoll
13 CMP-05 Compliance-Berichts-Oberfläche ⚖️ Compliance & eDiscovery Frontend Mittel 3 3 Fertig Next.js/React/TypeScript Oberfläche zum Anfordern, Einsehen und Herunterladen von GoBD-Verfahrensdokumentation und DSGVO-Berichten je Tenant. CMP-01 CMP-02 QA-03 Berichte lassen sich mit wenigen Klicks anfordern und herunterladen Nur berechtigte Rollen sehen Berichte anderer Personen ein Historie angeforderter Berichte ist je Tenant einsehbar Anforderung eines Berichts löst den zugehörigen Backend-Export korrekt aus Nicht berechtigte Rolle erhält keinen Zugriff auf fremde Berichte Downloadlink eines abgelaufenen Berichts wird abgewiesen
14 CMP-06 Vier-Augen-Freigabe für Löschungen ⚖️ Compliance & eDiscovery Backend Mittel 3 4 Fertig PostgreSQL mit FOR UPDATE-Lock, Timing-safe Vergleich Löschung abgelaufener Objekte erfordert eine zweite, unabhängige Bestätigung durch eine andere Person, bevor der Löschworkflow ausgeführt wird. RET-03 QA-03 CMP-07 Löschung wird erst nach zweiter Bestätigung durch eine von der anfordernden Person verschiedene Rolle ausgeführt Gleichzeitige Bestätigungsversuche führen nicht zu doppelter Ausführung Löschbestätigung wird mit einem geheimen, zeitlich begrenzten Bestätigungs-Token abgesichert Zwei parallele Bestätigungsanfragen auf dasselbe Objekt: genau eine Löschung wird ausgeführt (Lock-Test) Bestätigung durch dieselbe Person wie die Anforderung wird abgewiesen Vergleich des Bestätigungs-Tokens erfolgt zeitkonstant und ist gegen Timing-Angriffe getestet
15 BAK-01 Datenbank-Backup-Strategie 💾 Backup & Wiederherstellung Backend Mittel 3 1 Fertig PostgreSQL (pg_dump/pg_basebackup), inkrementelle Sicherung Automatisierte, inkrementelle Sicherung der PostgreSQL-Datenbank mit Aufbewahrung mehrerer Generationen und Verifikation jeder Sicherung. BAK-03 BAK-05 BAK-07 BAK-09 Vollsicherung und inkrementelle Sicherung laufen automatisiert nach Zeitplan Jede Sicherung wird nach Abschluss auf Lesbarkeit verifiziert, nicht nur auf Erstellung geprüft Mehrere Sicherungsgenerationen werden nach konfigurierbarer Regel vorgehalten und alte automatisch entfernt Sicherung gegen Testdatenbank erfolgreich erstellt und verifiziert Verifikation erkennt eine absichtlich beschädigte Sicherungsdatei Rotationsregel entfernt nachweislich nur die ältesten Generationen
16 BAK-02 Objekt-Storage-Backup/Snapshots 💾 Backup & Wiederherstellung Backend Mittel 3 1 Fertig Objekt-Storage-Snapshots, inkrementell und deduplizierend Automatisierte, deduplizierende Sicherung der im Objekt-Storage abgelegten Dateiinhalte, angelehnt an das restic/Borg-Sicherungskonzept. BAK-03 BAK-05 BAK-07 BAK-09 Sicherung erfasst neue und geänderte Objekte inkrementell, ohne unveränderte Objekte erneut zu übertragen Sicherung ist deduplizierend, identische Inhalte werden nur einmal gespeichert Jede Sicherung lässt sich einzeln auf Vollständigkeit prüfen Zweiter Sicherungslauf nach unverändertem Bestand überträgt keine Daten erneut Zwei identische Testdateien belegen nachweislich nur einmal Speicherplatz Vollständigkeitsprüfung erkennt ein fehlendes Objekt in der Sicherung
17 BAK-03 Restore-Verfahren 💾 Backup & Wiederherstellung Backend Mittel 3 2 Fertig Atomarer Restore über temporäres Verzeichnis Dokumentiertes, wiederholbares Verfahren zur Wiederherstellung von Datenbank und Objekt-Storage aus einer Sicherung, für Notfall wie für Einzelobjekt-Restore. BAK-01 BAK-02 BAK-04 BAK-06 Restore stellt Datenbank und Objekt-Storage aus einer gewählten Sicherungsgeneration wieder her Restore in ein nicht-leeres Zielverzeichnis beschädigt den bestehenden Inhalt nicht, solange der Vorgang nicht bestätigt wird Restore-Vorgang wird protokolliert (Quelle, Zeitpunkt, Ergebnis) Restore auf leerem System vollständig und erfolgreich durchgeführt Restore auf nicht-leeres Zielverzeichnis lässt bei Abbruch den ursprünglichen Inhalt unverändert Protokolleintrag zum Restore ist vollständig und nachvollziehbar
18 BAK-04 Tenant-Backup & -Restore (einzelner Mandant) 💾 Backup & Wiederherstellung Backend Mittel 3 3 Fertig Tenant-scharfer Export/Import auf Basis von BAK-03 Sicherung und Wiederherstellung der Daten eines einzelnen Mandanten, ohne andere Mandanten zu berühren – etwa für Mandanten-Umzug oder isolierte Notfallwiederherstellung. BAK-03 QA-04 Sicherung eines Tenants enthält ausschließlich dessen Daten aus Datenbank und Objekt-Storage Wiederherstellung eines Tenants verändert keine Daten anderer Tenants Tenant-Sicherung lässt sich unabhängig vom Gesamt-Backup planen und ausführen Sicherung von Tenant A enthält keine Datensätze von Tenant B (Stichprobe) Wiederherstellung von Tenant A in eine Testumgebung verändert Tenant B dort nicht Tenant-Sicherung und -Restore vollständig protokolliert
19 BAK-05 Reconciliation (Konsistenzprüfung Storage vs. DB) 💾 Backup & Wiederherstellung Backend Mittel 3 2 Fertig Geplanter Abgleichs-Job, Postgres-Jobqueue Periodische Prüfung, ob jeder in der Datenbank referenzierte Objekt-Storage-Eintrag tatsächlich existiert und umgekehrt, mit Bericht über Abweichungen. BAK-01 BAK-02 QA-04 Job erkennt Datenbankeinträge ohne zugehöriges Objekt im Storage Job erkennt Objekte im Storage ohne zugehörigen Datenbankeintrag Abweichungen werden berichtet, nicht automatisch stillschweigend behoben Absichtlich entferntes Storage-Objekt wird vom Job als Abweichung erkannt Absichtlich verwaister Datenbankeintrag wird vom Job als Abweichung erkannt Lauf ohne Abweichungen liefert einen leeren, eindeutig als sauber erkennbaren Bericht
20 BAK-06 Restore-Testverfahren 💾 Backup & Wiederherstellung Backend Einfach 2 3 Fertig Automatisierter, periodischer Restore-Test in Testumgebung Regelmäßiger, automatisierter Testlauf des Restore-Verfahrens gegen eine isolierte Testumgebung, mit Ergebnisprotokoll als Nachweis der Wiederherstellbarkeit. BAK-03 QA-04 BAK-10 Testlauf führt einen vollständigen Restore in eine isolierte Testumgebung durch Ergebnis (erfolgreich/fehlgeschlagen) wird mit Zeitstempel protokolliert Fehlgeschlagener Testlauf löst eine sichtbare Warnung aus Geplanter Testlauf gegen aktuelle Sicherung erfolgreich durchgeführt und protokolliert Absichtlich beschädigte Sicherung lässt den Testlauf sichtbar fehlschlagen Protokollhistorie zeigt mehrere zurückliegende Testläufe nachvollziehbar an
21 ANA-01 Kennzahlen-Aggregation (modulübergreifend) 📊 Kennzahlen & Reporting Backend Mittel 3 3 Fertig Aggregations-Job über registrierte Module Zentraler Dienst, der Kennzahlen (Objektbestand, Aufbewahrungsstatus, Löschvorgänge, Speichervolumen) aus allen über RET-05 registrierten Modulen aggregiert. RET-05 ANA-02 ANA-03 QA-05 Kennzahlen werden je Tenant und Modul sowie modulübergreifend aggregiert Aggregation läuft periodisch und liefert konsistente Werte über einen Zeitverlauf Neues registriertes Modul wird ohne Codeänderung in die Aggregation einbezogen Aggregation über zwei fiktive Module liefert korrekte Summen- und Einzelwerte Wiederholte Aggregation ohne Datenänderung liefert stabile Ergebnisse Neu registriertes drittes Testmodul erscheint automatisch in der nächsten Aggregation
22 ANA-02 Auswertungs-Dashboard 📊 Kennzahlen & Reporting Frontend Mittel 3 4 Fertig Next.js/React/TypeScript Dashboard zur Visualisierung der aggregierten Kennzahlen mit Filtern nach Tenant, Modul und Zeitraum. ANA-01 QA-05 Dashboard zeigt Bestands-, Aufbewahrungs- und Löschkennzahlen je Tenant Filter nach Modul und Zeitraum funktionieren kombinierbar Dashboard lädt auch bei großem Datenbestand in angemessener Zeit Filterkombination liefert dieselben Werte wie eine direkte Abfrage der Aggregation Dashboard mit synthetisch großem Testbestand bleibt bedienbar Rollen ohne Berechtigung sehen keine Kennzahlen fremder Tenants
23 ANA-03 Lizenz-/Nutzungs-Reports 📊 Kennzahlen & Reporting Backend Einfach 2 4 Fertig CSV/PDF-Export Bericht über Nutzung und Lizenzrelevantes je Tenant (Speichervolumen, aktive Objekte, Nutzeranzahl-Bezug), abgestimmt mit dem Lizenzmodell aus NEXARCH Core. ANA-01 QA-05 Bericht zeigt lizenzrelevante Nutzungswerte je Tenant für einen wählbaren Zeitraum Werte stimmen mit der zugrunde liegenden Kennzahlen-Aggregation überein Export ist als CSV und PDF verfügbar Bericht für Testzeitraum stimmt mit manuell nachgerechneten Werten überein Export in beiden Formaten enthält identische Kernwerte Bericht für Tenant ohne Aktivität liefert nachvollziehbar leere/Null-Werte statt Fehler
24 QA-01 Teststrategie Archive ✅ Prüfungen & Qualitätssicherung Backend Einfach 2 1 Fertig Testplan-Dokument, Testdatensatz-Konzept Teststrategie für das Archive-Board festlegen: Testebenen, Referenzdatensatz für Retention/WORM/Backup, Verantwortlichkeiten je Prüfgate. Teststrategie benennt Testebenen (Unit, Integration, Wiederherstellungstest) und deren Verantwortliche Referenzdatensatz für Retention- und Backup-Tests ist definiert und wiederverwendbar Strategie ist als Dokument abgelegt und von zweiter Person gegengelesen Pflichttests für sicherheitsrelevanten Code (Tenant-Scoping, Zugriffsprüfung, Auth-nahe Logik) sind als verbindliches Merge-Gate verankert – kein Merge auf solchen Code ohne Test, analog Core QA-01 Referenzdatensatz lässt sich reproduzierbar in einer Testumgebung aufsetzen Zweite Person bestätigt schriftlich die Nachvollziehbarkeit der Strategie Strategie deckt erkennbar alle folgenden Prüfgates ab (Abgleich mit QA-02 bis QA-05)
25 QA-02 Prüfgate Retention & WORM ✅ Prüfungen & Qualitätssicherung Backend Einfach 2 4 Fertig Abnahmeprotokoll Prüfgate für Fristenengine, Löschworkflow, Aufbewahrungssperre und WORM-Garantie vor Freigabe der Retention-Funktionen. RET-04 RET-03 RET-06 RET-07 QA-05 Alle Akzeptanzkriterien von RET-03 und RET-04 sind gegen den Referenzdatensatz nachgewiesen Versuch, eine gesperrte oder WORM-geschützte Ablage zu umgehen, scheitert nachweislich Protokoll mit Zielwert, Messwert und Bewertung ist abgelegt Löschversuch an gesperrtem Objekt schlägt fehl (Wiederholung des RET-03-Tests unter Prüfgate-Bedingungen) Überschreibversuch am WORM-Speicher schlägt fehl (Wiederholung des RET-04-Tests unter Prüfgate-Bedingungen) Offene Restrisiken sind schriftlich benannt
26 QA-03 Prüfgate Compliance & eDiscovery ✅ Prüfungen & Qualitätssicherung Backend Einfach 2 5 Fertig Abnahmeprotokoll Prüfgate für eDiscovery-Export und Vier-Augen-Freigabe vor Freigabe der Compliance-Funktionen. CMP-03 CMP-06 CMP-07 CMP-01 CMP-04 CMP-05 QA-05 eDiscovery-Export wird gegen den Referenzdatensatz erneut durchgeführt und geprüft Vier-Augen-Freigabe wird mit zwei unabhängigen Testrollen erneut nachgewiesen Protokoll mit Zielwert, Messwert und Bewertung ist abgelegt Export-Prüfsummen stimmen bei wiederholtem Testlauf erneut überein Löschversuch durch dieselbe Person ohne zweite Bestätigung scheitert erneut Offene Restrisiken sind schriftlich benannt
27 QA-04 Prüfgate Backup & Restore ✅ Prüfungen & Qualitätssicherung Backend Einfach 2 4 Fertig Abnahmeprotokoll, realer Wiederherstellungstest Prüfgate für Backup-Strategie und Restore-Verfahren vor Freigabe der Backup-Funktionen, inklusive einem real durchgeführten Wiederherstellungstest. BAK-06 BAK-04 BAK-05 BAK-07 QA-05 Restore wird real auf ein leeres Testsystem durchgeführt und dokumentiert Reconciliation nach Restore zeigt keine Abweichungen zwischen Storage und Datenbank Protokoll mit Zielwert, Messwert und Bewertung ist abgelegt Realer Restore-Testlauf erfolgreich und protokolliert Reconciliation nach dem Testlauf liefert einen sauberen Bericht Offene Restrisiken sind schriftlich benannt
28 QA-05 Abnahme- & Compliance-Prüfung Archive ✅ Prüfungen & Qualitätssicherung Backend Einfach 2 6 Fertig Abnahmeprotokoll Gesamtabnahme des Archive-Boards vor Freigabe: Retention/WORM, Compliance/eDiscovery und Backup/Restore müssen alle bestanden sein. QA-02 QA-03 QA-04 QA-06 QA-07 ANA-01 ANA-02 ANA-03 BAK-08 Alle drei fachlichen Prüfgates (QA-02, QA-03, QA-04) sind bestanden Gesamtprotokoll fasst alle drei Prüfgates mit Ergebnis zusammen Abnahmeprotokoll ist unterzeichnet Zusammenfassung aller drei Prüfgates gegen die jeweiligen Einzelprotokolle abgeglichen Offene Restrisiken aus allen drei Gates sind konsolidiert und schriftlich benannt Freigabeentscheidung ist dokumentiert
29 QA-06 Schnittstellen-Vertragstests ✅ Prüfungen & Qualitätssicherung Backend Mittel 3 3 Fertig Vertragstests (Consumer-Driven Contracts), CI-Pipeline Vertragstests für die Modul-Adapter-Schnittstelle (RET-05), über die DMS und Mail Objekte bei der Retention-Engine registrieren – Breaking Changes müssen automatisiert erkannt werden, bevor sie ein konsumierendes Modul stillschweigend bricht. RET-05 QA-05 Vertragstests decken RET-05 vollständig ab Absichtlich brechender Schema-Wechsel lässt Tests fehlschlagen Tests laufen automatisiert in der CI Testlauf gegen aktuellen Stand grün Simulierte Breaking Change erkannt CI-Integration nachgewiesen
30 BAK-07 Aufbewahrungsfrist für Backup-Snapshots 💾 Backup & Wiederherstellung Backend Mittel 3 2 Fertig PostgreSQL, Postgres-Jobqueue (geplante Jobs statt Redis) Eigene, von der Dokumenten-Retention (RET-02) unabhängige Aufbewahrungsfrist für Backup-Snapshots selbst – nach restic/Borg-Vorbild eine Prune-Policy (z. B. tägliche Snapshots 14 Tage, wöchentliche 3 Monate, monatliche 1 Jahr – konkrete Staffelung als Konfiguration, nicht hart codiert), damit Backups nicht unbegrenzt wachsen, aber auch nicht zu früh gelöscht werden. BAK-01 BAK-02 QA-04 Backup-Snapshots folgen einer konfigurierbaren Prune-Policy (Staffelung nach Alter), unabhängig von RET-02 Snapshot-Löschung nach Ablauf der Frist läuft automatisiert Eine gültige, nicht abgelaufene Aufbewahrungssperre auf einem Dokument (RET-03/CMP-06) verhindert nicht das Pruning älterer Backup-Snapshots, solange mindestens ein aktueller Snapshot das Dokument noch enthält Prune-Test mit simulierten Snapshots über mehrere Altersstufen ergibt korrekte Staffelung Automatisierte Löschung abgelaufener Snapshots im Test nachgewiesen Legal-Hold-Test bestätigt, dass Pruning nicht mit Dokumenten-Retention kollidiert
31 CMP-07 DSGVO-Löschantrag (Recht auf Löschung, Art. 17) ⚖️ Compliance & eDiscovery Backend Mittel 4 4 Fertig PostgreSQL, transaktionaler Zustandswechsel, Modul-Adapter-Schnittstelle (RET-05) Workflow für den Löschantrag einer betroffenen Person (Art. 17 DSGVO): modulübergreifende Suche (CMP-02), Löschung ohne Aufbewahrungspflicht, begründete Ablehnung mit Aufbewahrungspflicht, Freigabe über CMP-06, vollständiges Protokoll je Objekt. RET-03 RET-05 CMP-02 CMP-06 QA-03 Löschantrag findet über die Suche aus CMP-02 alle Objekte einer betroffenen Person, mandantenscharf Jedes gefundene Objekt wird EINZELN entschieden: Löschung oder Ablehnung mit Begründung – niemals eine pauschale Sammelentscheidung Tatsächliche Löschung durchläuft denselben Vier-Augen-Freigabeprozess wie jede andere Löschung (CMP-06), keine zweite Implementierung Ergebnis des Löschantrags (je Objekt: gelöscht/abgelehnt+Grund) ist vollständig und dauerhaft protokolliert Löschantrag für eine Testperson mit gemischtem Datenbestand liefert exakt eine Löschung und eine begründete Ablehnung Aufbewahrungssperre (Legal Hold) verhindert die Löschung auch bei bereits abgelaufener regulärer Frist Löschantrag für einen Tenant führt nachweislich zu keiner Aktion an Objekten eines anderen Tenants
32 QA-07 Last- & Leistungstest ✅ Prüfungen & Qualitätssicherung Backend Mittel 3 6 Fertig Lastgenerator, Messprotokoll Lasttest für Archive unter realistischer Last aus DMS und Mail gleichzeitig – insbesondere Retention-Prüfpfad (RET-03), Modul-Adapter-Registrierung (RET-05) und WORM-Schreibpfad unter Last. RET-05 RET-03 QA-05 Definierte Ziel-Latenz für die Retention-/Legal-Hold-Abfrage unter Last eingehalten WORM-Schreibpfad bleibt unter simulierter Last aus zwei gleichzeitig zugreifenden Modulen (DMS und Mail) korrekt und ohne Datenverlust Modul-Adapter-Registrierung (RET-05) verkraftet gleichzeitige Registrierung mehrerer Objekttypen ohne Race Condition Lasttest mit simulierten parallelen Anfragen aus DMS und Mail durchgeführt, Ergebnis dokumentiert WORM-Schreibpfad unter Last auf Datenverlust/Race Conditions geprüft Gleichzeitige Registrierung mehrerer Objekttypen bei RET-05 getestet
33 BAK-08 Checksum-basierte Objekt-Integritätsprüfung (Scrub-Job) 💾 Backup & Wiederherstellung Backend Mittel 3 4 Fertig Postgres-Jobqueue (FDN-04), SHA-256-Stream-Prüfung, Meldung über Core OPS-05 Periodischer Job, der Stichproben gespeicherter Objekte herunterlädt, deren SHA-256 neu berechnet und mit der in file_revisions.checksum_sha256 (FDN-02) hinterlegten Prüfsumme vergleicht. Ergänzt BAK-05 (reine Existenzprüfung) um Inhalts-Integrität – deckt stille Korruption und Bit-Rot insbesondere auf extern eingebundenem, nicht selbst überwachtem S3-Storage auf. BAK-05 FDN-04 FDN-09 OPS-05 Job zieht periodisch eine konfigurierbare Stichprobe gespeicherter Objekte, lädt sie, berechnet SHA-256 neu und vergleicht mit file_revisions.checksum_sha256 – Abweichung gilt als Befund Sampling priorisiert alte, unveränderte Objekte (GoBD-Relevanz: still vergammelnde Bytes, die niemand mehr anfasst, fallen sonst erst beim Restore auf); Neu-Schreibvorgänge sind bereits beim Schreiben verifiziert und werden nicht bevorzugt geprüft Befund wird gemeldet, nicht automatisch repariert – Meldung läuft über Core OPS-05 (Alerting) mit Objekt-Referenz, erwarteter vs. tatsächlicher Prüfsumme und Zeitpunkt Job läuft über die Postgres-Jobqueue (FDN-04) mit konfigurierbarer Kadenz und Stichprobengröße; Lauf ist idempotent und unterbrechbar ohne inkonsistenten Zustand Stichprobengröße und Kadenz sind je Betriebsstufe konfigurierbar, damit ein vollständiger Durchlauf über den Bestand in einem dokumentierten Zeitraum abgeschlossen wird (kein täglicher Voll-Download aller Objekte) Der Job erkennt Abweichungen nur bei Objekten, die gelesen und erneut geprüft werden können. Er ersetzt keine storage-seitige WORM-/Versionierungsstrategie und keine Zugriffs-/Audit-Logs des Storage-Providers (siehe STORAGE-KONZEPT.md Abschnitt 6.1) — bei extern eingebundenem, nicht-kompatiblem Kunden-Storage (Betriebsmodus 3, ohne Versioning/Object Lock/Audit-Logs) bleibt eine Lücke, die BAK-08 technisch nicht schließen kann. Testobjekt mit absichtlich manipuliertem Byte im Storage wird als Abweichung erkannt und gemeldet (Alert-Eingang über OPS-05 nachgewiesen) Unverändertes Testobjekt erzeugt keinen Befund (kein False-Positive) Verschlüsseltes Testobjekt (über FDN-09) wird korrekt gelesen und geprüft – der Job nutzt denselben Decrypt-Pfad wie reguläre Lesezugriffe, vergleicht also Klartext-Prüfsumme, nicht Chiffretext Test gegen ein simuliertes externes S3-Ziel (nicht selbst überwacht): Korruption dort wird erkannt – genau der Fall, der sonst unsichtbar bleibt Sampling-Statistik dokumentiert: Anteil alter vs. neuer Objekte in der Stichprobe entspricht der konfigurierten Priorisierung
34 RET-06-API Aufbewahrungsfristen-Konfigurations-Backend ⏳ Retention & WORM Backend Mittel 2 3 Fertig Go/net/http, PostgreSQL, provisorischer Rollen-Check (kein RBAC-02-HTTP-Wrapper vorhanden) Backend-API fuer RET-06: Aufbewahrungsklassen anlegen/aendern/deaktivieren, Vorschauliste ablaufender Objekte. Aus RET-06 herausgeloest (Board-Entscheidung: Backend zuerst, Next.js-Frontend als eigenes Folgeticket), damit kein Pseudo-Frontend-Protokoll entsteht. RET-02 RET-06 Aufbewahrungsklasse mit Frist lässt sich per API anlegen, ändern und deaktivieren API liefert Vorschauliste bald ablaufender Objekte, identisch zum periodischen Job Änderungen an Fristen sind nur mit gültiger Rollen-Kennung zugänglich (provisorischer Check, echter RBAC-02-HTTP-Wrapper folgt als Core-Ticket) Änderung einer Frist wirkt sich nur auf künftige Berechnungen aus, nicht rückwirkend Fehlende/falsche Rollen-Kennung erhält 403, gültige Kennung 200 (Negativ- und Positivtest) Vorschauliste stimmt mit dem Ergebnis des periodischen Jobs überein
35 RET-08 RET-06-API auf RBAC-06 migrieren (Provisorium abbauen) ⏳ Retention & WORM Backend Klein 1 4 Fertig Go, HTTP-Client internal/retentionapi.RequireRole (Header-basiertes Provisorium aus RET-06-API) durch einen echten Aufruf von Core RBAC-06 (POST /authorize, service-token-authentifiziert) ersetzen. Baut das seit RET-06-API dokumentierte Provisorium ab, jetzt da RBAC-06 real existiert und deployed ist. RBAC-06 RET-06-API RET-06 Der RBAC-Check in retentionapi nutzt ausschliesslich RBAC-06 (HTTP), nicht mehr das lokale Header-Provisorium Bestehende Endpunkte (POST /retention-classes, POST /retention-classes/{class}/deactivate) verhalten sich funktional unveraendert (gleiche AC wie RET-06-API) Fehlerfall: RBAC-06 nicht erreichbar oder verweigert -> Zugriff wird abgelehnt (fail closed), nicht stillschweigend erlaubt 403-Nachweis erfolgt gegen echte Policy-Rules ueber RBAC-06, nicht mehr nur gegen einen Header-Wert Bestehende RET-06-API-Tests (Preview stimmt mit periodischem Job ueberein, Deaktivierung wirkt) laufen weiterhin gruen nach der Migration Ausfall/Nichterreichbarkeit von RBAC-06 fuehrt zu einer Ablehnung (kein Fallback auf offenen Zugriff)
36 RET-09 Modul-Adapter-Dienst starten (RET-05 als laufender HTTP-Endpunkt) ⏳ Retention & WORM Backend Klein 1 5 Fertig Go, HTTP archive/internal/moduleadapter.RegisterHandler (RET-05) existiert als fertiger Go-Handler, laeuft aber nirgends als Dienst. RET-09 startet ihn als eigenstaendigen HTTP-Dienst (main.go + systemd), OHNE neue Archive-Logik - reines Wiring, analog RBAC-06/CFG-05 fuer andere Module. RET-05 DOC-16 ARC-11 moduleadapter.RegisterHandler laeuft als eigenstaendiger, ueber systemd verwalteter HTTP-Dienst Ein externer Client (anderes Modul) kann real POST /register gegen den laufenden Dienst aufrufen Keine neue Autorisierungs- oder Registrierungslogik - reiner Start des bestehenden Handlers Dienst startet und bleibt stabil (systemctl status aktiv) Realer POST /register von einem externen Testclient gegen den laufenden Dienst liefert die erwartete Registrierung (idempotent, wie in RET-05 getestet) Code-Review: keine Aenderung an moduleadapter.go/handler.go selbst, nur main.go+systemd neu
37 RET-10 CORS für RET-06-API (Frontend-Zugriff aus dem Browser) ⏳ Retention & WORM Backend Klein 1 5 Fertig Go, HTTP-Middleware (CORS) retention-api (RET-06-API) setzt keine CORS-Header - ein echter Browser blockiert den Fetch von RET-06 (Next.js-Frontend, anderer Origin) zum Backend. Real per Sichtpruefung des laufenden RET-06-Frontends gefunden (curl umgeht CORS, Go-/Vitest-Tests pruefen nicht browserseitig), nicht durch die urspruenglichen RET-06/RET-06-API-Pruefungen erfasst. RET-06-API retention-api setzt Access-Control-Allow-Origin fuer den konfigurierten Frontend-Origin (Umgebungsvariable, kein Wildcard in Produktion) Preflight-Anfragen (OPTIONS) werden korrekt beantwortet fuer POST/GET-Endpunkte RET-06-Frontend kann alle vier Endpunkte real aus einem Browser-Kontext (nicht nur curl) erreichen Realer Browser-Fetch (nicht curl) vom RET-06-Frontend gegen retention-api gelingt, Same-Origin-Policy nicht mehr blockierend OPTIONS-Preflight liefert korrekte CORS-Header fuer POST /retention-classes Fetch von einem NICHT konfigurierten Origin wird weiterhin blockiert (kein Wildcard-Leck)
38 RET-11 Storage-seitige WORM-Durchsetzung (Object-Lock statt nur Anwendungslogik) ⏳ Retention & WORM Backend Mittel 2 7 Fertig S3 Object Lock / Compliance-Mode, PostgreSQL, Go RET-04 verhindert Änderung/Überschreiben archivierter Objektinhalte nach dem Schreiben, aber ohne explizite Festlegung, ob dies nur durch Anwendungscode (übersprungen bei direktem Storage-Zugriff) oder durch eine Storage-seitige Garantie (z. B. S3 Object Lock im Compliance-Mode) erzwungen wird. WORM-Objekte über die Object-Lock-Funktion des Storage-Backends selbst sperren, sodass auch ein Zugriff mit vollen Storage-Zugangsdaten unterhalb der Anwendung keine Änderung/Löschung vor Fristablauf erlaubt. RET-04 Jedes WORM-Objekt wird beim Schreiben mit einer Storage-seitigen Object-Lock-Sperre bis zum Ablauf der Aufbewahrungsfrist versehen Ein Löschversuch mit direkten Storage-Zugangsdaten (unterhalb der Anwendung) schlägt vor Fristablauf fehl, nachweislich durch das Storage-Backend selbst und nicht nur durch Anwendungscode Nach Fristablauf und regulärer Freigabe (RET-03) ist das Objekt normal löschbar Test: direkter Löschversuch über die Storage-API (nicht über die NEXARCH-Anwendung) auf ein gesperrtes Objekt schlägt fehl Test: nach Fristablauf und Freigabe durch RET-03 ist die Löschung über den regulären Workflow möglich Konfigurationsprüfung: Object-Lock/Compliance-Mode ist für den produktiven Bucket aktiviert, dokumentiert in der Betriebsanleitung
39 RET-12 Unabhängige Tenant-Validierung bei Objekttyp-Registrierung durch DMS/Mail ⏳ Retention & WORM Backend Mittel 2 7 Fertig Service-Credentials (Core API-02), Tenant-Registry-Abgleich (Core TEN-01), Go RET-05 nimmt Objekttyp- und Aufbewahrungsklassen-Registrierungen von DMS und Mail entgegen. Ohne unabhängige Prüfung würde Archive dem vom registrierenden Modul mitgelieferten Tenant-Kontext blind vertrauen. Jede Registrierung muss den mitgelieferten Tenant-Kontext gegen die Core-Registry (TEN-01) validieren, unabhängig vom Service-Credential-Scope des aufrufenden Moduls – Archive verlässt sich nicht allein auf die Angabe von DMS/Mail. RET-05 Jede Objekttyp-/Aufbewahrungsklassen-Registrierung aus DMS/Mail wird gegen die Core-Registry auf Tenant-Gültigkeit geprüft, bevor sie übernommen wird Eine Registrierung mit einem nicht existierenden oder falschem Tenant-Kontext wird abgelehnt und protokolliert Bestehende, korrekte Registrierungsabläufe aus RET-05 funktionieren unverändert Test: Registrierung mit gültigem, existierendem Tenant-Kontext wird übernommen Test: Registrierung mit manipuliertem/fremdem Tenant-Kontext wird abgelehnt Regressionstest: normaler DMS-/Mail-Registrierungsablauf bleibt funktionsfähig
40 BAK-09 Envelope-Encryption für Backup-Snapshots (Datenbank & Objekt-Storage) 💾 Backup & Wiederherstellung Backend Mittel 2 7 Fertig Envelope-Encryption (Tenant-KEK aus Core API-10), restic/Borg-artige Sicherung BAK-01/BAK-02 sichern Datenbank und Objekt-Storage-Inhalte, ohne festzulegen, ob die Sicherungen selbst verschlüsselt sind. Archivierte Objekte sind live über die Tenant-KEK-Hierarchie (Core API-10) verschlüsselt – Backups dürfen kein schwächer geschütztes Abbild derselben Daten sein. Backup-Snapshots über denselben Tenant-KEK verschlüsseln wie die Live-Daten, sodass ein kompromittiertes Backup-Ziel ohne den jeweiligen Tenant-KEK keine verwertbaren Klartextdaten liefert. BAK-01 BAK-02 Backup-Snapshots von Datenbank und Objekt-Storage sind mit dem Tenant-KEK des jeweiligen Mandanten verschlüsselt Ein Zugriff auf das Backup-Ziel ohne den jeweiligen Tenant-KEK liefert keine verwertbaren Klartextdaten Wiederherstellung (BAK-03/BAK-04) funktioniert unverändert unter Verwendung des korrekten Tenant-KEK Test: Backup-Datei ohne Tenant-KEK ist nicht auswertbar (Stichprobe auf Klartext-Reste) Restore-Test mit korrektem Tenant-KEK stellt die Daten vollständig wieder her Test: Restore mit falschem/fremdem Tenant-KEK schlägt fehl, statt fremde Daten zu liefern
41 BAK-10 Schutzniveau der Restore-Testumgebung (DSGVO-konform) 💾 Backup & Wiederherstellung Backend Einfach 1 7 Fertig Isolierte Testumgebung, Zugriffskontrolle, Betriebsdokument BAK-06 testet das Restore-Verfahren regelmäßig automatisiert gegen eine isolierte Testumgebung – diese enthält dabei zwangsläufig echte (wiederhergestellte) Mandantendaten. Ohne festgelegtes Schutzniveau könnte die Testumgebung schwächer abgesichert sein als die Produktivumgebung und so zu einem leichteren Angriffsziel für dieselben Daten werden. Schutzniveau der Testumgebung verbindlich festlegen (gleiche Zugriffskontrolle, Netzwerksegmentierung und Löschfrist nach Testlauf wie produktiv) und dokumentieren. BAK-06 Die Restore-Testumgebung unterliegt derselben Zugriffskontrolle und Netzwerksegmentierung wie die Produktivumgebung Wiederhergestellte Testdaten werden nach Abschluss des Testlaufs und Protokollierung des Ergebnisses gelöscht, nicht dauerhaft vorgehalten Das Schutzniveau ist im Betriebsdokument zu BAK-06 explizit festgehalten Prüft Zugriffskontrolle/Netzwerksegmentierung der Testumgebung gegen die Produktivumgebung Prüft, dass nach einem Testlauf keine wiederhergestellten Daten über die dokumentierte Frist hinaus verbleiben Prüft, dass das Betriebsdokument das Schutzniveau explizit benennt
42 RET-15 Echter End-zu-Ende-Nachweis Storage-Object-Lock auf chattr-fähigem Host ⏳ Retention & WORM Backend Einfach 1 9 Backlog chattr-faehiger Host/Alternative identifiziert; Loeschversuch auf storage-gesperrtes Objekt schlaegt nachweislich fehl; Ergebnis als Nachtrag zu RET-11 dokumentiert Test auf identifiziertem Host durchgefuehrt; falls kein Host verfuegbar begruendete Dokumentation
43 RET-16 STORAGE-KONZEPT.md: Widerspruch ZFS als WORM-Backend klären ⏳ Retention & WORM Backend Einfach 0.5 9 Backlog Ausnahmevermerk ZFS fuer WORM-Basisverzeichnis ergaenzt; Verweis auf RET-11-Pruefprotokoll; keine sonstigen Aenderungen Dokument-Review; Diff-Pruefung
44 CMP-08 Ende-zu-Ende-Nachweis eDiscovery-Adapter (reale Drittmodul-Integration) ⚖️ Compliance & eDiscovery Backend Mittel 2 9 Backlog eDiscovery-Export gegen echte DMS-/Mail-Testinstanzen; Treffer korrekt und pruefsummengesichert; Nachtrag zu QA-03 dokumentiert Echter Testlauf dokumentiert; Pruefsummen identisch; offene Restrisiken benannt
45 SEC-01 Rolle muss aus verifizierter Identität kommen, nicht aus Client-Header 🔒 Sicherheit Backend Hoch 3 10 Backlog Go, bestehende Authentifizierungs-Infrastruktur (Session/JWT), Next.js (Frontend-Teil) Rolle wird in retentionapi/kennzahlenapi/complianceapi aus X-User-Role-Header statt verifizierter Identität gelesen (K3); NEXT_PUBLIC_USER_ROLE im Frontend muss entfernt werden. SEC-02 authz.go liest Rolle ausschliesslich aus verifizierter Identitaet (Session/JWT), X-User-Role wird ignoriert/abgelehnt NEXT_PUBLIC_USER_ROLE aus compliance-reports und retention-admin Frontend entfernt requested_by speichert nachvollziehbare Nutzeridentitaet statt nur Rollenname CORS laesst Rollen-Header-basierte Cross-Origin-Zugriffe nicht mehr zu Angriff mit gefaelschtem X-User-Role Header real nachgestellt und als blockiert nachgewiesen Legitimer Aufruf mit echter Rolle aus verifizierter Session funktioniert weiterhin Audit-Log enthaelt tatsaechliche Nutzeridentitaet Frontend-Build enthaelt NEXT_PUBLIC_USER_ROLE nachweislich nicht mehr
46 SEC-02 Tenant-Validierung in kennzahlenapi fehlt (Cross-Tenant-Leseleck) 🔒 Sicherheit Backend Niedrig 1 10 Backlog Go, bestehendes InstanceTenant-Validierungsmuster aus legalholdapi.go kennzahlenapi/handler.go:45 validiert den Query-Tenant nicht gegen InstanceTenant (H11), ermoeglicht Cross-Tenant-Lesen von Kennzahlen. handler.go validiert tenant Query-Parameter gegen InstanceTenant nach Muster aus legalholdapi.go Abweichung fuehrt zu Ablehnung (403), kein stillschweigendes Ignorieren Bestehende legitime Aufrufe funktionieren unveraendert Angriff mit fremdem tenant Query-Parameter real nachgestellt und als blockiert nachgewiesen Legitimer Aufruf mit eigenem tenant liefert weiterhin korrekte Daten Musterkonsistenz mit legalholdapi.go dokumentiert
47 SEC-03 TOCTOU Legal Hold vs. Destroy; Destroy ausserhalb der aeusseren Transaktion 🔒 Sicherheit Backend Mittel 2 10 Backlog PostgreSQL, pgx/v5, atomare UPDATE-Bedingungen, Transaktionssteuerung deletionworkflow.go prueft Legal Hold in separatem Query vor dem Loesch-UPDATE (TOCTOU, M1); deletionapproval.go ruft Destroy ausserhalb der aeusseren Transaktion auf. Legal-Hold-Pruefung ist Teil derselben atomaren UPDATE-Anweisung wie die Statusaenderung Destroy() laeuft innerhalb derselben Transaktion wie die Antragsfinalisierung Kein Codepfad mehr, in dem physische Vernichtung und DB-Zustand auseinanderlaufen TOCTOU-Fenster real nachgestellt (Legal Hold zwischen Pruefung und Update gesetzt) und als blockiert nachgewiesen Simulierter Fehler nach Destroy() vor Commit nachgestellt, Konsistenz nachgewiesen Regulaerer Loeschvorgang ohne Hold und ohne Fehler funktioniert weiterhin
48 SEC-04 wormstore: Release/Destroy ohne Legal-Hold-Pruefung, Reihenfolge-Problem 🔒 Sicherheit Backend Mittel 2 10 Backlog Go, Dateisystemoperationen, Zwei-Phasen-Commit-Muster, Pfad-Validierung wormstore.go prueft bei Release/Destroy keinen Legal Hold, physische Operation erfolgt vor DB-Commit (M2); filepath.Join ohne Traversal-Check auf key. Release/Destroy pruefen vor Ausfuehrung aktiven Legal Hold und verweigern bei Treffer Physische Operation erfolgt erst nach erfolgreichem DB-Commit bzw. Zwei-Phasen-Commit-Muster verhindert inkonsistenten Zwischenzustand key wird gegen Pfad-Traversal validiert Release/Destroy mit aktivem Legal Hold real nachgestellt und als blockiert nachgewiesen Simulierter Absturz zwischen physischer Operation und Commit nachgestellt, kein inkonsistenter Zustand Traversal-Angriff mit ../ Segmenten real nachgestellt und als blockiert nachgewiesen Regulaerer Release/Destroy ohne Hold und ohne Traversal funktioniert weiterhin
49 SEC-05 moduleadapter /register: fehlende Tenant-Bindung, optionale Authentifizierung 🔒 Sicherheit Backend Mittel 2 10 Backlog PostgreSQL, SQL-Migrationen (kein ORM), Go, bestehende Authentifizierungs-Middleware UNIQUE(module_name, object_type) ohne Tenant-Spalte (M3) erlaubt Cross-Tenant-Kollision bei Registrierung; ALLOW_UNAUTHENTICATED=true schaltet Auth fuer /register und /legal-hold komplett ab. UNIQUE-Constraint umfasst Tenant-Spalte, zwei Mandanten koennen denselben module_name/object_type unabhaengig registrieren Migration ueberfuehrt bestehende Registrierungen korrekt, ist rueckrollbar ALLOW_UNAUTHENTICATED hat in keiner produktionsnahen Konfiguration Standardwert true /register und /legal-hold verlangen bei deaktiviertem Schalter gueltige Authentifizierung Cross-Tenant-Kollision bei Registrierung real nachgestellt, nach Fix bestehen beide Registrierungen unabhaengig Migration vorwaerts und rueckwaerts gegen Datenbank mit bestehenden Testregistrierungen getestet Aufruf ohne Authentifizierung bei deaktiviertem Schalter real nachgestellt und als blockiert nachgewiesen Bestehende authentifizierte Registrierungsablaeufe funktionieren weiterhin
50 SEC-06 Append-only-Luecken bei mehreren Archive-Tabellen 🔒 Sicherheit Backend Mittel 2 10 Backlog PostgreSQL, SQL-Migrationen, bestehendes REVOKE/Trigger-Muster aus RET-11/AUD-07 legal_holds hat ON DELETE CASCADE, retention_class_assignments/dsgvo_decision_log/deletion_requests/worm_objects haben trotz Append-only-Anspruch kein DB-seitiges REVOKE/Trigger (M4). legal_holds verwendet ON DELETE RESTRICT oder eigene Historisierung statt CASCADE Betroffene vier Tabellen erhalten REVOKE UPDATE/DELETE von App-Rolle plus Trigger mit RAISE WARNING nach RET-11/AUD-07-Muster Bestehender Code mit UPDATE/DELETE auf worm_objects auf Insert-only-Logik umgestellt Direkter UPDATE/DELETE-Versuch auf allen vier Tabellen real nachgestellt und als blockiert/protokolliert nachgewiesen Loeschen eines Objekts mit aktivem Legal Hold real nachgestellt, Kaskaden-Verlust des Hold-Nachweises verhindert Migration vorwaerts und rueckwaerts gegen Datenbank mit Testdaten getestet Umgestellter Anwendungscode fuer worm_objects mit regulaerem Statuswechsel-Testfall erfolgreich durchlaufen
File diff suppressed because it is too large. Load diff
+50
View File
@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Archive Kanban – lokal</title>
<link rel="stylesheet" href="../_shared/kanban.css">
</head>
<body>
<header>
<div class="row">
<h1>Archive Kanban <span class="sub">– lokal, offline, ohne Server</span></h1>
<input id="q" placeholder="Suche: Code, Titel, Technik …" style="min-width:220px" />
<select id="fEpic"><option value="">Alle Epics</option></select>
<select id="fRole"><option value="">Alle Rollen</option></select>
<select id="fWave"><option value="">Alle Wellen</option></select>
<button id="onlyReady">Nur startbare</button>
<button id="exportBtn">Stand sichern</button>
<button id="resetBtn">Zurücksetzen</button>
</div>
<div class="stats" id="stats"></div>
</header>
<div class="board" id="board"></div>
<dialog id="dlg">
<div class="dlg-head">
<div>
<div class="code" id="dCode" style="font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--muted)"></div>
<div id="dTitle" style="font-size:18px;font-weight:600;margin-top:4px"></div>
<div id="dMeta" style="margin-top:8px"></div>
</div>
<div class="row">
<button class="primary" id="copyBtn">Prompt kopieren</button>
<button id="closeBtn">Schließen</button>
</div>
</div>
<div class="dlg-body">
<p id="dDesc" style="font-size:13px;color:#C7D3E5;line-height:1.6;margin-top:0"></p>
<h3>Baut auf</h3><div id="dDeps"></div>
<h3>Schaltet frei</h3><div id="dNext"></div>
<h3>Akzeptanzkriterien</h3><ul id="dAcc"></ul>
<h3>Prüfungen vor der Abnahme</h3><ul id="dChk"></ul>
<h3>Bau-Prompt</h3><pre id="dPrompt"></pre>
</div>
</dialog>
<script id="data" type="application/json">{"erzeugtAm": "2026-08-26", "totalDays": 93, "epics": [{"key": "RET", "name": "Retention & WORM", "emoji": "⏳", "color": "#B45309", "description": "Aufbewahrungsfristen, Legal Hold, WORM-Speicher und Modul-Adapter-Schnittstelle für DMS/Mail."}, {"key": "CMP", "name": "Compliance & eDiscovery", "emoji": "⚖️", "color": "#7C3AED", "description": "GoBD-Verfahrensdokumentation, DSGVO-Berichte, eDiscovery-Export und Vier-Augen-Freigaben."}, {"key": "BAK", "name": "Backup & Wiederherstellung", "emoji": "💾", "color": "#0369A1", "description": "Datenbank- und Objekt-Storage-Sicherung, Restore-Verfahren und Konsistenzprüfung."}, {"key": "ANA", "name": "Kennzahlen & Reporting", "emoji": "📊", "color": "#A855F7", "description": "Modulübergreifende Kennzahlen-Aggregation, Auswertungs-Dashboard und Lizenz-/Nutzungs-Reports."}, {"key": "QA", "name": "Prüfungen & Qualitätssicherung", "emoji": "✅", "color": "#16A34A", "description": "Teststrategie und verbindliche Prüfgates für Retention, Compliance und Backup."}], "waves": [{"welle": 1, "codes": ["RET-01", "CMP-04", "BAK-01", "BAK-02", "QA-01"]}, {"welle": 2, "codes": ["RET-02", "RET-04", "RET-05", "CMP-01", "CMP-02", "BAK-03", "BAK-05", "BAK-07"]}, {"welle": 3, "codes": ["RET-03", "RET-06", "RET-07", "CMP-03", "CMP-05", "BAK-04", "BAK-06", "ANA-01", "QA-06"]}, {"welle": 4, "codes": ["CMP-06", "ANA-02", "ANA-03", "QA-02", "QA-04", "CMP-07"]}, {"welle": 5, "codes": ["QA-03"]}, {"welle": 6, "codes": ["QA-05", "QA-07"]}, {"welle": 7, "codes": ["RET-11", "RET-12", "BAK-09", "BAK-10"]}], "kritischerPfad": {"path": ["RET-01", "RET-02", "RET-03", "CMP-06", "QA-03", "QA-05"], "days": 16}, "produktDna": {"uebernehmen": [{"produkt": "Alfresco", "staerke": "Retention Policies mit Stichtagsberechnung, revisionssichere Ablage und Aufbewahrungssperre (Legal Hold)."}, {"produkt": "Alfresco", "staerke": "Vier-Augen-Prinzip bei Freigaben, insbesondere bei Löschungen."}, {"produkt": "ecoDMS", "staerke": "Revisionssicherheit als Grundhaltung: unveränderliches Protokoll, nachvollziehbare Vernichtung."}, {"produkt": "restic/Borg", "staerke": "Inkrementelle, deduplizierende Sicherung mit eingebauter Verifikation und routinemäßigem Restore-Test."}], "vermeiden": [{"produkt": "Alfresco – schwergewichtige Plattform mit hohem Ressourcenbedarf und trägem Betrieb.", "ansatz": "Schlanker Go-Dienst mit Postgres-Jobqueue statt Java-Anwendungsserver und zusätzlicher Message-Queue-Infrastruktur."}]}, "epicDna": {"RET": {"leitsatz": "Aufbewahrung mit dem Ernst von Alfrescos Retention Policies, aber ohne dessen Ressourcen-Overhead.", "uebernehmen": ["Alfresco: Retention Policies mit Stichtagsberechnung je Objekttyp und automatischem Ablauf.", "ecoDMS: Revisionssicherheit als Grundhaltung – einmal archiviert, nicht mehr veränderbar.", "Alfresco: Aufbewahrungssperre (Legal Hold), die jede Löschregel überstimmt."], "vermeiden": ["Alfresco – hoher Ressourcen-Overhead der Plattform: schlanker Go-Dienst statt schwergewichtiger Anwendungsserver.", "Keine modulspezifische Retention-Logik in DMS oder Mail – ein zentraler Adapter für alle Objekttypen."]}, "CMP": {"leitsatz": "Nachweisführung wie ecoDMS, Vier-Augen-Prinzip wie Alfresco, aber schlank umgesetzt.", "uebernehmen": ["Alfresco: Vier-Augen-Prinzip bei Freigaben – Löschung nur mit zweiter, unabhängiger Bestätigung.", "ecoDMS: Nachvollziehbare Vernichtung mit lückenlosem Protokoll.", "GoBD-konforme Verfahrensdokumentation als exportierbares Dokument, nicht als Prosa-Anhang."], "vermeiden": ["Alfresco – Freigabeprozesse mit hoher Konfigurationslast: feste, einfache Vier-Augen-Regel statt konfigurierbarer Workflow-Engine.", "Keine Berichte, die nur manuell zusammengestellt werden können – jeder Bericht ist ein Exportknopf."]}, "BAK": {"leitsatz": "Sicherung nach dem Vorbild von restic/Borg: inkrementell, deduplizierend, verifizierbar.", "uebernehmen": ["restic/Borg: Inkrementelle, deduplizierende Sicherung mit Verifikation jeder Sicherung.", "restic/Borg: Wiederherstellung ist Routine, nicht Ausnahmefall – regelmäßig getestet.", "Reconciliation zwischen Objekt-Storage und Datenbank als eigenständige, planbare Prüfung."], "vermeiden": ["Keine Sicherung ohne belegten Wiederherstellungstest – eine ungeprüfte Sicherung zählt nicht als Sicherung.", "Kein Restore, der ein nicht-leeres Zielverzeichnis direkt überschreibt, ohne Atomarität zu garantieren."]}, "ANA": {"leitsatz": "Kennzahlen modulübergreifend an einer Stelle, nicht in jedem Modul einzeln nachgebaut.", "uebernehmen": ["Ein Aggregationsdienst für Kennzahlen aus DMS, Mail und Archive statt Silo-Reports je Modul.", "Dashboard mit Facetten und Filtern statt starrer Report-Vorlagen."], "vermeiden": ["Keine Kennzahlenlogik, die doppelt in DMS und Mail gepflegt werden muss."]}, "QA": {"leitsatz": "Prüfen heißt messen. Behauptungen ohne Messprotokoll gelten nicht als erledigt.", "uebernehmen": ["Fester PrüLine truncated
<script src="../_shared/kanban.js"></script>
</body>
</html>
+61
View File
@@ -0,0 +1,61 @@
# ANA-01 – Kennzahlen-Aggregation (modulübergreifend)
**Epic:** 📊 Kennzahlen & Reporting | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 3
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Zentraler Dienst, der Kennzahlen (Objektbestand, Aufbewahrungsstatus, Löschvorgänge, Speichervolumen) aus allen über RET-05 registrierten Modulen aggregiert.
**Technische Grundlage:** Aggregations-Job über registrierte Module
## Produkt-DNA für diesen Bereich
> Kennzahlen modulübergreifend an einer Stelle, nicht in jedem Modul einzeln nachgebaut.
**Übernehmen:**
- Ein Aggregationsdienst für Kennzahlen aus DMS, Mail und Archive statt Silo-Reports je Modul.
- Dashboard mit Facetten und Filtern statt starrer Report-Vorlagen.
**Bewusst vermeiden:**
- Keine Kennzahlenlogik, die doppelt in DMS und Mail gepflegt werden muss.
**Für genau diese Kachel:** Eine Aggregationsstelle für alle Module – DMS und Mail bauen keine eigene Kennzahlenlogik mehr.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `RET-05` Modul-Adapter-Schnittstelle (DMS/Mail registrieren Objekttypen) – Schnittstelle, über die DMS und Mail ihre Objekttypen (Dokument, Mail, Anhang) und die zugehörige Aufbewahrungsklasse bei Archive registrieren, statt eigene Retention-Logik zu bauen.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Kennzahlen werden je Tenant und Modul sowie modulübergreifend aggregiert
2. Aggregation läuft periodisch und liefert konsistente Werte über einen Zeitverlauf
3. Neues registriertes Modul wird ohne Codeänderung in die Aggregation einbezogen
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Aggregation über zwei fiktive Module liefert korrekte Summen- und Einzelwerte
2. Wiederholte Aggregation ohne Datenänderung liefert stabile Ergebnisse
3. Neu registriertes drittes Testmodul erscheint automatisch in der nächsten Aggregation
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `ANA-02` Auswertungs-Dashboard
- `ANA-03` Lizenz-/Nutzungs-Reports
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `ANA-01: kennzahlen-aggregation-modulübergreifend`
- Branch: `feature/ana-01-kennzahlen-aggregation-modulübergreifend`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+60
View File
@@ -0,0 +1,60 @@
# ANA-02 – Auswertungs-Dashboard
**Epic:** 📊 Kennzahlen & Reporting | **Rolle:** Frontend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 4
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Frontend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Oberfläche und Bedienbarkeit. Ruft ausschließlich vorhandene Schnittstellen auf, keine eigene Geschäftslogik.
## Auftrag
Dashboard zur Visualisierung der aggregierten Kennzahlen mit Filtern nach Tenant, Modul und Zeitraum.
**Technische Grundlage:** Next.js/React/TypeScript
## Produkt-DNA für diesen Bereich
> Kennzahlen modulübergreifend an einer Stelle, nicht in jedem Modul einzeln nachgebaut.
**Übernehmen:**
- Ein Aggregationsdienst für Kennzahlen aus DMS, Mail und Archive statt Silo-Reports je Modul.
- Dashboard mit Facetten und Filtern statt starrer Report-Vorlagen.
**Bewusst vermeiden:**
- Keine Kennzahlenlogik, die doppelt in DMS und Mail gepflegt werden muss.
**Für genau diese Kachel:** Kennzahlen ohne Dashboard bleiben Rohdaten – erst die Visualisierung macht sie für Fachanwender nutzbar.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `ANA-01` Kennzahlen-Aggregation (modulübergreifend) – Zentraler Dienst, der Kennzahlen (Objektbestand, Aufbewahrungsstatus, Löschvorgänge, Speichervolumen) aus allen über RET-05 registrierten Modulen aggregiert.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Dashboard zeigt Bestands-, Aufbewahrungs- und Löschkennzahlen je Tenant
2. Filter nach Modul und Zeitraum funktionieren kombinierbar
3. Dashboard lädt auch bei großem Datenbestand in angemessener Zeit
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Filterkombination liefert dieselben Werte wie eine direkte Abfrage der Aggregation
2. Dashboard mit synthetisch großem Testbestand bleibt bedienbar
3. Rollen ohne Berechtigung sehen keine Kennzahlen fremder Tenants
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- Alles, was nicht in den Akzeptanzkriterien steht. Keine vorauseilende Umsetzung späterer Anforderungen.
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `ANA-02: auswertungs-dashboard`
- Branch: `feature/ana-02-auswertungs-dashboard`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+60
View File
@@ -0,0 +1,60 @@
# ANA-03 – Lizenz-/Nutzungs-Reports
**Epic:** 📊 Kennzahlen & Reporting | **Rolle:** Backend | **Komplexität:** Einfach | **Aufwand:** 2 Personentage | **Welle:** 4
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Bericht über Nutzung und Lizenzrelevantes je Tenant (Speichervolumen, aktive Objekte, Nutzeranzahl-Bezug), abgestimmt mit dem Lizenzmodell aus NEXARCH Core.
**Technische Grundlage:** CSV/PDF-Export
## Produkt-DNA für diesen Bereich
> Kennzahlen modulübergreifend an einer Stelle, nicht in jedem Modul einzeln nachgebaut.
**Übernehmen:**
- Ein Aggregationsdienst für Kennzahlen aus DMS, Mail und Archive statt Silo-Reports je Modul.
- Dashboard mit Facetten und Filtern statt starrer Report-Vorlagen.
**Bewusst vermeiden:**
- Keine Kennzahlenlogik, die doppelt in DMS und Mail gepflegt werden muss.
**Für genau diese Kachel:** Lizenzrelevante Nutzungswerte gehören sauber belegt vorzuliegen, statt bei Bedarf händisch aus Rohdaten geschätzt zu werden.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `ANA-01` Kennzahlen-Aggregation (modulübergreifend) – Zentraler Dienst, der Kennzahlen (Objektbestand, Aufbewahrungsstatus, Löschvorgänge, Speichervolumen) aus allen über RET-05 registrierten Modulen aggregiert.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Bericht zeigt lizenzrelevante Nutzungswerte je Tenant für einen wählbaren Zeitraum
2. Werte stimmen mit der zugrunde liegenden Kennzahlen-Aggregation überein
3. Export ist als CSV und PDF verfügbar
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Bericht für Testzeitraum stimmt mit manuell nachgerechneten Werten überein
2. Export in beiden Formaten enthält identische Kernwerte
3. Bericht für Tenant ohne Aktivität liefert nachvollziehbar leere/Null-Werte statt Fehler
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- Alles, was nicht in den Akzeptanzkriterien steht. Keine vorauseilende Umsetzung späterer Anforderungen.
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `ANA-03: lizenz-nutzungs-reports`
- Branch: `feature/ana-03-lizenz-nutzungs-reports`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+62
View File
@@ -0,0 +1,62 @@
# BAK-01 – Datenbank-Backup-Strategie
**Epic:** 💾 Backup & Wiederherstellung | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 1
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Automatisierte, inkrementelle Sicherung der PostgreSQL-Datenbank mit Aufbewahrung mehrerer Generationen und Verifikation jeder Sicherung.
**Technische Grundlage:** PostgreSQL (pg_dump/pg_basebackup), inkrementelle Sicherung
## Produkt-DNA für diesen Bereich
> Sicherung nach dem Vorbild von restic/Borg: inkrementell, deduplizierend, verifizierbar.
**Übernehmen:**
- restic/Borg: Inkrementelle, deduplizierende Sicherung mit Verifikation jeder Sicherung.
- restic/Borg: Wiederherstellung ist Routine, nicht Ausnahmefall – regelmäßig getestet.
- Reconciliation zwischen Objekt-Storage und Datenbank als eigenständige, planbare Prüfung.
**Bewusst vermeiden:**
- Keine Sicherung ohne belegten Wiederherstellungstest – eine ungeprüfte Sicherung zählt nicht als Sicherung.
- Kein Restore, der ein nicht-leeres Zielverzeichnis direkt überschreibt, ohne Atomarität zu garantieren.
**Für genau diese Kachel:** Ohne verifizierte Sicherung ist jede spätere Wiederherstellung reine Hoffnung – die Verifikation ist deshalb Pflichtbestandteil, nicht Kür.
## Ausgangslage
Diese Kachel hat keine Vorbedingungen und ist sofort startbar.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Vollsicherung und inkrementelle Sicherung laufen automatisiert nach Zeitplan
2. Jede Sicherung wird nach Abschluss auf Lesbarkeit verifiziert, nicht nur auf Erstellung geprüft
3. Mehrere Sicherungsgenerationen werden nach konfigurierbarer Regel vorgehalten und alte automatisch entfernt
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Sicherung gegen Testdatenbank erfolgreich erstellt und verifiziert
2. Verifikation erkennt eine absichtlich beschädigte Sicherungsdatei
3. Rotationsregel entfernt nachweislich nur die ältesten Generationen
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `BAK-03` Restore-Verfahren
- `BAK-05` Reconciliation (Konsistenzprüfung Storage vs. DB)
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `BAK-01: datenbank-backup-strategie`
- Branch: `feature/bak-01-datenbank-backup-strategie`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+62
View File
@@ -0,0 +1,62 @@
# BAK-02 – Objekt-Storage-Backup/Snapshots
**Epic:** 💾 Backup & Wiederherstellung | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 1
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Automatisierte, deduplizierende Sicherung der im Objekt-Storage abgelegten Dateiinhalte, angelehnt an das restic/Borg-Sicherungskonzept.
**Technische Grundlage:** Objekt-Storage-Snapshots, inkrementell und deduplizierend
## Produkt-DNA für diesen Bereich
> Sicherung nach dem Vorbild von restic/Borg: inkrementell, deduplizierend, verifizierbar.
**Übernehmen:**
- restic/Borg: Inkrementelle, deduplizierende Sicherung mit Verifikation jeder Sicherung.
- restic/Borg: Wiederherstellung ist Routine, nicht Ausnahmefall – regelmäßig getestet.
- Reconciliation zwischen Objekt-Storage und Datenbank als eigenständige, planbare Prüfung.
**Bewusst vermeiden:**
- Keine Sicherung ohne belegten Wiederherstellungstest – eine ungeprüfte Sicherung zählt nicht als Sicherung.
- Kein Restore, der ein nicht-leeres Zielverzeichnis direkt überschreibt, ohne Atomarität zu garantieren.
**Für genau diese Kachel:** Inkrementell und deduplizierend wie restic/Borg – Sicherungsvolumen und -dauer bleiben auch bei großen Beständen beherrschbar.
## Ausgangslage
Diese Kachel hat keine Vorbedingungen und ist sofort startbar.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Sicherung erfasst neue und geänderte Objekte inkrementell, ohne unveränderte Objekte erneut zu übertragen
2. Sicherung ist deduplizierend, identische Inhalte werden nur einmal gespeichert
3. Jede Sicherung lässt sich einzeln auf Vollständigkeit prüfen
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Zweiter Sicherungslauf nach unverändertem Bestand überträgt keine Daten erneut
2. Zwei identische Testdateien belegen nachweislich nur einmal Speicherplatz
3. Vollständigkeitsprüfung erkennt ein fehlendes Objekt in der Sicherung
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `BAK-03` Restore-Verfahren
- `BAK-05` Reconciliation (Konsistenzprüfung Storage vs. DB)
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `BAK-02: objekt-storage-backup-snapshots`
- Branch: `feature/bak-02-objekt-storage-backup-snapshots`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+68
View File
@@ -0,0 +1,68 @@
# BAK-03 – Restore-Verfahren
**Epic:** 💾 Backup & Wiederherstellung | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 2
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Dokumentiertes, wiederholbares Verfahren zur Wiederherstellung von Datenbank und Objekt-Storage aus einer Sicherung, für Notfall wie für Einzelobjekt-Restore.
**Technische Grundlage:** Atomarer Restore über temporäres Verzeichnis
## Produkt-DNA für diesen Bereich
> Sicherung nach dem Vorbild von restic/Borg: inkrementell, deduplizierend, verifizierbar.
**Übernehmen:**
- restic/Borg: Inkrementelle, deduplizierende Sicherung mit Verifikation jeder Sicherung.
- restic/Borg: Wiederherstellung ist Routine, nicht Ausnahmefall – regelmäßig getestet.
- Reconciliation zwischen Objekt-Storage und Datenbank als eigenständige, planbare Prüfung.
**Bewusst vermeiden:**
- Keine Sicherung ohne belegten Wiederherstellungstest – eine ungeprüfte Sicherung zählt nicht als Sicherung.
- Kein Restore, der ein nicht-leeres Zielverzeichnis direkt überschreibt, ohne Atomarität zu garantieren.
**Für genau diese Kachel:** Restore ist das eigentliche Produkt einer Sicherung – eine Sicherung ohne funktionierenden Restore ist wertlos.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `BAK-01` Datenbank-Backup-Strategie – Automatisierte, inkrementelle Sicherung der PostgreSQL-Datenbank mit Aufbewahrung mehrerer Generationen und Verifikation jeder Sicherung.
- `BAK-02` Objekt-Storage-Backup/Snapshots – Automatisierte, deduplizierende Sicherung der im Objekt-Storage abgelegten Dateiinhalte, angelehnt an das restic/Borg-Sicherungskonzept.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Restore stellt Datenbank und Objekt-Storage aus einer gewählten Sicherungsgeneration wieder her
2. Restore in ein nicht-leeres Zielverzeichnis beschädigt den bestehenden Inhalt nicht, solange der Vorgang nicht bestätigt wird
3. Restore-Vorgang wird protokolliert (Quelle, Zeitpunkt, Ergebnis)
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Restore auf leerem System vollständig und erfolgreich durchgeführt
2. Restore auf nicht-leeres Zielverzeichnis lässt bei Abbruch den ursprünglichen Inhalt unverändert
3. Protokolleintrag zum Restore ist vollständig und nachvollziehbar
## Bekannte Fehler vermeiden
Aus einem bereits produktiven Schwestersystem bekannt: Restore in ein nicht-leeres Zielverzeichnis kann den bestehenden Inhalt beschädigen, wenn nicht atomar vorgegangen wird (`cmd_backup.go:206`, Bug-Klasse „-force restore where destination isn't empty“). Restore deshalb immer in ein leeres temporäres Verzeichnis schreiben und erst danach per atomarem Swap (z. B. Verzeichnis-Rename) an die Zielstelle bringen. Niemals direkt in ein belegtes Zielverzeichnis hineinschreiben.
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `BAK-04` Tenant-Backup & -Restore (einzelner Mandant)
- `BAK-06` Restore-Testverfahren
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `BAK-03: restore-verfahren`
- Branch: `feature/bak-03-restore-verfahren`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+62
View File
@@ -0,0 +1,62 @@
# BAK-04 – Tenant-Backup & -Restore (einzelner Mandant)
**Epic:** 💾 Backup & Wiederherstellung | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 3
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Sicherung und Wiederherstellung der Daten eines einzelnen Mandanten, ohne andere Mandanten zu berühren – etwa für Mandanten-Umzug oder isolierte Notfallwiederherstellung.
**Technische Grundlage:** Tenant-scharfer Export/Import auf Basis von BAK-03
## Produkt-DNA für diesen Bereich
> Sicherung nach dem Vorbild von restic/Borg: inkrementell, deduplizierend, verifizierbar.
**Übernehmen:**
- restic/Borg: Inkrementelle, deduplizierende Sicherung mit Verifikation jeder Sicherung.
- restic/Borg: Wiederherstellung ist Routine, nicht Ausnahmefall – regelmäßig getestet.
- Reconciliation zwischen Objekt-Storage und Datenbank als eigenständige, planbare Prüfung.
**Bewusst vermeiden:**
- Keine Sicherung ohne belegten Wiederherstellungstest – eine ungeprüfte Sicherung zählt nicht als Sicherung.
- Kein Restore, der ein nicht-leeres Zielverzeichnis direkt überschreibt, ohne Atomarität zu garantieren.
**Für genau diese Kachel:** Ein Mandant will manchmal umziehen oder isoliert wiederhergestellt werden, ohne dass alle anderen Mandanten betroffen sind.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `BAK-03` Restore-Verfahren – Dokumentiertes, wiederholbares Verfahren zur Wiederherstellung von Datenbank und Objekt-Storage aus einer Sicherung, für Notfall wie für Einzelobjekt-Restore.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Sicherung eines Tenants enthält ausschließlich dessen Daten aus Datenbank und Objekt-Storage
2. Wiederherstellung eines Tenants verändert keine Daten anderer Tenants
3. Tenant-Sicherung lässt sich unabhängig vom Gesamt-Backup planen und ausführen
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Sicherung von Tenant A enthält keine Datensätze von Tenant B (Stichprobe)
2. Wiederherstellung von Tenant A in eine Testumgebung verändert Tenant B dort nicht
3. Tenant-Sicherung und -Restore vollständig protokolliert
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- Alles, was nicht in den Akzeptanzkriterien steht. Keine vorauseilende Umsetzung späterer Anforderungen.
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `BAK-04: tenant-backup-und-restore-einzelner-mandant`
- Branch: `feature/bak-04-tenant-backup-und-restore-einzelner-mandant`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+63
View File
@@ -0,0 +1,63 @@
# BAK-05 – Reconciliation (Konsistenzprüfung Storage vs. DB)
**Epic:** 💾 Backup & Wiederherstellung | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 2
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Periodische Prüfung, ob jeder in der Datenbank referenzierte Objekt-Storage-Eintrag tatsächlich existiert und umgekehrt, mit Bericht über Abweichungen.
**Technische Grundlage:** Geplanter Abgleichs-Job, Postgres-Jobqueue
## Produkt-DNA für diesen Bereich
> Sicherung nach dem Vorbild von restic/Borg: inkrementell, deduplizierend, verifizierbar.
**Übernehmen:**
- restic/Borg: Inkrementelle, deduplizierende Sicherung mit Verifikation jeder Sicherung.
- restic/Borg: Wiederherstellung ist Routine, nicht Ausnahmefall – regelmäßig getestet.
- Reconciliation zwischen Objekt-Storage und Datenbank als eigenständige, planbare Prüfung.
**Bewusst vermeiden:**
- Keine Sicherung ohne belegten Wiederherstellungstest – eine ungeprüfte Sicherung zählt nicht als Sicherung.
- Kein Restore, der ein nicht-leeres Zielverzeichnis direkt überschreibt, ohne Atomarität zu garantieren.
**Für genau diese Kachel:** Sicherung und Datenbank laufen über Jahre leicht auseinander – Reconciliation macht diesen stillen Drift sichtbar, bevor ein Restore daran scheitert.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `BAK-01` Datenbank-Backup-Strategie – Automatisierte, inkrementelle Sicherung der PostgreSQL-Datenbank mit Aufbewahrung mehrerer Generationen und Verifikation jeder Sicherung.
- `BAK-02` Objekt-Storage-Backup/Snapshots – Automatisierte, deduplizierende Sicherung der im Objekt-Storage abgelegten Dateiinhalte, angelehnt an das restic/Borg-Sicherungskonzept.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Job erkennt Datenbankeinträge ohne zugehöriges Objekt im Storage
2. Job erkennt Objekte im Storage ohne zugehörigen Datenbankeintrag
3. Abweichungen werden berichtet, nicht automatisch stillschweigend behoben
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Absichtlich entferntes Storage-Objekt wird vom Job als Abweichung erkannt
2. Absichtlich verwaister Datenbankeintrag wird vom Job als Abweichung erkannt
3. Lauf ohne Abweichungen liefert einen leeren, eindeutig als sauber erkennbaren Bericht
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- Alles, was nicht in den Akzeptanzkriterien steht. Keine vorauseilende Umsetzung späterer Anforderungen.
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `BAK-05: reconciliation-konsistenzprüfung-storage-vs-db`
- Branch: `feature/bak-05-reconciliation-konsistenzprüfung-storage-vs-db`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+62
View File
@@ -0,0 +1,62 @@
# BAK-06 – Restore-Testverfahren
**Epic:** 💾 Backup & Wiederherstellung | **Rolle:** Backend | **Komplexität:** Einfach | **Aufwand:** 2 Personentage | **Welle:** 3
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Regelmäßiger, automatisierter Testlauf des Restore-Verfahrens gegen eine isolierte Testumgebung, mit Ergebnisprotokoll als Nachweis der Wiederherstellbarkeit.
**Technische Grundlage:** Automatisierter, periodischer Restore-Test in Testumgebung
## Produkt-DNA für diesen Bereich
> Sicherung nach dem Vorbild von restic/Borg: inkrementell, deduplizierend, verifizierbar.
**Übernehmen:**
- restic/Borg: Inkrementelle, deduplizierende Sicherung mit Verifikation jeder Sicherung.
- restic/Borg: Wiederherstellung ist Routine, nicht Ausnahmefall – regelmäßig getestet.
- Reconciliation zwischen Objekt-Storage und Datenbank als eigenständige, planbare Prüfung.
**Bewusst vermeiden:**
- Keine Sicherung ohne belegten Wiederherstellungstest – eine ungeprüfte Sicherung zählt nicht als Sicherung.
- Kein Restore, der ein nicht-leeres Zielverzeichnis direkt überschreibt, ohne Atomarität zu garantieren.
**Für genau diese Kachel:** Eine Sicherung gilt erst als geprüft, wenn ihr Restore regelmäßig und automatisiert getestet wird – nicht nur einmal beim Einrichten.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `BAK-03` Restore-Verfahren – Dokumentiertes, wiederholbares Verfahren zur Wiederherstellung von Datenbank und Objekt-Storage aus einer Sicherung, für Notfall wie für Einzelobjekt-Restore.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Testlauf führt einen vollständigen Restore in eine isolierte Testumgebung durch
2. Ergebnis (erfolgreich/fehlgeschlagen) wird mit Zeitstempel protokolliert
3. Fehlgeschlagener Testlauf löst eine sichtbare Warnung aus
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Geplanter Testlauf gegen aktuelle Sicherung erfolgreich durchgeführt und protokolliert
2. Absichtlich beschädigte Sicherung lässt den Testlauf sichtbar fehlschlagen
3. Protokollhistorie zeigt mehrere zurückliegende Testläufe nachvollziehbar an
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `QA-04` Prüfgate Backup & Restore
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `BAK-06: restore-testverfahren`
- Branch: `feature/bak-06-restore-testverfahren`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+65
View File
@@ -0,0 +1,65 @@
# BAK-07 – Aufbewahrungsfrist für Backup-Snapshots
**Epic:** 💾 Backup & Wiederherstellung | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 2
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Eigene, von der Dokumenten-Retention (RET-02) unabhängige Aufbewahrungsfrist für Backup-Snapshots selbst – nach restic/Borg-Vorbild eine Prune-Policy (z. B. tägliche Snapshots 14 Tage, wöchentliche 3 Monate, monatliche 1 Jahr – konkrete Staffelung als Konfiguration, nicht hart codiert), damit Backups nicht unbegrenzt wachsen, aber auch nicht zu früh gelöscht werden.
**Technische Grundlage:** PostgreSQL, Postgres-Jobqueue (geplante Jobs statt Redis)
## Produkt-DNA für diesen Bereich
> Sicherung nach dem Vorbild von restic/Borg: inkrementell, deduplizierend, verifizierbar.
**Übernehmen:**
- restic/Borg: Inkrementelle, deduplizierende Sicherung mit Verifikation jeder Sicherung.
- restic/Borg: eigene, konfigurierbare Prune-Policy für die Aufbewahrung der Sicherungen selbst (Staffelung nach Alter).
- Reconciliation zwischen Objekt-Storage und Datenbank als eigenständige, planbare Prüfung.
**Bewusst vermeiden:**
- Backup-Aufbewahrung mit der Dokumenten-Retention (RET-02) zu verwechseln ist ein Kategorienfehler – ein Dokument kann 10 Jahre aufbewahrungspflichtig sein, während die tägliche Backup-Kopie davon nur 14 Tage vorgehalten werden muss, weil die nächste Kopie sie ohnehin ersetzt. Beide Fristen sind unabhängig konfigurierbar, nicht gekoppelt.
- Kein Pruning, das den letzten verbliebenen Snapshot eines noch unter Aufbewahrungssperre (Legal Hold) stehenden Dokuments entfernt, solange kein aktuellerer Snapshot dieses Dokument enthält.
**Für genau diese Kachel:** Ohne eigene Prune-Policy wachsen Backups unbegrenzt oder werden willkürlich gelöscht – die Frist für die Sicherung selbst ist eine andere Frist als die für das gesicherte Dokument.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `BAK-01` Datenbank-Backup-Strategie – Automatisierte, inkrementelle Sicherung der PostgreSQL-Datenbank mit Aufbewahrung mehrerer Generationen und Verifikation jeder Sicherung.
- `BAK-02` Objekt-Storage-Backup/Snapshots – Automatisierte, deduplizierende Sicherung der im Objekt-Storage abgelegten Dateiinhalte.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Backup-Snapshots folgen einer konfigurierbaren Prune-Policy (Staffelung nach Alter), unabhängig von RET-02
2. Snapshot-Löschung nach Ablauf der Frist läuft automatisiert
3. Eine gültige, nicht abgelaufene Aufbewahrungssperre auf einem Dokument (RET-03/CMP-06) verhindert nicht das Pruning älterer Backup-Snapshots, solange mindestens ein aktueller Snapshot das Dokument noch enthält
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Prune-Test mit simulierten Snapshots über mehrere Altersstufen ergibt korrekte Staffelung
2. Automatisierte Löschung abgelaufener Snapshots im Test nachgewiesen
3. Legal-Hold-Test bestätigt, dass Pruning nicht mit Dokumenten-Retention kollidiert
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `RET-02` Aufbewahrungsfristen-Engine (Dokumenten-Retention)
- `RET-03` Löschworkflow & Aufbewahrungssperre (Legal Hold)
- `BAK-03` Restore-Verfahren
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `BAK-07: aufbewahrungsfrist-fuer-backup-snapshots`
- Branch: `feature/bak-07-aufbewahrungsfrist-fuer-backup-snapshots`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+59
View File
@@ -0,0 +1,59 @@
# BAK-09 – Envelope-Encryption für Backup-Snapshots (Datenbank & Objekt-Storage)
**Epic:** 💾 Backup & Wiederherstellung | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 2 Personentage | **Welle:** 7
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (Retention & WORM, Compliance & eDiscovery, Backup & Wiederherstellung, Kennzahlen), das sich an Alfresco, ecoDMS und restic/Borg orientiert.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
BAK-01/BAK-02 sichern Datenbank und Objekt-Storage-Inhalte, ohne festzulegen, ob die Sicherungen selbst verschlüsselt sind. Archivierte Objekte sind live über die Tenant-KEK-Hierarchie (Core API-10) verschlüsselt – Backups dürfen kein schwächer geschütztes Abbild derselben Daten sein. Backup-Snapshots über denselben Tenant-KEK verschlüsseln wie die Live-Daten, sodass ein kompromittiertes Backup-Ziel ohne den jeweiligen Tenant-KEK keine verwertbaren Klartextdaten liefert.
**Technische Grundlage:** Envelope-Encryption (Tenant-KEK aus Core API-10), restic/Borg-artige Sicherung
## Produkt-DNA für diesen Bereich
**Übernehmen:**
- restic/Borg: clientseitige Verschlüsselung vor dem Verlassen des Quellsystems als Standard, nicht als Zusatzoption.
**Bewusst vermeiden:**
- restic/Borg (Fehlkonfiguration in der Praxis) – unverschlüsseltes Backup-Repository bei falscher Einrichtung.: Verschlüsselung ist über die bestehende Tenant-KEK-Hierarchie erzwungen, keine separate, optionale Backup-Passphrase.
## Ausgangslage
Setzt auf folgenden bereits fertigen Kacheln auf: BAK-01, BAK-02.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Backup-Snapshots von Datenbank und Objekt-Storage sind mit dem Tenant-KEK des jeweiligen Mandanten verschlüsselt
2. Ein Zugriff auf das Backup-Ziel ohne den jeweiligen Tenant-KEK liefert keine verwertbaren Klartextdaten
3. Wiederherstellung (BAK-03/BAK-04) funktioniert unverändert unter Verwendung des korrekten Tenant-KEK
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Test: Backup-Datei ohne Tenant-KEK ist nicht auswertbar (Stichprobe auf Klartext-Reste)
2. Restore-Test mit korrektem Tenant-KEK stellt die Daten vollständig wieder her
3. Test: Restore mit falschem/fremdem Tenant-KEK schlägt fehl, statt fremde Daten zu liefern
## Bekannte Fehler vermeiden
Threat-Model-Finding (Archive-Board, 2026-09-12): ein unverschlüsseltes oder schwächer geschütztes Backup wäre ein einfacherer Angriffspfad auf dieselben Daten als das gut geschützte Live-System.
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `BAK-01` Datenbank-Backup-Strategie
- `BAK-02` Objekt-Storage-Backup/Snapshots
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `BAK-09: envelope-encryption-f-r-backup-snapshots-datenbank-objekt-storage`
- Branch: `feature/bak-09-envelope-encryption-f-r-backup-snapshots-datenbank-objekt-storage`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+58
View File
@@ -0,0 +1,58 @@
# BAK-10 – Schutzniveau der Restore-Testumgebung (DSGVO-konform)
**Epic:** 💾 Backup & Wiederherstellung | **Rolle:** Backend | **Komplexität:** Einfach | **Aufwand:** 1 Personentage | **Welle:** 7
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (Retention & WORM, Compliance & eDiscovery, Backup & Wiederherstellung, Kennzahlen), das sich an Alfresco, ecoDMS und restic/Borg orientiert.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
BAK-06 testet das Restore-Verfahren regelmäßig automatisiert gegen eine isolierte Testumgebung – diese enthält dabei zwangsläufig echte (wiederhergestellte) Mandantendaten. Ohne festgelegtes Schutzniveau könnte die Testumgebung schwächer abgesichert sein als die Produktivumgebung und so zu einem leichteren Angriffsziel für dieselben Daten werden. Schutzniveau der Testumgebung verbindlich festlegen (gleiche Zugriffskontrolle, Netzwerksegmentierung und Löschfrist nach Testlauf wie produktiv) und dokumentieren.
**Technische Grundlage:** Isolierte Testumgebung, Zugriffskontrolle, Betriebsdokument
## Produkt-DNA für diesen Bereich
**Übernehmen:**
- Betriebsdisziplin: Testdaten mit Personenbezug erhalten dasselbe Schutzniveau wie Produktivdaten, keine Ausnahme für Testumgebungen.
**Bewusst vermeiden:**
- verbreitetes Anti-Muster in Testumgebungen: Produktivdaten in schwächer gesicherte Staging-/Test-Umgebungen kopiert, dort länger als nötig aufbewahrt.: Restore-Testumgebung wird nach jedem Testlauf zurückgesetzt/gelöscht, Zugriffskontrolle identisch zu produktiv.
## Ausgangslage
Setzt auf folgenden bereits fertigen Kacheln auf: BAK-06.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Die Restore-Testumgebung unterliegt derselben Zugriffskontrolle und Netzwerksegmentierung wie die Produktivumgebung
2. Wiederhergestellte Testdaten werden nach Abschluss des Testlaufs und Protokollierung des Ergebnisses gelöscht, nicht dauerhaft vorgehalten
3. Das Schutzniveau ist im Betriebsdokument zu BAK-06 explizit festgehalten
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Prüft Zugriffskontrolle/Netzwerksegmentierung der Testumgebung gegen die Produktivumgebung
2. Prüft, dass nach einem Testlauf keine wiederhergestellten Daten über die dokumentierte Frist hinaus verbleiben
3. Prüft, dass das Betriebsdokument das Schutzniveau explizit benennt
## Bekannte Fehler vermeiden
Threat-Model-Finding (Archive-Board, 2026-09-12): eine schwächer geschützte Testumgebung mit echten wiederhergestellten Mandantendaten würde den durch Modell C und Envelope-Encryption erreichten Schutz umgehen, ohne dass dies wie ein klassischer Sicherheitsvorfall aussieht.
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `BAK-06` Restore-Testverfahren
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `BAK-10: schutzniveau-der-restore-testumgebung-dsgvo-konform`
- Branch: `feature/bak-10-schutzniveau-der-restore-testumgebung-dsgvo-konform`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+62
View File
@@ -0,0 +1,62 @@
# CMP-01 – GoBD-Verfahrensdokumentation
**Epic:** ⚖️ Compliance & eDiscovery | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 2
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Exportierbare Verfahrensdokumentation gemäß GoBD: Beschreibung der Aufbewahrungs-, Zugriffs- und Löschverfahren, automatisch aus der aktuellen Konfiguration erzeugt.
**Technische Grundlage:** PDF-Export, versionierte Dokumentvorlage
## Produkt-DNA für diesen Bereich
> Nachweisführung wie ecoDMS, Vier-Augen-Prinzip wie Alfresco, aber schlank umgesetzt.
**Übernehmen:**
- Alfresco: Vier-Augen-Prinzip bei Freigaben – Löschung nur mit zweiter, unabhängiger Bestätigung.
- ecoDMS: Nachvollziehbare Vernichtung mit lückenlosem Protokoll.
- GoBD-konforme Verfahrensdokumentation als exportierbares Dokument, nicht als Prosa-Anhang.
**Bewusst vermeiden:**
- Alfresco – Freigabeprozesse mit hoher Konfigurationslast: feste, einfache Vier-Augen-Regel statt konfigurierbarer Workflow-Engine.
- Keine Berichte, die nur manuell zusammengestellt werden können – jeder Bericht ist ein Exportknopf.
**Für genau diese Kachel:** GoBD verlangt eine nachvollziehbare Verfahrensdokumentation – die hier automatisch statt manuell aktuell gehalten wird.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `RET-01` Generisches Retention-Objektmodell – Generisches Datenmodell für aufbewahrungspflichtige Objekte anlegen: Objekttyp, Objekt-Referenz (modulübergreifend über Adapter), Aufbewahrungsklasse, Status. Migrationen versioniert und rückrollbar.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Dokumentation wird automatisiert aus der aktuellen Retention-Konfiguration erzeugt, nicht manuell gepflegt
2. Export liegt als versioniertes PDF mit Erzeugungsdatum vor
3. Änderung an Aufbewahrungsklassen spiegelt sich in der nächsten Erzeugung wider
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Erzeugtes Dokument enthält alle aktiven Aufbewahrungsklassen mit Fristen
2. Zwei aufeinanderfolgende Exporte ohne Konfigurationsänderung sind inhaltlich identisch
3. Export einer zweiten Person als GoBD-tauglich nachvollzogen
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `CMP-05` Compliance-Berichts-Oberfläche
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `CMP-01: gobd-verfahrensdokumentation`
- Branch: `feature/cmp-01-gobd-verfahrensdokumentation`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+62
View File
@@ -0,0 +1,62 @@
# CMP-02 – DSGVO-/Datenschutz-Berichte
**Epic:** ⚖️ Compliance & eDiscovery | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 2
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Berichte für Auskunftsersuchen, Verarbeitungsübersichten und Zugriffsnachweise je betroffener Person und Tenant.
**Technische Grundlage:** PDF/CSV-Export
## Produkt-DNA für diesen Bereich
> Nachweisführung wie ecoDMS, Vier-Augen-Prinzip wie Alfresco, aber schlank umgesetzt.
**Übernehmen:**
- Alfresco: Vier-Augen-Prinzip bei Freigaben – Löschung nur mit zweiter, unabhängiger Bestätigung.
- ecoDMS: Nachvollziehbare Vernichtung mit lückenlosem Protokoll.
- GoBD-konforme Verfahrensdokumentation als exportierbares Dokument, nicht als Prosa-Anhang.
**Bewusst vermeiden:**
- Alfresco – Freigabeprozesse mit hoher Konfigurationslast: feste, einfache Vier-Augen-Regel statt konfigurierbarer Workflow-Engine.
- Keine Berichte, die nur manuell zusammengestellt werden können – jeder Bericht ist ein Exportknopf.
**Für genau diese Kachel:** Auskunftsersuchen unter Fristdruck sind der Härtetest – ohne fertigen Bericht wird jede Anfrage zur manuellen Notoperation.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `RET-01` Generisches Retention-Objektmodell – Generisches Datenmodell für aufbewahrungspflichtige Objekte anlegen: Objekttyp, Objekt-Referenz (modulübergreifend über Adapter), Aufbewahrungsklasse, Status. Migrationen versioniert und rückrollbar.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Auskunftsbericht listet alle gespeicherten Objekte einer betroffenen Person mit Aufbewahrungsklasse
2. Verarbeitungsübersicht zeigt Zweck und Rechtsgrundlage je Objekttyp
3. Export ist mandantenscharf und enthält keine Daten anderer Tenants
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Auskunftsbericht für Testperson mit bekanntem Datenbestand stimmt mit erwarteter Liste überein
2. Bericht für einen Tenant enthält keine Objekte eines anderen Tenants
3. Export lässt sich als CSV weiterverarbeiten
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `CMP-05` Compliance-Berichts-Oberfläche
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `CMP-02: dsgvo-datenschutz-berichte`
- Branch: `feature/cmp-02-dsgvo-datenschutz-berichte`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+62
View File
@@ -0,0 +1,62 @@
# CMP-03 – eDiscovery-Suche & Export (modulübergreifend)
**Epic:** ⚖️ Compliance & eDiscovery | **Rolle:** Backend | **Komplexität:** Komplex | **Aufwand:** 4 Personentage | **Welle:** 3
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Suche über registrierte Objekttypen aus DMS und Mail hinweg für Rechtsverfahren, mit vollständigem, prüfsummengesichertem Export der Treffer.
**Technische Grundlage:** Modulübergreifende Such-API, ZIP-Export mit Prüfsummen
## Produkt-DNA für diesen Bereich
> Nachweisführung wie ecoDMS, Vier-Augen-Prinzip wie Alfresco, aber schlank umgesetzt.
**Übernehmen:**
- Alfresco: Vier-Augen-Prinzip bei Freigaben – Löschung nur mit zweiter, unabhängiger Bestätigung.
- ecoDMS: Nachvollziehbare Vernichtung mit lückenlosem Protokoll.
- GoBD-konforme Verfahrensdokumentation als exportierbares Dokument, nicht als Prosa-Anhang.
**Bewusst vermeiden:**
- Alfresco – Freigabeprozesse mit hoher Konfigurationslast: feste, einfache Vier-Augen-Regel statt konfigurierbarer Workflow-Engine.
- Keine Berichte, die nur manuell zusammengestellt werden können – jeder Bericht ist ein Exportknopf.
**Für genau diese Kachel:** eDiscovery ist der Beweis, dass die Modul-Adapter-Schnittstelle trägt: eine Suche, viele Module, ein rechtssicherer Export.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `RET-05` Modul-Adapter-Schnittstelle (DMS/Mail registrieren Objekttypen) – Schnittstelle, über die DMS und Mail ihre Objekttypen (Dokument, Mail, Anhang) und die zugehörige Aufbewahrungsklasse bei Archive registrieren, statt eigene Retention-Logik zu bauen.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Suche liefert Treffer aus mehreren registrierten Modulen in einer gemeinsamen Ergebnisliste
2. Export enthält Originalobjekte, Metadaten und eine Prüfsummenliste je Datei
3. Suchlauf und Export werden als eigener Vorgang protokolliert (wer, wann, welche Kriterien)
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Testsuche über zwei fiktive Module liefert erwartete kombinierte Trefferzahl
2. Prüfsumme jeder exportierten Datei stimmt nach Entpacken überein
3. Protokolleintrag zum Suchlauf ist nachträglich nicht veränderbar
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `QA-03` Prüfgate Compliance & eDiscovery
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `CMP-03: ediscovery-suche-und-export-modulübergreifend`
- Branch: `feature/cmp-03-ediscovery-suche-und-export-modulübergreifend`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+62
View File
@@ -0,0 +1,62 @@
# CMP-04 – Audit-Trail-Kopplung an Core-Audit-Log
**Epic:** ⚖️ Compliance & eDiscovery | **Rolle:** Backend | **Komplexität:** Einfach | **Aufwand:** 2 Personentage | **Welle:** 1
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Alle sicherheitsrelevanten Vorgänge in Archive (Fristsetzung, Sperre, Löschung, Export) werden an das zentrale Audit-Log in NEXARCH Core gemeldet, statt ein eigenes Protokoll zu führen.
**Technische Grundlage:** REST-Anbindung an NEXARCH Core Audit-Log
## Produkt-DNA für diesen Bereich
> Nachweisführung wie ecoDMS, Vier-Augen-Prinzip wie Alfresco, aber schlank umgesetzt.
**Übernehmen:**
- Alfresco: Vier-Augen-Prinzip bei Freigaben – Löschung nur mit zweiter, unabhängiger Bestätigung.
- ecoDMS: Nachvollziehbare Vernichtung mit lückenlosem Protokoll.
- GoBD-konforme Verfahrensdokumentation als exportierbares Dokument, nicht als Prosa-Anhang.
**Bewusst vermeiden:**
- Alfresco – Freigabeprozesse mit hoher Konfigurationslast: feste, einfache Vier-Augen-Regel statt konfigurierbarer Workflow-Engine.
- Keine Berichte, die nur manuell zusammengestellt werden können – jeder Bericht ist ein Exportknopf.
**Für genau diese Kachel:** Ein zentrales Audit-Log statt eines eigenen – Archive dupliziert keine Protokoll-Infrastruktur, die es in Core bereits gibt.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- Core `AUD-01` Zentrales Audit-Log-Modell – Zentrales Audit-Log-Datenmodell für sicherheits- und compliancerelevante Ereignisse (wer, was, wann, an welchem Tenant) als eigenständiges Modell getrennt vom Anwendungs-Log.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Jeder sicherheitsrelevante Vorgang erzeugt einen Eintrag im zentralen Audit-Log
2. Eintrag enthält Tenant, handelnde Person, Vorgang und Zeitstempel
3. Ausfall des Audit-Log-Dienstes blockiert nicht den Fachvorgang, wird aber sichtbar nachgemeldet
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Testvorgänge (Sperre setzen, Löschung, Export) erzeugen je einen nachvollziehbaren Audit-Eintrag
2. Simulierter Ausfall des Audit-Dienstes verhindert nicht die Fachfunktion
3. Nachmeldung nach Ausfallende ist vollständig, keine Lücke im Protokoll
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- Alles, was nicht in den Akzeptanzkriterien steht. Keine vorauseilende Umsetzung späterer Anforderungen.
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `CMP-04: audit-trail-kopplung-an-core-audit-log`
- Branch: `feature/cmp-04-audit-trail-kopplung-an-core-audit-log`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+63
View File
@@ -0,0 +1,63 @@
# CMP-05 – Compliance-Berichts-Oberfläche
**Epic:** ⚖️ Compliance & eDiscovery | **Rolle:** Frontend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 3
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Frontend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Oberfläche und Bedienbarkeit. Ruft ausschließlich vorhandene Schnittstellen auf, keine eigene Geschäftslogik.
## Auftrag
Oberfläche zum Anfordern, Einsehen und Herunterladen von GoBD-Verfahrensdokumentation und DSGVO-Berichten je Tenant.
**Technische Grundlage:** Next.js/React/TypeScript
## Produkt-DNA für diesen Bereich
> Nachweisführung wie ecoDMS, Vier-Augen-Prinzip wie Alfresco, aber schlank umgesetzt.
**Übernehmen:**
- Alfresco: Vier-Augen-Prinzip bei Freigaben – Löschung nur mit zweiter, unabhängiger Bestätigung.
- ecoDMS: Nachvollziehbare Vernichtung mit lückenlosem Protokoll.
- GoBD-konforme Verfahrensdokumentation als exportierbares Dokument, nicht als Prosa-Anhang.
**Bewusst vermeiden:**
- Alfresco – Freigabeprozesse mit hoher Konfigurationslast: feste, einfache Vier-Augen-Regel statt konfigurierbarer Workflow-Engine.
- Keine Berichte, die nur manuell zusammengestellt werden können – jeder Bericht ist ein Exportknopf.
**Für genau diese Kachel:** Ohne Oberfläche bleiben GoBD- und DSGVO-Berichte Kommandozeilen-Werkzeug für Entwickler statt Alltagswerkzeug für Prüfer.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `CMP-01` GoBD-Verfahrensdokumentation – Exportierbare Verfahrensdokumentation gemäß GoBD: Beschreibung der Aufbewahrungs-, Zugriffs- und Löschverfahren, automatisch aus der aktuellen Konfiguration erzeugt.
- `CMP-02` DSGVO-/Datenschutz-Berichte – Berichte für Auskunftsersuchen, Verarbeitungsübersichten und Zugriffsnachweise je betroffener Person und Tenant.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Berichte lassen sich mit wenigen Klicks anfordern und herunterladen
2. Nur berechtigte Rollen sehen Berichte anderer Personen ein
3. Historie angeforderter Berichte ist je Tenant einsehbar
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Anforderung eines Berichts löst den zugehörigen Backend-Export korrekt aus
2. Nicht berechtigte Rolle erhält keinen Zugriff auf fremde Berichte
3. Downloadlink eines abgelaufenen Berichts wird abgewiesen
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- Alles, was nicht in den Akzeptanzkriterien steht. Keine vorauseilende Umsetzung späterer Anforderungen.
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `CMP-05: compliance-berichts-oberfläche`
- Branch: `feature/cmp-05-compliance-berichts-oberfläche`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+66
View File
@@ -0,0 +1,66 @@
# CMP-06 – Vier-Augen-Freigabe für Löschungen
**Epic:** ⚖️ Compliance & eDiscovery | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 4
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Löschung abgelaufener Objekte erfordert eine zweite, unabhängige Bestätigung durch eine andere Person, bevor der Löschworkflow ausgeführt wird.
**Technische Grundlage:** PostgreSQL mit FOR UPDATE-Lock, Timing-safe Vergleich
## Produkt-DNA für diesen Bereich
> Nachweisführung wie ecoDMS, Vier-Augen-Prinzip wie Alfresco, aber schlank umgesetzt.
**Übernehmen:**
- Alfresco: Vier-Augen-Prinzip bei Freigaben – Löschung nur mit zweiter, unabhängiger Bestätigung.
- ecoDMS: Nachvollziehbare Vernichtung mit lückenlosem Protokoll.
- GoBD-konforme Verfahrensdokumentation als exportierbares Dokument, nicht als Prosa-Anhang.
**Bewusst vermeiden:**
- Alfresco – Freigabeprozesse mit hoher Konfigurationslast: feste, einfache Vier-Augen-Regel statt konfigurierbarer Workflow-Engine.
- Keine Berichte, die nur manuell zusammengestellt werden können – jeder Bericht ist ein Exportknopf.
**Für genau diese Kachel:** Vorbild: das Vier-Augen-Muster mit FOR UPDATE-Lock und zeitkonstantem Vergleich aus archivdms hat sich bewährt und wird hier als Standardlösung übernommen, statt es erneut zu erfinden.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `RET-03` Löschworkflow & Aufbewahrungssperre (Legal Hold) – Löschworkflow für abgelaufene Objekte: Freigabe, Vernichtung, Protokolleintrag. Aufbewahrungssperre (Legal Hold) verhindert jede Löschung unabhängig vom Fristablauf.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Löschung wird erst nach zweiter Bestätigung durch eine von der anfordernden Person verschiedene Rolle ausgeführt
2. Gleichzeitige Bestätigungsversuche führen nicht zu doppelter Ausführung
3. Löschbestätigung wird mit einem geheimen, zeitlich begrenzten Bestätigungs-Token abgesichert
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Zwei parallele Bestätigungsanfragen auf dasselbe Objekt: genau eine Löschung wird ausgeführt (Lock-Test)
2. Bestätigung durch dieselbe Person wie die Anforderung wird abgewiesen
3. Vergleich des Bestätigungs-Tokens erfolgt zeitkonstant und ist gegen Timing-Angriffe getestet
## Vorbild aus bestehendem System
Ein bereits produktives Schwestersystem hat das Vier-Augen-Prinzip bei Löschbestätigung mit einem `FOR UPDATE`-Lock auf dem betroffenen Datensatz und einem zeitkonstanten (timing-safe) Vergleich des Bestätigungs-Tokens umgesetzt. Beides hat sich bewährt und wird hier als Vorbild übernommen: der Lock verhindert doppelte gleichzeitige Ausführung, der zeitkonstante Vergleich verhindert das Erraten des Tokens über Zeitmessung.
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `QA-03` Prüfgate Compliance & eDiscovery
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `CMP-06: vier-augen-freigabe-für-löschungen`
- Branch: `feature/cmp-06-vier-augen-freigabe-für-löschungen`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+70
View File
@@ -0,0 +1,70 @@
# CMP-07 – DSGVO-Löschantrag (Recht auf Löschung, Art. 17)
**Epic:** ⚖️ Compliance & eDiscovery | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 4 Personentage | **Welle:** 4
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Workflow für den Löschantrag einer betroffenen Person (Art. 17 DSGVO): modulübergreifende Suche nach allen zu dieser Person gespeicherten Objekten (wiederverwendet die Auskunfts-Suche aus `CMP-02`), Löschung jedes Objekts OHNE aktive Aufbewahrungspflicht (`RET-03` hat Vorrang), nachvollziehbare Ablehnung mit Begründung für jedes Objekt MIT Aufbewahrungspflicht, vollständiges Protokoll der Entscheidung je Objekt. Tatsächliche Vernichtung läuft über denselben Vier-Augen-Freigabeprozess wie jede andere Löschung (`CMP-06`), keine zweite Lösch-Implementierung.
**Technische Grundlage:** PostgreSQL, transaktionaler Zustandswechsel, Wiederverwendung der Modul-Adapter-Schnittstelle (`RET-05`)
## Produkt-DNA für diesen Bereich
> Nachweisführung wie ecoDMS, Vier-Augen-Prinzip wie Alfresco, aber schlank umgesetzt.
**Übernehmen:**
- Alfresco: Vier-Augen-Prinzip bei Freigaben – Löschung nur mit zweiter, unabhängiger Bestätigung.
- ecoDMS: Nachvollziehbare Vernichtung mit lückenlosem Protokoll.
- GoBD-konforme Verfahrensdokumentation als exportierbares Dokument, nicht als Prosa-Anhang.
**Bewusst vermeiden:**
- Ein Vorgänger-Projekt (archivmail) hat den DSGVO-Löschantrag ursprünglich als eigenständigen, von der übrigen Löschlogik getrennten Sonderpfad gebaut: ein Löschantrag ruft hier stattdessen denselben Löschworkflow (`RET-03`/`CMP-06`) auf wie jede andere Löschung – kein Duplikat der Aufbewahrungs-/Vier-Augen-Prüfung.
- Keine stille Teillöschung: ein Löschantrag mit gemischtem Ergebnis (teils gelöscht, teils wegen Aufbewahrungspflicht abgelehnt) macht das Ergebnis je Objekt einzeln nachvollziehbar, statt eine pauschale Sammelantwort zu liefern.
**Für genau diese Kachel:** Ein Löschantrag unter Fristdruck (DSGVO kennt hierfür i.d.R. eine Monatsfrist) ist der Härtetest für das Zusammenspiel von Aufbewahrungspflicht und Löschrecht – beides muss automatisiert und nachvollziehbar entschieden werden, nicht manuell pro Fall.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `RET-03` Löschworkflow & Aufbewahrungssperre (Legal Hold) – Aufbewahrungssperre verhindert jede Löschung unabhängig vom Fristablauf.
- `RET-05` Modul-Adapter-Schnittstelle (DMS/Mail registrieren Objekttypen) – Rückruf-Mechanismus, über den Archive ein Modul beim Vernichten eines Objekts anspricht.
- `CMP-02` DSGVO-/Datenschutz-Berichte – modulübergreifende Suche nach allen Objekten einer betroffenen Person.
- `CMP-06` Vier-Augen-Freigabe für Löschungen – zweite, unabhängige Bestätigung vor tatsächlicher Vernichtung.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Löschantrag findet über die Suche aus `CMP-02` alle Objekte einer betroffenen Person, mandantenscharf
2. Jedes gefundene Objekt wird EINZELN entschieden: Löschung (keine Aufbewahrungspflicht) oder Ablehnung mit Begründung (aktive Aufbewahrungspflicht/Legal Hold aus `RET-03`) – niemals eine pauschale Sammelentscheidung
3. Tatsächliche Löschung durchläuft denselben Vier-Augen-Freigabeprozess wie jede andere Löschung (`CMP-06`), keine zweite Implementierung
4. Ergebnis des Löschantrags (je Objekt: gelöscht/abgelehnt+Grund) ist vollständig und dauerhaft protokolliert
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Löschantrag für eine Testperson mit gemischtem Datenbestand (ein Objekt ohne, ein Objekt mit aktiver Aufbewahrungspflicht) liefert exakt eine Löschung und eine begründete Ablehnung
2. Aufbewahrungssperre (Legal Hold) verhindert die Löschung nachweislich auch dann, wenn die reguläre Aufbewahrungsfrist bereits abgelaufen wäre
3. Löschantrag für einen Tenant führt nachweislich zu keiner Aktion an Objekten eines anderen Tenants
## Bekannte Fehler vermeiden
archivmail (Vorgängerprojekt) implementierte den DSGVO-Löschantrag ursprünglich als eigenständigen Workflow parallel zur regulären Aufbewahrungs-/Löschlogik – zwei Stellen, die dieselbe Aufbewahrungsregel auswerten, laufen bei Änderungen an einer Stelle auseinander. Diese Kachel ruft stattdessen ausschließlich `RET-03` (Aufbewahrungsprüfung) und `CMP-06` (Freigabe) auf, statt eine zweite Prüf-/Freigabelogik zu bauen.
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- Die Suche nach Objekten einer Person selbst (`CMP-02`)
- Die eigentliche Aufbewahrungsprüfung (`RET-03`) und Freigabe (`CMP-06`)
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `CMP-07: dsgvo-loeschantrag-recht-auf-loeschung`
- Branch: `feature/cmp-07-dsgvo-loeschantrag-recht-auf-loeschung`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+45
View File
@@ -0,0 +1,45 @@
# CMP-08 – Ende-zu-Ende-Nachweis eDiscovery-Adapter (reale Drittmodul-Integration)
**Epic:** ⚖️ Compliance & eDiscovery | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 2 Personentage | **Welle:** 9
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (Retention & WORM, Compliance & eDiscovery, Backup & Wiederherstellung, Kennzahlen), das sich an Alfresco, ecoDMS und restic/Borg orientiert.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
QA-03 (Archive-Board, Prüfgate Compliance & eDiscovery) hat den eDiscovery-Export gegen den Referenzdatensatz real geprüft, aber den eDiscovery-Adapter zu DMS/Mail (die tatsächlichen Quellmodule der durchsuchten Objekte) nur fiktiv getestet (siehe QA-03-PRUEFPROTOKOLL.md, offene Restrisiken). Diese Kachel schließt die Lücke: ein echter Ende-zu-Ende-Testlauf, bei dem der eDiscovery-Export tatsächlich gegen laufende DMS- und Mail-Instanzen (nicht nur gegen Referenzdatensatz-Fixtures) durchgeführt wird.
**Technische Grundlage:** reale DMS-/Mail-Testinstanzen auf Host 204, bestehender Modul-Adapter-Mechanismus (RET-05)
## Ausgangslage
Setzt auf folgenden bereits fertigen Kacheln auf: `CMP-03` eDiscovery-Suche & Export, `QA-03` Prüfgate Compliance & eDiscovery (Archive-Board), `RET-05` Modul-Adapter-Schnittstelle.
## Akzeptanzkriterien
1. eDiscovery-Export wird gegen echte, über RET-05 registrierte DMS- und Mail-Testinstanzen durchgeführt (nicht nur gegen Referenzdatensatz-Fixtures)
2. Treffer aus beiden Modulen sind im Export korrekt vorhanden und prüfsummengesichert
3. Ergebnis ist als Nachtrag zu QA-03-PRUEFPROTOKOLL.md dokumentiert
## Prüfungen vor der Abnahme
1. Echter Testlauf gegen laufende DMS- und Mail-Instanz durchgeführt, Ergebnis dokumentiert
2. Export-Prüfsummen bei wiederholtem Testlauf identisch
3. Offene Restrisiken (falls neue gefunden) schriftlich benannt
## Nicht Bestandteil dieser Kachel
- Neue eDiscovery-Funktionalität (nur End-zu-Ende-Nachweis des bestehenden Adapters)
- RBAC-Rollenberechtigung der Vier-Augen-Freigabe (separates, bereits in QA-03 benanntes offenes Risiko)
## Arbeitsweise
1. Lies zuerst CMP-03, QA-03-PRUEFPROTOKOLL.md und RET-05 vollständig.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `CMP-08: ende-zu-ende-nachweis-ediscovery-adapter-reale-drittmodul-integration`
- Branch: `feature/cmp-08-ende-zu-ende-nachweis-ediscovery-adapter-reale-drittmodul-integration`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+61
View File
@@ -0,0 +1,61 @@
# QA-01 – Teststrategie Archive
**Epic:** ✅ Prüfungen & Qualitätssicherung | **Rolle:** Backend | **Komplexität:** Einfach | **Aufwand:** 2 Personentage | **Welle:** 1
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Teststrategie für das Archive-Board festlegen: Testebenen, Referenzdatensatz für Retention/WORM/Backup, Verantwortlichkeiten je Prüfgate.
**Technische Grundlage:** Testplan-Dokument, Testdatensatz-Konzept
## Produkt-DNA für diesen Bereich
> Prüfen heißt messen. Behauptungen ohne Messprotokoll gelten nicht als erledigt.
**Übernehmen:**
- Fester Prüfplan je Ausbaustufe mit abgelegtem, nachlesbarem Protokoll.
- Nachgewiesene Wiederherstellbarkeit als Freigabevoraussetzung.
**Bewusst vermeiden:**
- Keine Freigabe auf Zuruf.
- Keine Prüfung nur auf dem Entwicklungsrechner mit synthetischen Testdaten.
**Für genau diese Kachel:** Ohne gemeinsame Teststrategie prüft jedes Prüfgate nach eigenem Gutdünken – das Fundament für vergleichbare Prüfergebnisse.
## Ausgangslage
Diese Kachel hat keine Vorbedingungen und ist sofort startbar.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Teststrategie benennt Testebenen (Unit, Integration, Wiederherstellungstest) und deren Verantwortliche
2. Referenzdatensatz für Retention- und Backup-Tests ist definiert und wiederverwendbar
3. Strategie ist als Dokument abgelegt und von zweiter Person gegengelesen
4. Pflichttests für sicherheitsrelevanten Code (Tenant-Scoping, Zugriffsprüfung, Auth-nahe Logik) sind als verbindliches Merge-Gate verankert – kein Merge auf solchen Code ohne Test, analog Core QA-01
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Referenzdatensatz lässt sich reproduzierbar in einer Testumgebung aufsetzen
2. Zweite Person bestätigt schriftlich die Nachvollziehbarkeit der Strategie
3. Strategie deckt erkennbar alle folgenden Prüfgates ab (Abgleich mit QA-02 bis QA-06)
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- Alles, was nicht in den Akzeptanzkriterien steht. Keine vorauseilende Umsetzung späterer Anforderungen.
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `QA-01: teststrategie-archive`
- Branch: `feature/qa-01-teststrategie-archive`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+64
View File
@@ -0,0 +1,64 @@
# QA-02 – Prüfgate Retention & WORM
**Epic:** ✅ Prüfungen & Qualitätssicherung | **Rolle:** Backend | **Komplexität:** Einfach | **Aufwand:** 2 Personentage | **Welle:** 4
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Prüfgate für Fristenengine, Löschworkflow, Aufbewahrungssperre und WORM-Garantie vor Freigabe der Retention-Funktionen.
**Technische Grundlage:** Abnahmeprotokoll
## Produkt-DNA für diesen Bereich
> Prüfen heißt messen. Behauptungen ohne Messprotokoll gelten nicht als erledigt.
**Übernehmen:**
- Fester Prüfplan je Ausbaustufe mit abgelegtem, nachlesbarem Protokoll.
- Nachgewiesene Wiederherstellbarkeit als Freigabevoraussetzung.
**Bewusst vermeiden:**
- Keine Freigabe auf Zuruf.
- Keine Prüfung nur auf dem Entwicklungsrechner mit synthetischen Testdaten.
**Für genau diese Kachel:** Ein eigenes Gate für Retention und WORM, weil hier die Kernversprechen des gesamten Boards stehen und Wiederholungen unter Prüfbedingungen zählen.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `RET-04` WORM-Speicher-Garantie (Append-only) – Speicherpfad für archivierte Objektinhalte, der nach dem Schreiben keine Änderung und kein Überschreiben mehr zulässt (Write Once, Read Many).
- `RET-03` Löschworkflow & Aufbewahrungssperre (Legal Hold) – Löschworkflow für abgelaufene Objekte: Freigabe, Vernichtung, Protokolleintrag. Aufbewahrungssperre (Legal Hold) verhindert jede Löschung unabhängig vom Fristablauf.
- `RET-06` Aufbewahrungsfristen-Konfigurationsoberfläche – Oberfläche zur Pflege von Aufbewahrungsklassen und Fristen je Objekttyp und Tenant, inklusive Vorschauliste bald ablaufender Objekte.
- `RET-07` Fristablauf-Benachrichtigungen – Benachrichtigung verantwortlicher Personen vor Ablauf einer Aufbewahrungsfrist, konfigurierbarer Vorlauf je Aufbewahrungsklasse. Der eigentliche Versand läuft ausschließlich über den zentralen Core-Benachrichtigungs-Dispatcher (CFG-02) – Archive erzeugt nur das Ereignis, versendet keine E-Mail selbst.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Alle Akzeptanzkriterien von RET-03 und RET-04 sind gegen den Referenzdatensatz nachgewiesen
2. Versuch, eine gesperrte oder WORM-geschützte Ablage zu umgehen, scheitert nachweislich
3. Protokoll mit Zielwert, Messwert und Bewertung ist abgelegt
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Löschversuch an gesperrtem Objekt schlägt fehl (Wiederholung des RET-03-Tests unter Prüfgate-Bedingungen)
2. Überschreibversuch am WORM-Speicher schlägt fehl (Wiederholung des RET-04-Tests unter Prüfgate-Bedingungen)
3. Offene Restrisiken sind schriftlich benannt
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `QA-05` Abnahme- & Compliance-Prüfung Archive
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `QA-02: prüfgate-retention-und-worm`
- Branch: `feature/qa-02-prüfgate-retention-und-worm`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+66
View File
@@ -0,0 +1,66 @@
# QA-03 – Prüfgate Compliance & eDiscovery
**Epic:** ✅ Prüfungen & Qualitätssicherung | **Rolle:** Backend | **Komplexität:** Einfach | **Aufwand:** 2 Personentage | **Welle:** 5
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Prüfgate für eDiscovery-Export und Vier-Augen-Freigabe vor Freigabe der Compliance-Funktionen.
**Technische Grundlage:** Abnahmeprotokoll
## Produkt-DNA für diesen Bereich
> Prüfen heißt messen. Behauptungen ohne Messprotokoll gelten nicht als erledigt.
**Übernehmen:**
- Fester Prüfplan je Ausbaustufe mit abgelegtem, nachlesbarem Protokoll.
- Nachgewiesene Wiederherstellbarkeit als Freigabevoraussetzung.
**Bewusst vermeiden:**
- Keine Freigabe auf Zuruf.
- Keine Prüfung nur auf dem Entwicklungsrechner mit synthetischen Testdaten.
**Für genau diese Kachel:** Compliance-Funktionen entscheiden im Ernstfall vor Gericht oder Aufsichtsbehörde – ein eigenes Gate stellt das vor Freigabe sicher.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `CMP-03` eDiscovery-Suche & Export (modulübergreifend) – Suche über registrierte Objekttypen aus DMS und Mail hinweg für Rechtsverfahren, mit vollständigem, prüfsummengesichertem Export der Treffer.
- `CMP-06` Vier-Augen-Freigabe für Löschungen – Löschung abgelaufener Objekte erfordert eine zweite, unabhängige Bestätigung durch eine andere Person, bevor der Löschworkflow ausgeführt wird.
- `CMP-07` DSGVO-Löschantrag (Recht auf Löschung, Art. 17) – Workflow für den Löschantrag einer betroffenen Person (Art. 17 DSGVO): modulübergreifende Suche (CMP-02), Löschung ohne Aufbewahrungspflicht, begründete Ablehnung mit Aufbewahrungspflicht, Freigabe über CMP-06, vollständiges Protokoll je Objekt.
- `CMP-01` GoBD-Verfahrensdokumentation – Exportierbare Verfahrensdokumentation gemäß GoBD: Beschreibung der Aufbewahrungs-, Zugriffs- und Löschverfahren, automatisch aus der aktuellen Konfiguration erzeugt.
- `CMP-04` Audit-Trail-Kopplung an Core-Audit-Log – Alle sicherheitsrelevanten Vorgänge in Archive (Fristsetzung, Sperre, Löschung, Export) werden an das zentrale Audit-Log in NEXARCH Core gemeldet, statt ein eigenes Protokoll zu führen.
- `CMP-05` Compliance-Berichts-Oberfläche – Oberfläche zum Anfordern, Einsehen und Herunterladen von GoBD-Verfahrensdokumentation und DSGVO-Berichten je Tenant.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. eDiscovery-Export wird gegen den Referenzdatensatz erneut durchgeführt und geprüft
2. Vier-Augen-Freigabe wird mit zwei unabhängigen Testrollen erneut nachgewiesen
3. Protokoll mit Zielwert, Messwert und Bewertung ist abgelegt
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Export-Prüfsummen stimmen bei wiederholtem Testlauf erneut überein
2. Löschversuch durch dieselbe Person ohne zweite Bestätigung scheitert erneut
3. Offene Restrisiken sind schriftlich benannt
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `QA-05` Abnahme- & Compliance-Prüfung Archive
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `QA-03: prüfgate-compliance-und-ediscovery`
- Branch: `feature/qa-03-prüfgate-compliance-und-ediscovery`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+64
View File
@@ -0,0 +1,64 @@
# QA-04 – Prüfgate Backup & Restore
**Epic:** ✅ Prüfungen & Qualitätssicherung | **Rolle:** Backend | **Komplexität:** Einfach | **Aufwand:** 2 Personentage | **Welle:** 4
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Prüfgate für Backup-Strategie und Restore-Verfahren vor Freigabe der Backup-Funktionen, inklusive einem real durchgeführten Wiederherstellungstest.
**Technische Grundlage:** Abnahmeprotokoll, realer Wiederherstellungstest
## Produkt-DNA für diesen Bereich
> Prüfen heißt messen. Behauptungen ohne Messprotokoll gelten nicht als erledigt.
**Übernehmen:**
- Fester Prüfplan je Ausbaustufe mit abgelegtem, nachlesbarem Protokoll.
- Nachgewiesene Wiederherstellbarkeit als Freigabevoraussetzung.
**Bewusst vermeiden:**
- Keine Freigabe auf Zuruf.
- Keine Prüfung nur auf dem Entwicklungsrechner mit synthetischen Testdaten.
**Für genau diese Kachel:** Backup ohne real durchgeführten Restore-Test ist eine unbelegte Behauptung – dieses Gate erzwingt den Beleg.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `BAK-06` Restore-Testverfahren – Regelmäßiger, automatisierter Testlauf des Restore-Verfahrens gegen eine isolierte Testumgebung, mit Ergebnisprotokoll als Nachweis der Wiederherstellbarkeit.
- `BAK-04` Tenant-Backup & -Restore (einzelner Mandant) – Sicherung und Wiederherstellung der Daten eines einzelnen Mandanten, ohne andere Mandanten zu berühren – etwa für Mandanten-Umzug oder isolierte Notfallwiederherstellung.
- `BAK-05` Reconciliation (Konsistenzprüfung Storage vs. DB) – Periodische Prüfung, ob jeder in der Datenbank referenzierte Objekt-Storage-Eintrag tatsächlich existiert und umgekehrt, mit Bericht über Abweichungen.
- `BAK-07` Aufbewahrungsfrist für Backup-Snapshots – Eigene, von der Dokumenten-Retention (RET-02) unabhängige Aufbewahrungsfrist für Backup-Snapshots selbst – nach restic/Borg-Vorbild eine Prune-Policy (z. B. tägliche Snapshots 14 Tage, wöchentliche 3 Monate, monatliche 1 Jahr – konkrete Staffelung als Konfiguration, nicht hart codiert), damit Backups nicht unbegrenzt wachsen, aber auch nicht zu früh gelöscht werden.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Restore wird real auf ein leeres Testsystem durchgeführt und dokumentiert
2. Reconciliation nach Restore zeigt keine Abweichungen zwischen Storage und Datenbank
3. Protokoll mit Zielwert, Messwert und Bewertung ist abgelegt
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Realer Restore-Testlauf erfolgreich und protokolliert
2. Reconciliation nach dem Testlauf liefert einen sauberen Bericht
3. Offene Restrisiken sind schriftlich benannt
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `QA-05` Abnahme- & Compliance-Prüfung Archive
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `QA-04: prüfgate-backup-und-restore`
- Branch: `feature/qa-04-prüfgate-backup-und-restore`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+68
View File
@@ -0,0 +1,68 @@
# QA-05 – Abnahme- & Compliance-Prüfung Archive
**Epic:** ✅ Prüfungen & Qualitätssicherung | **Rolle:** Backend | **Komplexität:** Einfach | **Aufwand:** 2 Personentage | **Welle:** 6
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Gesamtabnahme des Archive-Boards vor Freigabe: Retention/WORM, Compliance/eDiscovery und Backup/Restore müssen alle bestanden sein.
**Technische Grundlage:** Abnahmeprotokoll
## Produkt-DNA für diesen Bereich
> Prüfen heißt messen. Behauptungen ohne Messprotokoll gelten nicht als erledigt.
**Übernehmen:**
- Fester Prüfplan je Ausbaustufe mit abgelegtem, nachlesbarem Protokoll.
- Nachgewiesene Wiederherstellbarkeit als Freigabevoraussetzung.
**Bewusst vermeiden:**
- Keine Freigabe auf Zuruf.
- Keine Prüfung nur auf dem Entwicklungsrechner mit synthetischen Testdaten.
**Für genau diese Kachel:** Erst wenn Retention, Compliance und Backup einzeln bestanden sind, ist Archive insgesamt freigabefähig – diese Kachel bündelt den Nachweis.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `QA-02` Prüfgate Retention & WORM – Prüfgate für Fristenengine, Löschworkflow, Aufbewahrungssperre und WORM-Garantie vor Freigabe der Retention-Funktionen.
- `QA-03` Prüfgate Compliance & eDiscovery – Prüfgate für eDiscovery-Export und Vier-Augen-Freigabe vor Freigabe der Compliance-Funktionen.
- `QA-04` Prüfgate Backup & Restore – Prüfgate für Backup-Strategie und Restore-Verfahren vor Freigabe der Backup-Funktionen, inklusive einem real durchgeführten Wiederherstellungstest.
- `QA-06` Schnittstellen-Vertragstests – Vertragstests für die Modul-Adapter-Schnittstelle (RET-05), über die DMS und Mail Objekte bei der Retention-Engine registrieren – Breaking Changes müssen automatisiert erkannt werden, bevor sie ein konsumierendes Modul stillschweigend bricht.
- `QA-07` Last- & Leistungstest – Lasttest für Archive unter realistischer Last aus DMS und Mail gleichzeitig – insbesondere Retention-Prüfpfad (RET-03), Modul-Adapter-Registrierung (RET-05) und WORM-Schreibpfad unter Last.
- `ANA-01` Kennzahlen-Aggregation (modulübergreifend) – Zentraler Dienst, der Kennzahlen (Objektbestand, Aufbewahrungsstatus, Löschvorgänge, Speichervolumen) aus allen über RET-05 registrierten Modulen aggregiert.
- `ANA-02` Auswertungs-Dashboard – Dashboard zur Visualisierung der aggregierten Kennzahlen mit Filtern nach Tenant, Modul und Zeitraum.
- `ANA-03` Lizenz-/Nutzungs-Reports – Bericht über Nutzung und Lizenzrelevantes je Tenant (Speichervolumen, aktive Objekte, Nutzeranzahl-Bezug), abgestimmt mit dem Lizenzmodell aus NEXARCH Core.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Alle drei fachlichen Prüfgates (QA-02, QA-03, QA-04) sind bestanden
2. Gesamtprotokoll fasst alle drei Prüfgates mit Ergebnis zusammen
3. Abnahmeprotokoll ist unterzeichnet
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Zusammenfassung aller drei Prüfgates gegen die jeweiligen Einzelprotokolle abgeglichen
2. Offene Restrisiken aus allen drei Gates sind konsolidiert und schriftlich benannt
3. Freigabeentscheidung ist dokumentiert
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- Alles, was nicht in den Akzeptanzkriterien steht. Keine vorauseilende Umsetzung späterer Anforderungen.
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `QA-05: abnahme-und-compliance-prüfung-archive`
- Branch: `feature/qa-05-abnahme-und-compliance-prüfung-archive`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+60
View File
@@ -0,0 +1,60 @@
# QA-06 – Schnittstellen-Vertragstests
**Epic:** ✅ Prüfungen & Qualitätssicherung | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 3
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Vertragstests für die Modul-Adapter-Schnittstelle (RET-05), über die DMS und Mail Objekte bei der Retention-Engine registrieren – Breaking Changes müssen automatisiert erkannt werden, bevor sie ein konsumierendes Modul stillschweigend bricht.
**Technische Grundlage:** Vertragstests (Consumer-Driven Contracts), CI-Pipeline
## Produkt-DNA für diesen Bereich
> Prüfen heißt messen. Behauptungen ohne Messprotokoll gelten nicht als erledigt.
**Übernehmen:**
- Fester Vertragskorpus je Schnittstelle, an dem Kompatibilität wiederholbar geprüft wird.
- Nachgewiesene Erkennung von Breaking Changes als Freigabevoraussetzung, wie es verbindliche Schnittstellenverträge verlangen.
**Bewusst vermeiden:**
- Keine Freigabe auf Zuruf. Jedes Prüfgate hinterlässt ein abgelegtes, nachlesbares Protokoll.
- Keine Prüfung nur auf dem Entwicklungsrechner mit einer Handvoll Beispielaufrufen.
**Für genau diese Kachel:** Die Modul-Adapter-Schnittstelle ist der eigentliche Zweck des Boards – ein unbemerkter Bruch trifft DMS und Mail gleichermaßen und muss automatisiert auffallen, bevor er ausgeliefert wird.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `RET-05` Modul-Adapter-Schnittstelle (DMS/Mail registrieren Objekttypen) – Schnittstelle, über die DMS und Mail ihre Objekttypen (Dokument, Mail, Anhang) und die zugehörige Aufbewahrungsklasse bei Archive registrieren, statt eigene Retention-Logik zu bauen.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Vertragstests decken RET-05 vollständig ab
2. Absichtlich brechender Schema-Wechsel lässt Tests fehlschlagen
3. Tests laufen automatisiert in der CI
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Testlauf gegen aktuellen Stand grün
2. Simulierte Breaking Change erkannt
3. CI-Integration nachgewiesen
## Nicht Bestandteil dieser Kachel
- Alles, was nicht in den Akzeptanzkriterien steht. Keine vorauseilende Umsetzung späterer Anforderungen.
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `QA-06: schnittstellen-vertragstests`
- Branch: `feature/qa-06-schnittstellen-vertragstests`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+60
View File
@@ -0,0 +1,60 @@
# QA-07 – Last- & Leistungstest
**Epic:** ✅ Prüfungen & Qualitätssicherung | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 6
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Lasttest für Archive unter realistischer Last aus DMS und Mail gleichzeitig – insbesondere Retention-Prüfpfad (RET-03), Modul-Adapter-Registrierung (RET-05) und WORM-Schreibpfad unter Last.
**Technische Grundlage:** Lastgenerator, Messprotokoll
## Produkt-DNA für diesen Bereich
> Prüfen heißt messen. Behauptungen ohne Messprotokoll gelten nicht als erledigt.
**Übernehmen:**
- Nachgewiesene Prüfergebnisse als Freigabevoraussetzung, wie in allen anderen Boards.
**Bewusst vermeiden:**
- Keine Freigabe auf Zuruf. Jedes Prüfgate hinterlässt ein abgelegtes, nachlesbares Protokoll.
**Für genau diese Kachel:** Archive wird von zwei Modulen gleichzeitig angesprochen (DMS und Mail) – ohne Lasttest bleibt unklar, ob der Retention-Prüfpfad das verkraftet.
## Ausgangslage
Die folgenden Arbeitspakete sind bereits fertiggestellt und dürfen vorausgesetzt werden. Baue auf ihnen auf, statt Funktionalität zu duplizieren:
- `RET-05` Modul-Adapter-Schnittstelle (DMS/Mail registrieren Objekttypen) – Schnittstelle, über die DMS und Mail ihre Objekttypen (Dokument, Mail, Anhang) und die zugehörige Aufbewahrungsklasse bei Archive registrieren, statt eigene Retention-Logik zu bauen.
- `RET-03` Löschworkflow & Aufbewahrungssperre (Legal Hold) – Löschworkflow für abgelaufene Objekte: Freigabe, Vernichtung, Protokolleintrag. Aufbewahrungssperre (Legal Hold) verhindert jede Löschung unabhängig vom Fristablauf.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Definierte Ziel-Latenz für die Retention-/Legal-Hold-Abfrage unter Last eingehalten
2. WORM-Schreibpfad bleibt unter simulierter Last aus zwei gleichzeitig zugreifenden Modulen (DMS und Mail) korrekt und ohne Datenverlust
3. Modul-Adapter-Registrierung (RET-05) verkraftet gleichzeitige Registrierung mehrerer Objekttypen ohne Race Condition
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Lasttest mit simulierten parallelen Anfragen aus DMS und Mail durchgeführt, Ergebnis dokumentiert
2. WORM-Schreibpfad unter Last auf Datenverlust/Race Conditions geprüft
3. Gleichzeitige Registrierung mehrerer Objekttypen bei RET-05 getestet
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- (keine direkt abhängigen Kacheln bekannt)
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `QA-07: last leistungstest`
- Branch: `feature/qa-07-last-leistungstest`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
+65
View File
@@ -0,0 +1,65 @@
# RET-01 – Generisches Retention-Objektmodell
**Epic:** ⏳ Retention & WORM | **Rolle:** Backend | **Komplexität:** Mittel | **Aufwand:** 3 Personentage | **Welle:** 1
---
## Rolle
Du bist erfahrene Entwicklerin im Bereich Backend und baust NEXARCH Archive (zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup), das sich an Alfresco (Retention Policies, revisionssichere Ablage, Vier-Augen-Prinzip), ecoDMS (Revisionssicherheit, nachvollziehbare Vernichtung) und restic/Borg (inkrementelle, deduplizierende, verifizierbare Sicherung) orientiert und deren bekannte Schwächen bewusst vermeidet – insbesondere den Ressourcen-Overhead von Alfresco.
Serverseitige Logik, Datenzugriff und Schnittstelle. Keine Geschäftslogik in der Oberfläche.
## Auftrag
Generisches Datenmodell für aufbewahrungspflichtige Objekte anlegen: Objekttyp, Objekt-Referenz (modulübergreifend über Adapter), Aufbewahrungsklasse, Status. Migrationen versioniert und rückrollbar.
**Technische Grundlage:** PostgreSQL, pgx/v5, SQL-Migrationen (kein ORM)
## Produkt-DNA für diesen Bereich
> Aufbewahrung mit dem Ernst von Alfrescos Retention Policies, aber ohne dessen Ressourcen-Overhead.
**Übernehmen:**
- Alfresco: Retention Policies mit Stichtagsberechnung je Objekttyp und automatischem Ablauf.
- ecoDMS: Revisionssicherheit als Grundhaltung – einmal archiviert, nicht mehr veränderbar.
- Alfresco: Aufbewahrungssperre (Legal Hold), die jede Löschregel überstimmt.
**Bewusst vermeiden:**
- Alfresco – hoher Ressourcen-Overhead der Plattform: schlanker Go-Dienst statt schwergewichtiger Anwendungsserver.
- Keine modulspezifische Retention-Logik in DMS oder Mail – ein zentraler Adapter für alle Objekttypen.
**Für genau diese Kachel:** Das generische Objektmodell ist die Grundvoraussetzung, damit DMS und Mail keine eigene Retention-Logik bauen müssen.
## Ausgangslage
Diese Kachel hat keine Vorbedingungen und ist sofort startbar.
## Akzeptanzkriterien
Die Kachel gilt erst als umgesetzt, wenn alle Punkte erfüllt sind:
1. Objektmodell bildet beliebige Objekttypen aus DMS und Mail ab, ohne modulspezifische Spalten
2. Aufbewahrungsklasse ist je Objekt eindeutig zugeordnet und historisierbar
3. Migration läuft gegen leere Datenbank durch und ist rückrollbar
## Prüfungen vor der Abnahme
Führe jede Prüfung tatsächlich durch und halte das Ergebnis schriftlich fest. Nicht durchgeführte Prüfungen zählen als offen:
1. Migration vorwärts und rückwärts getestet
2. Testobjekt aus fiktivem DMS- und Mail-Adapter beide korrekt abgebildet
3. Tenant-Isolation der Kern-Tabellen durch Negativtest belegt
## Nicht Bestandteil dieser Kachel
Diese Punkte gehören ausdrücklich in andere Kacheln. Bereite höchstens die Schnittstelle dafür vor:
- `RET-02` Aufbewahrungsfristen-Engine
- `RET-04` WORM-Speicher-Garantie (Append-only)
- `RET-05` Modul-Adapter-Schnittstelle (DMS/Mail registrieren Objekttypen)
- `CMP-01` GoBD-Verfahrensdokumentation
- `CMP-02` DSGVO-/Datenschutz-Berichte
## Arbeitsweise
1. Lies zuerst den bestehenden Code der Vorbedingungen und halte dich an die dort etablierten Muster.
2. Setze die kleinste Lösung um, die alle Akzeptanzkriterien erfüllt. Kein Umbau angrenzender Bereiche.
3. Schreibe zu jedem Akzeptanzkriterium mindestens einen automatisierten Test.
4. Führe alle Prüfungen aus und dokumentiere Zielwert und Ergebnis.
5. Deutschsprachige Oberflächentexte, englischsprachige Bezeichner im Code.
6. Keine Zugangsdaten, Schlüssel oder Verbindungszeichenfolgen im Code – ausschließlich über Umgebungsvariablen.
## Abschluss
- Commit-Nachricht: `RET-01: generisches-retention-objektmodell`
- Branch: `feature/ret-01-generisches-retention-objektmodell`
- Schrittweise committen, Branch pushen, dann anhalten. Kein Merge, kein Deploy.
- In der Beschreibung des Pull Request die durchgeführten Prüfungen mit Ergebnis auflisten.
Loaded 100 of 587 files, more files were not shown because too many files have changed in this diff. Show more