{
  "rulesetId": "rs-composite",
  "name": "Composite eligibility with risk sub-ruleset",
  "description": "Runs the risk-score ruleset as a sub-ruleset and combines it with a purpose check.",
  "contractVersion": "app-contract@v2",
  "strategy": "evaluate-all",
  "nodes": [
    {
      "type": "start",
      "id": "start",
      "inputs": ["trip.*", "finance.*"],
      "next": "sub-risk"
    },
    {
      "type": "subRuleset",
      "id": "sub-risk",
      "rulesetRef": "rs-risk-score@v1",
      "outputAs": "risk",
      "next": "c-risk-outcome"
    },
    {
      "type": "condition",
      "id": "c-risk-outcome",
      "expr": { "op": "!=", "left": { "field": "risk.outcome" }, "right": { "lit": "PASS" } },
      "onTrue": "o-review",
      "onFalse": "c-purpose"
    },
    {
      "type": "outcome",
      "id": "o-review",
      "outcome": "FLAG",
      "reasonCode": "RISK_REVIEW",
      "reasonText": "Risk sub-ruleset returned {risk.outcome} with score {risk.score}.",
      "severity": "warning"
    },
    {
      "type": "condition",
      "id": "c-purpose",
      "expr": {
        "op": "in",
        "left": { "field": "trip.purpose" },
        "right": { "lit": ["tourism", "family_visit"] }
      },
      "onTrue": "o-ok",
      "onFalse": "o-business"
    },
    {
      "type": "outcome",
      "id": "o-ok",
      "outcome": "PASS",
      "reasonCode": "COMPOSITE_OK",
      "reasonText": "Low risk ({risk.score}) leisure trip.",
      "severity": "info"
    },
    {
      "type": "outcome",
      "id": "o-business",
      "outcome": "PASS",
      "reasonCode": "COMPOSITE_BUSINESS",
      "reasonText": "Low risk ({risk.score}) business trip.",
      "severity": "info"
    }
  ]
}
