Audit trail

Full traceability

Every number on the dashboard traces to a layer, an execution mode, and a modeling assumption — nothing is a black box. Source: Revolut (Demo Mode) · captured 2026-07-23T00:00:00.000Z

New Users · iOS · UK · Standard
activerisk 87

Data Sufficiency / Validation

{
  "eligible": true,
  "reasons": [],
  "sufficiency": {
    "users7d": {
      "current": 61000,
      "required": 500
    },
    "users28d": {
      "current": 232000,
      "required": 2000
    },
    "events7d": {
      "current": 540000,
      "required": 10000
    },
    "nonZeroDays28d": {
      "current": 28,
      "required": 20
    },
    "historyDays": {
      "current": 92,
      "required": 28
    }
  }
}

Deterministic Metrics

{
  "currentRate": 63,
  "baseline": 72.7,
  "variance": 4.5,
  "projected": {
    "d7": 60.9,
    "d14": 58.7,
    "d30": 53.8
  },
  "declineProbability": 0.96,
  "selfRecoveryProbability": 0,
  "escalationProbability": 0.68,
  "riskScore": 87,
  "impact": {
    "value": 24692,
    "unit": "conversions",
    "description": "~24,692 fewer conversions",
    "horizonDays": 30
  }
}

Forecast Array (p10/p50/p90, 30 days)

[
  {
    "day": 1,
    "p10": 59.8,
    "p50": 62.7,
    "p90": 65.6
  },
  {
    "day": 2,
    "p10": 59.5,
    "p50": 62.4,
    "p90": 65.2
  },
  {
    "day": 3,
    "p10": 59.2,
    "p50": 62.1,
    "p90": 64.9
  },
  {
    "day": 4,
    "p10": 58.9,
    "p50": 61.8,
    "p90": 64.6
  },
  {
    "day": 5,
    "p10": 58.6,
    "p50": 61.5,
    "p90": 64.4
  },
  {
    "day": 6,
    "p10": 58.2,
    "p50": 61.2,
    "p90": 64.1
  },
  {
    "day": 7,
    "p10": 57.9,
    "p50": 60.9,
    "p90": 63.8
  },
  {
    "day": 8,
    "p10": 57.6,
    "p50": 60.6,
    "p90": 63.5
  },
  {
    "day": 9,
    "p10": 57.3,
    "p50": 60.2,
    "p90": 63.2
  },
  {
    "day": 10,
    "p10": 56.9,
    "p50": 59.9,
    "p90": 62.9
  },
  {
    "day": 11,
    "p10": 56.6,
    "p50": 59.6,
    "p90": 62.7
  },
  {
    "day": 12,
    "p10": 56.3,
    "p50": 59.4,
    "p90": 62.4
  },
  {
    "day": 13,
    "p10": 55.9,
    "p50": 59.1,
    "p90": 62.2
  },
  {
    "day": 14,
    "p10": 55.6,
    "p50": 58.7,
    "p90": 61.9
  },
  {
    "day": 15,
    "p10": 55.3,
    "p50": 58.4,
    "p90": 61.5
  },
  {
    "day": 16,
    "p10": 54.9,
    "p50": 58.1,
    "p90": 61.3
  },
  {
    "day": 17,
    "p10": 54.5,
    "p50": 57.8,
    "p90": 61.1
  },
  {
    "day": 18,
    "p10": 54.2,
    "p50": 57.5,
    "p90": 60.9
  },
  {
    "day": 19,
    "p10": 53.9,
    "p50": 57.2,
    "p90": 60.6
  },
  {
    "day": 20,
    "p10": 53.5,
    "p50": 56.9,
    "p90": 60.3
  },
  {
    "day": 21,
    "p10": 53.1,
    "p50": 56.6,
    "p90": 60.1
  },
  {
    "day": 22,
    "p10": 52.7,
    "p50": 56.3,
    "p90": 59.8
  },
  {
    "day": 23,
    "p10": 52.4,
    "p50": 56,
    "p90": 59.6
  },
  {
    "day": 24,
    "p10": 52.1,
    "p50": 55.7,
    "p90": 59.3
  },
  {
    "day": 25,
    "p10": 51.7,
    "p50": 55.4,
    "p90": 59.1
  },
  {
    "day": 26,
    "p10": 51.4,
    "p50": 55.1,
    "p90": 58.9
  },
  {
    "day": 27,
    "p10": 50.9,
    "p50": 54.8,
    "p90": 58.6
  },
  {
    "day": 28,
    "p10": 50.6,
    "p50": 54.5,
    "p90": 58.3
  },
  {
    "day": 29,
    "p10": 50.3,
    "p50": 54.1,
    "p90": 58.1
  },
  {
    "day": 30,
    "p10": 49.8,
    "p50": 53.8,
    "p90": 57.8
  }
]

