Skip to content

feat(rules): behavioral POST-rule pack — turn PAA signals into verdicts - #105

Merged
omob merged 1 commit into
mainfrom
feat/behavioral-rule-pack
Jul 7, 2026
Merged

feat(rules): behavioral POST-rule pack — turn PAA signals into verdicts#105
omob merged 1 commit into
mainfrom
feat/behavioral-rule-pack

Conversation

@omob

@omob omob commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Turns PAA's velocity/graph signals into actual verdicts — addresses the efficacy validation's finding (#99) that "PAA computes features but no decision pathway consumes them."

What

Two POST-stage REVIEW rules in a new seed (04_behavioral_rule_pack.ts), keyed on PAA-derived snapshot features:

Rule Trigger Catches
velocity spike features.velocity_1h ≥ 15, individual account rapid-burst velocity anomaly
high fan-out spray features.unique_receivers_24h ≥ 12, individual account spray / freshly-recruited disburser

Both guard on is_agent_assisted == 0 and customer_is_corporate == 0 — agents and payroll accounts are legitimately high-velocity/high-fan-out. Every PAA feature these rules read defaults to 0 on a Redis cache miss, so the pack is cold-start-safe: silent until PAA has accumulated real state, no day-1 false positives. REVIEW (not DECLINE) routes to the analyst queue and feeds the label loop.

Measured (efficacy-validation harness, before → after)

Baseline = FATF pack only. Each scenario re-run with identical seeds; the tuning history (a corporate-guard fix after payroll spiked to 20% under an unguarded velocity rule) is in the commit trail.

Scenario Metric Before After
track1_velocity_burst recall (flagged) 0.00 0.80
track1_mule_network recall 0.00 0.00
track1_mobile_money_ring recall 0.04 0.04
track2_agent_fanout FP rate 0.0024 0.0048¹
track2_payroll FP rate 0.0028 0.0028
track2_airtime_topups FP rate 0.0020 0.0020
track2_diaspora_remittance FP rate 0.0227² 0.0227²

¹ The delta is ML noise (2 vs 1 AMOUNT_HIGH flags) — no behavioral rule fired on any legitimate scenario.
² Pre-existing FATF VPN-rule flags, unrelated to this pack.

Honest scope

Mule networks and rings stay at ~0 recall and this pack deliberately does not chase them: their signal is behavioral-over-time (received-then-forwarded, community cycling), which PAA's graph-degree features express too laggily/noisily for a reliable single-feature threshold. Two candidate rules targeting those (graph in/out-degree, pair round-trips) were built, measured, and dropped because they never fired on their target topologies — every shipped rule is one the harness validates. Mule/ring detection is the cold-start model retrain's job (next).

🤖 Generated with Claude Code

Two POST-stage REVIEW rules on PAA-derived features that the ML model
misses on trusted, authenticated traffic:
- velocity spike: features.velocity_1h >= 15 (individual accounts)
- fan-out spray: features.unique_receivers_24h >= 12 (individual accounts)

Both exclude agents and corporates (legitimately high-velocity /
high-fan-out). Every PAA signal read defaults to 0 on a Redis miss, so
the pack is cold-start-safe — silent until PAA accumulates real state.

Measured against efficacy-validation: velocity-anomaly recall 0.00 ->
0.80 with zero added false positives across agent-network, payroll,
airtime, and remittance legitimate traffic. Mule/ring detection stays
model-territory (behavioral-over-time, not a single-feature threshold).

Addresses the efficacy validation's 'PAA computes features but nothing
consumes them on the decision path' finding.
@omob
omob merged commit cfd07c2 into main Jul 7, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant