INT-11: Nutzer-Tenant-Kontext in Modul-Rueckkanaelen (Mail, stackt auf PR #294/295/296) #302
Closed
patrick
wants to merge 0 commits from
feature/int-11-nutzer-tenant-kontext-in-modul-rueckkanaelen-archive-ai-workflow into main
pull from: feature/int-11-nutzer-tenant-kontext-in-modul-rueckkanaelen-archive-ai-workflow
merge into: scripte:main
scripte:main
scripte:fix/ai-app-write-timeout
scripte:chore/migration-kanban-board
scripte:chore/connect-kanban-board
scripte:chore/workflow-kanban-board
scripte:chore/archive-kanban-board
scripte:chore/mail-kanban-board
scripte:chore/dms-kanban-board
scripte:chore/core-kanban-board
scripte:chore/ai-kanban-board
scripte:chore/ai-kanban-security-folgetickets
scripte:feat/ai-app-deployment
scripte:feat/ai-app-vorschlaege
scripte:feat/ai-cls09-herkunftsmarkierung
scripte:feat/ai-eng09-gemini
scripte:feat/ai-cls08-mehrsprachig
scripte:feat/ai-titel-korrespondent
scripte:feat/dms-backup-s3
scripte:feat/dms-s3-verdrahten
scripte:docs/alfresco-vergleich
scripte:refactor/common-batch-2
scripte:refactor/common-modul-pilot
scripte:fix/dms-httpharden-normalize
scripte:feature/shl-02-pagecontainer-dedup
scripte:test/dedup-fakekek-testutil
scripte:feature/nav-01-mail-postfach-registry-eintrag
scripte:feature/sec-08-09-rbac-cmis-audit
scripte:feature/shl-04-globale-modul-navigation
scripte:chore/mail-kanban-security-folgetickets
scripte:chore/dms-kanban-security-folgetickets
scripte:chore/core-kanban-security-folgetickets
scripte:chore/archive-kanban-security-folgetickets
scripte:chore/workflow-kanban-security-folgetickets
scripte:chore/connect-kanban-security-folgetickets
scripte:feature/qa-08-barrierefreiheits-audit-workflow
scripte:feature/tsk-04-aufgaben-oberflaeche-workflow
scripte:feature/qa-08-barrierefreiheits-audit-connect
scripte:feature/int-18-smtp-gateway-weiterleitung-an-feste-adresse-dms
scripte:docs/rollout-131-vorbereitung
scripte:feature/met-08-facturx-zugferd-szenarien-validator-dms
scripte:feature/qa-15-sicherheitspruefung-gesamtprojekt
scripte:fix/testrun-2026-09-21-dms
scripte:feature/cmp-07-dsgvo-loeschantrag-recht-auf-loeschung
scripte:feature/cmp-06-vier-augen-freigabe-fuer-loeschungen
scripte:feature/cmp-02-dsgvo-datenschutz-berichte
scripte:feature/ret-03-loeschworkflow-und-aufbewahrungssperre-legal-hold
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Nutzer-Tenant-Kontext in Modul-Rueckkanaelen (Archive/AI/Workflow). Baut auf dem 3-Wege-Merge von INT-08+INT-09+INT-10 auf (alle noch offene PRs #294/295/296, konfliktfrei gemergt) - dieser PR enthaelt daher deren Commits mit, bis diese drei mergen.
Echter Bug gefunden und gefixt: retentionclient.CheckLegalHold sendete einen am Client fix gesetzten Tenant statt des Tenants der tatsaechlich geprueften Nachricht - bei trash.Store.PurgeExpired mit mehreren aktiven Tenants in einem Lauf waere der falsche Tenant-Kontext an Archive gegangen. Tenant-Slug jetzt als Pflichtparameter durchgereicht bis PurgeExpired, neue ErrTenantRejected-Unterscheidung im Audit-Log.
AI/Workflow-Rueckkanaele (INT-09/10) hatten Tenant-Kontext bereits korrekt pro Aufruf, serverseitig bereits unabhaengig vom Service-Token validiert - keine Aenderung dort noetig, nur per Test bestaetigt.
AC1-3 und alle 3 Pruefungen real getestet (echte Postgres, echte zweite moduladapter-api-Instanz fuer Tenant-Isolationstest). Referenzmuster DMS INT-16 genutzt.
Siehe mail/docs/INT-11-PRUEFPROTOKOLL.md.
🤖 Generated with Claude Code
Je Akzeptanzkriterium ein automatisierter Test, real gegen Postgres (TEST_TENANT_DSN) UND gegen eine echte, als Subprozess gestartete workflow-app (workflow/cmd/workflow-app) -- kein HTTP-Fake, da Mail und Workflow als getrennte Go-Module ausschliesslich ueber den echten ENG-02-Adapter gekoppelt sind: - RegisterAll traegt message/thread samt Triggern tatsaechlich in module_registrations/module_registration_versions der laufenden Workflow-Instanz ein, auch bei wiederholtem Aufruf (Dienst-Neustart). - PublishMailReceived + Dispatcher.RunOnce liefern mail.received nachweisbar in module_events der echten Instanz aus. - Ein nicht erreichbarer Workflow-Endpunkt blockiert Enqueue nicht und hinterlaesst last_error/Status pending statt das Ereignis zu verwerfen. Dabei Fehler im ENG-02-Adapter gefunden und umgangen (nicht am Adapter selbst behoben, anderes Modul/Board): PublishEvent setzt einen leeren dedupe_key per NULLIF auf NULL, die Spalte ist aber NOT NULL -- jede Zustellung ohne Dedup-Schluessel schlug serverseitig fehl. Mail liefert deshalb immer einen abgeleiteten dedupe_key (mail:{object_type}:{trigger}:{object_id}) statt sich auf einen leeren Schluessel zu verlassen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>Inhalt bereits in main enthalten (geprueft per merge_all_prs.sh: leerer Merge-Diff). Geschlossen ohne Merge.
Pull request closed