{
  "version": 1,
  "about": "The machine-checkable contract behind every page in Noble's enforcement series. Each page carries one or more blocks; every block lists requests printed on that page, byte for byte, with the assertions the page makes about their responses. A block is one bracket of list state: the runner voids a block whose responses cite different list versions, so a page whose requests include an as_of screen or a list-restricted screen carries those in their own block. The format is the acceptance block Royal Bank (customer zero, nepdave/bank) attaches to every issue it files against Noble and runs with its acceptance-check tool; Royal Bank runs this manifest against production nightly and files an issue when any page's claim stops being true. A test in nepdave/noble (cmd/server/enforcement_test.go) fails if a page's requests and this manifest drift apart.",
  "index": "https://noblesight.io/enforcement/",
  "pages": [
    {
      "path": "/enforcement/bank-of-america-2026",
      "title": "Bank of America, N.A. — four screening failures, four requests you can run",
      "release": "https://ofac.treasury.gov/media/937231/download?inline=",
      "issue": "nepdave/noble#509",
      "blocks": [
        {
          "acceptance": 1,
          "base": "https://api.noblesight.io",
          "auth": {
            "header": "X-API-Key",
            "env": "NOBLE_API_KEY"
          },
          "headers": {
            "Content-Type": "application/json"
          },
          "steps": [
            {
              "name": "failure 1 — list_versions on every screening",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Alisher Usmanov"
              },
              "assert": [
                {
                  "path": ".list_versions",
                  "fn": "len",
                  "op": ">=",
                  "value": 9
                },
                {
                  "path": ".list_versions[].publish_date",
                  "op": "exists"
                },
                {
                  "path": ".engine_version",
                  "op": "exists"
                }
              ],
              "show": [
                ".engine_version",
                ".list_versions[list=ofac].publish_date"
              ]
            },
            {
              "name": "failure 2 — an exact name and DOB scores 100 and alerts, no priority tier",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Ramzan Kadyrov",
                "date_of_birth": "1976-10-05"
              },
              "assert": [
                {
                  "path": ".matches[@max:score].score",
                  "op": "==",
                  "value": 100
                },
                {
                  "path": ".matches[@max:score].uid",
                  "op": "==",
                  "value": "23343"
                },
                {
                  "path": ".summary.verdict",
                  "op": "==",
                  "value": "confirmed_match"
                },
                {
                  "path": ".alert_id",
                  "op": "exists"
                }
              ],
              "show": [
                ".alert_id",
                ".summary.top_match.date_of_birth"
              ]
            },
            {
              "name": "failure 3 — a threshold match opens an alert; nothing suppresses it",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Kasem Soleimani"
              },
              "assert": [
                {
                  "path": ".alert_id",
                  "op": "exists"
                },
                {
                  "path": ".summary.verdict",
                  "op": "==",
                  "value": "confirmed_match"
                },
                {
                  "path": ".summary.top_match.uid",
                  "op": "==",
                  "value": "10481"
                }
              ],
              "show": [
                ".alert_id"
              ]
            }
          ]
        },
        {
          "acceptance": 1,
          "base": "https://api.noblesight.io",
          "auth": {
            "header": "X-API-Key",
            "env": "NOBLE_API_KEY"
          },
          "headers": {
            "Content-Type": "application/json"
          },
          "steps": [
            {
              "name": "failure 4 — as_of pins list_versions to the requested date",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Alisher Usmanov",
                "as_of": "2026-10-01"
              },
              "poll": {
                "until": {
                  "path": ".screened_as_of",
                  "op": "exists"
                },
                "every_ms": 5000,
                "timeout_ms": 90000
              },
              "assert": [
                {
                  "path": ".screened_as_of",
                  "op": "exists"
                },
                {
                  "path": ".list_versions[list=ofac].publish_date",
                  "op": "==",
                  "value": "2026-10-01"
                },
                {
                  "path": ".alert_id",
                  "op": "absent"
                }
              ],
              "show": [
                ".screened_as_of",
                ".list_versions[list=ofac].publish_id"
              ]
            }
          ],
          "notes": "A cold as_of cut can answer 503 coverage_unavailable while the historical index builds (nepdave/noble#423); the poll retries until screened_as_of is present."
        }
      ]
    },
    {
      "path": "/enforcement/pegasus-worldwide-logistics-2026",
      "title": "Pegasus Worldwide Logistics — the name changed, the phone number didn't",
      "release": "https://ofac.treasury.gov/media/937206/download?inline=",
      "issue": "nepdave/noble#513",
      "blocks": [
        {
          "acceptance": 1,
          "base": "https://api.noblesight.io",
          "auth": {
            "header": "X-API-Key",
            "env": "NOBLE_API_KEY"
          },
          "headers": {
            "Content-Type": "application/json"
          },
          "steps": [
            {
              "name": "step 1 — the renamed entity alone is no significant match, honestly",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Huizhou Youli Fushi Co., Ltd",
                "lists": [
                  "ofac"
                ]
              },
              "assert": [
                {
                  "path": ".summary.verdict",
                  "op": "==",
                  "value": "no_significant_match"
                },
                {
                  "path": ".alert_id",
                  "op": "absent"
                }
              ],
              "show": [
                ".summary.top_match.score"
              ]
            },
            {
              "name": "step 2 — the phone number on the shipping document hits the designation",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "ids": [
                  {
                    "number": "8615815351839"
                  }
                ],
                "lists": [
                  "ofac"
                ]
              },
              "assert": [
                {
                  "path": ".summary.verdict",
                  "op": "==",
                  "value": "confirmed_match"
                },
                {
                  "path": ".matches",
                  "fn": "len",
                  "op": "==",
                  "value": 4
                },
                {
                  "path": ".matches[].score",
                  "op": "==",
                  "value": 100
                },
                {
                  "path": ".matches[].matched_via[].number",
                  "op": "==",
                  "value": "8615815351839"
                }
              ],
              "show": [
                ".matches[].uid"
              ]
            },
            {
              "name": "step 3 — the email address Pegasus wrote to hits the entity",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "ids": [
                  {
                    "number": "yk@yolimachine.com"
                  }
                ],
                "lists": [
                  "ofac"
                ]
              },
              "assert": [
                {
                  "path": ".matches[@max:score].uid",
                  "op": "==",
                  "value": "41376"
                },
                {
                  "path": ".matches[@max:score].score",
                  "op": "==",
                  "value": 100
                },
                {
                  "path": ".matches[].matched_via[].number",
                  "op": "==",
                  "value": "yk@yolimachine.com"
                }
              ],
              "show": [
                ".matches[@max:score].uid"
              ]
            },
            {
              "name": "step 4 — the whole document in one request is a confirmed match with an alert",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Huizhou Youli Fushi Co., Ltd",
                "ids": [
                  {
                    "number": "8615815351839"
                  },
                  {
                    "number": "yk@yolimachine.com"
                  }
                ],
                "lists": [
                  "ofac"
                ]
              },
              "assert": [
                {
                  "path": ".summary.verdict",
                  "op": "==",
                  "value": "confirmed_match"
                },
                {
                  "path": ".alert_id",
                  "op": "exists"
                },
                {
                  "path": ".matches[@max:score].score",
                  "op": "==",
                  "value": 100
                }
              ],
              "show": [
                ".alert_id"
              ]
            }
          ]
        }
      ]
    },
    {
      "path": "/enforcement/interactive-brokers-2025",
      "title": "Interactive Brokers — the system flagged it, a person closed it",
      "release": "https://ofac.treasury.gov/media/934501/download?inline=",
      "issue": "nepdave/noble#516",
      "blocks": [
        {
          "acceptance": 1,
          "base": "https://api.noblesight.io",
          "auth": {
            "header": "X-API-Key",
            "env": "NOBLE_API_KEY"
          },
          "headers": {
            "Content-Type": "application/json"
          },
          "steps": [
            {
              "name": "step 1a — a Venezuela program designation alerts at 100",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Alex Saab",
                "lists": [
                  "ofac"
                ]
              },
              "assert": [
                {
                  "path": ".alert_id",
                  "op": "exists"
                },
                {
                  "path": ".alert_reason",
                  "op": "==",
                  "value": "score_threshold"
                },
                {
                  "path": ".summary.top_match.uid",
                  "op": "==",
                  "value": "26995"
                },
                {
                  "path": ".matches[@max:score].score",
                  "op": "==",
                  "value": 100
                }
              ],
              "show": [
                ".alert_id"
              ]
            },
            {
              "name": "step 1b — a Syria program designation alerts at 100 under the press spelling",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Rami Makhlouf",
                "lists": [
                  "ofac"
                ]
              },
              "assert": [
                {
                  "path": ".alert_id",
                  "op": "exists"
                },
                {
                  "path": ".summary.top_match.uid",
                  "op": "==",
                  "value": "10725"
                },
                {
                  "path": ".matches[@max:score].score",
                  "op": "==",
                  "value": 100
                }
              ],
              "show": [
                ".alert_id"
              ]
            }
          ],
          "notes": "The closure sequence on this page (escalate, same-actor resolve refused, second analyst closes) needs an alert the caller owns and two registered team members, so it is not in this block; the alert's four_eyes_required and due_at are covered by GET /v1/alerts/{id} in the issue's acceptance."
        }
      ]
    },
    {
      "path": "/enforcement/crypto-crimea-2023",
      "title": "CoinList, Poloniex and Uphold — the country field said Russia, the address said Simferopol",
      "release": "https://ofac.treasury.gov/media/932406/download?inline=",
      "issue": "nepdave/noble#520",
      "blocks": [
        {
          "acceptance": 1,
          "base": "https://api.noblesight.io",
          "auth": {
            "header": "X-API-Key",
            "env": "NOBLE_API_KEY"
          },
          "headers": {
            "Content-Type": "application/json"
          },
          "steps": [
            {
              "name": "coinlist — country RU, Simferopol in the address, raises Crimea from the address",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Ivan Petrov",
                "country": "RU",
                "address": "ul. Lenina 12, Simferopol, Crimea"
              },
              "assert": [
                {
                  "path": ".jurisdiction_risk.jurisdiction",
                  "op": "==",
                  "value": "UA-43"
                },
                {
                  "path": ".jurisdiction_nexus.source",
                  "op": "==",
                  "value": "address"
                },
                {
                  "path": ".jurisdiction_nexus.evaluated",
                  "op": "==",
                  "value": "Simferopol"
                },
                {
                  "path": ".jurisdiction_nexus.status",
                  "op": "==",
                  "value": "embargoed"
                }
              ],
              "show": [
                ".jurisdiction_nexus"
              ]
            },
            {
              "name": "coinlist — a Crimean city in location.city, country Ukraine",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Ivan Petrov",
                "location": {
                  "country": "UA",
                  "city": "Yalta"
                }
              },
              "assert": [
                {
                  "path": ".jurisdiction_risk.jurisdiction",
                  "op": "==",
                  "value": "UA-43"
                },
                {
                  "path": ".jurisdiction_nexus.source",
                  "op": "==",
                  "value": "location.city"
                },
                {
                  "path": ".jurisdiction_nexus.evaluated",
                  "op": "==",
                  "value": "Yalta"
                }
              ],
              "show": [
                ".jurisdiction_nexus"
              ]
            },
            {
              "name": "coinlist — the same thing in Cyrillic raises Sevastopol",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Ivan Petrov",
                "country": "RU",
                "address": "г. Севастополь, ул. Ленина 12"
              },
              "assert": [
                {
                  "path": ".jurisdiction_risk.jurisdiction",
                  "op": "==",
                  "value": "UA-40"
                },
                {
                  "path": ".jurisdiction_nexus.source",
                  "op": "==",
                  "value": "address"
                },
                {
                  "path": ".jurisdiction_nexus.evaluated",
                  "op": "==",
                  "value": "Севастополь"
                }
              ],
              "show": [
                ".jurisdiction_nexus"
              ]
            },
            {
              "name": "poloniex — a Moscow street named after Crimea must stay silent",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Ivan Petrov",
                "country": "RU",
                "address": "Krymskaya ulitsa 4, Moscow"
              },
              "assert": [
                {
                  "path": ".jurisdiction_risk",
                  "op": "absent"
                },
                {
                  "path": ".jurisdiction_nexus.evaluated",
                  "op": "==",
                  "value": "RU"
                },
                {
                  "path": ".jurisdiction_nexus.status",
                  "op": "==",
                  "value": "no_determination"
                }
              ],
              "show": [
                ".jurisdiction_nexus"
              ]
            },
            {
              "name": "uphold — a listed wallet address alone is a confirmed match with an alert",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "ids": [
                  {
                    "number": "3Lpoy53K625zVeE47ZasiG5jGkAxJ27kh1"
                  }
                ]
              },
              "assert": [
                {
                  "path": ".matches[@max:score].uid",
                  "op": "==",
                  "value": "36025"
                },
                {
                  "path": ".matches[@max:score].score",
                  "op": "==",
                  "value": 100
                },
                {
                  "path": ".matches[].matched_via[].number",
                  "op": "==",
                  "value": "3Lpoy53K625zVeE47ZasiG5jGkAxJ27kh1"
                },
                {
                  "path": ".alert_id",
                  "op": "exists"
                }
              ],
              "show": [
                ".alert_id"
              ]
            }
          ]
        }
      ]
    },
    {
      "path": "/enforcement/coverage",
      "title": "Which enforcement release does your integration resemble? — the coverage report",
      "release": "https://noblesight.io/enforcement/",
      "issue": "nepdave/noble#529",
      "blocks": [
        {
          "acceptance": 1,
          "base": "https://api.noblesight.io",
          "auth": {
            "header": "X-API-Key",
            "env": "NOBLE_API_KEY"
          },
          "headers": {
            "Content-Type": "application/json"
          },
          "setup": [
            {
              "name": "step 1 — read the report and remember three counts",
              "method": "GET",
              "path": "/v1/account/coverage",
              "capture": {
                "dob": ".inputs.date_of_birth.count",
                "ids": ".inputs.identifiers.count",
                "address": ".inputs.address.count"
              },
              "assert": [
                {
                  "path": ".screenings",
                  "op": ">=",
                  "value": 0
                },
                {
                  "path": ".window.from",
                  "op": "exists"
                }
              ],
              "show": [
                ".window",
                ".screenings"
              ]
            }
          ],
          "steps": [
            {
              "name": "step 3a — a screening with a date of birth adds to date_of_birth",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Zzyxx Coverage Probe",
                "date_of_birth": "1970-01-01"
              },
              "assert": [
                {
                  "path": ".request_id",
                  "op": "exists"
                },
                {
                  "path": ".summary.verdict",
                  "op": "exists"
                }
              ],
              "show": [
                ".request_id",
                ".summary.verdict"
              ]
            },
            {
              "name": "step 3b — a screening with an identifier adds to identifiers",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Zzyxx Coverage Probe",
                "ids": [
                  {
                    "number": "+1 415 555 0100"
                  }
                ]
              },
              "assert": [
                {
                  "path": ".request_id",
                  "op": "exists"
                },
                {
                  "path": ".summary.verdict",
                  "op": "exists"
                }
              ],
              "show": [
                ".request_id",
                ".summary.verdict"
              ]
            },
            {
              "name": "step 3c — a screening with a country and a free-text address adds to address",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Zzyxx Coverage Probe",
                "country": "GB",
                "address": "10 Downing Street, London SW1A 2AA"
              },
              "assert": [
                {
                  "path": ".request_id",
                  "op": "exists"
                },
                {
                  "path": ".summary.verdict",
                  "op": "exists"
                },
                {
                  "path": ".jurisdiction_nexus.source",
                  "op": "==",
                  "value": "country"
                },
                {
                  "path": ".jurisdiction_nexus.status",
                  "op": "==",
                  "value": "no_determination"
                }
              ],
              "show": [
                ".request_id",
                ".summary.verdict"
              ]
            },
            {
              "name": "step 3d — read again: each count rose and the report has its seven controls",
              "method": "GET",
              "path": "/v1/account/coverage",
              "assert": [
                {
                  "path": ".inputs.date_of_birth.count",
                  "op": ">",
                  "value": "{dob}"
                },
                {
                  "path": ".inputs.identifiers.count",
                  "op": ">",
                  "value": "{ids}"
                },
                {
                  "path": ".inputs.address.count",
                  "op": ">",
                  "value": "{address}"
                },
                {
                  "path": ".screenings",
                  "op": ">",
                  "value": 0
                },
                {
                  "path": ".controls",
                  "fn": "len",
                  "op": "==",
                  "value": 7
                },
                {
                  "path": ".controls[].status",
                  "op": "in",
                  "value": [
                    "active",
                    "partial",
                    "inactive",
                    "not_applicable"
                  ]
                },
                {
                  "path": ".controls[].page",
                  "op": "exists"
                },
                {
                  "path": ".controls[].guidance",
                  "op": "exists"
                },
                {
                  "path": ".controls[id=list_versions].status",
                  "op": "==",
                  "value": "active"
                },
                {
                  "path": ".controls[id=no_suppression].status",
                  "op": "==",
                  "value": "active"
                },
                {
                  "path": ".controls[id=exact_name_dob].requires",
                  "op": "contains",
                  "value": "date_of_birth"
                },
                {
                  "path": ".controls[id=identifiers].requires",
                  "op": "contains",
                  "value": "ids"
                },
                {
                  "path": ".controls[id=geography].requires",
                  "op": "contains",
                  "value": "address"
                },
                {
                  "path": ".alerts.closed",
                  "op": ">=",
                  "value": 0
                },
                {
                  "path": ".meta.disclaimer",
                  "op": "exists"
                }
              ],
              "show": [
                ".inputs.date_of_birth.count",
                ".inputs.identifiers.count",
                ".inputs.address.count",
                ".controls[].id",
                ".controls[].status"
              ]
            }
          ],
          "notes": "The page's windowed GET (from/to for one quarter) and the over-long window that is refused with invalid_parameter are shown on the page but not probed here: the first is the same request with a filter, the second is an error path the issue's acceptance covers. The counts are compared with > rather than +1 because other blocks in this manifest screen with a date_of_birth in the same run."
        }
      ]
    },
    {
      "path": "/enforcement/payoneer-2021",
      "title": "Payoneer — OFAC listed the filter's defects, one request each",
      "release": "https://ofac.treasury.gov/media/911571/download?inline=",
      "issue": "nepdave/noble#534",
      "blocks": [
        {
          "acceptance": 1,
          "base": "https://api.noblesight.io",
          "auth": {
            "header": "X-API-Key",
            "env": "NOBLE_API_KEY"
          },
          "headers": {
            "Content-Type": "application/json"
          },
          "steps": [
            {
              "name": "defect ii — the BIC alone matches the designated bank",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "ids": [
                  {
                    "type": "SWIFT/BIC",
                    "number": "VTBRRUMM"
                  }
                ]
              },
              "assert": [
                {
                  "path": ".summary.top_match.uid",
                  "op": "==",
                  "value": "17013"
                },
                {
                  "path": ".matches[@max:score].score",
                  "op": "==",
                  "value": 100
                },
                {
                  "path": ".matches[@max:score].matched_via[].number",
                  "op": "==",
                  "value": "VTBRRUMM"
                },
                {
                  "path": ".summary.verdict",
                  "op": "==",
                  "value": "confirmed_match"
                },
                {
                  "path": ".alert_id",
                  "op": "exists"
                }
              ],
              "show": [
                ".alert_id",
                ".matches[@max:score].matched_via"
              ]
            },
            {
              "name": "defect ii — name and BIC together, one audit row",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "VTB Bank PJSC",
                "entity_type": "entity",
                "ids": [
                  {
                    "type": "SWIFT/BIC",
                    "number": "VTBRRUMM"
                  }
                ]
              },
              "assert": [
                {
                  "path": ".summary.top_match.uid",
                  "op": "==",
                  "value": "17013"
                },
                {
                  "path": ".matches[@max:score].score",
                  "op": "==",
                  "value": 100
                },
                {
                  "path": ".matches[@max:score].matched_via[].number",
                  "op": "==",
                  "value": "VTBRRUMM"
                },
                {
                  "path": ".alert_id",
                  "op": "exists"
                }
              ],
              "show": [
                ".alert_id",
                ".summary.top_match.score"
              ]
            },
            {
              "name": "defect iv — Simferopol in the address outranks RU in the country field",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Ivan Petrov",
                "country": "RU",
                "address": "ul. Lenina 12, Simferopol, Crimea"
              },
              "assert": [
                {
                  "path": ".jurisdiction_risk.jurisdiction",
                  "op": "==",
                  "value": "UA-43"
                },
                {
                  "path": ".jurisdiction_nexus.source",
                  "op": "==",
                  "value": "address"
                },
                {
                  "path": ".jurisdiction_nexus.evaluated",
                  "op": "==",
                  "value": "Simferopol"
                },
                {
                  "path": ".jurisdiction_nexus.status",
                  "op": "==",
                  "value": "embargoed"
                }
              ],
              "show": [
                ".jurisdiction_nexus"
              ]
            }
          ],
          "notes": "Defect iii (an alert stays open with a deadline) reads GET /v1/alerts/{id} and GET /v1/alerts/stats on the page; both need an alert the caller owns, so they are covered by the issue's acceptance rather than this block."
        },
        {
          "acceptance": 1,
          "base": "https://api.noblesight.io",
          "auth": {
            "header": "X-API-Key",
            "env": "NOBLE_API_KEY"
          },
          "headers": {
            "Content-Type": "application/json"
          },
          "steps": [
            {
              "name": "defect i — one letter off still alerts (OFAC only, so the score shows the algorithm)",
              "method": "POST",
              "path": "/v1/screen",
              "body": {
                "name": "Alisher Usmanof",
                "lists": [
                  "ofac"
                ]
              },
              "assert": [
                {
                  "path": ".summary.top_match.uid",
                  "op": "==",
                  "value": "35283"
                },
                {
                  "path": ".summary.top_match.score",
                  "op": ">=",
                  "value": 80
                },
                {
                  "path": ".summary.top_match.score",
                  "op": "<",
                  "value": 100
                },
                {
                  "path": ".summary.verdict",
                  "op": "in",
                  "value": [
                    "strong_match",
                    "confirmed_match"
                  ]
                },
                {
                  "path": ".alert_id",
                  "op": "exists"
                }
              ],
              "show": [
                ".summary.top_match.score",
                ".summary.verdict",
                ".alert_id"
              ]
            }
          ],
          "notes": "Its own block because lists is restricted to ofac: the runner voids a block whose steps cite different list sets."
        }
      ]
    }
  ]
}
