{
  "info": {
    "name": "Hive Protected Flow — Signed Decisions + Meter Quote",
    "description": "Runnable, live-endpoint collection for the Hive Protected Flow decision layer. Given an R3Pv receipt group, a declared policy pack, and declared exposure, /v1/protected-flow/assess returns a signed decision (permit / permit_with_evidence / require_approval / hold / recover / reroute / escalate / block) and a three-part meter quote (platform fee + R3Pv/Healing premium band + optional bps on protected exposure). The signed assessment round-trips /v1/receipt/verify like any Hive receipt. No funds move — this service never calls Circle APIs and never reverses finalized chain transactions.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    { "key": "baseUrl", "value": "https://receipts.thehiveryiq.com", "type": "string" }
  ],
  "item": [
    {
      "name": "1 · Protected Flow health",
      "request": {
        "method": "GET",
        "header": [],
        "url": { "raw": "{{baseUrl}}/v1/protected-flow/health", "host": ["{{baseUrl}}"], "path": ["v1", "protected-flow", "health"] },
        "description": "Discovery: decision classes, policy packs, meter schema, signer."
      }
    },
    {
      "name": "2 · Sign a stablecoin-intent receipt (no funds moved)",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "var body = pm.response.json();",
              "if (body && body.receipt) { pm.collectionVariables.set('lastReceipt', JSON.stringify(body.receipt)); }",
              "pm.test('signed receipt returned', function () { pm.expect(pm.response.code).to.eql(200); });"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [ { "key": "Content-Type", "value": "application/json" } ],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"action\": \"stablecoin_transfer\",\n  \"external_system\": \"circle\",\n  \"actor\": { \"did\": \"did:example:agent\" },\n  \"payload\": {\n    \"asset\": \"USDC\",\n    \"amount\": \"1000.00\",\n    \"from\": \"0xSender\",\n    \"to\": \"0xRecipient\",\n    \"network\": \"base\",\n    \"net_moved\": \"0.00\",\n    \"policy_state\": \"within_policy\"\n  },\n  \"healing_state\": \"pre_broadcast_stoppable\"\n}"
        },
        "url": { "raw": "{{baseUrl}}/v1/receipt-relay/event", "host": ["{{baseUrl}}"], "path": ["v1", "receipt-relay", "event"] },
        "description": "Self-attested receipt over a Circle-shaped USDC transfer intent. net_moved=0.00 and healing_state=pre_broadcast_stoppable declare the recovery window. Hive never calls Circle APIs."
      }
    },
    {
      "name": "3 · Assess it (default policy, $500 exposure) — expect require_approval or hold on self_attested",
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "var r = pm.collectionVariables.get('lastReceipt');",
              "if (r) { pm.variables.set('assessBody', '{\"label\":\"circle-usdc-intent\",\"receipts\":[' + r + '],\"policy_pack\":\"default\",\"declared_exposure_usd\":500.0}'); }",
              "else { pm.variables.set('assessBody', '{\"receipt_ids\":[\"run request 2 first\"],\"policy_pack\":\"default\",\"declared_exposure_usd\":500.0}'); }"
            ]
          }
        },
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "var body = pm.response.json();",
              "if (body && body.group_id) { pm.collectionVariables.set('groupId', body.group_id); }",
              "if (body && body.signed_assessment) {",
              "  var a = body.signed_assessment;",
              "  pm.collectionVariables.set('assessmentVerifyBody', JSON.stringify({ receipt_id: a.assessment_id, payload_sha256: a.payload_sha256, sig_b64u: a.sig_b64u, ts: a.ts }));",
              "}",
              "pm.test('signed decision returned', function () { pm.expect(pm.response.code).to.eql(200); pm.expect(body.verification.ok).to.eql(true); });"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [ { "key": "Content-Type", "value": "application/json" } ],
        "body": { "mode": "raw", "raw": "{{assessBody}}" },
        "url": { "raw": "{{baseUrl}}/v1/protected-flow/assess", "host": ["{{baseUrl}}"], "path": ["v1", "protected-flow", "assess"] },
        "description": "Assess the receipt under the DEFAULT policy pack with a $500 declared exposure. Because the receipt is only self_attested (no relay_observed or chain_verified evidence), the default policy's require_min_tier=relay_observed forces a hard-fail HOLD — this is the point: the platform will NEVER over-permit. Meter shows platform_fee_usd + protection_premium_usd + exposure_premium_usd (2 bps on $500)."
      }
    },
    {
      "name": "4 · Re-assess under strict_bank policy — expect stricter decision",
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "var r = pm.collectionVariables.get('lastReceipt');",
              "if (r) { pm.variables.set('assessBody2', '{\"label\":\"bank-grade\",\"receipts\":[' + r + '],\"policy_pack\":\"strict_bank\",\"declared_exposure_usd\":50000.0}'); }",
              "else { pm.variables.set('assessBody2', '{}'); }"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [ { "key": "Content-Type", "value": "application/json" } ],
        "body": { "mode": "raw", "raw": "{{assessBody2}}" },
        "url": { "raw": "{{baseUrl}}/v1/protected-flow/assess", "host": ["{{baseUrl}}"], "path": ["v1", "protected-flow", "assess"] },
        "description": "Same receipt, strict_bank pack (require_min_tier=chain_verified), $50k declared exposure. Expect decision=hold or escalate, with hard-fail rationale citing 'weakest_boundary_below_policy'. Meter reflects the higher band + bps."
      }
    },
    {
      "name": "5 · Evidence export — bundled, offline-verifiable audit pack",
      "request": {
        "method": "GET",
        "header": [],
        "url": { "raw": "{{baseUrl}}/v1/protected-flow/evidence/{{groupId}}/export", "host": ["{{baseUrl}}"], "path": ["v1", "protected-flow", "evidence", "{{groupId}}", "export"] },
        "description": "Returns a signed evidence bundle: r3pv_signed_vector + latest_signed_assessment + referenced_receipts + pubkey_material + how_to_verify_offline. The bundle itself round-trips /v1/receipt/verify."
      }
    },
    {
      "name": "6 · Verify the signed assessment — round-trip proof",
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "var b = pm.collectionVariables.get('assessmentVerifyBody');",
              "if (b) { pm.variables.set('verifyBody', b); }"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [ { "key": "Content-Type", "value": "application/json" } ],
        "body": { "mode": "raw", "raw": "{{verifyBody}}" },
        "url": { "raw": "{{baseUrl}}/v1/receipt/verify", "host": ["{{baseUrl}}"], "path": ["v1", "receipt", "verify"] },
        "description": "POST the signed assessment's verifier fields back to the public verifier. Returns verified=true — the Protected Flow decision is a first-class Hive receipt."
      }
    }
  ]
}