Layer Trace

{
  "l1": {
    "summary": "Reachability simulated against current system configuration.",
    "constraints": [
      {
        "description": "New iOS onboarding adds an extra confirmation step before first card provisioning",
        "value": "+1 step"
      },
      {
        "description": "Share of KYC-passed users who never fund the account in first session",
        "value": "27%"
      }
    ]
  },
  "l2": {
    "method": "OLS trend over last 21d, prediction interval from SE(β) × 1.34 misspecification allowance, 20,000-path Monte Carlo → p10/p50/p90",
    "cohort": "Standard × New Users × iOS × UK"
  }
}
New Users · Android · EEA · Standard
activerisk 89

Data Sufficiency / Validation

{
  "eligible": true,
  "reasons": [],
  "sufficiency": {
    "users7d": {
      "current": 84000,
      "required": 500
    },
    "users28d": {
      "current": 318000,
      "required": 2000
    },
    "events7d": {
      "current": 690000,
      "required": 10000
    },
    "nonZeroDays28d": {
      "current": 28,
      "required": 20
    },
    "historyDays": {
      "current": 92,
      "required": 28
    }
  }
}

Deterministic Metrics

{
  "currentRate": 55,
  "baseline": 63.3,
  "variance": 4,
  "projected": {
    "d7": 52.8,
    "d14": 50.7,
    "d30": 45.7
  },
  "declineProbability": 0.9,
  "selfRecoveryProbability": 0.01,
  "escalationProbability": 0.68,
  "riskScore": 89,
  "impact": {
    "value": 17268,
    "unit": "conversions",
    "description": "~17,268 fewer conversions",
    "horizonDays": 30
  }
}

Forecast Array (p10/p50/p90, 30 days)

