refactor: Prüfgate-Pakete nach Funktion benannt, migration* gruppiert #373

Merged
patrick merged 2 commits from refactor/struktur-pakete into main 2026-10-28 11:32:30 +01:00
59 changed files with 62 additions and 63 deletions

No files matched your search

@@ -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"
@@ -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
+1 -1
View File
@@ -1,7 +1,7 @@
// Package retentionverify implementiert VAL-03: Stichprobenvergleich von
// retain_until (Quelle aus TAR-01 vs. nach der Migration im generischen
// Retention-Objektmodell) je Tenant, nach dem Berichtsmuster aus VAL-01
// (internal/migrationverify): Abweichung ist entweder erklaert oder
// (internal/migration/verify): Abweichung ist entweder erklaert oder
// blockierender Befund, nie reine Notiz.
package retentionverify
+2 -2
View File
@@ -1,6 +1,6 @@
// cor01-tenant-migrate fuehrt COR-01 aus: Uebernahme der freigegebenen
// tenant_migration_map (MAP-02) in Core TEN-01. Einmalig wiederholbar
// gegen dieselbe Quelle (siehe internal/migrationtenant).
// gegen dieselbe Quelle (siehe internal/migration/tenant).
package main
import (
@@ -9,7 +9,7 @@ import (
"os"
"gitea.perlbach24.de/scripte/nexarch/internal/db"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationtenant"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/tenant"
"gitea.perlbach24.de/scripte/nexarch/internal/tenant"
)
+2 -2
View File
@@ -1,6 +1,6 @@
// cor02-user-migrate fuehrt COR-02 aus: Uebernahme der freigegebenen
// user_migration_map in Core IAM-01, bcrypt-Hashes 1:1 ohne Rehash.
// Einmalig wiederholbar gegen dieselbe Quelle (siehe internal/migrationuser).
// Einmalig wiederholbar gegen dieselbe Quelle (siehe internal/migration/user).
package main
import (
@@ -9,7 +9,7 @@ import (
"os"
"gitea.perlbach24.de/scripte/nexarch/internal/db"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationuser"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/user"
"gitea.perlbach24.de/scripte/nexarch/internal/tenant"
)
+2 -2
View File
@@ -4,7 +4,7 @@
// Migrationsschritt.
//
// Benutzer-Quellzahl kommt aus der freigegebenen user_migration_map
// (Registry-DB, siehe internal/migrationuser). Dokument-/Nachrichten-
// (Registry-DB, siehe internal/migration/user). Dokument-/Nachrichten-
// Quellzahlen kommen aus archivdms/archivmail und liegen in diesem
// Repository nicht als Go-Code vor (nur als Source-Interface in
// dms/internal/migrationdocument bzw. mail/internal/messagemigration,
@@ -22,7 +22,7 @@ import (
"github.com/jackc/pgx/v5/pgxpool"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationverify"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/verify"
"gitea.perlbach24.de/scripte/nexarch/internal/tenant"
)
+1 -1
View File
@@ -223,7 +223,7 @@ const val02SampleSize = 5
// val02 entschluesselt eine Stichprobe migrierter Revisionen ueber denselben
// crypto.Service wie der Lesepfad; den eigentlichen Hash-Vergleich macht
// internal/migrationverify (VAL-02) im Root-Modul auf diesen Klartexten.
// internal/migration/verify (VAL-02) im Root-Modul auf diesen Klartexten.
func (e *Env) val02(ctx context.Context, t Tenant, _ int64, res *Result) error {
target, err := e.Pool(ctx, t.TenantDB)
if err != nil {
@@ -1,8 +1,8 @@
// Package qa08 ist das Pruefgate "Revisionssicherheit" (QA-08): Manipulation
// Package auditproof ist das Pruefgate "Revisionssicherheit" (QA-08): Manipulation
// an Protokoll und Revisionsinhalt wird erkannt, Signaturen sind mit einem
// externen Werkzeug (pdfsig) pruefbar, Aktionen sind im Protokoll auffindbar,
// und pro Revision entsteht ein Pruefbericht.
package qa08
package auditproof
import (
"bytes"
@@ -1,9 +1,9 @@
// Package qa03 ist das Pruefgate "Dokumentenkern" (QA-03): der komplette
// Package documentcore ist das Pruefgate "Dokumentenkern" (QA-03): der komplette
// Lebenszyklus hochladen, ansehen, ablegen, herunterladen, loeschen,
// wiederherstellen als automatisierter Test gegen das echte, voll migrierte
// Schema, mit Pruefsummenvergleich ueber alle Schritte, Abbruchszenarien und
// dem vollstaendigen Referenzkorpus (QA-01).
package qa03
package documentcore
import (
"bytes"
@@ -1,8 +1,8 @@
// Package qa02 ist das Pruefgate "Fundament" (QA-02): Durchstich von der
// Package foundation ist das Pruefgate "Fundament" (QA-02): Durchstich von der
// identifizierten Anfrage bis zum verschluesselt abgelegten Objekt, Wirksamkeit
// der Verschluesselung und Fehlerbild bei Ausfall von Datenbank, Storage und
// Schluesseldienst, jeweils gegen das echte, voll migrierte Schema.
package qa02
package foundation
import (
"bytes"
@@ -1,10 +1,10 @@
// Package qa10 enthaelt QA-10s automatisierte Prüfungen je Akzeptanzkriterium:
// Package loadtest enthaelt QA-10s automatisierte Prüfungen je Akzeptanzkriterium:
// Zielwerte fuer Antwortzeit/Durchsatz gemessen (AC1), definiertes statt
// zufaelliges Verhalten bei Ueberlast (AC2), selbststaendige Erholung nach
// Lastspitze (AC3). Dieselbe Bootstrap-Logik wie cmd/qa10loadtest, aber
// kleine, schnelle Groessenordnung fuer den CI-Testlauf statt fuer die
// Messung im Prüfprotokoll.
package qa10
package loadtest
import (
"bytes"
@@ -92,7 +92,7 @@ func setup(t *testing.T, docCount int) *testHarness {
if err != nil {
t.Fatalf("users tabelle: %v", err)
}
migrations, err := migrate.Load(filepath.Join("..", "..", "migrations", "tenant"))
migrations, err := migrate.Load(filepath.Join("..", "..", "..", "migrations", "tenant"))
if err != nil {
t.Fatalf("migrationen laden: %v", err)
}
@@ -1,4 +1,4 @@
package qa05
package metadataclass
import (
"bytes"
@@ -1,9 +1,9 @@
// Package qa05 ist das Pruefgate "Metadaten & Klassifizierung" (QA-05) fuer
// Package metadataclass ist das Pruefgate "Metadaten & Klassifizierung" (QA-05) fuer
// den Teil, der im DMS existiert: Feldvalidierung ueber alle Eingabewege,
// Typwechsel mit Bestandsdaten und Konsistenz der Massenbearbeitung, gegen das
// echte, voll migrierte Schema. Die Genauigkeit der automatischen Zuordnung
// (MET-05, CLS-01/03) ist mangels Umsetzung nicht pruefbar, siehe Protokoll.
package qa05
package metadataclass
import (
"bytes"
@@ -1,8 +1,8 @@
// Package qa04 ist das Pruefgate "Suche & Texterkennung" (QA-04): Es misst am
// Package searchocr ist das Pruefgate "Suche & Texterkennung" (QA-04): Es misst am
// festen, synthetischen Referenzkorpus die Erkennungsrate der OCR-Pipeline, die
// Trefferqualitaet der Suche und die Konsistenz zwischen Datenbank und Suchindex,
// gegen echtes Postgres (Testschema), echtes Tesseract und echtes Manticore.
package qa04
package searchocr
import (
"bytes"
@@ -1,7 +1,7 @@
// Package qa06 ist das Pruefgate "Sicherheit & Berechtigung" (QA-06): jede
// Package securityauthz ist das Pruefgate "Sicherheit & Berechtigung" (QA-06): jede
// Rolle gegen jeden objektbezogenen Endpunkt, Einschleusung, Upload-Haertung,
// signierte URLs und aktive Inhalte.
package qa06
package securityauthz
import (
"context"
@@ -1,4 +1,4 @@
package qa06
package securityauthz
import (
"context"
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationacl"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/acl"
"gitea.perlbach24.de/scripte/nexarch/internal/policy"
"gitea.perlbach24.de/scripte/nexarch/internal/rbac"
)
+4 -4
View File
@@ -11,10 +11,10 @@ import (
"gitea.perlbach24.de/scripte/nexarch/internal/finalmigrationapproval"
"gitea.perlbach24.de/scripte/nexarch/internal/migrate"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationaudit"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationrole"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationtenant"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationuser"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/audit"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/role"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/tenant"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/user"
"gitea.perlbach24.de/scripte/nexarch/internal/tenant"
"gitea.perlbach24.de/scripte/nexarch/internal/tenantapproval"
"gitea.perlbach24.de/scripte/nexarch/internal/tenantmatch"
+2 -2
View File
@@ -15,8 +15,8 @@ import (
"github.com/jackc/pgx/v5/pgxpool"
"gitea.perlbach24.de/scripte/nexarch/internal/auth"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationuser"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationverify"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/user"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/verify"
"gitea.perlbach24.de/scripte/nexarch/internal/user"
)
+2 -2
View File
@@ -7,10 +7,10 @@ import (
"path/filepath"
"strings"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationauditcontinuity"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/auditcontinuity"
)
// val04 verwendet VAL-04 (internal/migrationauditcontinuity) direkt: Quelle
// val04 verwendet VAL-04 (internal/migration/auditcontinuity) direkt: Quelle
// und Ziel liegen beide in der Registry-DB (legacy_audit_log_staging bzw.
// audit_events aus COR-05), eine Modulstufe ist dafuer nicht noetig.
func (d *Dryrun) val04(ctx context.Context) (Outcome, error) {
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,6 +1,6 @@
// Package migrationauditcontinuity implementiert VAL-04: den
// Kontinuitaetsabgleich des Audit-Logs je Tenant nach COR-05
// (internal/migrationaudit) — aeltester/neuester Eintrag und Gesamtzahl
// (internal/migration/audit) — aeltester/neuester Eintrag und Gesamtzahl
// zwischen legacy_audit_log_staging (Quelle) und audit_events (Ziel)
// duerfen weder eine Luecke noch eine Zeitverschiebung zeigen.
package migrationauditcontinuity
@@ -11,7 +11,7 @@ import (
"github.com/jackc/pgx/v5/pgxpool"
"gitea.perlbach24.de/scripte/nexarch/internal/migrationaudit"
"gitea.perlbach24.de/scripte/nexarch/internal/migration/audit"
"gitea.perlbach24.de/scripte/nexarch/internal/testdb"
)
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -79,10 +79,10 @@ func TestMigrateApproved(t *testing.T) {
// Fuenf synthetische, freigegebene Tenant-Zusammenfuehrungen und ein
// bewusst NICHT freigegebener Eintrag (Akzeptanzkriterium 2).
type synthEntry struct {
id string
slug string
name string
approved bool
id string
slug string
name string
approved bool
}
suffix := testdb.Suffix()
entries := make([]synthEntry, 0, 6)
File renamed without changes.
File renamed without changes.
@@ -12,7 +12,7 @@ import (
type TenantPoolResolver func(ctx context.Context, tenantSlug string) (*pgxpool.Pool, error)
// PostgresTenantCountProvider zaehlt users und documents direkt in der
// Tenant-Datenbank, in die COR-02 (internal/migrationuser) bzw. DOK-01
// Tenant-Datenbank, in die COR-02 (internal/migration/user) bzw. DOK-01
// (dms/internal/migrationdocument) schreiben. Die Nachrichten-Zieltabelle
// existiert nicht in Postgres (siehe mail/internal/messagemigration,
// Metadaten liegen ausschliesslich im Manticore-Suchindex) — das
@@ -40,7 +40,7 @@ func (p PostgresTenantCountProvider) Counts(ctx context.Context, tenantSlug stri
// RegistryApprovedUserCountProvider zaehlt freigegebene
// user_migration_map-Eintraege je Tenant (siehe
// internal/migrationuser.MapStore.Approved) als Quellzahl der
// internal/migration/user.MapStore.Approved) als Quellzahl der
// Benutzer-Kerntabelle.
type RegistryApprovedUserCountProvider struct {
RegistryPool *pgxpool.Pool
File renamed without changes.
File renamed without changes.
File renamed without changes.
+2 -2
View File
@@ -8,8 +8,8 @@ import (
"github.com/jackc/pgx/v5/pgxpool"
"gitea.perlbach24.de/scripte/nexarch/internal/testdb"
"gitea.perlbach24.de/scripte/nexarch/internal/tenantmatch"
"gitea.perlbach24.de/scripte/nexarch/internal/testdb"
)
func setupSchema(t *testing.T, ctx context.Context, pool *pgxpool.Pool) {
@@ -134,7 +134,7 @@ func TestUnapprovedEntry_IsRejectedByDownstreamConsumer(t *testing.T) {
id := ids[0]
// Akzeptanzkriterium 3: approved_at IS NOT NULL ist die einzige Quelle,
// die COR-01 (internal/migrationtenant.MapStore.Approved) tatsaechlich
// die COR-01 (internal/migration/tenant.MapStore.Approved) tatsaechlich
// liest -- derselbe Filter wird hier direkt nachgebildet, um die
// Zurueckweisung ohne Freigabe nachzuweisen.
var count int
+1 -1
View File
@@ -3,7 +3,7 @@
// (internal/tenantapproval) eine Ebene tiefer (Benutzer statt Tenant). Jede
// Benutzer-Zusammenfuehrung erfordert eine explizite, protokollierte
// menschliche Entscheidung (Approve/Reject), bevor COR-02
// (internal/migrationuser.MapStore.Approved) sie als Quelle nutzen darf.
// (internal/migration/user.MapStore.Approved) sie als Quelle nutzen darf.
package usermigrationapproval
import (
+2 -2
View File
@@ -167,7 +167,7 @@ func TestUnapprovedMerge_StaysRejectedWhileBothAccountsRemainSeparatelyMigratabl
}
mergeID := mergeIDs[0]
// Downstream-Filter von COR-02 (internal/migrationuser.MapStore.Approved)
// Downstream-Filter von COR-02 (internal/migration/user.MapStore.Approved)
// liest ausschliesslich approved_at IS NOT NULL -- hier direkt
// nachgebildet, um die Zurueckweisung ohne Freigabe nachzuweisen.
assertNotApprovedForDownstream := func(id int64) {
@@ -251,7 +251,7 @@ func TestUnapprovedMerge_StaysRejectedWhileBothAccountsRemainSeparatelyMigratabl
// AC3: die freigegebene Map ist die einzige Quelle fuer COR-02 --
// Approved() liefert ausschliesslich Eintraege mit approved_at gesetzt,
// genau der Filter, den internal/migrationuser.MapStore.Approved
// genau der Filter, den internal/migration/user.MapStore.Approved
// implementiert.
func TestApproved_LiefertNurFreigegebeneEintraege(t *testing.T) {
ctx := context.Background()
+1 -1
View File
@@ -52,7 +52,7 @@ go_suite FDN-09 ./internal/crypto/
go_suite FDN-16 ./internal/testdb/ ./internal/testlock/
go_suite FDN-10/11 ./internal/downloadapi/ ./internal/jobqueue/
go_suite QA-01 ./internal/testcorpus/
go_suite QA-02 ./internal/qa02/
go_suite QA-02 ./internal/gates/foundation/
perf_serial() {
local out; out="$(cd dms && TEST_PERF=1 go test -count=1 -p 1 -v -run 'TestSearch_ConcurrentRequestsStayUnderResponseTimeLimit|TestFilters_ResponseTimeWithFiveFilters' ./internal/searchapi/ 2>&1)"
+1 -1
View File
@@ -25,7 +25,7 @@ go_suite DOC-11/12 ./internal/trash/ ./internal/trashapi/
go_suite DOC-14 ./internal/docmerge/
go_suite DOC-15 ./internal/bulkedit/ ./internal/bulkeditapi/
go_suite QA-01 ./internal/testcorpus/
go_suite QA-03 ./internal/qa03/
go_suite QA-03 ./internal/gates/documentcore/
if [ "${QA03_SKIP_WEB:-0}" != 1 ]; then
for d in shl dms-upload dms-browser pdf-viewer; do
@@ -1,10 +1,10 @@
// Package qa03 ist das Pruefgate Genehmigungen & Aufgaben (QA-03): ein
// Package approvals ist das Pruefgate Genehmigungen & Aufgaben (QA-03): ein
// fester Testkorpus, der die bereits gemergten Bausteine APR-02
// (dualcheck), APR-04 (delegation), TSK-03 (escalation) und TSK-05
// (escalationnotify) end-zu-ende gegen echtes Postgres durchspielt --
// Missbrauchsversuche auf die Vier-Augen-Freigabe, Zeitraffer-Fristen und
// den vollstaendigen Eskalationspfad bis zum simulierten Core-Dispatcher.
package qa03
package approvals
import (
"context"
@@ -1,9 +1,9 @@
// Package qa02 ist das Pruefgate fuer QA-02: Zustandsautomat (ENG-01),
// Package engine ist das Pruefgate fuer QA-02: Zustandsautomat (ENG-01),
// Prozessdefinitions-Format (ENG-03), Modul-Adapter-Schnittstelle (ENG-02)
// und Fehlerbehandlung/Retry (ENG-05) werden hier nicht isoliert, sondern
// im Zusammenspiel gegen eine echte, frisch migrierte Testdatenbank
// gefahren.
package qa02
package engine
import (
"context"