Implemented an adaptive risk engine that replaces static risk thresholds with:
- Versioned weighted policy engine
- Deterministic calibrated ML ensemble scorer
- Per-tenant policy support
- Explainable risk factors for each decision
- Drift monitoring for feature distribution shifts
- Reproducible decision logs with rollback-safe policy lifecycle
-
models/RiskPolicyVersion.js- Stores policy versions per tenant
- Supports active/archived lifecycle
- Enables version history and rollback-safe publishing
-
models/RiskDecisionLog.js- Stores reproducible risk decisions with:
- policy version
- model version
- policy checksum
- input hash
- reproducibility key
- explainability factors
- Stores reproducible risk decisions with:
-
models/RiskDriftMetric.js- Tracks model drift per tenant/model version
- Stores baseline/current feature stats and drift status
config/adaptiveRiskPolicy.v2.json- Default policy for global tenant bootstrap
- Includes rule weights, model coefficients, calibration, thresholds, and drift settings
services/adaptiveRiskEngineV2Service.js- Policy bootstrap/retrieval
- Rule scoring + ML ensemble scoring
- Score calibration
- Final decision routing (allowed/monitor/challenged/blocked)
- Explainability generation
- Drift metric updates
- Policy publish and rollback
services/suspiciousLoginDetectionService.js- Replaced static additive thresholds with adaptive risk engine v2 evaluation
- Added policy/model metadata to security event details
- Added explainability-linked risk flags
routes/adaptiveRiskEngine.jsGET /api/risk-engine/policyPUT /api/risk-engine/policyPOST /api/risk-engine/policy/rollbackGET /api/risk-engine/historyGET /api/risk-engine/driftGET /api/risk-engine/decisions
server.js- Registered risk engine API route:
app.use('/api/risk-engine', adaptiveRiskEngineRoutes)
- Registered risk engine API route:
Done via weighted policy + calibrated ensemble in adaptiveRiskEngineV2Service.
Done via tenantId-scoped policy versions with global fallback.
Done via persisted factor contributions and top factors in decision logs and response payload.
Done via EWMA-based feature drift tracking with stable/watch/alert statuses.
Done through:
- policy versioning and checksums
- input hashes
- reproducibility keys
- rollback endpoint and publish lifecycle