[
  {
    "day": 1,
    "p10": 50.9,
    "p50": 54.7,
    "p90": 58.5
  },
  {
    "day": 2,
    "p10": 50.5,
    "p50": 54.4,
    "p90": 58.2
  },
  {
    "day": 3,
    "p10": 50.3,
    "p50": 54.1,
    "p90": 57.9
  },
  {
    "day": 4,
    "p10": 49.9,
    "p50": 53.7,
    "p90": 57.6
  },
  {
    "day": 5,
    "p10": 49.6,
    "p50": 53.4,
    "p90": 57.3
  },
  {
    "day": 6,
    "p10": 49.3,
    "p50": 53.2,
    "p90": 57
  },
  {
    "day": 7,
    "p10": 49,
    "p50": 52.8,
    "p90": 56.8
  },
  {
    "day": 8,
    "p10": 48.6,
    "p50": 52.5,
    "p90": 56.5
  },
  {
    "day": 9,
    "p10": 48.2,
    "p50": 52.2,
    "p90": 56.2
  },
  {
    "day": 10,
    "p10": 47.9,
    "p50": 51.9,
    "p90": 56
  },
  {
    "day": 11,
    "p10": 47.6,
    "p50": 51.6,
    "p90": 55.7
  },
  {
    "day": 12,
    "p10": 47.2,
    "p50": 51.3,
    "p90": 55.3
  },
  {
    "day": 13,
    "p10": 46.9,
    "p50": 51,
    "p90": 55.1
  },
  {
    "day": 14,
    "p10": 46.4,
    "p50": 50.7,
    "p90": 54.9
  },
  {
    "day": 15,
    "p10": 46.1,
    "p50": 50.4,
    "p90": 54.6
  },
  {
    "day": 16,
    "p10": 45.8,
    "p50": 50.1,
    "p90": 54.4
  },
  {
    "day": 17,
    "p10": 45.4,
    "p50": 49.7,
    "p90": 54.1
  },
  {
    "day": 18,
    "p10": 45,
    "p50": 49.4,
    "p90": 53.9
  },
  {
    "day": 19,
    "p10": 44.5,
    "p50": 49.1,
    "p90": 53.6
  },
  {
    "day": 20,
    "p10": 44.3,
    "p50": 48.8,
    "p90": 53.3
  },
  {
    "day": 21,
    "p10": 43.8,
    "p50": 48.5,
    "p90": 53.1
  },
  {
    "day": 22,
    "p10": 43.5,
    "p50": 48.2,
    "p90": 52.9
  },
  {
    "day": 23,
    "p10": 43,
    "p50": 47.9,
    "p90": 52.6
  },
  {
    "day": 24,
    "p10": 42.7,
    "p50": 47.6,
    "p90": 52.4
  },
  {
    "day": 25,
    "p10": 42.3,
    "p50": 47.3,
    "p90": 52.2
  },
  {
    "day": 26,
    "p10": 41.9,
    "p50": 46.9,
    "p90": 52
  },
  {
    "day": 27,
    "p10": 41.5,
    "p50": 46.6,
    "p90": 51.7
  },
  {
    "day": 28,
    "p10": 41.2,
    "p50": 46.3,
    "p90": 51.6
  },
  {
    "day": 29,
    "p10": 40.8,
    "p50": 46.1,
    "p90": 51.3
  },
  {
    "day": 30,
    "p10": 40.3,
    "p50": 45.7,
    "p90": 51.1
  }
]

Layer Trace

{
  "l1": {
    "summary": "Reachability simulated against current system configuration.",
    "constraints": [
      {
        "description": "Android 14+ notification delivery reduced, weakening the first-transaction nudge",
        "value": "-22% delivery"
      }
    ]
  },
  "l2": {
    "method": "OLS trend over last 21d, prediction interval from SE(β) × 1.34 misspecification allowance, 20,000-path Monte Carlo → p10/p50/p90",
    "cohort": "Standard × New Users × Android × EEA"
  }
}
Activated · iOS · US · Metal · Investors
activerisk 72

Data Sufficiency / Validation

{
  "eligible": true,
  "reasons": [],
  "sufficiency": {
    "users7d": {
      "current": 9200,
      "required": 500
    },
    "users28d": {
      "current": 34000,
      "required": 2000
    },
    "events7d": {
      "current": 61000,
      "required": 10000
    },
    "nonZeroDays28d": {
      "current": 27,
      "required": 20
    },
    "historyDays": {
      "current": 92,
      "required": 28
    }
  }
}

Deterministic Metrics

{
  "currentRate": 12,
  "baseline": 14.3,
  "variance": 1.3,
  "projected": {
    "d7": 11.6,
    "d14": 11.3,
    "d30": 10.4
  },
  "declineProbability": 0.72,
  "selfRecoveryProbability": 0.17,
  "escalationProbability": 0.55,
  "riskScore": 72,
  "impact": {
    "value": 322,
    "unit": "conversions",
    "description": "~322 fewer conversions",
    "horizonDays": 30
  }
}

Forecast Array (p10/p50/p90, 30 days)

