Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,135 changes: 1,135 additions & 0 deletions drafts/cycles-evidence-v0.1.yaml

Large diffs are not rendered by default.

142 changes: 142 additions & 0 deletions drafts/fixtures/cycles-evidence-v0.1/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
# CyclesEvidence v0.1 — reference fixtures

Thirteen signed, content-addressed `CyclesEvidence` envelopes covering
the five artifact types, the decision branches an audit consumer needs
to handle (including the live-path 4xx denial introduced for the issue
#25 integration, a 403 error on `POST /v1/decide`, and a commit with
`StandardMetrics` populated), and every value of the closed `Unit` enum.
Each fixture is the JCS-canonical bytes of a fully populated envelope,
exactly as a Cycles server would emit it.

These fixtures back the test-plan checkbox on PR
`runcycles/cycles-protocol#90`:

> Implement a worked example: emit one envelope per artifact type from
> a reference Cycles server, compute `evidence_id`, sign, then
> re-verify; commit fixtures alongside the spec.

## Layout

```
generate.py — generator (deterministic)
verify.py — verifier (round-trip check)
requirements.txt — jcs, pynacl
cases/
01-decide-allow.json — DecidePayload, decision=ALLOW
02-reserve-allow.json — ReservePayload, decision=ALLOW, balances populated
03-reserve-dry-run-deny.json — ReservePayload with dry_run=true, decision=DENY (the ONLY valid wire shape for decision=DENY on reserve, per cycles-protocol-v0:978)
04-reserve-allow-with-caps.json — ReservePayload, decision=ALLOW_WITH_CAPS, Caps populated
05-commit-success.json — CommitPayload, reservation_id hoisted, partial commit
06-release-success.json — ReleasePayload, ALLOW_WITH_CAPS reservation released
07-release-with-reason.json — ReleasePayload with optional ReleaseRequest.reason
08-reserve-allow-no-trace-id.json — ReservePayload, optional trace_id omitted (field absent, NOT empty string)
09-decide-risk-points-allow.json — DecidePayload, unit=RISK_POINTS (authority class), Action.tags populated
10-reserve-credits-allow.json — ReservePayload, unit=CREDITS (implementation-defined class), Balance.allocated populated
11-reserve-live-budget-exceeded.json — ErrorPayload, 409 BUDGET_EXCEEDED, endpoint="POST /v1/reservations" — the canonical live-denial wire shape that issue #25's APS gateway needs to bind evidence to
12-decide-live-forbidden.json — ErrorPayload, 403 FORBIDDEN, endpoint="POST /v1/decide" — exercises the corrected endpoint name (canonical /v1/decide, not /v1/decisions) and a non-budget ErrorCode
13-commit-with-metrics.json — CommitPayload with StandardMetrics populated (5 fields incl. `custom` escape hatch) — exercises the constrained StandardMetrics mirror added in round 6 (object schema with `additionalProperties: false` and per-field constraints; not an enum)
```

## What each fixture proves

| Fixture | Spec rule exercised |
|---|---|
| 01 | `decide` payload one-of branch; `DecisionResponse` minimal-required shape (only `decision`) |
| 02 | `reserve` happy path; `Balance` with `SignedAmount` `remaining` |
| 03 | Dry-run reserve DENY — the *only* legal wire shape with `decision: DENY` on a reserve. Per `cycles-protocol-v0.yaml` §ReservationCreateResponse.decision: "For dry_run=true, decision MAY be DENY. For dry_run=false, insufficient budget MUST be expressed via 409 BUDGET_EXCEEDED (not decision=DENY)." Live (non-dry) denials are case 11. |
| 04 | ALLOW_WITH_CAPS preserves the `Caps` payload in signed bytes (load-bearing for audit per `#25` thread) |
| 05 | `reservation_id` hoisted into the signed payload — closes the `commit_reservation` linkage gap from `#92` review round 4 |
| 06 | `release` payload one-of branch; symmetric `reservation_id` hoist |
| 07 | Optional `ReleaseRequest.reason` round-trips through canonical bytes |
| 08 | Optional `trace_id` **omitted** (field absent in canonical bytes — distinct from `""` or `null` per spec normative note on omit/null/empty) |
| 09 | `RISK_POINTS` unit (authority class per `#25` `unit_class` discussion); optional `Action.tags` populated |
| 10 | `CREDITS` unit (implementation-defined class per `cycles-protocol-v0` UnitEnum); optional `Balance.allocated` populated |
| 11 | `error` artifact type — live (non-dry) 409 `BUDGET_EXCEEDED` from `POST /v1/reservations`. The canonical wire shape for the pre-execution denial path that issue #25 needs APS receipts to bind evidence to. The request body is preserved in the signed payload; `endpoint` discriminates which Mirror schema `request` follows. |
| 12 | `error` artifact type — 403 `FORBIDDEN` from `POST /v1/decide` (canonical endpoint name, not `/v1/decisions`). Exercises the decide error path and a non-budget ErrorCode value (the round-5 fix renamed the endpoint everywhere; this fixture proves the endpoint-discriminated request validation accepts a real `DecisionRequest` body under the correct endpoint name). |
| 13 | `commit` artifact type with `metrics` populated. Exercises the `StandardMetrics` mirror added in round 6: all five canonical fields (`tokens_input`, `tokens_output`, `latency_ms`, `model_version`, `custom`) with the `custom` escape hatch carrying deployment-specific extras. Closes the coverage gap that allowed `CommitRequestMirror.metrics` to be `additionalProperties: true` undetected. |

## Reproducing the fixtures

```sh
pip install -r requirements.txt
python generate.py
```

The generator is deterministic. Re-running it overwrites `cases/*.json`
with byte-identical output; a clean working tree after `python
generate.py` proves the fixtures match the spec algorithm.

## Verifying the fixtures

```sh
python verify.py
```

For each fixture, `verify.py` runs the v0.1 normative verification
contract from `cycles-evidence-v0.1.yaml`:

1. Recompute `evidence_id` (sha256 over JCS-canonical bytes with
`evidence_id=""` and `signature=""`); compare byte-for-byte.
2. Recanonicalize with `evidence_id` populated and `signature=""`;
Ed25519-verify against the pubkey resolved from `signer_did`.
3. Check `artifact_type` matches exactly one `payload` key.
4. Validate optional `trace_id` against the 32-hex pattern when
present.

Exit code 0 on all-green; non-zero on any failure.

## Test signer

**These fixtures are signed with a test key. They are NOT authoritative
evidence and the keypair MUST NOT be used by any production
deployment.**

The signer seed is derived deterministically as:

```
sha256("cycles-evidence-v0.1-fixture-signer")
```

so anyone can re-derive the same Ed25519 keypair locally. The resulting
public key (which appears as `signer_did` in every fixture) is:

```
ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43
```

Production Cycles deployments will sign with a server-owned key
published via the `did:cycles:*` method (out of scope for v0.1, see
spec).

## Spot-checking tamper detection

Flip one character anywhere in a fixture's signed bytes (the payload,
the timestamp, the trace_id) and re-run `verify.py`. The verifier
reports both `evidence_id mismatch` and `signature verification
failed`. This demonstrates that the canonical-bytes input to sha256
covers the whole envelope and that the Ed25519 signature is tied to
the recomputed `evidence_id`.

Example:

```sh
# Tamper: change reservation_id one byte
python -c "
import json, pathlib
p = pathlib.Path('cases/05-commit-success.json')
e = json.loads(p.read_text())
e['payload']['commit']['reservation_id'] = e['payload']['commit']['reservation_id'][:-1] + 'X'
p.write_text(json.dumps(e))
"
python verify.py # → FAIL on 05-commit-success.json
python generate.py # → restores from canonical sources
```

## Promoting these fixtures

When `cycles-evidence-v0.1.yaml` graduates from `drafts/` to a numbered
spec at repo root, this fixture set should move with it (e.g. to
`fixtures/cycles-evidence-v0.2/`). The generator inputs in
`generate.py` should be reviewed at promotion time and any sample IDs
/ public-key references regenerated against the production signing-key
shape once `did:cycles:*` is normative.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"decide","evidence_id":"8b49e5594013cdf069ddfbaea97e1ba8136425aa3d42b778c96fd33412625d03","issued_at_ms":1810000000000,"payload":{"decide":{"request":{"action":{"kind":"model.call","name":"gpt-4o"},"estimate":{"amount":2000000,"unit":"USD_MICROCENTS"},"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0A1","subject":{"agent":"researcher","tenant":"acme"}},"response":{"affected_scopes":["tenant"],"decision":"ALLOW"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"ab62e0eaa0fd0097d47ceb54043111f731166e1448c5fe52bf35f3e0a697a803719b030d241abdfd1ed426f473de9f79c308f729b9b1d9ec39d202fc4dedb500","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"0af7651916cd43dd8448eb211c80319c"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"reserve","evidence_id":"ca70a9c6816d463614ec46b19266ff286bde220c2caf0951ae7888cc36c485aa","issued_at_ms":1810000000100,"payload":{"reserve":{"request":{"action":{"kind":"model.call","name":"gpt-4o"},"estimate":{"amount":2000000,"unit":"USD_MICROCENTS"},"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0A2","subject":{"agent":"researcher","tenant":"acme"},"ttl_ms":30000},"response":{"affected_scopes":["tenant"],"balances":[{"remaining":{"amount":8000000,"unit":"USD_MICROCENTS"},"reserved":{"amount":2000000,"unit":"USD_MICROCENTS"},"scope":"tenant","scope_path":"tenant=acme","spent":{"amount":0,"unit":"USD_MICROCENTS"}}],"decision":"ALLOW","expires_at_ms":1810000030100,"reservation_id":"rsv_01HZZ8N4F8FBQX5K6TGYR0M0A3","reserved":{"amount":2000000,"unit":"USD_MICROCENTS"},"scope_path":"tenant=acme"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"e62228d5389b5b325f287d3f6267c64e8fcba4b374fde30a7b1e569426fc28afadacc69b7be158fc315b533e25f79ed5b21aa87a3ae30e2f37566802fd6c880e","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"0af7651916cd43dd8448eb211c80319c"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"reserve","evidence_id":"a9daac55e6acac74f4d8ef4f7801fec9d3503e74251769aa5a7d44b6de577436","issued_at_ms":1810000000200,"payload":{"reserve":{"request":{"action":{"kind":"model.call","name":"gpt-4o"},"dry_run":true,"estimate":{"amount":50000000,"unit":"USD_MICROCENTS"},"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0B1","subject":{"agent":"researcher","tenant":"acme"},"ttl_ms":30000},"response":{"affected_scopes":["tenant"],"balances":[{"remaining":{"amount":8000000,"unit":"USD_MICROCENTS"},"reserved":{"amount":0,"unit":"USD_MICROCENTS"},"scope":"tenant","scope_path":"tenant=acme","spent":{"amount":92000000,"unit":"USD_MICROCENTS"}}],"decision":"DENY","reason_code":"BUDGET_EXCEEDED","scope_path":"tenant=acme"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"8399ded9ec49c7cfa79b5969883708ff321fbac30c97066a2c7fa7dd4f33a1d0ec3a232581fd03a7db04bafd56bfc39185619f419619b29bcc88db1942c59100","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"b9c8a0d3f2e147a9a7f4d2e1b0c9876f"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"reserve","evidence_id":"625a4c09714ba41f11d070f589d192a7cbff4816f470e0df6d26e134755252cc","issued_at_ms":1810000000300,"payload":{"reserve":{"request":{"action":{"kind":"model.call","name":"gpt-4o"},"estimate":{"amount":32000,"unit":"TOKENS"},"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0C1","subject":{"agent":"researcher","tenant":"acme"},"ttl_ms":30000},"response":{"affected_scopes":["tenant"],"caps":{"cooldown_ms":1000,"max_tokens":8000,"tool_allowlist":["read.*"]},"decision":"ALLOW_WITH_CAPS","expires_at_ms":1810000030300,"reservation_id":"rsv_01HZZ8N4F8FBQX5K6TGYR0M0C2","reserved":{"amount":8000,"unit":"TOKENS"},"scope_path":"tenant=acme"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"96e368bc9ac0a759f3ed4bf30e90165d2cb20b0d023a9e1812e13de833b5e1c85fe1f003098be4df0b7a7a7b1f9ffb952ed4dfa05a5e9bb2917bb07043a32b09","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"commit","evidence_id":"f8ebfb3918bcc3d610d80d56f649c3a8721a0e5d5ab650471f65bdcba8131cb1","issued_at_ms":1810000010000,"payload":{"commit":{"request":{"actual":{"amount":1750000,"unit":"USD_MICROCENTS"},"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0A4"},"reservation_id":"rsv_01HZZ8N4F8FBQX5K6TGYR0M0A3","response":{"balances":[{"remaining":{"amount":8250000,"unit":"USD_MICROCENTS"},"reserved":{"amount":0,"unit":"USD_MICROCENTS"},"scope":"tenant","scope_path":"tenant=acme","spent":{"amount":1750000,"unit":"USD_MICROCENTS"}}],"charged":{"amount":1750000,"unit":"USD_MICROCENTS"},"released":{"amount":250000,"unit":"USD_MICROCENTS"},"status":"COMMITTED"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"a770949651ed1870c47c254338c42060bd69e4f23e98ccdc2e35829a7c30b2dcf66f5784936e33ab679740806d4963af59fb487bcc21ea2d59d9a3e9e41f7804","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"0af7651916cd43dd8448eb211c80319c"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"release","evidence_id":"d2ef1a25d7c79d9ef0df421dd12b6874424ba3c8af2488da2bd8f705926d09fd","issued_at_ms":1810000005000,"payload":{"release":{"request":{"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0C3"},"reservation_id":"rsv_01HZZ8N4F8FBQX5K6TGYR0M0C2","response":{"balances":[{"remaining":{"amount":100000,"unit":"TOKENS"},"reserved":{"amount":0,"unit":"TOKENS"},"scope":"tenant","scope_path":"tenant=acme","spent":{"amount":0,"unit":"TOKENS"}}],"released":{"amount":8000,"unit":"TOKENS"},"status":"RELEASED"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"11d67308e68441f7ca8ff3c3d5087604969b24dcd8cfb67abbed9c05027d71716c01a3f5f2162f4bac7e4d9038816516a423c511fb39e557266ed8ab9e031d02","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"release","evidence_id":"d0dd461732551bb6416e585db19cdc6797dcf12e19dd197856db4e9945b86821","issued_at_ms":1810000007000,"payload":{"release":{"request":{"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0A5","reason":"handler_timeout"},"reservation_id":"rsv_01HZZ8N4F8FBQX5K6TGYR0M0A3","response":{"balances":[{"remaining":{"amount":10000000,"unit":"USD_MICROCENTS"},"reserved":{"amount":0,"unit":"USD_MICROCENTS"},"scope":"tenant","scope_path":"tenant=acme","spent":{"amount":0,"unit":"USD_MICROCENTS"}}],"released":{"amount":2000000,"unit":"USD_MICROCENTS"},"status":"RELEASED"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"d8757bae97976c386023c4c595cac4d1ff4e90da3dfb965d67b25d961155185a5192f8efbf3a6a3d42100f86bdd0d43610f26c6a57740a379d726b51e66f1e02","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"reserve","evidence_id":"f97b0000ea1dae2f5652d1e9d89739cda55e5c78cc351baae14f92aabe2f384b","issued_at_ms":1810000000400,"payload":{"reserve":{"request":{"action":{"kind":"model.call","name":"gpt-4o"},"estimate":{"amount":1000000,"unit":"USD_MICROCENTS"},"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0D1","subject":{"agent":"researcher","tenant":"acme"},"ttl_ms":30000},"response":{"affected_scopes":["tenant"],"decision":"ALLOW","expires_at_ms":1810000030400,"reservation_id":"rsv_01HZZ8N4F8FBQX5K6TGYR0M0D2","reserved":{"amount":1000000,"unit":"USD_MICROCENTS"}}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"5c7df6631a1a8bcac68a4c66b755b92fd5547256ebd7ad0b151280010563b41338e19326b22c7def23df6bde39375f6c1e887dabbb20a23d0cf20a802560cc06","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"decide","evidence_id":"0c2d96c29903fd4165a760a72bbb5062e47057621d5c0d5d810d90e92573bb4f","issued_at_ms":1810000020000,"payload":{"decide":{"request":{"action":{"kind":"tool.call","name":"send_external_email","tags":["prod","customer-facing"]},"estimate":{"amount":5,"unit":"RISK_POINTS"},"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0E1","subject":{"agent":"researcher","tenant":"acme"}},"response":{"affected_scopes":["tenant","agent"],"decision":"ALLOW"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"32092e6a5a3d69c8bf55d727e867d168fad60d3e81e3f605c91ca440fe6c4f41148adbdc9ae2a334c2091fba5692f2462c4ca3bd0b58c2c3e33c3dbcae9ad80a","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"reserve","evidence_id":"0f779daaffc517057e23a25e68b6c45e1c1c30d2fb724a3ee3e6a6e4f9d07e6f","issued_at_ms":1810000030000,"payload":{"reserve":{"request":{"action":{"kind":"compute.job","name":"image-render"},"estimate":{"amount":50,"unit":"CREDITS"},"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0F1","subject":{"agent":"researcher","tenant":"acme"},"ttl_ms":60000},"response":{"affected_scopes":["tenant"],"balances":[{"allocated":{"amount":1000,"unit":"CREDITS"},"remaining":{"amount":950,"unit":"CREDITS"},"reserved":{"amount":50,"unit":"CREDITS"},"scope":"tenant","scope_path":"tenant=acme","spent":{"amount":0,"unit":"CREDITS"}}],"decision":"ALLOW","expires_at_ms":1810000090000,"reservation_id":"rsv_01HZZ8N4F8FBQX5K6TGYR0M0F2","reserved":{"amount":50,"unit":"CREDITS"},"scope_path":"tenant=acme"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"edb0234632aa36ecc73f4435b50f50f5d9ad3fc4b0da03a25646e1d1612d0e4489fe0a5d443f84004f12892e2156a9c60d12e273741e2319dcb80e12fe6a7904","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"error","evidence_id":"9a0a4915c31a7c0ffebe7de1cc3b9d318c09861dfa12653a84c004e797fc7742","issued_at_ms":1810000040000,"payload":{"error":{"endpoint":"POST /v1/reservations","http_status":409,"request":{"action":{"kind":"model.call","name":"gpt-4o"},"estimate":{"amount":100000000,"unit":"USD_MICROCENTS"},"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0G1","subject":{"agent":"researcher","tenant":"acme"},"ttl_ms":30000},"response":{"error":"BUDGET_EXCEEDED","message":"Insufficient remaining budget for scope tenant=acme","request_id":"req_01HZZ8N4F8FBQX5K6TGYR0M0G2","trace_id":"0123456789abcdef0123456789abcdef"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"78eefba76d414e75bf2f5cef696005fc2bc3f14e228938c9fc0795b65e400f7ab2a7b05fde955078c45b16fc7bdbddd8fba1bcfa1bc613f2c44c07b5d1ce5909","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"0123456789abcdef0123456789abcdef"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifact_type":"error","evidence_id":"dbe4f743b69a42d41a30102210c8de08b97d84467b0d057a0e18dc461b912e4d","issued_at_ms":1810000050000,"payload":{"error":{"endpoint":"POST /v1/decide","http_status":403,"request":{"action":{"kind":"model.call","name":"gpt-4o"},"estimate":{"amount":1000000,"unit":"USD_MICROCENTS"},"idempotency_key":"01HZZ8N4F8FBQX5K6TGYR0M0H1","subject":{"agent":"researcher","tenant":"acme"}},"response":{"error":"FORBIDDEN","message":"Tenant scope mismatch with effective auth context","request_id":"req_01HZZ8N4F8FBQX5K6TGYR0M0H2","trace_id":"fedcba9876543210fedcba9876543210"}}},"schema_version":"cycles-evidence/v0.1","server_id":"https://cycles.example.com/v1","signature":"9de34d70a49aa0d44f6e53db33cde9bb1635e252c2979993f76d012444bb928baaeb61e7bcd85452e8765bd854febf8f5e773fad9fd96bd2a60dcf40bcf8610f","signer_did":"ec52b49b81eb29ef6f62947cade245c715bf943b7ef2a5f2789288574466fc43","trace_id":"fedcba9876543210fedcba9876543210"}
Loading
Loading