{
  "tool_id": "art-446-counterparty-internal-limit-check",
  "tool_version": "1.0.0",
  "display_name": "Counterparty Internal Limit Check",
  "mcp_name": "compute_counterparty_limit_check",
  "mandate_type": "compliance_mandate",
  "wave": 70,
  "gpu": false,
  "url": "https://ainumbers.co/chaingraph/art-446-counterparty-internal-limit-check.html",
  "description": "Counterparty internal credit-limit check: compares each counterparty's caller-supplied current exposure against its board-approved internal limit line (settlement, pre-settlement/PFE, or aggregate limit type), computes utilization percent and headroom, and flags each counterparty WITHIN_LIMIT, WARNING (above the caller-set soft-warning threshold, e.g. 90% of the limit), or BREACH (exposure exceeds the approved limit). This is a deterministic point-in-time check against internally governed limit lines -- distinct from the Basel/Reg-YY regulatory single-counterparty threshold check (art-425) -- and is NOT a real-time exposure monitor: no live feed, no intraday polling, no scheduled job. Not X: use art-425 for the Basel III / Regulation YY 25%/15%-of-Tier-1 regulatory large-exposures limit; use this node for internal (board- or risk-committee-approved) counterparty limit-line governance.",
  "input_schema_ref": "chaingraph/art-446-counterparty-internal-limit-check.html#manifest",
  "consumes": [],
  "feeds": [],
  "status": "live",
  "conformance_fixtures": true,
  "compute_capability": "server",
  "compute_images": [
    {
      "system": "sha256-source",
      "image_id": "sha256:235144f13ce1e5f16af5e68341a3f6eac7579044827d63769a9b062658bd21ab",
      "valid_from": "2026-07-10"
    },
    {
      "system": "risc0",
      "image_id": "sha256:a1a0bc89b5b1febaeda3519f6dbade0fa5ac16beeb143c4e1b01689573567bc6",
      "valid_from": "2026-07-23"
    }
  ],
  "compute_proof_ready": "ready",
  "export_capability": [
    "json"
  ],
  "compute_proof": {
    "type": "ZkVmReceipt",
    "system": "risc0",
    "receiptFormat": "groth16-bn254",
    "imageId": "sha256:a1a0bc89b5b1febaeda3519f6dbade0fa5ac16beeb143c4e1b01689573567bc6",
    "seal": "GXO6X72MbqGljONDGx3ocJf5tcsC+SxwEGXM2o+ZRq8tSFihSABcP8tRbOGj/7dbdRMOm/6UW1RFLUCVDYX3wy+cQXLHaHTLTdDplIl/kNWyHjwBD96jUEcHLsNOrN+fGvlX8Ky6+xrfPiFBDKIlZNsrqxdovRmx5yzgqLBBB2gCkk6XbAgyB1QsSZIEg7ke1SfY/7ipkKTLX9YJkQIO+QHARJeFRxf/YYmXI3785J8SJuSDOVNlxxKq3IZEDg1fEUqRdAX4enjenqS91zTS4R+edqVjnNtv6Z/V7D5wM9Qeumdn7EPq2r+PWjlTTMke3GQVIOle1vkt7BUq0mQI1g==",
    "journal": {
      "chaingraph_version": "0.4.0",
      "kernel_digest": "sha256:235144f13ce1e5f16af5e68341a3f6eac7579044827d63769a9b062658bd21ab",
      "output": {
        "breach_list": [],
        "counterparties": [
          {
            "approved_limit_musd": 1000,
            "counterparty_id": "cp-A",
            "counterparty_name": "Counterparty A",
            "current_exposure_musd": 400,
            "headroom_musd": 600,
            "limit_type": "settlement",
            "status": "WITHIN_LIMIT",
            "utilization_pct": 40,
            "warning_threshold_pct": 90
          },
          {
            "approved_limit_musd": 1500,
            "counterparty_id": "cp-B",
            "counterparty_name": "Counterparty B",
            "current_exposure_musd": 300,
            "headroom_musd": 1200,
            "limit_type": "aggregate",
            "status": "WITHIN_LIMIT",
            "utilization_pct": 20,
            "warning_threshold_pct": 90
          }
        ],
        "note": "Deterministic point comparison of caller-supplied current exposure against the caller-supplied approved internal limit line for a single reporting date. Not a real-time exposure monitor.",
        "regulatory_basis": "Internal (board- or risk-committee-approved) counterparty credit-limit governance -- not a regulatory threshold. Distinct from the Basel III / Regulation YY 25%/15%-of-Tier-1 large-exposures limit (see art-425).",
        "warning_list": []
      }
    }
  }
}