[
  {
    "day": 1,
    "p10": 10.4,
    "p50": 12,
    "p90": 13.5
  },
  {
    "day": 2,
    "p10": 10.4,
    "p50": 11.9,
    "p90": 13.4
  },
  {
    "day": 3,
    "p10": 10.3,
    "p50": 11.8,
    "p90": 13.4
  },
  {
    "day": 4,
    "p10": 10.2,
    "p50": 11.8,
    "p90": 13.3
  },
  {
    "day": 5,
    "p10": 10.2,
    "p50": 11.7,
    "p90": 13.2
  },
  {
    "day": 6,
    "p10": 10.1,
    "p50": 11.7,
    "p90": 13.2
  },
  {
    "day": 7,
    "p10": 10,
    "p50": 11.6,
    "p90": 13.2
  },
  {
    "day": 8,
    "p10": 10,
    "p50": 11.6,
    "p90": 13.2
  },
  {
    "day": 9,
    "p10": 9.9,
    "p50": 11.5,
    "p90": 13.1
  },
  {
    "day": 10,
    "p10": 9.9,
    "p50": 11.5,
    "p90": 13.1
  },
  {
    "day": 11,
    "p10": 9.8,
    "p50": 11.4,
    "p90": 13.1
  },
  {
    "day": 12,
    "p10": 9.7,
    "p50": 11.4,
    "p90": 13
  },
  {
    "day": 13,
    "p10": 9.7,
    "p50": 11.3,
    "p90": 13
  },
  {
    "day": 14,
    "p10": 9.6,
    "p50": 11.3,
    "p90": 12.9
  },
  {
    "day": 15,
    "p10": 9.5,
    "p50": 11.2,
    "p90": 12.9
  },
  {
    "day": 16,
    "p10": 9.4,
    "p50": 11.2,
    "p90": 12.9
  },
  {
    "day": 17,
    "p10": 9.4,
    "p50": 11.1,
    "p90": 12.9
  },
  {
    "day": 18,
    "p10": 9.3,
    "p50": 11,
    "p90": 12.8
  },
  {
    "day": 19,
    "p10": 9.2,
    "p50": 11,
    "p90": 12.8
  },
  {
    "day": 20,
    "p10": 9.1,
    "p50": 11,
    "p90": 12.8
  },
  {
    "day": 21,
    "p10": 9,
    "p50": 10.9,
    "p90": 12.7
  },
  {
    "day": 22,
    "p10": 9,
    "p50": 10.8,
    "p90": 12.7
  },
  {
    "day": 23,
    "p10": 8.9,
    "p50": 10.8,
    "p90": 12.7
  },
  {
    "day": 24,
    "p10": 8.8,
    "p50": 10.7,
    "p90": 12.7
  },
  {
    "day": 25,
    "p10": 8.7,
    "p50": 10.7,
    "p90": 12.7
  },
  {
    "day": 26,
    "p10": 8.6,
    "p50": 10.6,
    "p90": 12.7
  },
  {
    "day": 27,
    "p10": 8.5,
    "p50": 10.6,
    "p90": 12.6
  },
  {
    "day": 28,
    "p10": 8.5,
    "p50": 10.5,
    "p90": 12.6
  },
  {
    "day": 29,
    "p10": 8.3,
    "p50": 10.5,
    "p90": 12.6
  },
  {
    "day": 30,
    "p10": 8.3,
    "p50": 10.4,
    "p90": 12.6
  }
]

Layer Trace

{
  "l1": {
    "summary": "No blocking reachability constraints detected.",
    "constraints": []
  },
  "l2": {
    "method": "OLS trend over last 21d, prediction interval from SE(β) × 1.34 misspecification allowance, 20,000-path Monte Carlo → p10/p50/p90",
    "cohort": "Metal · Investor × Activated × iOS × US"
  }
}
Activated · iOS · UK · Premium
activerisk 21

Data Sufficiency / Validation

{
  "eligible": true,
  "reasons": [],
  "sufficiency": {
    "users7d": {
      "current": 14000,
      "required": 500
    },
    "users28d": {
      "current": 52000,
      "required": 2000
    },
    "events7d": {
      "current": 96000,
      "required": 10000
    },
    "nonZeroDays28d": {
      "current": 28,
      "required": 20
    },
    "historyDays": {
      "current": 92,
      "required": 28
    }
  }
}

