@sanning/proof 0.19.1 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +30 -29
  2. package/dist/agent-record.d.ts +62 -0
  3. package/dist/agent-record.js +527 -0
  4. package/dist/agent-schemas.generated.d.ts +15 -0
  5. package/dist/agent-schemas.generated.js +5759 -0
  6. package/dist/case-file.d.ts +32 -89
  7. package/dist/case-file.js +41 -93
  8. package/dist/case.d.ts +339 -822
  9. package/dist/case.js +667 -1160
  10. package/dist/chain.d.ts +19 -47
  11. package/dist/chain.js +78 -205
  12. package/dist/claims.d.ts +211 -0
  13. package/dist/claims.js +1081 -0
  14. package/dist/cli.d.ts +45 -68
  15. package/dist/cli.js +618 -1022
  16. package/dist/compose.js +23 -65
  17. package/dist/crypto.d.ts +7 -8
  18. package/dist/crypto.js +60 -147
  19. package/dist/declaration.d.ts +68 -194
  20. package/dist/declaration.js +175 -518
  21. package/dist/environment.d.ts +9 -30
  22. package/dist/environment.js +17 -66
  23. package/dist/evidence.d.ts +119 -160
  24. package/dist/evidence.js +744 -1103
  25. package/dist/exit-codes.d.ts +11 -27
  26. package/dist/exit-codes.js +24 -59
  27. package/dist/file-match.d.ts +33 -79
  28. package/dist/file-match.js +33 -69
  29. package/dist/grading.d.ts +98 -135
  30. package/dist/grading.js +224 -380
  31. package/dist/handoff.d.ts +62 -160
  32. package/dist/handoff.js +153 -393
  33. package/dist/index.d.ts +14 -10
  34. package/dist/index.js +60 -167
  35. package/dist/json-schema.d.ts +29 -0
  36. package/dist/json-schema.js +298 -0
  37. package/dist/merkle.js +16 -28
  38. package/dist/message-parts.d.ts +56 -212
  39. package/dist/message-parts.js +142 -502
  40. package/dist/side-content.d.ts +11 -22
  41. package/dist/side-content.js +22 -65
  42. package/dist/types.d.ts +17 -0
  43. package/dist/types.js +19 -5
  44. package/dist/verifier.d.ts +40 -114
  45. package/dist/verifier.js +196 -535
  46. package/dist/witness-cache.d.ts +24 -45
  47. package/dist/witness-cache.js +38 -81
  48. package/dist/witness-lookup.d.ts +36 -57
  49. package/dist/witness-lookup.js +89 -139
  50. package/dist/zip-reader.d.ts +18 -33
  51. package/dist/zip-reader.js +19 -34
  52. package/package.json +11 -3
  53. package/src/agent-record.ts +608 -0
  54. package/src/agent-schemas.generated.ts +5764 -0
  55. package/src/case-file.ts +45 -109
  56. package/src/case.ts +814 -1328
  57. package/src/chain.ts +85 -224
  58. package/src/claims.ts +1253 -0
  59. package/src/cli.ts +714 -1176
  60. package/src/compose.ts +33 -79
  61. package/src/crypto.ts +60 -147
  62. package/src/declaration.ts +219 -656
  63. package/src/environment.ts +17 -65
  64. package/src/evidence.ts +958 -1381
  65. package/src/exit-codes.ts +24 -63
  66. package/src/file-match.ts +40 -89
  67. package/src/grading.ts +287 -421
  68. package/src/handoff.ts +175 -427
  69. package/src/index.ts +131 -177
  70. package/src/json-schema.ts +295 -0
  71. package/src/merkle.ts +16 -28
  72. package/src/message-parts.ts +155 -533
  73. package/src/side-content.ts +25 -68
  74. package/src/types.ts +55 -36
  75. package/src/verifier.ts +202 -526
  76. package/src/witness-cache.ts +45 -94
  77. package/src/witness-lookup.ts +107 -177
  78. package/src/zip-reader.ts +20 -38
  79. package/vectors/README.md +52 -34
  80. package/vectors/agent-record.json +2175 -0
  81. package/vectors/case-file-index.json +1 -1
  82. package/vectors/case-split.json +2 -2
  83. package/vectors/chain-reading.json +3 -3
  84. package/vectors/file-match.json +285 -148
  85. package/vectors/jcs-reader.json +6 -6
  86. package/vectors/pack-grading.json +102 -25
  87. package/vectors/sandbox-evidence.json +573 -581
  88. package/vectors/stamp-on-chain.json +18 -18
  89. package/vectors/witness-cache.json +49 -49
  90. package/dist/agent-proof.d.ts +0 -28
  91. package/dist/agent-proof.js +0 -226
  92. package/dist/run-adapters.d.ts +0 -10
  93. package/dist/run-adapters.js +0 -35
  94. package/dist/run.d.ts +0 -209
  95. package/dist/run.js +0 -1405
  96. package/src/agent-proof.ts +0 -264
  97. package/src/run-adapters.ts +0 -44
  98. package/src/run.ts +0 -1598
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "rule": "stamp-on-chain",
3
- "ruleVersion": 3,
4
- "statement": "What re-fetching a stamp's witness from a gateway DOES and DOES NOT settle. A stamp body carries no producer signature and no inclusion proof of its own, so the witness is the entire independent part of it (evidence-bundle.md §5.2.4): confirming that a gateway holds the exact bytes named by anchor_ref is the only check that turns Sanning's own assertion into evidence. It is an ONLINE act and always optional — an offline verdict is unchanged by it and never claims it happened. Four states, never three: not-checked (no gateway was asked, or the stamp names no witness), confirm (a gateway returned the witnessed bytes), mismatch (a gateway returned DIFFERENT bytes — the only outcome that fails anything), unreachable (we asked and nobody answered — an availability gap, never an accusation). The expected bytes are stamps[].stamp_bytes VERBATIM, because §5.2.2 defines that field as the exact bytes handed to the witness; re-canonicalizing them would compare the chain against bytes nobody signed.",
3
+ "ruleVersion": 4,
4
+ "statement": "What re-fetching a stamp's witness from a gateway DOES and DOES NOT settle. A stamp body carries no producer signature and no inclusion proof of its own, so the witness is the entire independent part of it (evidence-bundle.md §5.2.4): confirming that a gateway holds the exact bytes named by anchor_ref is the only check that turns Sanning's own assertion into evidence. It is an ONLINE act and always optional — an offline verdict is unchanged by it and never claims it happened. Four states, never three: not-checked (no gateway was asked, or the stamp names no witness), confirm (a gateway returned the witnessed bytes), mismatch (a gateway returned DIFFERENT bytes — the only outcome that fails anything), unreachable (we asked and nobody answered: an availability gap, never an accusation, and it moves no verdict; the witness line says so). A stamp nobody witnessed (no anchor_ref) leaves the witnessed claim not proven, so the bundle is incomplete, exit 2. The expected bytes are stamps[].stamp_bytes VERBATIM, because §5.2.2 defines that field as the exact bytes handed to the witness; re-canonicalizing them would compare the chain against bytes nobody signed.",
5
5
  "home": "@sanning/proof — ts/vectors/stamp-on-chain.json. This file is the RULE, not a test fixture of one implementation. The TypeScript kernel implements it in ts/src/evidence.ts (refetchStamps / refetchStamp / probeGateway / rollupOnChain) and is held to it by ts/test/stamp-on-chain-vectors.test.ts; the Python kernel implements it in src/sanning_proof/evidence.py (_refetch_stamps / _refetch_stamp / _probe_gateway / _rollup_on_chain) and is held to the SAME file by tests/test_stamp_on_chain_vectors.py. Neither kernel can pass by agreeing with the other.",
6
6
  "consumers": "A surface that re-fetches a stamp witness SHOULD call the kernel's verifyEvidenceBundle with `gateways` rather than derive the rule again. A surface that cannot yet (an older pinned kernel, another language) vendors this file byte-for-byte, asserts its own derivation against it, and runs a drift check against the copy shipped in the @sanning/proof tarball at vectors/stamp-on-chain.json — failing when it cannot find a copy to compare against. A vendored copy that is not byte-identical to this one is a defect, not a variant. In particular: a surface MUST NOT collapse the four states into a boolean. A reader that cannot distinguish not-checked from unreachable will report that no gateway could be reached when none was tried, which is a false accusation manufactured by a missing state, and is the defect this table was written after.",
7
- "howToUse": "Each case describes one sanning.stamp.evidence/v2 pack and one set of scripted gateway responses. Build the pack from `packScaffold`: for each entry of `stamps` (index i, 0-based) sign ONE sanning.events/v2 envelope over the record {\"event\":{\"content_hash\":\"<64×a>\"},\"i\":i} with event_id `ev-<i>` and the fixed seed, take its leaf under RFC 9162 (SHA-256(0x00 ‖ JCS(envelope))), make a one-leaf tree, and build the stamp body from `stampBodyScaffold` with merkle_root = that root, leaf_count = 1 and one sub-tree covering [0,1). stamp_bytes is JCS(stamp body) hex-encoded; stamp_ref is SHA-256 of the DECODED bytes. When the entry's `witnessed` is true attach anchor_ref = {kind: entry's `kind` (default \"arweave\"), id: `<anchorIdPrefix><i>`}, otherwise omit anchor_ref entirely. Give each stamp one event whose inclusion is {stamp_ref, leaf_index: 0, leaf_count: 1, leaf_hash, audit_path: []}. Wrap the body per `wrapperScaffold`, set body_hash = SHA-256(JCS(body)) and sign the wrapper (minus `signature`) with the same seed. Then call the kernel with the case's `gateways` and a fetch seam that answers `{gateway}/{anchor id}` per the `returns` entry for that stamp at that gateway's index, and assert `expect`. A case with an empty `gateways` list is called with no gateway list at all, that is the not-checked state and it must be reachable without a fetch seam. Only an `arweave` witness whose id is a 43-character base64url string is ever fetched (proof#115): a stamp naming any other `kind` is never probed, whatever its id looks like, and stays `ok` with `onChain: null`.",
7
+ "howToUse": "Each case describes one sanning.stamp.evidence/v2 pack and one set of scripted gateway responses. Build the pack from `packScaffold`: for each entry of `stamps` (index i, 0-based) sign ONE sanning.events/v2 envelope over the record {\"event\":{\"content_hash\":\"<64×a>\"},\"i\":i} with event_id `ev-<i>` and the fixed seed, take its leaf under RFC 9162 (SHA-256(0x00 ‖ JCS(envelope))), make a one-leaf tree, and build the stamp body from `stampBodyScaffold` with merkle_root = that root, leaf_count = 1 and one sub-tree covering [0,1). stamp_bytes is JCS(stamp body) hex-encoded; stamp_ref is SHA-256 of the DECODED bytes. When the entry's `witnessed` is true attach anchor_ref = {kind: entry's `kind` (default \"arweave\"), id: `<anchorIdPrefix><i>`}, otherwise omit anchor_ref entirely. Give each stamp one event whose inclusion is {stamp_ref, leaf_index: 0, leaf_count: 1, leaf_hash, audit_path: []}. Wrap the body per `wrapperScaffold`, set body_hash = SHA-256(JCS(body)) and sign the wrapper (minus `signature`) with the same seed. Then call the kernel with the case's `gateways` and a fetch seam that answers `{gateway}/{anchor id}` per the `returns` entry for that stamp at that gateway's index, and assert `expect`. A case with an empty `gateways` list is called with no gateway list at all, that is the not-checked state and it must be reachable without a fetch seam. Only an `arweave` witness whose id is a 43-character base64url string is ever fetched: a stamp naming any other `kind` is never probed, whatever its id looks like, and stays `ok` with `onChain: null`.",
8
8
  "responseKinds": {
9
9
  "witnessed": "The exact decoded stamp_bytes. The honest chain.",
10
10
  "altered": "JCS of the same stamp body with interval_end changed to 2026-09-09T13:00:00.000Z — a well-formed, canonical, semantically different stamp. This is the forgery shape that matters: a pack built on it is fully self-consistent OFFLINE and lies only about what was witnessed.",
@@ -68,7 +68,7 @@
68
68
  },
