{
  "description": "S5: a relational operator (gt/gte/lt/lte) whose condition carries NO value key MUST NEVER match, regardless of the context value. SDKs MUST NOT coerce a missing threshold to 0. layer_gate lists policy_omitted_gte (gte with no value) BEFORE policy_valid_gte (gte value 100); the omitted policy is always skipped, so resolution falls through to the valid policy. Verified with the reference engine (js-sdk/packages/core); Python currently coerces the missing threshold to 0.0 and is the outlier fixed in Phase 2.",
  "bundle": "bundle_conditions_omitted.json",
  "testCases": [
    {
      "name": "omitted_skipped_valid_matches",
      "comment": "threshold_score=150. policy_omitted_gte (gte, no value) never matches -> skipped. policy_valid_gte (gte 100) matches -> gate.enabled=true via valid_on. Proves the omitted-value policy did not swallow the layer.",
      "context": {
        "userId": "u-1",
        "threshold_score": 150
      },
      "expectedAssignments": {
        "gate.enabled": true
      },
      "expectedLayers": [
        {
          "layerId": "layer_gate",
          "bucket": 808,
          "policyId": "policy_valid_gte",
          "allocationName": "valid_on",
          "comment": "policy_omitted_gte skipped (no threshold value); policy_valid_gte matched"
        }
      ]
    },
    {
      "name": "omitted_skipped_none_match",
      "comment": "threshold_score=50. policy_omitted_gte (gte, no value) never matches; policy_valid_gte (gte 100) fails (50 < 100). No policy matches -> gate.enabled stays at its default. If a broken SDK coerced the missing threshold to 0, policy_omitted_gte would wrongly match (50 >= 0) and set gate.enabled=true.",
      "context": {
        "userId": "u-2",
        "threshold_score": 50
      },
      "expectedAssignments": {
        "gate.enabled": false
      },
      "expectedLayers": [
        {
          "layerId": "layer_gate",
          "bucket": 804,
          "comment": "No policy matched: omitted-value gte never matches, valid gte 100 fails at 50."
        }
      ]
    }
  ]
}