Deterministic Metrics

{
  "currentRate": 19,
  "baseline": 18.3,
  "variance": 0.7,
  "projected": {
    "d7": 19.1,
    "d14": 19.3,
    "d30": 19.6
  },
  "declineProbability": 0.38,
  "selfRecoveryProbability": 0.7,
  "escalationProbability": 0.1,
  "riskScore": 21,
  "impact": {
    "value": 0,
    "unit": "conversions",
    "description": "~0 fewer conversions",
    "horizonDays": 30
  }
}

Forecast Array (p10/p50/p90, 30 days)

[
  {
    "day": 1,
    "p10": 17.9,
    "p50": 19,
    "p90": 20.1
  },
  {
    "day": 2,
    "p10": 17.9,
    "p50": 19,
    "p90": 20.2
  },
  {
    "day": 3,
    "p10": 18,
    "p50": 19.1,
    "p90": 20.2
  },
  {
    "day": 4,
    "p10": 18,
    "p50": 19.1,
    "p90": 20.2
  },
  {
    "day": 5,
    "p10": 18,
    "p50": 19.1,
    "p90": 20.2
  },
  {
    "day": 6,
    "p10": 18,
    "p50": 19.1,
    "p90": 20.3
  },
  {
    "day": 7,
    "p10": 18,
    "p50": 19.1,
    "p90": 20.3
  },
  {
    "day": 8,
    "p10": 18,
    "p50": 19.2,
    "p90": 20.3
  },
  {
    "day": 9,
    "p10": 18,
    "p50": 19.2,
    "p90": 20.3
  },
  {
    "day": 10,
    "p10": 18,
    "p50": 19.2,
    "p90": 20.4
  },
  {
    "day": 11,
    "p10": 18,
    "p50": 19.2,
    "p90": 20.4
  },
  {
    "day": 12,
    "p10": 18,
    "p50": 19.2,
    "p90": 20.4
  },
  {
    "day": 13,
    "p10": 18,
    "p50": 19.3,
    "p90": 20.5
  },
  {
    "day": 14,
    "p10": 18.1,
    "p50": 19.3,
    "p90": 20.5
  },
  {
    "day": 15,
    "p10": 18.1,
    "p50": 19.3,
    "p90": 20.6
  },
  {
    "day": 16,
    "p10": 18.1,
    "p50": 19.3,
    "p90": 20.6
  },
  {
    "day": 17,
    "p10": 18.1,
    "p50": 19.3,
    "p90": 20.6
  },
  {
    "day": 18,
    "p10": 18.1,
    "p50": 19.4,
    "p90": 20.6
  },
  {
    "day": 19,
    "p10": 18.1,
    "p50": 19.4,
    "p90": 20.7
  },
  {
    "day": 20,
    "p10": 18.1,
    "p50": 19.4,
    "p90": 20.7
  },
  {
    "day": 21,
    "p10": 18.1,
    "p50": 19.4,
    "p90": 20.8
  },
  {
    "day": 22,
    "p10": 18.1,
    "p50": 19.5,
    "p90": 20.8
  },
  {
    "day": 23,
    "p10": 18.1,
    "p50": 19.5,
    "p90": 20.9
  },
  {
    "day": 24,
    "p10": 18.1,
    "p50": 19.5,
    "p90": 20.9
  },
  {
    "day": 25,
    "p10": 18.1,
    "p50": 19.5,
    "p90": 21
  },
  {
    "day": 26,
    "p10": 18.1,
    "p50": 19.5,
    "p90": 21
  },
  {
    "day": 27,
    "p10": 18.1,
    "p50": 19.6,
    "p90": 21
  },
  {
    "day": 28,
    "p10": 18.1,
    "p50": 19.6,
    "p90": 21.1
  },
  {
    "day": 29,
    "p10": 18,
    "p50": 19.6,
    "p90": 21.1
  },
  {
    "day": 30,
    "p10": 18.1,
    "p50": 19.6,
    "p90": 21.2
  }
]