69
69
  {
70
70
  "id": "mismatch-fails-the-stamp",
71
- "why": "THE case this capability exists for. The pack is internally perfect — wrapper signed, stamp_ref derived from its own bytes, those bytes JCS-canonical, the event's RFC 9162 path reconstructing the committed root — and verifies `verified` offline. The chain holds different bytes. Only a re-fetch can tell, and it must fail the stamp rather than note it: a stamp whose witness contradicts it is not partially witnessed, it is contradicted. An implementation whose byte comparison cannot fail passes every other case in this table and this one alone.",
71
+ "why": "THE case this capability exists for. The pack is internally perfect — wrapper signed, stamp_ref derived from its own bytes, those bytes JCS-canonical, the event's RFC 9162 path reconstructing the committed root — and verifies `verified` offline. The chain holds different bytes. Only a re-fetch can tell, and it must fail the stamp rather than note it: a stamp whose witness contradicts it is not half witnessed, it is contradicted. An implementation whose byte comparison cannot fail passes every other case in this table and this one alone.",
72
72
  "gateways": ["https://g1.example"],
73
73
  "stamps": [{ "witnessed": true, "returns": ["altered"] }],
74
74
  "expect": {
@@ -88,14 +88,14 @@
88
88
  }
89
89
  },
90
90
  {
91
- "id": "unreachable-is-undetermined-not-failed",
92
- "why": "A gateway that does not answer has told us NOTHING about the evidence, and a verifier that turns silence into an accusation is the exact failure the anchor_ref vocabulary was designed around. Undetermined: the offline-sound stamp stays ok, the run drops to `partial`, and the exit code is 3 — a retry, not a finding.",
91
+ "id": "unreachable-moves-nothing-never-failed",
92
+ "why": "A gateway that does not answer has told us NOTHING about the evidence, and a verifier that turns silence into an accusation is the exact failure the anchor_ref vocabulary was designed around. It moves nothing: the offline-sound stamp stays ok, the run keeps its offline verdict and exit code, and the witness line says the lookup did not settle. A retry, not a finding.",
93
93
  "gateways": ["https://g1.example"],
94
94
  "stamps": [{ "witnessed": true, "returns": ["unreachable"] }],
95
95
  "expect": {
96
96
  "onChainChecked": true,
97
- "status": "partial",
98
- "exit": 3,
97
+ "status": "verified",
98
+ "exit": 0,
99
99
  "stamps": [
100
100
  {
101
101
  "rollup": "unreachable",
@@ -130,7 +130,7 @@
130
130
  },
131
131
  {
132
132
  "id": "confirm-beats-unreachable",
133
- "why": "Best-evidence, once nothing has contradicted anything. One gateway being down is an availability fact about that gateway; another gateway returning the witnessed bytes is a fact about the record. The record wins, and the run is not downgraded for the outage — otherwise every auditor with one stale gateway in their list would read `partial` on fully witnessed evidence.",
133
+ "why": "Best-evidence, once nothing has contradicted anything. One gateway being down is an availability fact about that gateway; another gateway returning the witnessed bytes is a fact about the record. The record wins, and the run is not downgraded for the outage — otherwise every auditor with one stale gateway in their list would read a worse verdict on fully witnessed evidence.",
134
134
  "gateways": ["https://g1.example", "https://g2.example"],
135
135
  "stamps": [{ "witnessed": true, "returns": ["unreachable", "witnessed"] }],
136
136
  "expect": {
@@ -150,13 +150,13 @@
150
150
  },
151
151
  {
152
152
  "id": "unwitnessed-stamp-is-not-checked-never-unreachable",
153
- "why": "A stamp with no anchor_ref names no witness, so there is nothing to ask any gateway for. onChain stays null — not-checked — even though gateways were supplied and every one of them is reachable. Reporting all-unreachable here would invent a network event that did not occur. The bundle is already `partial` for the right reason, said in the right words, by §5.2.4, and exits 3 for that reason with or without a gateway list (0.13.0: `partial` exits 3 in every verb).",
153
+ "why": "A stamp with no anchor_ref names no witness, so there is nothing to ask any gateway for. onChain stays null — not-checked — even though gateways were supplied and every one of them is reachable. Reporting all-unreachable here would invent a network event that did not occur. The bundle is already `incomplete` for the right reason (witnessed not proven), said in the right words, by §5.2.4, and exits 2 for that reason with or without a gateway list.",
154
154
  "gateways": ["https://g1.example"],
155
155
  "stamps": [{ "witnessed": false, "returns": ["witnessed"] }],
156
156
  "expect": {
157
157
  "onChainChecked": true,
158
- "status": "partial",
159
- "exit": 3,
158
+ "status": "incomplete",
159
+ "exit": 2,
160
160
  "stamps": [{ "rollup": null, "onChainOk": null, "ok": true }],
161
161
  "bundleErrorsContain": ["sealed by Sanning, witnessed by nobody"]
162
162
  }
@@ -199,7 +199,7 @@
199
199
  },
200
200
  {
201
201
  "id": "two-gaps-are-two-notes",
202
- "why": "One stamp witnessed but unreachable, one stamp never witnessed. Both hold the bundle at `partial` and both get SAID. They have different causes and different fixes — one waits for the network, the other for the interval to close — and an auditor told only about the gateway would read the unwitnessed stamp as fine. The per-stamp results keep them apart too: the first carries an unreachable rollup, the second carries null.",
202
+ "why": "One stamp witnessed but unreachable, one stamp never witnessed. The unwitnessed stamp holds the bundle at `incomplete`, the unreachable one moves nothing, and both get SAID. They have different causes and different fixes — one waits for the network, the other for the interval to close — and an auditor told only about the gateway would read the unwitnessed stamp as fine. The per-stamp results keep them apart too: the first carries an unreachable rollup, the second carries null.",
203
203
  "gateways": ["https://g1.example"],
204
204
  "stamps": [
205
205
  { "witnessed": true, "returns": ["unreachable"] },
@@ -207,8 +207,8 @@
207
207
  ],
208
208
  "expect": {
209
209
  "onChainChecked": true,
210
- "status": "partial",
211
- "exit": 3,
210
+ "status": "incomplete",
211
+ "exit": 2,
212
212
  "stamps": [
213
213
  {
214
214
  "rollup": "unreachable",
@@ -227,13 +227,13 @@
227
227
  },
228
228
  {
229
229
  "id": "unknown-kind-witness-is-not-checked-never-mismatch",
230
- "why": "proof#115: a witness whose kind names no adapter this verifier has is never fetched, whatever gateways were passed and whatever its id looks like. Fetching it anyway, and comparing the response against stamp_bytes, is how a gateway that has never heard of the kind gets read as a mismatch or a 404 gets read as unreachable — both an accusation this verifier has no grounds to make. The bundle stays partial, said in the kind note, and the stamp itself stays ok with no on-chain result at all: not-checked, not unreachable.",
230
+ "why": ": a witness whose kind names no adapter this verifier has is never fetched, whatever gateways were passed and whatever its id looks like. Fetching it anyway, and comparing the response against stamp_bytes, is how a gateway that has never heard of the kind gets read as a mismatch or a 404 gets read as unreachable — both an accusation this verifier has no grounds to make. The bundle keeps its offline verdict, said in the kind note, and the stamp itself stays ok with no on-chain result at all: not-checked, not unreachable.",
231
231
  "gateways": ["https://g1.example"],
232
232
  "stamps": [{ "witnessed": true, "kind": "memory", "returns": ["witnessed"] }],
233
233
  "expect": {
234
234
  "onChainChecked": true,
235
- "status": "partial",
236
- "exit": 3,
235
+ "status": "verified",
236
+ "exit": 0,
237
237
  "stamps": [{ "rollup": null, "onChainOk": null, "ok": true }],
238
238
  "bundleErrorsContain": [
239
239
  "one or more stamps name a witness kind this verifier has no adapter for, so it could not be re-fetched"
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "rule": "witness-cache",
3
3
  "ruleVersion": 1,
4
- "statement": "What a reader does with the witnessed-time cache, the file `witness-cache.json` beside a pack's `bundle.json` (evidence-bundle.md 5.5.6 and 5.6.6, v1.25, A30). The file is not part of the bundle and nobody signs it, so anyone holding the pack can edit it, and every member of it is unverified by construction. It never moves the headline, the pack grade, the bundle verdict or the signature, and a reader before v1.25 lists it as a file outside every pack and reads nothing else differently. Offline, each cached time is printed on the witness line, labelled not checked. With gateways, each is looked up: a block that differs from the cached one is a finding, the witness line reads `differs` and `case` exits 1; a matching block is printed as the public record's answer; a lookup that names no block leaves the cached value labelled not checked and moves nothing. A file that is absent or malformed reads as no cache. A `cache` member inside `bundle.json` is an unknown wrapper field in the signed scope, and is never read as a cache.",
4
+ "statement": "What a reader does with the witnessed-time cache, the file `witness-cache.json` beside a pack's `bundle.json` (evidence-bundle.md §5.5.6 and §5.6.6). The file is not part of the bundle and nobody signs it, so anyone holding the pack can edit it, and every member of it is unverified by construction. It never moves the headline, the pack grade, the bundle verdict or the signature, and a reader that does not know it lists it as a file outside every pack and reads nothing else differently. Offline, each cached time is printed on the witness line, labelled not checked. With gateways, each is looked up: a block that differs from the cached one is a finding, the witness line reads `differs` and `case` exits 1; a matching block is printed as the public record's answer; a lookup that names no block leaves the cached value labelled not checked and moves nothing. A file that is absent or malformed reads as no cache. A `cache` member inside `bundle.json` is an unknown wrapper field in the signed scope, and is never read as a cache.",
5
5
  "home": "@sanning/proof: ts/vectors/witness-cache.json, written by tools/gen-vectors/gen_witness_cache_table.py with every expectation by hand. The TypeScript kernel implements it in ts/src/witness-cache.ts and ts/src/cli.ts and is held to it by ts/test/witness-cache-vectors.test.ts; the Python kernel implements it in src/sanning_proof/witness_cache.py and src/sanning_proof/cli.py and is held to the SAME file by tests/test_witness_cache_vectors.py.",
6
6
  "howToUse": "For each case, take `pack`, set its top-level `cache` to the case's `wrapperCache` where it has one (and leave the signature as it is), and write it as `<dir>/witness-pack/bundle.json`, with `sideContentHex` beside it as `<dir>/witness-pack/logs/<event_id>.json` and, where the case has `cacheFileHex`, those exact bytes as `<dir>/witness-pack/witness-cache.json`. Run the `case` command over that folder twice. The case's `headline` and `offlineExit`, where it has them, replace the table's. Offline: assert the headline, the exit, and the witness line's state and rendered text are `expect.offline`. Online, with `--gateways` set to `expect.online.gateways`: answer `<gateway>/<anchorId>` with the stamp's witnessed bytes where `bytes` says `witnessed`, and answer each POST to `<gateway>/graphql` whose body is `graphqlQuery` per the case's `graphql` answer for that gateway: `block` is `{\"data\":{\"transaction\":{\"block\":{\"height\":H,\"timestamp\":T}}}}`, `pending` is `{\"data\":{\"transaction\":{\"block\":null}}}`, `stringNumbers` is the block with both numbers written as JSON strings, and `unreachable` is a refused request. Assert the headline is unchanged, the exit, the on-chain verdict, the witness line's state and rendered text, how many time lookups were made, and that one byte lookup was made per gateway, or `byteRequests` where the case gives it.",
7
7
  "cacheFileName": "witness-cache.json",
8
8
  "cacheVersion": "sanning.witness-cache/v1",
9
9
  "anchorId": "witnessCacheFixtureAnchorId0000000000000000",
10
- "stampRef": "f74af46cf35175dec5c279c83802c82df30f8b772362f759eeac207106b2cd9c",
11
- "stampBytesHex": "7b22696e74657276616c5f656e64223a22323032362d30392d30385431323a31303a30302e3030305a222c22696e74657276616c5f7374617274223a22323032362d30392d30385431323a30303a30302e3030305a222c226c6561665f636f756e74223a312c226d65726b6c655f726f6f74223a2236643835653661663061336331376538343235323064656561343731363635633561346136666639343863616338336562663764383563376662653231613733222c226f72675f726566223a2239393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939222c227374616d705f76657273696f6e223a2273616e6e696e672e7374616d702f7631222c227375627472656573223a7b2231313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131223a7b2266697273745f6c656166223a302c226c6561665f636f756e74223a312c22726f6f74223a2236643835653661663061336331376538343235323064656561343731363635633561346136666639343863616338336562663764383563376662653231613733227d7d7d",
10
+ "stampRef": "32824f285ea1a6fcaacc37ea81324a71ea0ba8811acde52ed36e0142a5dd5bd5",
11
+ "stampBytesHex": "7b22696e74657276616c5f656e64223a22323032362d30392d30385431323a31303a30302e3030305a222c22696e74657276616c5f7374617274223a22323032362d30392d30385431323a30303a30302e3030305a222c226c6561665f636f756e74223a312c226d65726b6c655f726f6f74223a2234373964306464343761313435333062663031633738613466336137623330653335326338626130313562343236613066326163336533393561306339343165222c226f72675f726566223a2239393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939222c227374616d705f76657273696f6e223a2273616e6e696e672e7374616d702f7631222c227375627472656573223a7b2231313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131223a7b2266697273745f6c656166223a302c226c6561665f636f756e74223a312c22726f6f74223a2234373964306464343761313435333062663031633738613466336137623330653335326338626130313562343236613066326163336533393561306339343165227d7d7d",
12
12
  "graphqlQuery": "{\"query\":\"query{transaction(id:\\\"witnessCacheFixtureAnchorId0000000000000000\\\"){block{height timestamp}}}\"}",
13
13
  "headline": "verified",
14
14
  "offlineExit": 0,
@@ -27,8 +27,8 @@
27
27
  "body": {
28
28
  "stamps": [
29
29
  {
30
- "stamp_ref": "f74af46cf35175dec5c279c83802c82df30f8b772362f759eeac207106b2cd9c",
31
- "stamp_bytes": "7b22696e74657276616c5f656e64223a22323032362d30392d30385431323a31303a30302e3030305a222c22696e74657276616c5f7374617274223a22323032362d30392d30385431323a30303a30302e3030305a222c226c6561665f636f756e74223a312c226d65726b6c655f726f6f74223a2236643835653661663061336331376538343235323064656561343731363635633561346136666639343863616338336562663764383563376662653231613733222c226f72675f726566223a2239393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939222c227374616d705f76657273696f6e223a2273616e6e696e672e7374616d702f7631222c227375627472656573223a7b2231313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131223a7b2266697273745f6c656166223a302c226c6561665f636f756e74223a312c22726f6f74223a2236643835653661663061336331376538343235323064656561343731363635633561346136666639343863616338336562663764383563376662653231613733227d7d7d",
30
+ "stamp_ref": "32824f285ea1a6fcaacc37ea81324a71ea0ba8811acde52ed36e0142a5dd5bd5",
31
+ "stamp_bytes": "7b22696e74657276616c5f656e64223a22323032362d30392d30385431323a31303a30302e3030305a222c22696e74657276616c5f7374617274223a22323032362d30392d30385431323a30303a30302e3030305a222c226c6561665f636f756e74223a312c226d65726b6c655f726f6f74223a2234373964306464343761313435333062663031633738613466336137623330653335326338626130313562343236613066326163336533393561306339343165222c226f72675f726566223a2239393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939222c227374616d705f76657273696f6e223a2273616e6e696e672e7374616d702f7631222c227375627472656573223a7b2231313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131223a7b2266697273745f6c656166223a302c226c6561665f636f756e74223a312c22726f6f74223a2234373964306464343761313435333062663031633738613466336137623330653335326338626130313562343236613066326163336533393561306339343165227d7d7d",
32
32
  "anchor_ref": {
33
33
  "kind": "arweave",
34
34
  "id": "witnessCacheFixtureAnchorId0000000000000000"
@@ -40,28 +40,28 @@
40
40
  "envelope": {
41
41
  "spec_version": "sanning.events/v2",
42
42
  "event_id": "ad022c80-4c65-4fcf-9346-ed285802beba",
43
- "payload_hash": "813b6fc58ad1789760f6a7d4ecb85a7de5287e7f2def95b6c65a01257ad68b9b",
43
+ "payload_hash": "c4fe95f0c24f8cc2002951994ed895b1792b9cea1c456985ccd6a19c0b4f2ea5",
44
44
  "signed_at": "2026-09-08T12:00:00Z",
45
45
  "environment": "production",
46
46
  "public_key": "207a067892821e25d770f1fba0c47c11ff4b813e54162ece9eb839e076231ab6",
47
- "signature": "1224935b022b2b932b1096d000dd303b0d8a57ba90a9bbbf13df821f7521a81c29d33880be7e2c586495921cd7f7b445f8bd563530bd823467a4887d03108005"
47
+ "signature": "0fb5441cf04d5a54e5d6581f74ffe51b99b48a0950cce2ebd708114bf04c6b645e4b0b74a89cdd8aedb9b1318576ca3717f3cb749410bc39ec6f7b91c0366b01"
48
48
  },
49
49
  "inclusion": {
50
- "stamp_ref": "f74af46cf35175dec5c279c83802c82df30f8b772362f759eeac207106b2cd9c",
50
+ "stamp_ref": "32824f285ea1a6fcaacc37ea81324a71ea0ba8811acde52ed36e0142a5dd5bd5",
51
51
  "leaf_index": 0,
52
52
  "leaf_count": 1,
53
- "leaf_hash": "6d85e6af0a3c17e842520deea471665c5a4a6ff948cac83ebf7d85c7fbe21a73",
53
+ "leaf_hash": "479d0dd47a14530bf01c78a4f3a7b30e352c8ba015b426a0f2ac3e395a0c941e",
54
54
  "audit_path": []
55
55
  },
56
- "event_bytes": "7b226576656e74223a7b22636f6e74656e745f68617368223a2239386230386337396439313831643034363337316166643139623438393431653633313434316361316530323531646535663238666632636533383533383033227d7d"
56
+ "event_bytes": "7b226576656e74223a7b22636f6e74656e745f68617368223a2239386230386337396439313831643034363337316166643139623438393431653633313434316361316530323531646535663238666632636533383533383033227d2c226576656e745f74797065223a226576656e74227d"
57
57
  }
58
58
  ]
59
59
  },
60
- "body_hash": "1c9a04502d8efa29d985b89cea5e3fb28438b03bf3ecc15b7a6be468a0eded67",
60
+ "body_hash": "41a4136d56d37a439a39bb1aea08ed33239dbe0b16229307a0b2893ab2c1cda6",
61
61
  "previous_hash": "GENESIS",
62
62
  "signature_alg": "ed25519",
63
63
  "public_key": "207a067892821e25d770f1fba0c47c11ff4b813e54162ece9eb839e076231ab6",
64
- "signature": "3603350967925d8cf101b33972a52d4d664be6894d02be873d6e71b79efd6ebc60e20156af7cd7deb95909bc9de0d470d5851dc14a53304a4a95e5a952b25a0f"
64
+ "signature": "e42d66ba2ce62a079c7cec2bdd53b7fc0f3a7654ac5764846a663b770fe8776ae8142d397a7f64a0c99485510fbe916bc426339f6d373a8885247056c0bd8308"
65
65
  },
66
66
  "sideContentHex": {
67
67
  "ad022c80-4c65-4fcf-9346-ed285802beba": "7b2273746570223a227769746e6573732d63616368652066697874757265227d"
@@ -69,7 +69,7 @@
69
69
  "cases": [
70
70
  {
71
71
  "id": "cache-absent",
72
- "why": "A pack with no cache reads exactly as it did before the cache existed: the same line offline, the same line with a gateway, and no time is asked for.",
72
+ "why": "A pack with no cache reads as a pack with none: the same line offline, the same line with a gateway, and no time is asked for.",
73
73
  "expect": {
74
74
  "offline": {
75
75
  "state": "not_checked",
@@ -102,7 +102,7 @@
102
102
  {
103
103
  "id": "cache-matches",
104
104
  "why": "Offline, the cached time is printed and labelled not checked, and the line stays not checked. With a gateway, the time the public record returns is printed as the record's, and the line is confirmed by the bytes, as it would be with no cache.",
105
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
105
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
106
106
  "expect": {
107
107
  "offline": {
108
108
  "state": "not_checked",
@@ -135,7 +135,7 @@
135
135
  {
136
136
  "id": "cache-time-wrong",
137
137
  "why": "A cache one hour late. Offline, the reader cannot tell, so it prints the cached value and says it is not checked, never that it is confirmed. With a gateway it is a finding: the line reads differs, the command exits 1, and the headline does not move.",
138
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383837333030372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
138
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383837333030372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
139
139
  "expect": {
140
140
  "offline": {
141
141
  "state": "not_checked",
@@ -158,7 +158,7 @@
158
158
  ]
159
159
  },
160
160
  "state": "differs",
161
- "onChainVerdict": "failed",
161
+ "onChainVerdict": "differs",
162
162
  "exit": 1,
163
163
  "graphqlRequests": 1,
164
164
  "rendered": "Witness: The public record holds different bytes: a pack dates the witness block 1996701 at 2026-09-08T13:10:07Z, and the public record dates it block 1996701 at 2026-09-08T12:10:07Z (answered: http://gw.example)"
@@ -168,7 +168,7 @@
168
168
  {
169
169
  "id": "cache-height-wrong",
170
170
  "why": "The right time and the wrong block. Both numbers are compared, so this differs too.",
171
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730322c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
171
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730322c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
172
172
  "expect": {
173
173
  "offline": {
174
174
  "state": "not_checked",
@@ -191,7 +191,7 @@
191
191
  ]
192
192
  },
193
193
  "state": "differs",
194
- "onChainVerdict": "failed",
194
+ "onChainVerdict": "differs",
195
195
  "exit": 1,
196
196
  "graphqlRequests": 1,
197
197
  "rendered": "Witness: The public record holds different bytes: a pack dates the witness block 1996702 at 2026-09-08T12:10:07Z, and the public record dates it block 1996701 at 2026-09-08T12:10:07Z (answered: http://gw.example)"
@@ -201,7 +201,7 @@
201
201
  {
202
202
  "id": "cache-wrong-time-lookup-unsettled",
203
203
  "why": "A wrong cache, and a time lookup that does not settle. The bytes still confirm, and the cached value stays labelled not checked: a wrong cache never reads as confirmed, and an unanswered time lookup accuses nobody and moves no exit code.",
204
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383837333030372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
204
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383837333030372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
205
205
  "expect": {
206
206
  "offline": {
207
207
  "state": "not_checked",
@@ -232,7 +232,7 @@
232
232
  {
233
233
  "id": "cache-wrong-witness-pending",
234
234
  "why": "The gateway holds the transaction and has no block for it yet. That names no block, so it settles nothing: the cached value stays not checked.",
235
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383837333030372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
235
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383837333030372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
236
236
  "expect": {
237
237
  "offline": {
238
238
  "state": "not_checked",
@@ -263,7 +263,7 @@
263
263
  {
264
264
  "id": "cache-wrong-answer-not-a-block",
265
265
  "why": "A gateway answers the time lookup with numbers spelled as strings. That is not an answer this reader reads, so it names no block and settles nothing.",
266
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383837333030372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
266
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383837333030372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
267
267
  "expect": {
268
268
  "offline": {
269
269
  "state": "not_checked",
@@ -294,7 +294,7 @@
294
294
  {
295
295
  "id": "cache-one-gateway-differs",
296
296
  "why": "Two gateways, one naming the cached block and one naming another. Worst answer wins, as it does for the bytes: the line reads differs.",
297
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
297
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
298
298
  "expect": {
299
299
  "offline": {
300
300
  "state": "not_checked",
@@ -324,7 +324,7 @@
324
324
  ]
325
325
  },
326
326
  "state": "differs",
327
- "onChainVerdict": "failed",
327
+ "onChainVerdict": "differs",
328
328
  "exit": 1,
329
329
  "graphqlRequests": 2,
330
330
  "rendered": "Witness: The public record holds different bytes: a pack dates the witness block 1996701 at 2026-09-08T12:10:07Z, and the public record dates it block 1996701 at 2026-09-08T12:09:07Z (answered: http://gw.example, http://gw2.example)"
@@ -334,7 +334,7 @@
334
334
  {
335
335
  "id": "cache-nested-to-512",
336
336
  "why": "An entry carrying an unknown member that takes the file to exactly 512 levels, the most the file is read under. The file is not the bundle, so its depth is nothing the bundle's bounds read; the entry reads, and its unknown member is ignored.",
337
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c226e6f7465223a5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d2c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
337
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c226e6f7465223a5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d2c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
338
338
  "expect": {
339
339
  "offline": {
340
340
  "state": "not_checked",
@@ -366,12 +366,12 @@
366
366
  },
367
367
  {
368
368
  "id": "wrapper-cache-is-an-unknown-field",
369
- "why": "The v1.22 draft's shape: a good cache written as a `cache` member INSIDE bundle.json, after the wrapper was signed, and no file beside it. It is an unknown wrapper field, inside the signed scope exactly as on proof 0.13.0, so the wrapper signature fails and the pack reads failed. It is never read as a cache: nothing is printed for it and no time is asked for. A pack whose wrapper fails names no witness to look up, as on 0.13.0, so no byte lookup is made either.",
369
+ "why": "A good cache written as a `cache` member INSIDE bundle.json, after the wrapper was signed, and no file beside it. It is an unknown wrapper field, inside the signed scope, so the wrapper signature fails and the pack reads failed. It is never read as a cache: nothing is printed for it and no time is asked for. A pack whose wrapper fails names no witness to look up, so no byte lookup is made either.",
370
370
  "wrapperCache": {
371
371
  "cache_version": "sanning.witness-cache/v1",
372
372
  "witnessed": [
373
373
  {
374
- "stamp_ref": "f74af46cf35175dec5c279c83802c82df30f8b772362f759eeac207106b2cd9c",
374
+ "stamp_ref": "32824f285ea1a6fcaacc37ea81324a71ea0ba8811acde52ed36e0142a5dd5bd5",
375
375
  "block_height": 1996701,
376
376
  "block_time": 1788869407
377
377
  }
@@ -401,7 +401,7 @@
401
401
  ]
402
402
  },
403
403
  "state": "not_checked",
404
- "onChainVerdict": "undetermined",
404
+ "onChainVerdict": "not_settled",
405
405
  "exit": 1,
406
406
  "graphqlRequests": 0,
407
407
  "byteRequests": 0,
@@ -478,7 +478,7 @@
478
478
  {
479
479
  "id": "malformed-file-byte-order-mark",
480
480
  "why": "A malformed cache file, the good file after a byte-order mark. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
481
- "cacheFileHex": "efbbbf7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
481
+ "cacheFileHex": "efbbbf7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
482
482
  "expect": {
483
483
  "offline": {
484
484
  "state": "not_checked",
@@ -511,7 +511,7 @@
511
511
  {
512
512
  "id": "malformed-file-not-utf8",
513
513
  "why": "A malformed cache file, the good file with an ill-formed UTF-8 byte in an unknown member. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
514
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d2c226e6f7465223a22ff227d",
514
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d2c226e6f7465223a22ff227d",
515
515
  "expect": {
516
516
  "offline": {
517
517
  "state": "not_checked",
@@ -544,7 +544,7 @@
544
544
  {
545
545
  "id": "malformed-file-non-finite",
546
546
  "why": "A malformed cache file, the good file with NaN in an unknown member. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
547
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d2c226e6f7465223a4e614e7d",
547
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d2c226e6f7465223a4e614e7d",
548
548
  "expect": {
549
549
  "offline": {
550
550
  "state": "not_checked",
@@ -577,7 +577,7 @@
577
577
  {
578
578
  "id": "malformed-file-duplicate-member",
579
579
  "why": "A malformed cache file, witnessed named twice, an empty list first and the good list second. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
580
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b5d2c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
580
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b5d2c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
581
581
  "expect": {
582
582
  "offline": {
583
583
  "state": "not_checked",
@@ -610,7 +610,7 @@
610
610
  {
611
611
  "id": "malformed-file-nested-past-512",
612
612
  "why": "A malformed cache file, the good file with an unknown member nested 513 levels deep. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
613
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d2c226e6f7465223a5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d7d",
613
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d2c226e6f7465223a5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d7d",
614
614
  "expect": {
615
615
  "offline": {
616
616
  "state": "not_checked",
@@ -676,7 +676,7 @@
676
676
  {
677
677
  "id": "malformed-cache-is-an-array",
678
678
  "why": "A malformed cache file, an array, not an object. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
679
- "cacheFileHex": "5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d",
679
+ "cacheFileHex": "5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d",
680
680
  "expect": {
681
681
  "offline": {
682
682
  "state": "not_checked",
@@ -708,8 +708,8 @@
708
708
  },
709
709
  {
710
710
  "id": "malformed-version-missing",
711
- "why": "A malformed cache file, the v1.22 wrapper shape, no cache_version. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
712
- "cacheFileHex": "7b227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
711
+ "why": "A malformed cache file, the wrapper shape with no cache_version. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
712
+ "cacheFileHex": "7b227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
713
713
  "expect": {
714
714
  "offline": {
715
715
  "state": "not_checked",
@@ -742,7 +742,7 @@
742
742
  {
743
743
  "id": "malformed-version-unknown",
744
744
  "why": "A malformed cache file, cache_version sanning.witness-cache/v2. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
745
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7632222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
745
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7632222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
746
746
  "expect": {
747
747
  "offline": {
748
748
  "state": "not_checked",
@@ -775,7 +775,7 @@
775
775
  {
776
776
  "id": "malformed-version-not-a-string",
777
777
  "why": "A malformed cache file, cache_version 1. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
778
- "cacheFileHex": "7b2263616368655f76657273696f6e223a312c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
778
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a312c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
779
779
  "expect": {
780
780
  "offline": {
781
781
  "state": "not_checked",
@@ -841,7 +841,7 @@
841
841
  {
842
842
  "id": "malformed-witnessed-not-a-list",
843
843
  "why": "A malformed cache file, witnessed is an object. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
844
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d7d",
844
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d7d",
845
845
  "expect": {
846
846
  "offline": {
847
847
  "state": "not_checked",
@@ -907,7 +907,7 @@
907
907
  {
908
908
  "id": "malformed-time-as-a-string",
909
909
  "why": "A malformed cache file, block_time a string. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
910
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a22323032362d30392d30385431323a31303a30375a222c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
910
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a22323032362d30392d30385431323a31303a30375a222c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
911
911
  "expect": {
912
912
  "offline": {
913
913
  "state": "not_checked",
@@ -940,7 +940,7 @@
940
940
  {
941
941
  "id": "malformed-time-not-whole",
942
942
  "why": "A malformed cache file, block_time 1788869407.5. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
943
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372e352c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
943
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372e352c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
944
944
  "expect": {
945
945
  "offline": {
946
946
  "state": "not_checked",
@@ -973,7 +973,7 @@
973
973
  {
974
974
  "id": "malformed-time-negative",
975
975
  "why": "A malformed cache file, block_time -1. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
976
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a2d312c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
976
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a2d312c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
977
977
  "expect": {
978
978
  "offline": {
979
979
  "state": "not_checked",
@@ -1006,7 +1006,7 @@
1006
1006
  {
1007
1007
  "id": "malformed-time-past-9999",
1008
1008
  "why": "A malformed cache file, block_time one second past 9999-12-31T23:59:59Z. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
1009
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a3235333430323330303830302c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
1009
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a3235333430323330303830302c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
1010
1010
  "expect": {
1011
1011
  "offline": {
1012
1012
  "state": "not_checked",
@@ -1039,7 +1039,7 @@
1039
1039
  {
1040
1040
  "id": "malformed-time-a-boolean",
1041
1041
  "why": "A malformed cache file, block_time true. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
1042
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a747275652c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
1042
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a747275652c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
1043
1043
  "expect": {
1044
1044
  "offline": {
1045
1045
  "state": "not_checked",
@@ -1072,7 +1072,7 @@
1072
1072
  {
1073
1073
  "id": "malformed-time-missing",
1074
1074
  "why": "A malformed cache file, no block_time. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
1075
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
1075
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
1076
1076
  "expect": {
1077
1077
  "offline": {
1078
1078
  "state": "not_checked",
@@ -1105,7 +1105,7 @@
1105
1105
  {
1106
1106
  "id": "malformed-height-missing",
1107
1107
  "why": "A malformed cache file, no block_height. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
1108
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
1108
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
1109
1109
  "expect": {
1110
1110
  "offline": {
1111
1111
  "state": "not_checked",
@@ -1138,7 +1138,7 @@
1138
1138
  {
1139
1139
  "id": "malformed-height-unsafe",
1140
1140
  "why": "A malformed cache file, block_height 2^53. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
1141
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a393030373139393235343734303939322c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
1141
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a393030373139393235343734303939322c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
1142
1142
  "expect": {
1143
1143
  "offline": {
1144
1144
  "state": "not_checked",
@@ -1171,7 +1171,7 @@
1171
1171
  {
1172
1172
  "id": "malformed-ref-uppercase",
1173
1173
  "why": "A malformed cache file, stamp_ref in uppercase hex. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
1174
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2246373441463436434633353137354445433543323739433833383032433832444633304638423737323336324637353945454143323037313036423243443943227d5d7d",
1174
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832344632383545413141364643414143433337454138313332344137314541304241383831314143444535324544333645303134324135444435424435227d5d7d",
1175
1175
  "expect": {
1176
1176
  "offline": {
1177
1177
  "state": "not_checked",
@@ -1237,7 +1237,7 @@
1237
1237
  {
1238
1238
  "id": "malformed-ref-named-twice",
1239
1239
  "why": "A malformed cache file, two entries for the one stamp, the same values in both. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
1240
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d2c7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
1240
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d2c7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
1241
1241
  "expect": {
1242
1242
  "offline": {
1243
1243
  "state": "not_checked",
@@ -1270,7 +1270,7 @@
1270
1270
  {
1271
1271
  "id": "malformed-ref-named-twice-one-malformed",
1272
1272
  "why": "A malformed cache file, two entries for the one stamp, one of them malformed. It reads as no cache: nothing is printed for it, no time is asked for, and nothing moves.",
1273
- "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d2c7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a22736f6f6e222c227374616d705f726566223a2266373461663436636633353137356465633563323739633833383032633832646633306638623737323336326637353965656163323037313036623263643963227d5d7d",
1273
+ "cacheFileHex": "7b2263616368655f76657273696f6e223a2273616e6e696e672e7769746e6573732d63616368652f7631222c227769746e6573736564223a5b7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a313738383836393430372c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d2c7b22626c6f636b5f686569676874223a313939363730312c22626c6f636b5f74696d65223a22736f6f6e222c227374616d705f726566223a2233323832346632383565613161366663616163633337656138313332346137316561306261383831316163646535326564333665303134326135646435626435227d5d7d",
1274
1274
  "expect": {
1275
1275
  "offline": {
1276
1276
  "state": "not_checked",
@@ -1,28 +0,0 @@
1
- import type { Envelope } from "./types.js";
2
- export declare const AGENT_PROOF_SPEC_VERSION = "sanning.agent.proof/v1";
3
- export interface AgentProofBundle {
4
- spec_version: string;
5
- checkpoint_envelope: Envelope;
6
- checkpoint_tx_id: string;
7
- leaf: Record<string, unknown>;
8
- leaf_index: number;
9
- audit_path: string[];
10
- [k: string]: unknown;
11
- }
12
- export interface AgentProofResult {
13
- status: "verified" | "failed" | "partial" | "malformed";
14
- checkpointOk: boolean;
15
- inclusionOk: boolean;
16
- onChainOk: boolean | null;
17
- onChainChecked: boolean;
18
- leafIndex: number;
19
- leafCount: number | null;
20
- checkpointTxId: string | null;
21
- errors: string[];
22
- }
23
- export interface VerifyAgentProofOptions {
24
- gateways?: string[];
25
- fetchImpl?: typeof fetch;
26
- }
27
- export declare function isAgentProofSpec(specVersion: unknown): boolean;
28
- export declare function verifyAgentProof(bundle: unknown, options?: VerifyAgentProofOptions): Promise<AgentProofResult>;