{
  "v": "proto-2",
  "kind": "attesto.receipt",
  "subject": "flight-recorder-run",
  "issuedAt": "2026-10-30T09:16:15.397Z",
  "issuedBy": "attesto-flight-recorder@proto-2.1",
  "run": {
    "ref": "run-dujuay8mqy"
  },
  "verify": {
    "url": "https://stage.attesto.cloud/verify",
    "howTo": "Open https://stage.attesto.cloud/verify (or a saved copy of that page, offline) and drop this file in. Nothing is sent to us."
  },
  "claims": {
    "proves": "This record shows that these steps of the run happened in this order, no later than the times confirmed by the outside timekeeper, and that none was changed or removed afterwards. Each action names who allowed it: a rule, or a person.",
    "doesNotProve": "It does not prove that the AI's reasoning was right, who a person really is (names are typed, not checked), or anything that happened outside this record."
  },
  "limits": [
    "Refunds are simulated in this prototype: no money moved.",
    "Names are claims: the customer's name comes from the customer channel, and the approver typed their own name on the approval page. Nobody signed in.",
    "Privacy is not finished (DESIGN EL21): names are in this receipt in plain text, and a redacted copy that still checks is not possible yet. The batch log that the outside timekeepers see holds only fingerprints.",
    "Only actions routed through the flight recorder are covered."
  ],
  "witnesses": {
    "timekeepers": [
      {
        "id": "freetsa",
        "name": "FreeTSA",
        "rootSha256": "a6379e7cecc05faa3cbf076013d745e327bbbaa38c0b9af22469d4701d18aabc"
      }
    ],
    "bitcoin": "OpenTimestamps",
    "note": "1 outside timekeeper (FreeTSA) + Bitcoin (OpenTimestamps). A second independent timekeeper is planned."
  },
  "chain": {
    "hash": "sha256(canonicalJSON({ v, runId, seq, prev, type, at, who, tag, source, how, data }))",
    "genesis": "0000000000000000000000000000000000000000000000000000000000000000",
    "facts": [
      {
        "v": "proto-2",
        "runId": "run-dujuay8mqy",
        "seq": 1,
        "prev": "0000000000000000000000000000000000000000000000000000000000000000",
        "how": {
          "build": "attesto-flight-recorder@proto-2.0",
          "rules": "rules-v1#6ad3916fe682caed",
          "traceId": "a4bb24754a15dc67"
        },
        "type": "request.received",
        "at": "2026-10-17T00:21:18.335Z",
        "who": {
          "kind": "customer",
          "id": "cust-ben",
          "name": "Ben Okafor"
        },
        "tag": "claimed",
        "source": "customer message",
        "data": {
          "textHash": "23919aaab8fd9290f9e77cd72fdb48447d88da55886d9a0bf91cd64a37c5b3b7"
        },
        "hash": "b1cf2a7d4b8b4666fcd1997ce644dc174473cbe25d135f2e1c0c28d04f9658ce"
      },
      {
        "v": "proto-2",
        "runId": "run-dujuay8mqy",
        "seq": 2,
        "prev": "b1cf2a7d4b8b4666fcd1997ce644dc174473cbe25d135f2e1c0c28d04f9658ce",
        "how": {
          "build": "attesto-flight-recorder@proto-2.0",
          "rules": "rules-v1#6ad3916fe682caed",
          "traceId": "a4bb24754a15dc67",
          "agent": "Support agent@toy-0.1"
        },
        "type": "action.proposed",
        "at": "2026-10-17T00:21:18.693Z",
        "who": {
          "kind": "agent",
          "id": "agent:toy-support",
          "name": "Support agent",
          "version": "toy-0.1"
        },
        "tag": "claimed",
        "source": "agent proposal",
        "data": {
          "proposalId": "p-9z49y6bj2b",
          "action": {
            "kind": "refund",
            "orderId": "1190",
            "amountCents": 18000,
            "currency": "USD"
          },
          "reasonHash": "8e063cc4afa33e3eb470ec7de2620795704d12b0c678c2bc3e9b91c6a6480d9c"
        },
        "hash": "754f51e5ebd501bbf89aefdfe77dd5e5fff388e674784a2a12ebffe022c36c31"
      },
      {
        "v": "proto-2",
        "runId": "run-dujuay8mqy",
        "seq": 3,
        "prev": "754f51e5ebd501bbf89aefdfe77dd5e5fff388e674784a2a12ebffe022c36c31",
        "how": {
          "build": "attesto-flight-recorder@proto-2.0",
          "rules": "rules-v1#6ad3916fe682caed",
          "traceId": "a4bb24754a15dc67",
          "agent": "Support agent@toy-0.1"
        },
        "at": "2026-10-17T00:21:18.693Z",
        "who": {
          "kind": "rules",
          "id": "rules",
          "name": "Your rules"
        },
        "tag": "observed",
        "source": "decide()",
        "type": "action.held",
        "data": {
          "proposalId": "p-9z49y6bj2b",
          "rule": {
            "id": "over-100-needs-person",
            "name": "Refunds over $100 need a person"
          },
          "checked": [
            {
              "ruleId": "flagged-customer",
              "matched": false
            },
            {
              "ruleId": "one-refund-per-order",
              "matched": false
            },
            {
              "ruleId": "over-100-needs-person",
              "matched": true
            }
          ],
          "approvalId": "ap-p-9z49y6bj2b"
        },
        "hash": "710d8c92a855072350a533b25c18eb830669bc6bffc7cc8017c9e97babe35ba8"
      },
      {
        "v": "proto-2",
        "runId": "run-dujuay8mqy",
        "seq": 4,
        "prev": "710d8c92a855072350a533b25c18eb830669bc6bffc7cc8017c9e97babe35ba8",
        "how": {
          "build": "attesto-flight-recorder@proto-2.0",
          "rules": "rules-v1#6ad3916fe682caed",
          "traceId": "a4bb2567dda8dc67"
        },
        "type": "person.approved",
        "at": "2026-10-17T00:21:57.099Z",
        "who": {
          "kind": "person",
          "id": "person:tester",
          "name": "Tester"
        },
        "tag": "claimed",
        "source": "approval link",
        "data": {
          "proposalId": "p-9z49y6bj2b",
          "approvalId": "ap-p-9z49y6bj2b"
        },
        "hash": "103157921b15eea97221e9a148eb4c300bc444186e989ab90d7ddd282d7af288"
      },
      {
        "v": "proto-2",
        "runId": "run-dujuay8mqy",
        "seq": 5,
        "prev": "103157921b15eea97221e9a148eb4c300bc444186e989ab90d7ddd282d7af288",
        "how": {
          "build": "attesto-flight-recorder@proto-2.0",
          "rules": "rules-v1#6ad3916fe682caed",
          "traceId": "a4bb2567dda8dc67"
        },
        "type": "action.done",
        "at": "2026-10-17T00:21:57.117Z",
        "who": {
          "kind": "system",
          "id": "simulated payments (prototype)",
          "name": "simulated payments (prototype)"
        },
        "tag": "observed",
        "source": "simulated payments (prototype)",
        "data": {
          "proposalId": "p-9z49y6bj2b",
          "reference": "sim-refund-p-9z49y6bj2b"
        },
        "hash": "be757be734daeec0bf2f7d16b22e9270c5a72a57b60077196a4987c16f0f6a8d"
      }
    ]
  },
  "checkpoints": [],
  "batches": [],
  "otsAnchors": [],
  "rules": {
    "ref": "rules-v1#6ad3916fe682caed",
    "list": [
      {
        "id": "flagged-customer",
        "name": "Block if the customer is flagged",
        "when": {
          "check": "customer-flagged"
        },
        "outcome": "block"
      },
      {
        "id": "one-refund-per-order",
        "name": "Never refund the same order twice",
        "when": {
          "check": "order-already-refunded"
        },
        "outcome": "block"
      },
      {
        "id": "over-100-needs-person",
        "name": "Refunds over $100 need a person",
        "when": {
          "check": "amount-over",
          "cents": 10000
        },
        "outcome": "hold"
      },
      {
        "id": "small-refunds-ok",
        "name": "Refunds up to $100 are allowed",
        "when": {
          "check": "always"
        },
        "outcome": "allow"
      }
    ]
  },
  "privateTexts": {
    "note": "Not part of the chain. Each text's SHA-256 is in the facts. These can be removed from a shared copy without breaking the chain.",
    "byHash": {
      "23919aaab8fd9290f9e77cd72fdb48447d88da55886d9a0bf91cd64a37c5b3b7": "The jacket I ordered (order 1190) never arrived. It has been three weeks.",
      "8e063cc4afa33e3eb470ec7de2620795704d12b0c678c2bc3e9b91c6a6480d9c": "Order 1190 shows no delivery scan. Refund the $180 jacket."
    }
  },
  "summary": {
    "customer": "Ben Okafor",
    "actions": [
      {
        "title": "Refund $180 for order 1190",
        "status": "Done",
        "story": "On 17 Oct 2026 at 00:21 UTC the support agent proposed a $180 refund for order 1190. The rule “Refunds over $100 need a person” held it for a person. Tester approved it at 00:21 UTC. It was done at 00:21 UTC."
      }
    ],
    "note": "Plain-language summary for reading the file. The checker does not trust it: it rebuilds the timeline from the facts."
  }
}