Layer Trace

{
  "l1": {
    "summary": "No blocking reachability constraints detected.",
    "constraints": []
  },
  "l2": {
    "method": "OLS trend over last 21d, prediction interval from SE(β) × 1.34 misspecification allowance, 20,000-path Monte Carlo → p10/p50/p90",
    "cohort": "Premium × Activated × iOS × UK"
  }
}
New Users · Android · India · Prepaid/UPI
monitoring

Data Sufficiency / Validation

{
  "eligible": false,
  "reasons": [
    "320 users in 7d (need 500+).",
    "1500 users in 28d (need 2000+).",
    "7200 events in 7d (need 10000+).",
    "17 active days in 28d (need 20+)."
  ],
  "sufficiency": {
    "users7d": {
      "current": 320,
      "required": 500
    },
    "users28d": {
      "current": 1500,
      "required": 2000
    },
    "events7d": {
      "current": 7200,
      "required": 10000
    },
    "nonZeroDays28d": {
      "current": 17,
      "required": 20
    },
    "historyDays": {
      "current": 24,
      "required": 28
    }
  }
}

Deterministic Metrics

{
  "currentRate": 40,
  "baseline": 40.4,
  "variance": 1.1,
  "projected": {
    "d7": null,
    "d14": null,
    "d30": null
  },
  "declineProbability": 0,
  "selfRecoveryProbability": 0,
  "escalationProbability": 0,
  "riskScore": 0,
  "impact": {
    "value": 0,
    "unit": "conversions",
    "description": "INSUFFICIENT SIGNAL",
    "horizonDays": 30
  }
}

Layer Trace

{
  "l1": {
    "summary": "No blocking reachability constraints detected.",
    "constraints": []
  },
  "l2": {
    "method": "Suppressed — INSUFFICIENT SIGNAL",
    "cohort": "Prepaid/UPI × New Users × Android × India"
  }
}
New Users · iOS · Mexico · Standard
insufficient

Data Sufficiency / Validation

{
  "eligible": false,
  "reasons": [
    "Only 7 days of history (need 14+).",
    "6400 events in 7d (need 10000+).",
    "6 active days in 28d (need 20+)."
  ],
  "sufficiency": {
    "users7d": {
      "current": 2100,
      "required": 500
    },
    "users28d": {
      "current": 4200,
      "required": 2000
    },
    "events7d": {
      "current": 6400,
      "required": 10000
    },
    "nonZeroDays28d": {
      "current": 6,
      "required": 20
    },
    "historyDays": {
      "current": 7,
      "required": 28
    }
  }
}

Deterministic Metrics

{
  "currentRate": 43,
  "baseline": 43.2,
  "variance": 0.5,
  "projected": {
    "d7": null,
    "d14": null,
    "d30": null
  },
  "declineProbability": 0,
  "selfRecoveryProbability": 0,
  "escalationProbability": 0,
  "riskScore": 0,
  "impact": {
    "value": 0,
    "unit": "conversions",
    "description": "INSUFFICIENT SIGNAL",
    "horizonDays": 30
  }
}

Layer Trace

{
  "l1": {
    "summary": "No blocking reachability constraints detected.",
    "constraints": []
  },
  "l2": {
    "method": "Suppressed — INSUFFICIENT SIGNAL",
    "cohort": "Standard × New Users × iOS × Mexico"
  }
}
NarrativeEngine Contract (Layer 3)

Flow: Deterministic → LLM → UI. The LLM never computes a number; it only interprets the metrics above. On-demand only.

System Prompt (verbatim)

You are a behavioral simulation analyst. You explain what will likely happen NEXT if nothing changes. You do not compute metrics. You do not claim causation. You always express uncertainty. If signal is weak, say "INSUFFICIENT SIGNAL". Output JSON only.
Shadow — know what happens next, before it happens