Ereignisvertrag (versioniert, Tenant-Bindung, Dedupe-Key) in moduleadapter.PublishEvent//events; Ereignisse fremder Mandanten werden abgelehnt und protokolliert (RejectedEvents).
Neue Migration 0013_event_dispatch: module_events um Mandant/Dedupe/Verarbeitungsstatus erweitert, neue Tabellen event_task_rules (mandantenweite Zuordnung Ereignis -> Aufgabe/Genehmigung) und event_dispatch_log (Einmal-Verarbeitung).
Neues Paket internal/eventtrigger: RuleStore + Dispatcher.Dispatch, erzeugt aus einem Ereignis ueber die konfigurierte Regel genau eine Aufgabe oder einen Genehmigungslauf.
Doppelzustellung -> genau eine Aufgabe: PASS (TestPublishEvent_DuplicateDedupeKeyIsIdempotent, TestDispatch_DuplicateDeliverySameEventCreatesOnlyOneTask)
Ausfall/Wiederanlauf ohne Verlust/Dubletten: PASS (TestDispatch_SurvivesRestartWithoutLossOrDuplicates, TestDispatch_EventWithoutRuleStaysPending); bekanntes, dokumentiertes Restrisiko bei Absturz im schmalen Fenster zwischen Objekt-Anlage und Bestaetigung.
Cross-Tenant negativ -> abgelehnt und protokolliert: PASS (TestPublishEvent_RejectsForeignTenantAndLogsIt)
Alle Tests real gegen Postgres 17 auf Testhost 192.168.1.204 ausgefuehrt (eigene Wegwerf-DB, zurueckgebaut). Voller Modul-Testlauf (go test ./... -p 1) und go vet ./... gruen, keine Regressionen.
## Zusammenfassung
- Ereignisvertrag (versioniert, Tenant-Bindung, Dedupe-Key) in `moduleadapter.PublishEvent`/`/events`; Ereignisse fremder Mandanten werden abgelehnt und protokolliert (`RejectedEvents`).
- Neue Migration `0013_event_dispatch`: `module_events` um Mandant/Dedupe/Verarbeitungsstatus erweitert, neue Tabellen `event_task_rules` (mandantenweite Zuordnung Ereignis -> Aufgabe/Genehmigung) und `event_dispatch_log` (Einmal-Verarbeitung).
- Neues Paket `internal/eventtrigger`: `RuleStore` + `Dispatcher.Dispatch`, erzeugt aus einem Ereignis ueber die konfigurierte Regel genau eine Aufgabe oder einen Genehmigungslauf.
## Pruefungen (siehe workflow/docs/ENG-09-PRUEFPROTOKOLL.md)
1. Doppelzustellung -> genau eine Aufgabe: PASS (`TestPublishEvent_DuplicateDedupeKeyIsIdempotent`, `TestDispatch_DuplicateDeliverySameEventCreatesOnlyOneTask`)
2. Ausfall/Wiederanlauf ohne Verlust/Dubletten: PASS (`TestDispatch_SurvivesRestartWithoutLossOrDuplicates`, `TestDispatch_EventWithoutRuleStaysPending`); bekanntes, dokumentiertes Restrisiko bei Absturz im schmalen Fenster zwischen Objekt-Anlage und Bestaetigung.
3. Cross-Tenant negativ -> abgelehnt und protokolliert: PASS (`TestPublishEvent_RejectsForeignTenantAndLogsIt`)
Alle Tests real gegen Postgres 17 auf Testhost 192.168.1.204 ausgefuehrt (eigene Wegwerf-DB, zurueckgebaut). Voller Modul-Testlauf (`go test ./... -p 1`) und `go vet ./...` gruen, keine Regressionen.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
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.
Zusammenfassung
moduleadapter.PublishEvent//events; Ereignisse fremder Mandanten werden abgelehnt und protokolliert (RejectedEvents).0013_event_dispatch:module_eventsum Mandant/Dedupe/Verarbeitungsstatus erweitert, neue Tabellenevent_task_rules(mandantenweite Zuordnung Ereignis -> Aufgabe/Genehmigung) undevent_dispatch_log(Einmal-Verarbeitung).internal/eventtrigger:RuleStore+Dispatcher.Dispatch, erzeugt aus einem Ereignis ueber die konfigurierte Regel genau eine Aufgabe oder einen Genehmigungslauf.Pruefungen (siehe workflow/docs/ENG-09-PRUEFPROTOKOLL.md)
TestPublishEvent_DuplicateDedupeKeyIsIdempotent,TestDispatch_DuplicateDeliverySameEventCreatesOnlyOneTask)TestDispatch_SurvivesRestartWithoutLossOrDuplicates,TestDispatch_EventWithoutRuleStaysPending); bekanntes, dokumentiertes Restrisiko bei Absturz im schmalen Fenster zwischen Objekt-Anlage und Bestaetigung.TestPublishEvent_RejectsForeignTenantAndLogsIt)Alle Tests real gegen Postgres 17 auf Testhost 192.168.1.204 ausgefuehrt (eigene Wegwerf-DB, zurueckgebaut). Voller Modul-Testlauf (
go test ./... -p 1) undgo vet ./...gruen, keine Regressionen.🤖 Generated with Claude Code