@onchaindiligence/agent-evidence 0.1.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/conformance/README.md +31 -0
  4. package/conformance/duplicate-outer-key.json +1 -0
  5. package/conformance/manifest.json +74 -0
  6. package/conformance/missing-parent.json +31 -0
  7. package/conformance/noncanonical-payload.json +31 -0
  8. package/conformance/rfc8785-vectors.json +31 -0
  9. package/conformance/valid-full-graph.json +31 -0
  10. package/dist/canonical.d.ts +14 -0
  11. package/dist/canonical.d.ts.map +1 -0
  12. package/dist/canonical.js +249 -0
  13. package/dist/canonical.js.map +1 -0
  14. package/dist/constants.d.ts +9 -0
  15. package/dist/constants.d.ts.map +1 -0
  16. package/dist/constants.js +9 -0
  17. package/dist/constants.js.map +1 -0
  18. package/dist/dsse.d.ts +10 -0
  19. package/dist/dsse.d.ts.map +1 -0
  20. package/dist/dsse.js +85 -0
  21. package/dist/dsse.js.map +1 -0
  22. package/dist/errors.d.ts +16 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +19 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/graph.d.ts +3 -0
  27. package/dist/graph.d.ts.map +1 -0
  28. package/dist/graph.js +227 -0
  29. package/dist/graph.js.map +1 -0
  30. package/dist/index.d.ts +14 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +10 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/records.d.ts +14 -0
  35. package/dist/records.d.ts.map +1 -0
  36. package/dist/records.js +55 -0
  37. package/dist/records.js.map +1 -0
  38. package/dist/schema.d.ts +4 -0
  39. package/dist/schema.d.ts.map +1 -0
  40. package/dist/schema.js +45 -0
  41. package/dist/schema.js.map +1 -0
  42. package/dist/trust.d.ts +64 -0
  43. package/dist/trust.d.ts.map +1 -0
  44. package/dist/trust.js +254 -0
  45. package/dist/trust.js.map +1 -0
  46. package/dist/types.d.ts +83 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/verifier.d.ts +5 -0
  51. package/dist/verifier.d.ts.map +1 -0
  52. package/dist/verifier.js +489 -0
  53. package/dist/verifier.js.map +1 -0
  54. package/examples/withheld-payment.mjs +67 -0
  55. package/package.json +65 -0
  56. package/schemas/attestation-key.schema.json +88 -0
  57. package/schemas/bundle-payload.schema.json +32 -0
  58. package/schemas/catalog.json +20 -0
  59. package/schemas/common.schema.json +35 -0
  60. package/schemas/dsse-envelope.schema.json +34 -0
  61. package/schemas/portable-file.schema.json +62 -0
  62. package/schemas/proof.schema.json +98 -0
  63. package/schemas/record.schema.json +286 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OnChainDiligence
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # @onchaindiligence/agent-evidence
2
+
3
+ Production Node.js/TypeScript implementation of the published
4
+ OnChainDiligence Agent Evidence v0 protocol. It creates deterministic records,
5
+ validates the complete evidence DAG, seals bundles with Ed25519 DSSE, and
6
+ verifies portable bundles offline with caller-supplied trust.
7
+
8
+ The package is currently **packable and publish-ready, but not yet published to
9
+ npm**. Do not advertise a registry install until the owner completes npm trusted
10
+ publishing. From this repository, test the exact public artifact with:
11
+
12
+ ```sh
13
+ npm pack ./packages/agent-evidence
14
+ npm install ./onchaindiligence-agent-evidence-0.1.0.tgz
15
+ ```
16
+
17
+ Node.js 20.19 or newer and ESM are required.
18
+
19
+ ## What a signature proves
20
+
21
+ A valid signature proves that the identified key signed the exact canonical
22
+ bundle bytes and that the bundle satisfies the protocol and caller's trust
23
+ policy. It does not prove that an upstream fact is objectively true. Source
24
+ proofs establish attribution to a witness; the verifier never turns embedded
25
+ keys into trust and never contacts OnChainDiligence, a blockchain, a schema
26
+ server, or an evidence provider.
27
+
28
+ ## Stable public API
29
+
30
+ - `createRecord(kind, statement, options)` creates a schema-valid v0 record and
31
+ derives its deterministic content ID.
32
+ - `contentId(value)` and `canonicalize(value)` expose the protocol's exact
33
+ RFC 8785 content-addressing boundary.
34
+ - `createBundlePayload(records, options)` sorts records and validates IDs,
35
+ roots, references, required relationships, graph completeness, and cycles.
36
+ - `createEd25519Signer(privateKey)` creates a local Node Ed25519 signer.
37
+ - `sealBundle(payload, signer, options)` validates, canonicalizes, performs
38
+ exact DSSE PAE, verifies the caller signer result, and returns portable data.
39
+ - `createKeyRecord(publicKey, options)` produces a validated lifecycle record.
40
+ - `TrustPolicy.fromKeyRecords(records, options)` creates explicit caller trust.
41
+ - `verifyBundle(bundle, trustPolicy)` returns a machine-readable tri-state
42
+ `VerificationReport` without network access.
43
+ - `validateBundlePayload` and `validateDocument` support explicit validation.
44
+ - `parseJson`, `parseTimestamp`, `formatTimestamp`, `deriveKeyId`, `dssePae`,
45
+ and the documented constants/types cover protocol-safe lower-level use.
46
+
47
+ Construction/configuration errors are typed as `AgentEvidenceError` subclasses:
48
+ `CanonicalizationError`, `ParseError`, `SchemaValidationError`,
49
+ `EvidenceValidationError`, `SigningError`, and `TrustPolicyError`.
50
+
51
+ ## Verification states
52
+
53
+ - `VALID`: every required structural, graph, cryptographic, lifecycle,
54
+ freshness, and caller-trust component passed.
55
+ - `INVALID`: the document violates the protocol, such as a bad signature,
56
+ altered content ID, invalid edge, unsupported version, or invalid key window.
57
+ - `UNVERIFIABLE`: the document may be coherent, but caller trust or required
58
+ evidence material is insufficient.
59
+
60
+ `UNVERIFIABLE` is never promoted to `VALID` or collapsed into `INVALID`.
61
+ Inspect `report.components` for stable codes, key/record references, and
62
+ diagnostics.
63
+
64
+ ## Trust and key rotation
65
+
66
+ Trust is supplied only through `TrustPolicy`. Keys carried inside the portable
67
+ bundle are untrusted hints. Active and retired historical Ed25519 keys are
68
+ evaluated against the bundle's signed `created_at` and their explicit validity
69
+ interval. Revoked or compromised keys are invalid. A missing defensible
70
+ `valid_from` is `UNVERIFIABLE`, not guessed. Replacement links must be distinct
71
+ and resolve inside the caller's trust set.
72
+
73
+ ## Signing
74
+
75
+ `sealBundle` accepts an `Ed25519Signer` containing a key ID, public key, and
76
+ sync/async signing callback. It verifies that the key ID matches the public key
77
+ and that the returned signature is valid before emitting a bundle. This allows
78
+ external signing implementations without introducing remote signing or key
79
+ fetching into the protocol. `createEd25519Signer` is the local PKCS8/`KeyObject`
80
+ convenience implementation.
81
+
82
+ Private key material is never loaded from files or configuration by this
83
+ package and no production signing key is bundled.
84
+
85
+ ## Financial-agent example
86
+
87
+ [`examples/withheld-payment.mjs`](./examples/withheld-payment.mjs) builds
88
+ Principal → Agent → Mandate → Run → Evidence/Policy → Decision → Execution,
89
+ where policy withholds an invoice payment because recipient ownership evidence
90
+ is missing. The execution is `withheld-not-submitted`; the example does not
91
+ fabricate a transaction or settlement.
92
+
93
+ ## Schemas and interoperability
94
+
95
+ The npm artifact includes the canonical v0 schemas and public conformance
96
+ corpus. Build tests fail if packaged files differ byte-for-byte from
97
+ `spec/agent-evidence/v0`. The same deterministic fixture is produced and
98
+ verified by both the TypeScript and Python implementations.
@@ -0,0 +1,31 @@
1
+ # Agent Evidence v0 conformance corpus
2
+
3
+ These fixtures are language-neutral inputs for Agent Evidence v0 producers and
4
+ verifiers. `manifest.json` is the case index and records the exact expected
5
+ overall state. `valid-full-graph.json` contains all eight v0 record kinds and a
6
+ real Ed25519 DSSE signature. The other static files isolate canonicalization,
7
+ graph, and duplicate-name failures; JSON Patch mutations use RFC 6902 paths.
8
+
9
+ The deterministic private seed in `generate.mjs` is public test material. It
10
+ MUST NOT be deployed, configured as a production trust root, or accepted
11
+ outside conformance tests. Regeneration is deterministic:
12
+
13
+ ```text
14
+ node generate.mjs portable
15
+ node generate.mjs noncanonicalPayload
16
+ node generate.mjs missingParent
17
+ ```
18
+
19
+ Verification rules:
20
+
21
+ 1. Parse with duplicate-name rejection before ordinary JSON-schema validation.
22
+ 2. Validate the portable file and the decoded payload against the schemas in
23
+ `../schema`.
24
+ 3. Apply caller trust from `trusted_key_ids`; embedded keys are hints only.
25
+ 4. Verify DSSE over the exact decoded bytes before parsing the payload.
26
+ 5. Enforce RFC 8785 bytes, IDs, ordering, DAG, references, key lifecycle, and
27
+ policy in the normative order from `docs/AGENT_EVIDENCE_V0.md`.
28
+
29
+ JSON Schema covers representation constraints. Graph relationships,
30
+ canonical bytes, signatures, key derivation/trust, and tri-state outcomes are
31
+ semantic conformance requirements and therefore have explicit corpus cases.
@@ -0,0 +1 @@
1
+ {"media_type":"application/vnd.onchaindiligence.agent-evidence+json","media_type":"application/vnd.onchaindiligence.agent-evidence+json","bundle_version":"onchaindiligence.agent-evidence.bundle.v0","envelope":{},"verification_material":{}}
@@ -0,0 +1,74 @@
1
+ {
2
+ "corpus_id": "onchaindiligence.agent-evidence.v0.conformance",
3
+ "corpus_version": "2026-08-28",
4
+ "test_key_warning": "Public deterministic test key only. Never trust or deploy it.",
5
+ "base_fixture": "valid-full-graph.json",
6
+ "cases": [
7
+ {
8
+ "id": "valid-full-graph",
9
+ "fixture": "valid-full-graph.json",
10
+ "trusted_key_ids": ["ed25519-3rLe053Cb84OYIW2"],
11
+ "expected": "VALID",
12
+ "covers": ["all-record-kinds", "record-ids", "bundle-id", "dag", "dsse", "key-window"]
13
+ },
14
+ {
15
+ "id": "invalid-signature",
16
+ "fixture": "valid-full-graph.json",
17
+ "outer_json_patch": [
18
+ {
19
+ "op": "replace",
20
+ "path": "/envelope/signatures/0/sig",
21
+ "value": "cpQSw7HTSuaPKkYzc/FXL/9lplP5ZEceSesmhQioOqtYXRwdf6jVrnuHZ06+AnfxaFybj/s6oNz5AnZTYF/wBQ=="
22
+ }
23
+ ],
24
+ "trusted_key_ids": ["ed25519-3rLe053Cb84OYIW2"],
25
+ "expected": "INVALID",
26
+ "reason": "dsse-signature"
27
+ },
28
+ {
29
+ "id": "outer-version-mismatch",
30
+ "fixture": "valid-full-graph.json",
31
+ "outer_json_patch": [
32
+ {
33
+ "op": "replace",
34
+ "path": "/bundle_version",
35
+ "value": "onchaindiligence.agent-evidence.bundle.v9"
36
+ }
37
+ ],
38
+ "trusted_key_ids": ["ed25519-3rLe053Cb84OYIW2"],
39
+ "expected": "INVALID",
40
+ "reason": "outer-inner-version-mismatch"
41
+ },
42
+ {
43
+ "id": "noncanonical-signed-payload",
44
+ "fixture": "noncanonical-payload.json",
45
+ "trusted_key_ids": ["ed25519-3rLe053Cb84OYIW2"],
46
+ "expected": "INVALID",
47
+ "reason": "payload-not-rfc8785",
48
+ "note": "The DSSE signature is valid over payload bytes prefixed by one ASCII space."
49
+ },
50
+ {
51
+ "id": "missing-parent",
52
+ "fixture": "missing-parent.json",
53
+ "trusted_key_ids": ["ed25519-3rLe053Cb84OYIW2"],
54
+ "expected": "INVALID",
55
+ "reason": "missing-parent",
56
+ "note": "The DSSE signature is valid; the changed record also intentionally exposes a record-ID mismatch."
57
+ },
58
+ {
59
+ "id": "unknown-key",
60
+ "fixture": "valid-full-graph.json",
61
+ "trusted_key_ids": [],
62
+ "expected": "UNVERIFIABLE",
63
+ "reason": "no-caller-trusted-key",
64
+ "note": "The embedded key is a hint and MUST NOT become trusted merely because it is embedded."
65
+ },
66
+ {
67
+ "id": "duplicate-outer-key",
68
+ "fixture": "duplicate-outer-key.json",
69
+ "trusted_key_ids": ["ed25519-3rLe053Cb84OYIW2"],
70
+ "expected": "INVALID",
71
+ "reason": "duplicate-json-name"
72
+ }
73
+ ]
74
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "media_type": "application/vnd.onchaindiligence.agent-evidence+json",
3
+ "bundle_version": "onchaindiligence.agent-evidence.bundle.v0",
4
+ "envelope": {
5
+ "payloadType": "application/vnd.onchaindiligence.agent-evidence.bundle.v0+json",
6
+ "payload": "eyJidW5kbGVfaWQiOiJzaGEyNTY6ZXpweWczM05SQWNTWllrekpnMzJsX0dURlBNUzdGNnBoMVJ3VzFxZXNtbyIsImJ1bmRsZV92ZXJzaW9uIjoib25jaGFpbmRpbGlnZW5jZS5hZ2VudC1ldmlkZW5jZS5idW5kbGUudjAiLCJjcmVhdGVkX2F0IjoiMjAyNi0wOC0yOFQxMjowMDowNi4wMDBaIiwiZXh0ZW5zaW9ucyI6e30sInJlY29yZHMiOlt7ImlkIjoic2hhMjU2Oi12NVM2Qmg0OFdVNmpDY2hzOFFlOThpdmZfQV9wZEVJR3RtY3hmTThveEkiLCJraW5kIjoiZXhlY3V0aW9uIiwicGFyZW50cyI6WyJzaGEyNTY6Rkx5WVZncWNGTzIxN0JQWDJUMXVpcUpMT2dNaU1OODc5YXZUN3ZLQzhyayJdLCJwcm9vZnMiOltdLCJyZWNvcmRfdmVyc2lvbiI6Im9uY2hhaW5kaWxpZ2VuY2UuYWdlbnQtZXZpZGVuY2UucmVjb3JkLnYwIiwic3RhdGVtZW50Ijp7ImFtb3VudCI6IjEuMDAiLCJhc3NldCI6InBhdGhVU0QiLCJibG9ja19udW1iZXIiOiIxMjM0NTY3OCIsImNvbmZpcm1lZF9hdCI6IjIwMjYtMDgtMjhUMTI6MDA6MDUuMDAwWiIsImRlY2lzaW9uX3JlZiI6InNoYTI1NjpGTHlZVmdxY0ZPMjE3QlBYMlQxdWlxSkxPZ01pTU44NzlhdlQ3dktDOHJrIiwiZXhlY3V0aW9uX2lkIjoiZXhlY3V0aW9uLWNvbmZvcm1hbmNlLTAwMSIsImV4ZWN1dGlvbl90eXBlIjoib25jaGFpbi10cmFuc2ZlciIsIm5ldHdvcmsiOiJlaXAxNTU6MSIsInJlY2lwaWVudCI6IjB4MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiIsInNlbmRlciI6IjB4MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMyIsInN0YXR1cyI6ImNvbmZpcm1lZCIsInN1Ym1pdHRlZF9hdCI6IjIwMjYtMDgtMjhUMTI6MDA6MDQuMDAwWiIsInRyYW5zYWN0aW9uX2RpZ2VzdCI6eyJzaGEyNTYiOiJTa0xCZFBnSVJrbVF0bkowZ3UtTjYyOFN3a2xKUkVIUXVldDhMQXNkUGRNIn0sInRyYW5zYWN0aW9uX2hhc2giOiIweDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEifX0seyJpZCI6InNoYTI1NjpGTHlZVmdxY0ZPMjE3QlBYMlQxdWlxSkxPZ01pTU44NzlhdlQ3dktDOHJrIiwia2luZCI6ImRlY2lzaW9uIiwicGFyZW50cyI6WyJzaGEyNTY6RzFneFBucVNxTEJMQXFodHpXWmllbEF6OTVHQW9KeGRINjJ1Q2l5Z2t1ZyIsInNoYTI1NjpoV05LbEs0WWlCUG9SVEpFOVNEZTRpZG5mNmxHUGF3UUlybG9qYWVpU2g0Iiwic2hhMjU2OmlxWTZvVWI5V3BRSkhUY3YzdHFIdS04Q3UyNW5OdjdDQVhRWkRoX0huWmciXSwicHJvb2ZzIjpbXSwicmVjb3JkX3ZlcnNpb24iOiJvbmNoYWluZGlsaWdlbmNlLmFnZW50LWV2aWRlbmNlLnJlY29yZC52MCIsInN0YXRlbWVudCI6eyJhZ2VudF9yZWYiOiJzaGEyNTY6TzF6aEkxSnFEY21lS09oU3dSWlQyMGE3aUVDNzFqbEg2LTBRV2JSX0M1NCIsImRlY2lkZWRfYXQiOiIyMDI2LTA4LTI4VDEyOjAwOjAzLjAwMFoiLCJkZWNpc2lvbl9pZCI6ImRlY2lzaW9uLWNvbmZvcm1hbmNlLTAwMSIsImRlY2lzaW9uX3R5cGUiOiJwYXltZW50LWFwcHJvdmFsIiwiZXZpZGVuY2VfcmVmcyI6WyJzaGEyNTY6RzFneFBucVNxTEJMQXFodHpXWmllbEF6OTVHQW9KeGRINjJ1Q2l5Z2t1ZyJdLCJvdXRjb21lIjp7ImFwcHJvdmVkIjp0cnVlfSwicG9saWN5X2RpZ2VzdCI6eyJzaGEyNTYiOiI0VEhWMVNmTkFQTTlIVEx2X05fMGFlSW11YUZmbTlyTmVMUG04ZGtQdTR3In0sInBvbGljeV9yZWYiOiJzaGEyNTY6aXFZNm9VYjlXcFFKSFRjdjN0cUh1LThDdTI1bk52N0NBWFFaRGhfSG5aZyIsInJ1bl9yZWYiOiJzaGEyNTY6aFdOS2xLNFlpQlBvUlRKRTlTRGU0aWRuZjZsR1Bhd1FJcmxvamFlaVNoNCJ9fSx7ImlkIjoic2hhMjU2OkcxZ3hQbnFTcUxCTEFxaHR6V1ppZWxBejk1R0FvSnhkSDYydUNpeWdrdWciLCJraW5kIjoiZXZpZGVuY2UiLCJwYXJlbnRzIjpbInNoYTI1NjpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIl0sInByb29mcyI6W3siZGlnZXN0Ijp7InNoYTI1NiI6IlpORk1taXV4VE0zYU5GcFZqLWNtMjNCR0V2Z0REZnpnZ0VUY092Z3djVzgifSwibWVkaWFfdHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJwcm9vZl90eXBlIjoiZXh0ZXJuYWwtZGlnZXN0In1dLCJyZWNvcmRfdmVyc2lvbiI6Im9uY2hhaW5kaWxpZ2VuY2UuYWdlbnQtZXZpZGVuY2UucmVjb3JkLnYwIiwic3RhdGVtZW50Ijp7ImV2aWRlbmNlX3R5cGUiOiJzYW5jdGlvbnMtc2NyZWVuIiwiZXhwaXJlc19hdCI6bnVsbCwib2JzZXJ2ZWRfYXQiOiIyMDI2LTA4LTI4VDEyOjAwOjAxLjAwMFoiLCJyZXF1ZXN0Ijp7ImRpZ2VzdCI6eyJzaGEyNTYiOiJwel95UjU2SzJIdmE2OUtrZ1I0VjF0T0Z5bXlZbDdBaEgwYmJVMWF5WnVNIn0sIm1lZGlhX3R5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sInJlc3BvbnNlIjp7ImRpZ2VzdCI6eyJzaGEyNTYiOiJaTkZNbWl1eFRNM2FORnBWai1jbTIzQkdFdmdERGZ6Z2dFVGNPdmd3Y1c4In0sIm1lZGlhX3R5cGUiOiJhcHBsaWNhdGlvbi9qc29uIiwibW9kZSI6ImVtYmVkZGVkIiwidmFsdWUiOnsic2FuY3Rpb25lZCI6ZmFsc2V9fSwicnVuX3JlZiI6InNoYTI1NjpoV05LbEs0WWlCUG9SVEpFOVNEZTRpZG5mNmxHUGF3UUlybG9qYWVpU2g0Iiwic2NvcGUiOnsiY292ZXJhZ2UiOiJvbmUgdGVzdCBhZGRyZXNzIiwicXVlcnkiOiIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEifSwic291cmNlIjp7ImlkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5pbnZhbGlkIiwidHlwZSI6Imh0dHBzLWFwaSJ9LCJ0b29sIjp7Im5hbWUiOiJzY3JlZW5fd2FsbGV0IiwidmVyc2lvbiI6IjEifSwidHJ1c3RfbW9kZSI6ImFnZW50LWFzc2VydGlvbiJ9fSx7ImlkIjoic2hhMjU2OkhKZ2hUX3hIS2FDNWJTXzVINnBYYjlTSFZSbXNhMXhlWG8ydXZwVFVGcWciLCJraW5kIjoicHJpbmNpcGFsIiwicGFyZW50cyI6W10sInByb29mcyI6W10sInJlY29yZF92ZXJzaW9uIjoib25jaGFpbmRpbGlnZW5jZS5hZ2VudC1ldmlkZW5jZS5yZWNvcmQudjAiLCJzdGF0ZW1lbnQiOnsiZGlzcGxheV9uYW1lIjoiQ29uZm9ybWFuY2UgVHJlYXN1cnkiLCJwcmluY2lwYWxfaWQiOiJ1cm46b25jaGFpbmRpbGlnZW5jZTp0ZXN0OnRyZWFzdXJ5IiwicHJpbmNpcGFsX3R5cGUiOiJvcmdhbml6YXRpb24ifX0seyJpZCI6InNoYTI1NjpPMXpoSTFKcURjbWVLT2hTd1JaVDIwYTdpRUM3MWpsSDYtMFFXYlJfQzU0Iiwia2luZCI6ImFnZW50IiwicGFyZW50cyI6WyJzaGEyNTY6SEpnaFRfeEhLYUM1YlNfNUg2cFhiOVNIVlJtc2ExeGVYbzJ1dnBUVUZxZyJdLCJwcm9vZnMiOltdLCJyZWNvcmRfdmVyc2lvbiI6Im9uY2hhaW5kaWxpZ2VuY2UuYWdlbnQtZXZpZGVuY2UucmVjb3JkLnYwIiwic3RhdGVtZW50Ijp7ImFnZW50X2lkIjoidXJuOm9uY2hhaW5kaWxpZ2VuY2U6dGVzdDphZ2VudCIsImFnZW50X3ZlcnNpb24iOiIxLjAuMCIsIm9wZXJhdG9yX3JlZiI6InNoYTI1NjpISmdoVF94SEthQzViU181SDZwWGI5U0hWUm1zYTF4ZVhvMnV2cFRVRnFnIn19LHsiaWQiOiJzaGEyNTY6aFdOS2xLNFlpQlBvUlRKRTlTRGU0aWRuZjZsR1Bhd1FJcmxvamFlaVNoNCIsImtpbmQiOiJydW4iLCJwYXJlbnRzIjpbInNoYTI1NjpPMXpoSTFKcURjbWVLT2hTd1JaVDIwYTdpRUM3MWpsSDYtMFFXYlJfQzU0Iiwic2hhMjU2Om12bUg5TWRpeTRDdlZSU2RXclIyUVFRejlPYWVnNDhpdlVMR2RxVjBxU3MiXSwicHJvb2ZzIjpbXSwicmVjb3JkX3ZlcnNpb24iOiJvbmNoYWluZGlsaWdlbmNlLmFnZW50LWV2aWRlbmNlLnJlY29yZC52MCIsInN0YXRlbWVudCI6eyJhZ2VudF9yZWYiOiJzaGEyNTY6TzF6aEkxSnFEY21lS09oU3dSWlQyMGE3aUVDNzFqbEg2LTBRV2JSX0M1NCIsImVuZGVkX2F0IjoiMjAyNi0wOC0yOFQxMjowMDowNS4wMDBaIiwibWFuZGF0ZV9yZWYiOiJzaGEyNTY6bXZtSDlNZGl5NEN2VlJTZFdyUjJRUVF6OU9hZWc0OGl2VUxHZHFWMHFTcyIsInJ1bl9leHRlcm5hbF9pZCI6InJ1bi1jb25mb3JtYW5jZS0wMDEiLCJzdGFydGVkX2F0IjoiMjAyNi0wOC0yOFQxMjowMDowMC4wMDBaIn19LHsiaWQiOiJzaGEyNTY6aXFZNm9VYjlXcFFKSFRjdjN0cUh1LThDdTI1bk52N0NBWFFaRGhfSG5aZyIsImtpbmQiOiJwb2xpY3kiLCJwYXJlbnRzIjpbInNoYTI1NjpoV05LbEs0WWlCUG9SVEpFOVNEZTRpZG5mNmxHUGF3UUlybG9qYWVpU2g0Il0sInByb29mcyI6W10sInJlY29yZF92ZXJzaW9uIjoib25jaGFpbmRpbGlnZW5jZS5hZ2VudC1ldmlkZW5jZS5yZWNvcmQudjAiLCJzdGF0ZW1lbnQiOnsiZGlnZXN0Ijp7InNoYTI1NiI6IjRUSFYxU2ZOQVBNOUhUTHZfTl8wYWVJbXVhRmZtOXJOZUxQbThka1B1NHcifSwiZWZmZWN0aXZlX2Zyb20iOiIyMDI2LTA4LTI4VDAwOjAwOjAwLjAwMFoiLCJwb2xpY3kiOnsicnVsZSI6InNhbmN0aW9uZWQgbXVzdCBiZSBmYWxzZSJ9LCJwb2xpY3lfaWQiOiJ1cm46b25jaGFpbmRpbGlnZW5jZTp0ZXN0OnBvbGljeSIsInNvdXJjZSI6Imh0dHBzOi8vZXhhbXBsZS5pbnZhbGlkL3BvbGljeS8xIiwidmVyc2lvbiI6IjEifX0seyJpZCI6InNoYTI1Njptdm1IOU1kaXk0Q3ZWUlNkV3JSMlFRUXo5T2FlZzQ4aXZVTEdkcVYwcVNzIiwia2luZCI6Im1hbmRhdGUiLCJwYXJlbnRzIjpbInNoYTI1NjpISmdoVF94SEthQzViU181SDZwWGI5U0hWUm1zYTF4ZVhvMnV2cFRVRnFnIl0sInByb29mcyI6W10sInJlY29yZF92ZXJzaW9uIjoib25jaGFpbmRpbGlnZW5jZS5hZ2VudC1ldmlkZW5jZS5yZWNvcmQudjAiLCJzdGF0ZW1lbnQiOnsibGltaXRzIjp7ImFtb3VudCI6IjEwLjAwIn0sIm1hbmRhdGVfaWQiOiJtYW5kYXRlLWNvbmZvcm1hbmNlLTAwMSIsInByaW5jaXBhbF9yZWYiOiJzaGEyNTY6SEpnaFRfeEhLYUM1YlNfNUg2cFhiOVNIVlJtc2ExeGVYbzJ1dnBUVUZxZyIsInNjb3BlIjp7ImFjdGlvbiI6InBheSIsImFzc2V0IjoicGF0aFVTRCIsIm1heF9hbW91bnQiOiIxMC4wMCJ9LCJ2YWxpZF9mcm9tIjoiMjAyNi0wOC0yOFQwMDowMDowMC4wMDBaIiwidmFsaWRfdW50aWwiOiIyMDI2LTA4LTI5VDAwOjAwOjAwLjAwMFoifX1dLCJyb290X2lkcyI6WyJzaGEyNTY6LXY1UzZCaDQ4V1U2akNjaHM4UWU5OGl2Zl9BX3BkRUlHdG1jeGZNOG94SSJdLCJydW5faWQiOiJzaGEyNTY6aFdOS2xLNFlpQlBvUlRKRTlTRGU0aWRuZjZsR1Bhd1FJcmxvamFlaVNoNCJ9",
7
+ "signatures": [
8
+ {
9
+ "keyid": "ed25519-3rLe053Cb84OYIW2",
10
+ "sig": "U1yLRqrtQYTk1phwK6Q3uLZswXBU7kEs2YaLNDJl8Z0S9ywetcl1pbPJFcjwU8kuTFVmpO4p0XTNcSbRCSxqCQ=="
11
+ }
12
+ ]
13
+ },
14
+ "verification_material": {
15
+ "keys": [
16
+ {
17
+ "key_id": "ed25519-3rLe053Cb84OYIW2",
18
+ "algorithm": "ed25519",
19
+ "public_key_pem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAPUAXw+hDiVqStwqnTRt+vJyYLM8uxJaMwM1V8Sr0Zgw=\n-----END PUBLIC KEY-----\n",
20
+ "status": "active",
21
+ "valid_from": "2026-08-28T00:00:00.000Z",
22
+ "valid_until": null,
23
+ "status_changed_at": "2026-08-28T00:00:00.000Z",
24
+ "replacement_key_id": null,
25
+ "compromised_at": null
26
+ }
27
+ ],
28
+ "registry_snapshots": [],
29
+ "anchors": []
30
+ }
31
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "media_type": "application/vnd.onchaindiligence.agent-evidence+json",
3
+ "bundle_version": "onchaindiligence.agent-evidence.bundle.v0",
4
+ "envelope": {
5
+ "payloadType": "application/vnd.onchaindiligence.agent-evidence.bundle.v0+json",
6
+ "payload": "IHsiYnVuZGxlX2lkIjoic2hhMjU2OmV6cHlnMzNOUkFjU1pZa3pKZzMybF9HVEZQTVM3RjZwaDFSd1cxcWVzbW8iLCJidW5kbGVfdmVyc2lvbiI6Im9uY2hhaW5kaWxpZ2VuY2UuYWdlbnQtZXZpZGVuY2UuYnVuZGxlLnYwIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDgtMjhUMTI6MDA6MDYuMDAwWiIsImV4dGVuc2lvbnMiOnt9LCJyZWNvcmRzIjpbeyJpZCI6InNoYTI1NjotdjVTNkJoNDhXVTZqQ2NoczhRZTk4aXZmX0FfcGRFSUd0bWN4Zk04b3hJIiwia2luZCI6ImV4ZWN1dGlvbiIsInBhcmVudHMiOlsic2hhMjU2OkZMeVlWZ3FjRk8yMTdCUFgyVDF1aXFKTE9nTWlNTjg3OWF2VDd2S0M4cmsiXSwicHJvb2ZzIjpbXSwicmVjb3JkX3ZlcnNpb24iOiJvbmNoYWluZGlsaWdlbmNlLmFnZW50LWV2aWRlbmNlLnJlY29yZC52MCIsInN0YXRlbWVudCI6eyJhbW91bnQiOiIxLjAwIiwiYXNzZXQiOiJwYXRoVVNEIiwiYmxvY2tfbnVtYmVyIjoiMTIzNDU2NzgiLCJjb25maXJtZWRfYXQiOiIyMDI2LTA4LTI4VDEyOjAwOjA1LjAwMFoiLCJkZWNpc2lvbl9yZWYiOiJzaGEyNTY6Rkx5WVZncWNGTzIxN0JQWDJUMXVpcUpMT2dNaU1OODc5YXZUN3ZLQzhyayIsImV4ZWN1dGlvbl9pZCI6ImV4ZWN1dGlvbi1jb25mb3JtYW5jZS0wMDEiLCJleGVjdXRpb25fdHlwZSI6Im9uY2hhaW4tdHJhbnNmZXIiLCJuZXR3b3JrIjoiZWlwMTU1OjEiLCJyZWNpcGllbnQiOiIweDIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIiLCJzZW5kZXIiOiIweDMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMiLCJzdGF0dXMiOiJjb25maXJtZWQiLCJzdWJtaXR0ZWRfYXQiOiIyMDI2LTA4LTI4VDEyOjAwOjA0LjAwMFoiLCJ0cmFuc2FjdGlvbl9kaWdlc3QiOnsic2hhMjU2IjoiU2tMQmRQZ0lSa21RdG5KMGd1LU42MjhTd2tsSlJFSFF1ZXQ4TEFzZFBkTSJ9LCJ0cmFuc2FjdGlvbl9oYXNoIjoiMHgxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIn19LHsiaWQiOiJzaGEyNTY6Rkx5WVZncWNGTzIxN0JQWDJUMXVpcUpMT2dNaU1OODc5YXZUN3ZLQzhyayIsImtpbmQiOiJkZWNpc2lvbiIsInBhcmVudHMiOlsic2hhMjU2OkcxZ3hQbnFTcUxCTEFxaHR6V1ppZWxBejk1R0FvSnhkSDYydUNpeWdrdWciLCJzaGEyNTY6aFdOS2xLNFlpQlBvUlRKRTlTRGU0aWRuZjZsR1Bhd1FJcmxvamFlaVNoNCIsInNoYTI1NjppcVk2b1ViOVdwUUpIVGN2M3RxSHUtOEN1MjVuTnY3Q0FYUVpEaF9IblpnIl0sInByb29mcyI6W10sInJlY29yZF92ZXJzaW9uIjoib25jaGFpbmRpbGlnZW5jZS5hZ2VudC1ldmlkZW5jZS5yZWNvcmQudjAiLCJzdGF0ZW1lbnQiOnsiYWdlbnRfcmVmIjoic2hhMjU2Ok8xemhJMUpxRGNtZUtPaFN3UlpUMjBhN2lFQzcxamxINi0wUVdiUl9DNTQiLCJkZWNpZGVkX2F0IjoiMjAyNi0wOC0yOFQxMjowMDowMy4wMDBaIiwiZGVjaXNpb25faWQiOiJkZWNpc2lvbi1jb25mb3JtYW5jZS0wMDEiLCJkZWNpc2lvbl90eXBlIjoicGF5bWVudC1hcHByb3ZhbCIsImV2aWRlbmNlX3JlZnMiOlsic2hhMjU2OkcxZ3hQbnFTcUxCTEFxaHR6V1ppZWxBejk1R0FvSnhkSDYydUNpeWdrdWciXSwib3V0Y29tZSI6eyJhcHByb3ZlZCI6dHJ1ZX0sInBvbGljeV9kaWdlc3QiOnsic2hhMjU2IjoiNFRIVjFTZk5BUE05SFRMdl9OXzBhZUltdWFGZm05ck5lTFBtOGRrUHU0dyJ9LCJwb2xpY3lfcmVmIjoic2hhMjU2OmlxWTZvVWI5V3BRSkhUY3YzdHFIdS04Q3UyNW5OdjdDQVhRWkRoX0huWmciLCJydW5fcmVmIjoic2hhMjU2OmhXTktsSzRZaUJQb1JUSkU5U0RlNGlkbmY2bEdQYXdRSXJsb2phZWlTaDQifX0seyJpZCI6InNoYTI1NjpHMWd4UG5xU3FMQkxBcWh0eldaaWVsQXo5NUdBb0p4ZEg2MnVDaXlna3VnIiwia2luZCI6ImV2aWRlbmNlIiwicGFyZW50cyI6WyJzaGEyNTY6aFdOS2xLNFlpQlBvUlRKRTlTRGU0aWRuZjZsR1Bhd1FJcmxvamFlaVNoNCJdLCJwcm9vZnMiOlt7ImRpZ2VzdCI6eyJzaGEyNTYiOiJaTkZNbWl1eFRNM2FORnBWai1jbTIzQkdFdmdERGZ6Z2dFVGNPdmd3Y1c4In0sIm1lZGlhX3R5cGUiOiJhcHBsaWNhdGlvbi9qc29uIiwicHJvb2ZfdHlwZSI6ImV4dGVybmFsLWRpZ2VzdCJ9XSwicmVjb3JkX3ZlcnNpb24iOiJvbmNoYWluZGlsaWdlbmNlLmFnZW50LWV2aWRlbmNlLnJlY29yZC52MCIsInN0YXRlbWVudCI6eyJldmlkZW5jZV90eXBlIjoic2FuY3Rpb25zLXNjcmVlbiIsImV4cGlyZXNfYXQiOm51bGwsIm9ic2VydmVkX2F0IjoiMjAyNi0wOC0yOFQxMjowMDowMS4wMDBaIiwicmVxdWVzdCI6eyJkaWdlc3QiOnsic2hhMjU2IjoicHpfeVI1NksySHZhNjlLa2dSNFYxdE9GeW15WWw3QWhIMGJiVTFheVp1TSJ9LCJtZWRpYV90eXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LCJyZXNwb25zZSI6eyJkaWdlc3QiOnsic2hhMjU2IjoiWk5GTW1pdXhUTTNhTkZwVmotY20yM0JHRXZnRERmemdnRVRjT3Znd2NXOCJ9LCJtZWRpYV90eXBlIjoiYXBwbGljYXRpb24vanNvbiIsIm1vZGUiOiJlbWJlZGRlZCIsInZhbHVlIjp7InNhbmN0aW9uZWQiOmZhbHNlfX0sInJ1bl9yZWYiOiJzaGEyNTY6aFdOS2xLNFlpQlBvUlRKRTlTRGU0aWRuZjZsR1Bhd1FJcmxvamFlaVNoNCIsInNjb3BlIjp7ImNvdmVyYWdlIjoib25lIHRlc3QgYWRkcmVzcyIsInF1ZXJ5IjoiMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIn0sInNvdXJjZSI6eyJpZCI6Imh0dHBzOi8vYXBpLmV4YW1wbGUuaW52YWxpZCIsInR5cGUiOiJodHRwcy1hcGkifSwidG9vbCI6eyJuYW1lIjoic2NyZWVuX3dhbGxldCIsInZlcnNpb24iOiIxIn0sInRydXN0X21vZGUiOiJhZ2VudC1hc3NlcnRpb24ifX0seyJpZCI6InNoYTI1NjpISmdoVF94SEthQzViU181SDZwWGI5U0hWUm1zYTF4ZVhvMnV2cFRVRnFnIiwia2luZCI6InByaW5jaXBhbCIsInBhcmVudHMiOltdLCJwcm9vZnMiOltdLCJyZWNvcmRfdmVyc2lvbiI6Im9uY2hhaW5kaWxpZ2VuY2UuYWdlbnQtZXZpZGVuY2UucmVjb3JkLnYwIiwic3RhdGVtZW50Ijp7ImRpc3BsYXlfbmFtZSI6IkNvbmZvcm1hbmNlIFRyZWFzdXJ5IiwicHJpbmNpcGFsX2lkIjoidXJuOm9uY2hhaW5kaWxpZ2VuY2U6dGVzdDp0cmVhc3VyeSIsInByaW5jaXBhbF90eXBlIjoib3JnYW5pemF0aW9uIn19LHsiaWQiOiJzaGEyNTY6TzF6aEkxSnFEY21lS09oU3dSWlQyMGE3aUVDNzFqbEg2LTBRV2JSX0M1NCIsImtpbmQiOiJhZ2VudCIsInBhcmVudHMiOlsic2hhMjU2OkhKZ2hUX3hIS2FDNWJTXzVINnBYYjlTSFZSbXNhMXhlWG8ydXZwVFVGcWciXSwicHJvb2ZzIjpbXSwicmVjb3JkX3ZlcnNpb24iOiJvbmNoYWluZGlsaWdlbmNlLmFnZW50LWV2aWRlbmNlLnJlY29yZC52MCIsInN0YXRlbWVudCI6eyJhZ2VudF9pZCI6InVybjpvbmNoYWluZGlsaWdlbmNlOnRlc3Q6YWdlbnQiLCJhZ2VudF92ZXJzaW9uIjoiMS4wLjAiLCJvcGVyYXRvcl9yZWYiOiJzaGEyNTY6SEpnaFRfeEhLYUM1YlNfNUg2cFhiOVNIVlJtc2ExeGVYbzJ1dnBUVUZxZyJ9fSx7ImlkIjoic2hhMjU2OmhXTktsSzRZaUJQb1JUSkU5U0RlNGlkbmY2bEdQYXdRSXJsb2phZWlTaDQiLCJraW5kIjoicnVuIiwicGFyZW50cyI6WyJzaGEyNTY6TzF6aEkxSnFEY21lS09oU3dSWlQyMGE3aUVDNzFqbEg2LTBRV2JSX0M1NCIsInNoYTI1Njptdm1IOU1kaXk0Q3ZWUlNkV3JSMlFRUXo5T2FlZzQ4aXZVTEdkcVYwcVNzIl0sInByb29mcyI6W10sInJlY29yZF92ZXJzaW9uIjoib25jaGFpbmRpbGlnZW5jZS5hZ2VudC1ldmlkZW5jZS5yZWNvcmQudjAiLCJzdGF0ZW1lbnQiOnsiYWdlbnRfcmVmIjoic2hhMjU2Ok8xemhJMUpxRGNtZUtPaFN3UlpUMjBhN2lFQzcxamxINi0wUVdiUl9DNTQiLCJlbmRlZF9hdCI6IjIwMjYtMDgtMjhUMTI6MDA6MDUuMDAwWiIsIm1hbmRhdGVfcmVmIjoic2hhMjU2Om12bUg5TWRpeTRDdlZSU2RXclIyUVFRejlPYWVnNDhpdlVMR2RxVjBxU3MiLCJydW5fZXh0ZXJuYWxfaWQiOiJydW4tY29uZm9ybWFuY2UtMDAxIiwic3RhcnRlZF9hdCI6IjIwMjYtMDgtMjhUMTI6MDA6MDAuMDAwWiJ9fSx7ImlkIjoic2hhMjU2OmlxWTZvVWI5V3BRSkhUY3YzdHFIdS04Q3UyNW5OdjdDQVhRWkRoX0huWmciLCJraW5kIjoicG9saWN5IiwicGFyZW50cyI6WyJzaGEyNTY6aFdOS2xLNFlpQlBvUlRKRTlTRGU0aWRuZjZsR1Bhd1FJcmxvamFlaVNoNCJdLCJwcm9vZnMiOltdLCJyZWNvcmRfdmVyc2lvbiI6Im9uY2hhaW5kaWxpZ2VuY2UuYWdlbnQtZXZpZGVuY2UucmVjb3JkLnYwIiwic3RhdGVtZW50Ijp7ImRpZ2VzdCI6eyJzaGEyNTYiOiI0VEhWMVNmTkFQTTlIVEx2X05fMGFlSW11YUZmbTlyTmVMUG04ZGtQdTR3In0sImVmZmVjdGl2ZV9mcm9tIjoiMjAyNi0wOC0yOFQwMDowMDowMC4wMDBaIiwicG9saWN5Ijp7InJ1bGUiOiJzYW5jdGlvbmVkIG11c3QgYmUgZmFsc2UifSwicG9saWN5X2lkIjoidXJuOm9uY2hhaW5kaWxpZ2VuY2U6dGVzdDpwb2xpY3kiLCJzb3VyY2UiOiJodHRwczovL2V4YW1wbGUuaW52YWxpZC9wb2xpY3kvMSIsInZlcnNpb24iOiIxIn19LHsiaWQiOiJzaGEyNTY6bXZtSDlNZGl5NEN2VlJTZFdyUjJRUVF6OU9hZWc0OGl2VUxHZHFWMHFTcyIsImtpbmQiOiJtYW5kYXRlIiwicGFyZW50cyI6WyJzaGEyNTY6SEpnaFRfeEhLYUM1YlNfNUg2cFhiOVNIVlJtc2ExeGVYbzJ1dnBUVUZxZyJdLCJwcm9vZnMiOltdLCJyZWNvcmRfdmVyc2lvbiI6Im9uY2hhaW5kaWxpZ2VuY2UuYWdlbnQtZXZpZGVuY2UucmVjb3JkLnYwIiwic3RhdGVtZW50Ijp7ImxpbWl0cyI6eyJhbW91bnQiOiIxMC4wMCJ9LCJtYW5kYXRlX2lkIjoibWFuZGF0ZS1jb25mb3JtYW5jZS0wMDEiLCJwcmluY2lwYWxfcmVmIjoic2hhMjU2OkhKZ2hUX3hIS2FDNWJTXzVINnBYYjlTSFZSbXNhMXhlWG8ydXZwVFVGcWciLCJzY29wZSI6eyJhY3Rpb24iOiJwYXkiLCJhc3NldCI6InBhdGhVU0QiLCJtYXhfYW1vdW50IjoiMTAuMDAifSwidmFsaWRfZnJvbSI6IjIwMjYtMDgtMjhUMDA6MDA6MDAuMDAwWiIsInZhbGlkX3VudGlsIjoiMjAyNi0wOC0yOVQwMDowMDowMC4wMDBaIn19XSwicm9vdF9pZHMiOlsic2hhMjU2Oi12NVM2Qmg0OFdVNmpDY2hzOFFlOThpdmZfQV9wZEVJR3RtY3hmTThveEkiXSwicnVuX2lkIjoic2hhMjU2OmhXTktsSzRZaUJQb1JUSkU5U0RlNGlkbmY2bEdQYXdRSXJsb2phZWlTaDQifQ==",
7
+ "signatures": [
8
+ {
9
+ "keyid": "ed25519-3rLe053Cb84OYIW2",
10
+ "sig": "bliqXg9CCHAalaxCW8tNf79uZX1UDQlozGFA2EPTfFIkTe+w2qv5GS4LpZ62Q7+/ecwXhbyMwnWh3gY2n0L2BQ=="
11
+ }
12
+ ]
13
+ },
14
+ "verification_material": {
15
+ "keys": [
16
+ {
17
+ "key_id": "ed25519-3rLe053Cb84OYIW2",
18
+ "algorithm": "ed25519",
19
+ "public_key_pem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAPUAXw+hDiVqStwqnTRt+vJyYLM8uxJaMwM1V8Sr0Zgw=\n-----END PUBLIC KEY-----\n",
20
+ "status": "active",
21
+ "valid_from": "2026-08-28T00:00:00.000Z",
22
+ "valid_until": null,
23
+ "status_changed_at": "2026-08-28T00:00:00.000Z",
24
+ "replacement_key_id": null,
25
+ "compromised_at": null
26
+ }
27
+ ],
28
+ "registry_snapshots": [],
29
+ "anchors": []
30
+ }
31
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "corpus_version": 1,
3
+ "source": "RFC 8785 sections 3.2.2 and 3.2.3, plus OnChainDiligence parser policy",
4
+ "canonicalization": [
5
+ {
6
+ "id": "recursive-order-arrays-empty-negative-zero",
7
+ "input": { "z": [], "n": -0, "a": { "y": true, "x": ["b", "a"], "empty": {} } },
8
+ "expected": "{\"a\":{\"empty\":{},\"x\":[\"b\",\"a\"],\"y\":true},\"n\":0,\"z\":[]}"
9
+ },
10
+ {
11
+ "id": "rfc8785-unicode-property-order",
12
+ "input": { "€": "Euro Sign", "\r": "Carriage Return", "דּ": "Hebrew Letter Dalet With Dagesh", "1": "One", "😀": "Emoji: Grinning Face", "€": "Control", "ö": "Latin Small Letter O With Diaeresis" },
13
+ "expected": "{\"\\r\":\"Carriage Return\",\"1\":\"One\",\"€\":\"Control\",\"ö\":\"Latin Small Letter O With Diaeresis\",\"€\":\"Euro Sign\",\"😀\":\"Emoji: Grinning Face\",\"דּ\":\"Hebrew Letter Dalet With Dagesh\"}"
14
+ },
15
+ {
16
+ "id": "rfc8785-numbers-and-escapes",
17
+ "input": { "numbers": [333333333.3333333, 1e30, 4.5, 0.002, 1e-27], "text": "line\n\"\\" },
18
+ "expected": "{\"numbers\":[333333333.3333333,1e+30,4.5,0.002,1e-27],\"text\":\"line\\n\\\"\\\\\"}"
19
+ },
20
+ {
21
+ "id": "boundary-safe-integers",
22
+ "input": [-9007199254740991, 9007199254740991],
23
+ "expected": "[-9007199254740991,9007199254740991]"
24
+ }
25
+ ],
26
+ "invalid_json": [
27
+ { "id": "duplicate-key", "input": "{\"data\":1,\"data\":2}", "error_code": "duplicate_key" },
28
+ { "id": "unsafe-positive-integer", "input": "{\"n\":9007199254740992}", "error_code": "unsafe_integer" },
29
+ { "id": "unsafe-negative-integer", "input": "{\"n\":-9007199254740992}", "error_code": "unsafe_integer" }
30
+ ]
31
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "media_type": "application/vnd.onchaindiligence.agent-evidence+json",
3
+ "bundle_version": "onchaindiligence.agent-evidence.bundle.v0",
4
+ "envelope": {
5
+ "payloadType": "application/vnd.onchaindiligence.agent-evidence.bundle.v0+json",
6
+ "payload": "eyJidW5kbGVfaWQiOiJzaGEyNTY6ZXpweWczM05SQWNTWllrekpnMzJsX0dURlBNUzdGNnBoMVJ3VzFxZXNtbyIsImJ1bmRsZV92ZXJzaW9uIjoib25jaGFpbmRpbGlnZW5jZS5hZ2VudC1ldmlkZW5jZS5idW5kbGUudjAiLCJjcmVhdGVkX2F0IjoiMjAyNi0wOC0yOFQxMjowMDowNi4wMDBaIiwiZXh0ZW5zaW9ucyI6e30sInJlY29yZHMiOlt7ImlkIjoic2hhMjU2Oi12NVM2Qmg0OFdVNmpDY2hzOFFlOThpdmZfQV9wZEVJR3RtY3hmTThveEkiLCJraW5kIjoiZXhlY3V0aW9uIiwicGFyZW50cyI6WyJzaGEyNTY6Rkx5WVZncWNGTzIxN0JQWDJUMXVpcUpMT2dNaU1OODc5YXZUN3ZLQzhyayJdLCJwcm9vZnMiOltdLCJyZWNvcmRfdmVyc2lvbiI6Im9uY2hhaW5kaWxpZ2VuY2UuYWdlbnQtZXZpZGVuY2UucmVjb3JkLnYwIiwic3RhdGVtZW50Ijp7ImFtb3VudCI6IjEuMDAiLCJhc3NldCI6InBhdGhVU0QiLCJibG9ja19udW1iZXIiOiIxMjM0NTY3OCIsImNvbmZpcm1lZF9hdCI6IjIwMjYtMDgtMjhUMTI6MDA6MDUuMDAwWiIsImRlY2lzaW9uX3JlZiI6InNoYTI1NjpGTHlZVmdxY0ZPMjE3QlBYMlQxdWlxSkxPZ01pTU44NzlhdlQ3dktDOHJrIiwiZXhlY3V0aW9uX2lkIjoiZXhlY3V0aW9uLWNvbmZvcm1hbmNlLTAwMSIsImV4ZWN1dGlvbl90eXBlIjoib25jaGFpbi10cmFuc2ZlciIsIm5ldHdvcmsiOiJlaXAxNTU6MSIsInJlY2lwaWVudCI6IjB4MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiIsInNlbmRlciI6IjB4MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMyIsInN0YXR1cyI6ImNvbmZpcm1lZCIsInN1Ym1pdHRlZF9hdCI6IjIwMjYtMDgtMjhUMTI6MDA6MDQuMDAwWiIsInRyYW5zYWN0aW9uX2RpZ2VzdCI6eyJzaGEyNTYiOiJTa0xCZFBnSVJrbVF0bkowZ3UtTjYyOFN3a2xKUkVIUXVldDhMQXNkUGRNIn0sInRyYW5zYWN0aW9uX2hhc2giOiIweDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEifX0seyJpZCI6InNoYTI1NjpGTHlZVmdxY0ZPMjE3QlBYMlQxdWlxSkxPZ01pTU44NzlhdlQ3dktDOHJrIiwia2luZCI6ImRlY2lzaW9uIiwicGFyZW50cyI6WyJzaGEyNTY6RzFneFBucVNxTEJMQXFodHpXWmllbEF6OTVHQW9KeGRINjJ1Q2l5Z2t1ZyIsInNoYTI1NjpoV05LbEs0WWlCUG9SVEpFOVNEZTRpZG5mNmxHUGF3UUlybG9qYWVpU2g0Iiwic2hhMjU2OmlxWTZvVWI5V3BRSkhUY3YzdHFIdS04Q3UyNW5OdjdDQVhRWkRoX0huWmciXSwicHJvb2ZzIjpbXSwicmVjb3JkX3ZlcnNpb24iOiJvbmNoYWluZGlsaWdlbmNlLmFnZW50LWV2aWRlbmNlLnJlY29yZC52MCIsInN0YXRlbWVudCI6eyJhZ2VudF9yZWYiOiJzaGEyNTY6TzF6aEkxSnFEY21lS09oU3dSWlQyMGE3aUVDNzFqbEg2LTBRV2JSX0M1NCIsImRlY2lkZWRfYXQiOiIyMDI2LTA4LTI4VDEyOjAwOjAzLjAwMFoiLCJkZWNpc2lvbl9pZCI6ImRlY2lzaW9uLWNvbmZvcm1hbmNlLTAwMSIsImRlY2lzaW9uX3R5cGUiOiJwYXltZW50LWFwcHJvdmFsIiwiZXZpZGVuY2VfcmVmcyI6WyJzaGEyNTY6RzFneFBucVNxTEJMQXFodHpXWmllbEF6OTVHQW9KeGRINjJ1Q2l5Z2t1ZyJdLCJvdXRjb21lIjp7ImFwcHJvdmVkIjp0cnVlfSwicG9saWN5X2RpZ2VzdCI6eyJzaGEyNTYiOiI0VEhWMVNmTkFQTTlIVEx2X05fMGFlSW11YUZmbTlyTmVMUG04ZGtQdTR3In0sInBvbGljeV9yZWYiOiJzaGEyNTY6aXFZNm9VYjlXcFFKSFRjdjN0cUh1LThDdTI1bk52N0NBWFFaRGhfSG5aZyIsInJ1bl9yZWYiOiJzaGEyNTY6aFdOS2xLNFlpQlBvUlRKRTlTRGU0aWRuZjZsR1Bhd1FJcmxvamFlaVNoNCJ9fSx7ImlkIjoic2hhMjU2OkcxZ3hQbnFTcUxCTEFxaHR6V1ppZWxBejk1R0FvSnhkSDYydUNpeWdrdWciLCJraW5kIjoiZXZpZGVuY2UiLCJwYXJlbnRzIjpbInNoYTI1NjpoV05LbEs0WWlCUG9SVEpFOVNEZTRpZG5mNmxHUGF3UUlybG9qYWVpU2g0Il0sInByb29mcyI6W3siZGlnZXN0Ijp7InNoYTI1NiI6IlpORk1taXV4VE0zYU5GcFZqLWNtMjNCR0V2Z0REZnpnZ0VUY092Z3djVzgifSwibWVkaWFfdHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJwcm9vZl90eXBlIjoiZXh0ZXJuYWwtZGlnZXN0In1dLCJyZWNvcmRfdmVyc2lvbiI6Im9uY2hhaW5kaWxpZ2VuY2UuYWdlbnQtZXZpZGVuY2UucmVjb3JkLnYwIiwic3RhdGVtZW50Ijp7ImV2aWRlbmNlX3R5cGUiOiJzYW5jdGlvbnMtc2NyZWVuIiwiZXhwaXJlc19hdCI6bnVsbCwib2JzZXJ2ZWRfYXQiOiIyMDI2LTA4LTI4VDEyOjAwOjAxLjAwMFoiLCJyZXF1ZXN0Ijp7ImRpZ2VzdCI6eyJzaGEyNTYiOiJwel95UjU2SzJIdmE2OUtrZ1I0VjF0T0Z5bXlZbDdBaEgwYmJVMWF5WnVNIn0sIm1lZGlhX3R5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sInJlc3BvbnNlIjp7ImRpZ2VzdCI6eyJzaGEyNTYiOiJaTkZNbWl1eFRNM2FORnBWai1jbTIzQkdFdmdERGZ6Z2dFVGNPdmd3Y1c4In0sIm1lZGlhX3R5cGUiOiJhcHBsaWNhdGlvbi9qc29uIiwibW9kZSI6ImVtYmVkZGVkIiwidmFsdWUiOnsic2FuY3Rpb25lZCI6ZmFsc2V9fSwicnVuX3JlZiI6InNoYTI1NjpoV05LbEs0WWlCUG9SVEpFOVNEZTRpZG5mNmxHUGF3UUlybG9qYWVpU2g0Iiwic2NvcGUiOnsiY292ZXJhZ2UiOiJvbmUgdGVzdCBhZGRyZXNzIiwicXVlcnkiOiIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEifSwic291cmNlIjp7ImlkIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5pbnZhbGlkIiwidHlwZSI6Imh0dHBzLWFwaSJ9LCJ0b29sIjp7Im5hbWUiOiJzY3JlZW5fd2FsbGV0IiwidmVyc2lvbiI6IjEifSwidHJ1c3RfbW9kZSI6ImFnZW50LWFzc2VydGlvbiJ9fSx7ImlkIjoic2hhMjU2OkhKZ2hUX3hIS2FDNWJTXzVINnBYYjlTSFZSbXNhMXhlWG8ydXZwVFVGcWciLCJraW5kIjoicHJpbmNpcGFsIiwicGFyZW50cyI6W10sInByb29mcyI6W10sInJlY29yZF92ZXJzaW9uIjoib25jaGFpbmRpbGlnZW5jZS5hZ2VudC1ldmlkZW5jZS5yZWNvcmQudjAiLCJzdGF0ZW1lbnQiOnsiZGlzcGxheV9uYW1lIjoiQ29uZm9ybWFuY2UgVHJlYXN1cnkiLCJwcmluY2lwYWxfaWQiOiJ1cm46b25jaGFpbmRpbGlnZW5jZTp0ZXN0OnRyZWFzdXJ5IiwicHJpbmNpcGFsX3R5cGUiOiJvcmdhbml6YXRpb24ifX0seyJpZCI6InNoYTI1NjpPMXpoSTFKcURjbWVLT2hTd1JaVDIwYTdpRUM3MWpsSDYtMFFXYlJfQzU0Iiwia2luZCI6ImFnZW50IiwicGFyZW50cyI6WyJzaGEyNTY6SEpnaFRfeEhLYUM1YlNfNUg2cFhiOVNIVlJtc2ExeGVYbzJ1dnBUVUZxZyJdLCJwcm9vZnMiOltdLCJyZWNvcmRfdmVyc2lvbiI6Im9uY2hhaW5kaWxpZ2VuY2UuYWdlbnQtZXZpZGVuY2UucmVjb3JkLnYwIiwic3RhdGVtZW50Ijp7ImFnZW50X2lkIjoidXJuOm9uY2hhaW5kaWxpZ2VuY2U6dGVzdDphZ2VudCIsImFnZW50X3ZlcnNpb24iOiIxLjAuMCIsIm9wZXJhdG9yX3JlZiI6InNoYTI1NjpISmdoVF94SEthQzViU181SDZwWGI5U0hWUm1zYTF4ZVhvMnV2cFRVRnFnIn19LHsiaWQiOiJzaGEyNTY6aFdOS2xLNFlpQlBvUlRKRTlTRGU0aWRuZjZsR1Bhd1FJcmxvamFlaVNoNCIsImtpbmQiOiJydW4iLCJwYXJlbnRzIjpbInNoYTI1NjpPMXpoSTFKcURjbWVLT2hTd1JaVDIwYTdpRUM3MWpsSDYtMFFXYlJfQzU0Iiwic2hhMjU2Om12bUg5TWRpeTRDdlZSU2RXclIyUVFRejlPYWVnNDhpdlVMR2RxVjBxU3MiXSwicHJvb2ZzIjpbXSwicmVjb3JkX3ZlcnNpb24iOiJvbmNoYWluZGlsaWdlbmNlLmFnZW50LWV2aWRlbmNlLnJlY29yZC52MCIsInN0YXRlbWVudCI6eyJhZ2VudF9yZWYiOiJzaGEyNTY6TzF6aEkxSnFEY21lS09oU3dSWlQyMGE3aUVDNzFqbEg2LTBRV2JSX0M1NCIsImVuZGVkX2F0IjoiMjAyNi0wOC0yOFQxMjowMDowNS4wMDBaIiwibWFuZGF0ZV9yZWYiOiJzaGEyNTY6bXZtSDlNZGl5NEN2VlJTZFdyUjJRUVF6OU9hZWc0OGl2VUxHZHFWMHFTcyIsInJ1bl9leHRlcm5hbF9pZCI6InJ1bi1jb25mb3JtYW5jZS0wMDEiLCJzdGFydGVkX2F0IjoiMjAyNi0wOC0yOFQxMjowMDowMC4wMDBaIn19LHsiaWQiOiJzaGEyNTY6aXFZNm9VYjlXcFFKSFRjdjN0cUh1LThDdTI1bk52N0NBWFFaRGhfSG5aZyIsImtpbmQiOiJwb2xpY3kiLCJwYXJlbnRzIjpbInNoYTI1NjpoV05LbEs0WWlCUG9SVEpFOVNEZTRpZG5mNmxHUGF3UUlybG9qYWVpU2g0Il0sInByb29mcyI6W10sInJlY29yZF92ZXJzaW9uIjoib25jaGFpbmRpbGlnZW5jZS5hZ2VudC1ldmlkZW5jZS5yZWNvcmQudjAiLCJzdGF0ZW1lbnQiOnsiZGlnZXN0Ijp7InNoYTI1NiI6IjRUSFYxU2ZOQVBNOUhUTHZfTl8wYWVJbXVhRmZtOXJOZUxQbThka1B1NHcifSwiZWZmZWN0aXZlX2Zyb20iOiIyMDI2LTA4LTI4VDAwOjAwOjAwLjAwMFoiLCJwb2xpY3kiOnsicnVsZSI6InNhbmN0aW9uZWQgbXVzdCBiZSBmYWxzZSJ9LCJwb2xpY3lfaWQiOiJ1cm46b25jaGFpbmRpbGlnZW5jZTp0ZXN0OnBvbGljeSIsInNvdXJjZSI6Imh0dHBzOi8vZXhhbXBsZS5pbnZhbGlkL3BvbGljeS8xIiwidmVyc2lvbiI6IjEifX0seyJpZCI6InNoYTI1Njptdm1IOU1kaXk0Q3ZWUlNkV3JSMlFRUXo5T2FlZzQ4aXZVTEdkcVYwcVNzIiwia2luZCI6Im1hbmRhdGUiLCJwYXJlbnRzIjpbInNoYTI1NjpISmdoVF94SEthQzViU181SDZwWGI5U0hWUm1zYTF4ZVhvMnV2cFRVRnFnIl0sInByb29mcyI6W10sInJlY29yZF92ZXJzaW9uIjoib25jaGFpbmRpbGlnZW5jZS5hZ2VudC1ldmlkZW5jZS5yZWNvcmQudjAiLCJzdGF0ZW1lbnQiOnsibGltaXRzIjp7ImFtb3VudCI6IjEwLjAwIn0sIm1hbmRhdGVfaWQiOiJtYW5kYXRlLWNvbmZvcm1hbmNlLTAwMSIsInByaW5jaXBhbF9yZWYiOiJzaGEyNTY6SEpnaFRfeEhLYUM1YlNfNUg2cFhiOVNIVlJtc2ExeGVYbzJ1dnBUVUZxZyIsInNjb3BlIjp7ImFjdGlvbiI6InBheSIsImFzc2V0IjoicGF0aFVTRCIsIm1heF9hbW91bnQiOiIxMC4wMCJ9LCJ2YWxpZF9mcm9tIjoiMjAyNi0wOC0yOFQwMDowMDowMC4wMDBaIiwidmFsaWRfdW50aWwiOiIyMDI2LTA4LTI5VDAwOjAwOjAwLjAwMFoifX1dLCJyb290X2lkcyI6WyJzaGEyNTY6LXY1UzZCaDQ4V1U2akNjaHM4UWU5OGl2Zl9BX3BkRUlHdG1jeGZNOG94SSJdLCJydW5faWQiOiJzaGEyNTY6aFdOS2xLNFlpQlBvUlRKRTlTRGU0aWRuZjZsR1Bhd1FJcmxvamFlaVNoNCJ9",
7
+ "signatures": [
8
+ {
9
+ "keyid": "ed25519-3rLe053Cb84OYIW2",
10
+ "sig": "c5QSw7HTSuaPKkYzc/FXL/9lplP5ZEceSesmhQioOqtYXRwdf6jVrnuHZ06+AnfxaFybj/s6oNz5AnZTYF/wBQ=="
11
+ }
12
+ ]
13
+ },
14
+ "verification_material": {
15
+ "keys": [
16
+ {
17
+ "key_id": "ed25519-3rLe053Cb84OYIW2",
18
+ "algorithm": "ed25519",
19
+ "public_key_pem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAPUAXw+hDiVqStwqnTRt+vJyYLM8uxJaMwM1V8Sr0Zgw=\n-----END PUBLIC KEY-----\n",
20
+ "status": "active",
21
+ "valid_from": "2026-08-28T00:00:00.000Z",
22
+ "valid_until": null,
23
+ "status_changed_at": "2026-08-28T00:00:00.000Z",
24
+ "replacement_key_id": null,
25
+ "compromised_at": null
26
+ }
27
+ ],
28
+ "registry_snapshots": [],
29
+ "anchors": []
30
+ }
31
+ }
@@ -0,0 +1,14 @@
1
+ import type { JsonValue } from './types.js';
2
+ export declare function canonicalize(value: unknown): Uint8Array;
3
+ export declare function canonicalizeText(value: unknown): string;
4
+ export declare function contentId(value: unknown): string;
5
+ export declare function formatTimestamp(value: Date): string;
6
+ export declare function parseTimestamp(value: string): Date;
7
+ export declare function cloneJson<T extends JsonValue>(value: T): T;
8
+ export declare function enforceLimits(value: unknown, limits: {
9
+ maxDepth: number;
10
+ maxStringLength: number;
11
+ maxArrayLength: number;
12
+ }): void;
13
+ export declare function parseJson(data: string | Uint8Array): JsonValue;
14
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAwD3C,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEvD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAGnD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAOlD;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAE1D;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC5E,IAAI,CAmCN;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAQ9D"}