feat(compliance): add the aml rules engine and rolling-window aggregator - #279
Merged
Conversation
Add two generic, reusable AML building blocks. The AmlEvaluator embeds the decision engine in-process to score a transaction against a configurable rule, parsing the rule fail-closed at construction so an invalid rule fails startup rather than silently clearing; its default rule is neutral and never flags. The RollingWindowAggregator counts and sums observations over per-transaction, month and lifetime windows without baking in any threshold. No real rules or business values; the event consumer that composes them lands in a later slice. Closes #266
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
E-04 Compliance #266 - generic AML building blocks (the event consumer that composes them is #267).
What
@Component): embeds the decision-engine lib in-process (like payments screening), parses the configured rule fail-closed at construction, and maps a match on the configuredflagLabeltoFlagged(reasonCodes), elseClear. The default rule is neutral (always yields CLEAR != flagLabel) so an unconfigured engine never flags - no business logic baked in.@Component): generic count + BigDecimal sum overPER_TRANSACTION(most recent by time),MONTH(>= now-30d, boundary inclusive) andLIFETIMEwindows. No thresholds - the caller interprets the result.AmlTransactionView,AmlDecision,AmlObservation,WindowAggregate,AmlWindow),AmlRulesProperties+ComplianceConfig(@EnableConfigurationProperties), decision-engine added as a project dependency.Clean-room (§5.3.1)
No real AML rules, thresholds, score-bands, lists, PEP, or foreign IP. Generic attributes (amount/currency/subjectReference) + neutral labels (CLEAR/FLAG). subjectReference opaque.
Gate chain
DecisionDslExceptionin the fail-closed test; a label-discriminator test).All local gates green; pure unit tests (no new IT).
Closes #266