> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.whalehunt.net/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.whalehunt.net/_mcp/server.

# Lifecycle events and fields

Events appear in `batch.events`. The wire frame version and event schema are independent. The schema described here is `onchain.lifecycle.v1`. JSON fragments on this page illustrate tagged values; they are not complete events or captured production messages.

## Common lifecycle envelope

All listed fields are present on lifecycle events. Nullable relations are emitted as null, not omitted. The minimal source-quality envelope is a separate shape described below.

| Field                                       | JSON type                    | Meaning                                          |
| ------------------------------------------- | ---------------------------- | ------------------------------------------------ |
| `schema`                                    | string                       | `onchain.lifecycle.v1`                           |
| `eventId`                                   | typed string ID              | Stable notification identity for dedup           |
| `eventType`                                 | string                       | Event type below                                 |
| `entityId`                                  | Hash32 string                | Entity whose assessment changes                  |
| `assessmentRevision`                        | canonical decimal u64 string | Entity assessment revision                       |
| `rulesVersion`                              | string                       | Interpretation rules identity                    |
| `observedAt`                                | timestamp string             | Observation time, not client acceptance time     |
| `evidenceStage`                             | string enum                  | Evidence stage                                   |
| `transactionId`, `intentId`, `occurrenceId` | Hash32 string or null        | Known relations; occurrence identifies inclusion |
| `correctionOf`                              | typed event ID or null       | Previous notification being corrected            |
| `facets`                                    | object                       | Routing context                                  |
| `payload`                                   | tagged object                | Variant selected by `kind`                       |
| `eventOrdinal`                              | canonical decimal string     | Added by delivery; original batch index          |

Evidence stages are `pending_observation`, `admitted_intent`, `receipt_complete`, `canonicality_assessment`, `resolution_assessment`. An enum value does not imply its own public event type.

`facets` contains required `network`, `owners`, `signers`, `tokenIds`, `conditionIds`, `stages`, `correctionTargets`; the latter six are arrays and may be empty. NetworkRef is an object with `namespace: "eip155"`, `chain_id: 137` as a JSON integer and `genesis_hash` as a Hash32. It is distinct from frame scope's string network `polygon:137`. Signer facets do not imply a signer selector.

Domain IDs are opaque and are not interchangeable with transaction hashes. Hash32 uses `0x` followed by 64 lowercase hex characters; addresses use `0x` followed by 40 lowercase hex characters. Null relation means no known relation, not a zero hash. Raw uint256 values use canonical unsigned decimal strings, with range 0 through 2^256−1; revisions use u64 decimal strings.

## fill.intent

An admitted provisional participation from supported calldata. It is not an execution result. Payload requires `kind: "intent"`, `intent_id` (Hash32) and `pending` (object).

All pending fields below are present; only `calculationEvidenceRef` can be null.

| Pending fields                                                 | Type / meaning                                                    |
| -------------------------------------------------------------- | ----------------------------------------------------------------- |
| `network`, `transactionHash`, `exchangeDestination`            | NetworkRef, Hash32, address                                       |
| `transactionId`, `invocationId`, `intentId`                    | Domain Hash32 IDs                                                 |
| `role`, `calldataOrdinal`, `orderHash`                         | `maker`/`taker`, JSON u32 integer, Hash32                         |
| `conditionId`, `owner`, `signer`, `tokenId`, `side`            | Hash32, addresses, uint256 decimal string, `"0"` buy / `"1"` sell |
| `makerAsset`, `takerAsset`                                     | `collateral` or `outcome_token`                                   |
| `signedMakerAmount`, `signedTakerAmount`                       | Signed raw amounts as uint256 strings                             |
| `requestedFillMakerAmount`, `requestedFeeArgument`             | Call arguments as uint256 strings; not actual amounts             |
| `limitRatio`                                                   | Required `makerAmount`, `takerAmount` uint256 strings             |
| `calculation`                                                  | Tagged result below                                               |
| `generationId`, `deploymentEvidenceRef`, `operatorEvidenceRef` | Hash32 evidence references                                        |
| `calculationEvidenceRef`                                       | Hash32 or null                                                    |
| `orderSignatureVerified`, `executionGuaranteed`                | Booleans; do not infer stronger claims from calldata              |

Calculation fragment:

```json
{"status":"unavailable","reason":"taker_execution_dependent"}
```

The other variant is `provisional_maker_taking` with required raw `amount` string and `rule` string identifying the supported calculation rule. Unavailable reasons: `taker_execution_dependent`, `rule_unverified`, `zero_maker_amount`, `fill_exceeds_signed_maker_amount`, `arithmetic_overflow`. Fields from another variant are not substitutes for the selected result.

Save intent as provisional; exclude it from actual volume. Valid admitted pending facts do not claim `executionGuaranteed: true`. One transaction can have several intents, and repeated order hashes do not prove a unique execution relation.

## transaction.included and transaction.reverted

These describe a full receipt outcome for a particular inclusion. Payload requires `kind: "inclusion"`, `inclusion_id` (Hash32), `outcome` (`success`/`revert`) and `normalizationStatus` (tagged object).

Normalization fragment:

```json
{"status":"normalized"}
```

Other statuses are `no_exchange_events`, `reverted`, or `unsupported` with required `reason`. Unsupported reasons: `incomplete_taker_emission`, `fee_evidence`, `match_shape`, `conservation`, `amount_exceeds_u128`, `arithmetic_overflow`.

Record outcome and normalization separately from executions. Revert creates no fills. Unsupported normalization is not a zero fill. Success does not prove finality or guarantee supported executions. Receipt-only inclusion is valid, and this envelope is not the raw receipt.

## fill.execution

A normalized execution from a complete receipt. A later event of the same type can refine its intent relation, with a new revision rather than another trade.

Payload fields are all required and non-null:

| Field          | Type / meaning                                                      |
| -------------- | ------------------------------------------------------------------- |
| `kind`         | `execution`                                                         |
| `execution_id` | Hash32 execution identity                                           |
| `amounts`      | Required `side`, `tokenId`, `grossCash`, `shares`, `fee`, `netCash` |
| `intent`       | Tagged exact/ambiguous/unavailable correlation                      |
| `resource_ids` | Array of shared resource Hash32 IDs                                 |

`side` is string `"0"` (buy) or `"1"` (sell). Remaining amounts are uint256 decimal strings. Cash and shares use raw units from verified asset configuration; maker/taker perspectives must not be summed as independent volume.

Correlation fragment:

```json
{"status":"unavailable","reason":"intent_not_observed"}
```

Exact correlation requires `status: "exact"` and `value` (IntentId). Ambiguous requires `status: "ambiguous"` and `candidates` (IntentId array). Unavailable requires `reason`: `intent_not_observed`, `unsupported_invocation` or `insufficient_evidence`. No exact join is promised from transaction hash alone. Missing intent correlation does not turn receipt-backed actual amounts into estimates.

Apply by execution/entity and revision, respecting occurrence canonicality. Receipt-first and partial fills are valid. See [identities](/polymarket/concepts/identities) and [amounts](/polymarket/concepts/values).

## canonicality.changed

An updated chain-evidence assessment of one inclusion. Payload requires `kind: "canonicality_changed"`, `inclusion_id` (Hash32), `prior` and `current`.

Assessment values: `unassessed`, `included`, `orphaned`, `depth_confirmed`, `chain_finalized`. Fragment:

```json
{"prior":"included","current":"orphaned"}
```

Update the canonical projection of this inclusion and related executions. Reinclusion creates a different occurrence. Depth does not establish chain finality. `canonicality.orphaned` and `canonicality.chain_finalized` are not wire event types: they are assessment values in this event type.

## transaction.resolution

Evidence about an observed transaction's fate, not a fabricated receipt or automatic terminal replacement. Required payload fields: `kind: "resolution"`, `resolution_id` Hash32, `reason` object, `status` object and `evidence_ref` Hash32.

| `reason` tag              | Required additional fields                                                         | Interpretation                                |
| ------------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------- |
| `horizon_expired_unknown` | `horizon`: timestamp string                                                        | No proven cancellation                        |
| `competing_candidate`     | `candidate_transaction_id`: Hash32, `sender`: address, `nonce`: decimal u64 string | Candidate has not necessarily won             |
| `nonce_consumed`          | `consuming_transaction_id`, `block_hash`: Hash32                                   | Still subject to applicable chain corrections |

The nested tag is named `reason`, not `kind`. Status is either `unresolved`, or `receipt_observed` with required `inclusion_ids` Hash32 array. Fragment:

```json
{"status":"unresolved"}
```

Save the assessment and revision, allowing later receipt evidence. Resolution creates neither an execution nor volume.

## source.gap and capability.changed

These report source observation quality using a minimal envelope. They do not require the lifecycle relation/facets fields above.

Required fields: `schema`, `eventId`, `eventType`, `entityId`, `assessmentRevision`, `rulesVersion`, `observedAt`, `evidenceStage`, `payload`, plus delivered `eventOrdinal`. `observationReason`, when available, is present as a string (`realtime`, `recovery_backfill`, `late_resolution`); otherwise it is omitted, not emitted as null.

`rulesVersion` is `source-quality.v1`, `evidenceStage` is `source_observation`, revision is `"1"`. Entity ID uses `idx:v1:source-quality:` followed by Hash32; it is not a transaction ID. Observation time is an RFC3339 string.

Payload requires only `sourceScope`, `network`, `contractScope`, `capability`, `reason`. Network is string `polygon:137`. Source/contract scopes are bounded lowercase ASCII names using letters, digits, `.`, `:`, `_`, `-`.

`source.gap` has capability `gap`; reasons are `transport`, `protocol`, `queue_overload`, `queue_failure`, `process_restart`, `process_shutdown`, `source_control`, `removed_log`. `capability.changed` has capability `ready` and reason `subscription_ack`.

Update quality coverage without creating fills. Quiet-wallet subscriptions can receive these notices; ready does not recover missing pending. Private epochs/recovery bytes are excluded. See [source health](/polymarket/operations/source-health).

## Mixed wire names

Preserve snake\_case fields such as `intent_id`, `execution_id`, `resource_ids`, `inclusion_id`, `resolution_id`, `evidence_ref` and resolution variant fields. The common envelope and many nested structs use camelCase. Converting the entire payload to a uniform casing changes the contract.

## Complete synthetic source-derived examples

These are deterministic software fixtures produced by the existing reducer and serializers, not observed trades or production captures. The pending fixture has `orderSignatureVerified: false` and synthetic evidence references: it demonstrates reducer output and JSON shape only, not successful signed-envelope verification or admission.

The following six objects are complete stored lifecycle domain events. They are not a customer `batch` frame: delivery adds `eventOrdinal` and the batch envelope. Normal lifecycle `facets` are preserved. The success, orphan correction, revert and unresolved examples illustrate different fixture scenarios; do not aggregate them into one trade.

### fill.intent: complete stored domain event

```json
{
  "assessmentRevision": "1",
  "correctionOf": null,
  "entityId": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe",
  "eventId": "idx:v1:event:cdcafdc6e056c0c2020b69114cd7bc880e8320bc991e4f9ab313001d00f117a2",
  "eventType": "fill.intent",
  "evidenceStage": "admitted_intent",
  "facets": {
    "conditionIds": [
      "0x3131313131313131313131313131313131313131313131313131313131313131"
    ],
    "correctionTargets": [],
    "network": {
      "chain_id": 137,
      "genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
      "namespace": "eip155"
    },
    "owners": [
      "0x4141414141414141414141414141414141414141"
    ],
    "signers": [
      "0x4242424242424242424242424242424242424242"
    ],
    "stages": [
      "pending"
    ],
    "tokenIds": [
      "7"
    ]
  },
  "intentId": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe",
  "observedAt": "2026-09-24T11:59:59Z",
  "occurrenceId": null,
  "payload": {
    "intent_id": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe",
    "kind": "intent",
    "pending": {
      "calculation": {
        "reason": "rule_unverified",
        "status": "unavailable"
      },
      "calculationEvidenceRef": null,
      "calldataOrdinal": 0,
      "conditionId": "0x3131313131313131313131313131313131313131313131313131313131313131",
      "deploymentEvidenceRef": "0x8282828282828282828282828282828282828282828282828282828282828282",
      "exchangeDestination": "0x5151515151515151515151515151515151515151",
      "executionGuaranteed": false,
      "generationId": "0x8181818181818181818181818181818181818181818181818181818181818181",
      "intentId": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe",
      "invocationId": "0xcede4c97c84a925d9aa90c18aa8df61ad1facd18c5adce0facb2245178c72c00",
      "limitRatio": {
        "makerAmount": "1000000",
        "takerAmount": "2000000"
      },
      "makerAsset": "collateral",
      "network": {
        "chain_id": 137,
        "genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
        "namespace": "eip155"
      },
      "operatorEvidenceRef": "0x8383838383838383838383838383838383838383838383838383838383838383",
      "orderHash": "0x7171717171717171717171717171717171717171717171717171717171717171",
      "orderSignatureVerified": false,
      "owner": "0x4141414141414141414141414141414141414141",
      "requestedFeeArgument": "0",
      "requestedFillMakerAmount": "500000",
      "role": "maker",
      "side": "0",
      "signedMakerAmount": "1000000",
      "signedTakerAmount": "2000000",
      "signer": "0x4242424242424242424242424242424242424242",
      "takerAsset": "outcome_token",
      "tokenId": "7",
      "transactionHash": "0x2121212121212121212121212121212121212121212121212121212121212121",
      "transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
    }
  },
  "rulesVersion": "onchain-lifecycle-reducer-v1",
  "schema": "onchain.lifecycle.v1",
  "transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}
```

### transaction.included: complete stored domain event

```json
{
  "assessmentRevision": "1",
  "correctionOf": null,
  "entityId": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
  "eventId": "idx:v1:event:a1cafc222af33186886a4166ee57e0c29c6a3091de6cd7b468c22fccf2aff2df",
  "eventType": "transaction.included",
  "evidenceStage": "receipt_complete",
  "facets": {
    "conditionIds": [
      "0x3131313131313131313131313131313131313131313131313131313131313131"
    ],
    "correctionTargets": [],
    "network": {
      "chain_id": 137,
      "genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
      "namespace": "eip155"
    },
    "owners": [
      "0x4141414141414141414141414141414141414141"
    ],
    "signers": [
      "0x4242424242424242424242424242424242424242"
    ],
    "stages": [
      "included"
    ],
    "tokenIds": [
      "7"
    ]
  },
  "intentId": null,
  "observedAt": "2026-09-24T12:00:00Z",
  "occurrenceId": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
  "payload": {
    "inclusion_id": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
    "kind": "inclusion",
    "normalizationStatus": {
      "status": "normalized"
    },
    "outcome": "success"
  },
  "rulesVersion": "onchain-lifecycle-reducer-v1",
  "schema": "onchain.lifecycle.v1",
  "transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}
```

### fill.execution: complete stored domain event

```json
{
  "assessmentRevision": "1",
  "correctionOf": null,
  "entityId": "0x97643d249648bbc7ea9fd77472dfa580116b0ac19d00734d4c6d25c8b7de09de",
  "eventId": "idx:v1:event:0fc9fc197498bcff3c630c02e568df73b954ffb924315256db63cb92f6c74499",
  "eventType": "fill.execution",
  "evidenceStage": "receipt_complete",
  "facets": {
    "conditionIds": [
      "0x3131313131313131313131313131313131313131313131313131313131313131"
    ],
    "correctionTargets": [],
    "network": {
      "chain_id": 137,
      "genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
      "namespace": "eip155"
    },
    "owners": [
      "0x4141414141414141414141414141414141414141"
    ],
    "signers": [
      "0x4242424242424242424242424242424242424242"
    ],
    "stages": [
      "included"
    ],
    "tokenIds": [
      "7"
    ]
  },
  "intentId": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe",
  "observedAt": "2026-09-24T12:00:00Z",
  "occurrenceId": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
  "payload": {
    "amounts": {
      "fee": "0",
      "grossCash": "500000",
      "netCash": "500000",
      "shares": "1000000",
      "side": "0",
      "tokenId": "7"
    },
    "execution_id": "0x97643d249648bbc7ea9fd77472dfa580116b0ac19d00734d4c6d25c8b7de09de",
    "intent": {
      "status": "exact",
      "value": "0xd5b6f031c3a81028217a4a1375d6cbe70acaf08c33c9bc136e4f621ac16ffcbe"
    },
    "kind": "execution",
    "resource_ids": []
  },
  "rulesVersion": "onchain-lifecycle-reducer-v1",
  "schema": "onchain.lifecycle.v1",
  "transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}
```

### canonicality.changed: complete stored domain event

```json
{
  "assessmentRevision": "2",
  "correctionOf": "idx:v1:event:a1cafc222af33186886a4166ee57e0c29c6a3091de6cd7b468c22fccf2aff2df",
  "entityId": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
  "eventId": "idx:v1:event:fb09803b9c2df714b623c1f2c708b6ed88c821358fa0dd880f8e48a48e304bd0",
  "eventType": "canonicality.changed",
  "evidenceStage": "canonicality_assessment",
  "facets": {
    "conditionIds": [
      "0x3131313131313131313131313131313131313131313131313131313131313131"
    ],
    "correctionTargets": [
      "idx:v1:event:a1cafc222af33186886a4166ee57e0c29c6a3091de6cd7b468c22fccf2aff2df"
    ],
    "network": {
      "chain_id": 137,
      "genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
      "namespace": "eip155"
    },
    "owners": [
      "0x4141414141414141414141414141414141414141"
    ],
    "signers": [
      "0x4242424242424242424242424242424242424242"
    ],
    "stages": [
      "included"
    ],
    "tokenIds": [
      "7"
    ]
  },
  "intentId": null,
  "observedAt": "2026-09-24T12:01:00Z",
  "occurrenceId": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
  "payload": {
    "current": "orphaned",
    "inclusion_id": "0x2fd454e36102f70d9e856cba8c5a63d834c7e5437b01948f4cbae3b273aa92bf",
    "kind": "canonicality_changed",
    "prior": "included"
  },
  "rulesVersion": "onchain-lifecycle-reducer-v1",
  "schema": "onchain.lifecycle.v1",
  "transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}
```

### transaction.reverted: complete stored domain event

```json
{
  "assessmentRevision": "1",
  "correctionOf": null,
  "entityId": "0xe04266478ddb8561a55744f42fc3967182d8b7c947634d670ba369168b55b03d",
  "eventId": "idx:v1:event:f6d684b8e2bc41a01340a157fe9f98fc2b065e459b9259755698be5f8e48c09c",
  "eventType": "transaction.reverted",
  "evidenceStage": "receipt_complete",
  "facets": {
    "conditionIds": [
      "0x3131313131313131313131313131313131313131313131313131313131313131"
    ],
    "correctionTargets": [],
    "network": {
      "chain_id": 137,
      "genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
      "namespace": "eip155"
    },
    "owners": [
      "0x4141414141414141414141414141414141414141"
    ],
    "signers": [
      "0x4242424242424242424242424242424242424242"
    ],
    "stages": [
      "reverted"
    ],
    "tokenIds": [
      "7"
    ]
  },
  "intentId": null,
  "observedAt": "2026-09-24T12:00:00Z",
  "occurrenceId": "0xe04266478ddb8561a55744f42fc3967182d8b7c947634d670ba369168b55b03d",
  "payload": {
    "inclusion_id": "0xe04266478ddb8561a55744f42fc3967182d8b7c947634d670ba369168b55b03d",
    "kind": "inclusion",
    "normalizationStatus": {
      "status": "reverted"
    },
    "outcome": "revert"
  },
  "rulesVersion": "onchain-lifecycle-reducer-v1",
  "schema": "onchain.lifecycle.v1",
  "transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}
```

### transaction.resolution: complete stored domain event

```json
{
  "assessmentRevision": "1",
  "correctionOf": null,
  "entityId": "0x349d80700e610533793b1610cc015809f1d55203c76216f25ddc078922d639d3",
  "eventId": "idx:v1:event:70590494b01201d7c7f718881b13ca0521dbbd39402fa5b7cde0c8612b51068b",
  "eventType": "transaction.resolution",
  "evidenceStage": "resolution_assessment",
  "facets": {
    "conditionIds": [
      "0x3131313131313131313131313131313131313131313131313131313131313131"
    ],
    "correctionTargets": [],
    "network": {
      "chain_id": 137,
      "genesis_hash": "0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b",
      "namespace": "eip155"
    },
    "owners": [
      "0x4141414141414141414141414141414141414141"
    ],
    "signers": [
      "0x4242424242424242424242424242424242424242"
    ],
    "stages": [
      "resolution"
    ],
    "tokenIds": [
      "7"
    ]
  },
  "intentId": null,
  "observedAt": "2026-09-24T12:10:01Z",
  "occurrenceId": null,
  "payload": {
    "evidence_ref": "0x8585858585858585858585858585858585858585858585858585858585858585",
    "kind": "resolution",
    "reason": {
      "horizon": "2026-09-24T12:10:00Z",
      "reason": "horizon_expired_unknown"
    },
    "resolution_id": "0x349d80700e610533793b1610cc015809f1d55203c76216f25ddc078922d639d3",
    "status": {
      "status": "unresolved"
    }
  },
  "rulesVersion": "onchain-lifecycle-reducer-v1",
  "schema": "onchain.lifecycle.v1",
  "transactionId": "0x3fb4913b332b4dbe3be61301776121674a5446792825d1ee15151039bf87090d"
}
```

### Quality notices: complete projected batch frames

These two deterministic fixtures use the actual replay projection and server serializer. Unlike stored domain events above, each includes a delivery ordinal and batch envelope. Private epochs and quality routing facets are excluded. The fixture clock is synthetic, not a current source-status claim.

```json
{
  "batchId": "f29d6487-26da-f45c-6f88-1f3f122b4c9c",
  "deliveryMode": "replay",
  "events": [
    {
      "assessmentRevision": "1",
      "entityId": "idx:v1:source-quality:0x5231b4aec309843f01fdbea761b7119f7f6eb6ef03cf0618e31d90b2241f73d2",
      "eventId": "idx:v1:event:f29d648726daf45c6f881f3f122b4c9c8d4d8d37dc782192547e6ce8052ae110",
      "eventOrdinal": "0",
      "eventType": "capability.changed",
      "evidenceStage": "source_observation",
      "observedAt": "2027-01-15T08:00:00.000000000Z",
      "payload": {
        "capability": "ready",
        "contractScope": "ctf-exchange-v2",
        "network": "polygon:137",
        "reason": "subscription_ack",
        "sourceScope": "polygon.pending"
      },
      "rulesVersion": "source-quality.v1",
      "schema": "onchain.lifecycle.v1"
    }
  ],
  "frameSequence": "3",
  "kind": "batch",
  "matchedEventCount": "1",
  "position": "1",
  "sourceEventCount": "1",
  "version": 1
}
```

```json
{
  "batchId": "d33b5269-9292-82f5-a691-62e0c96a97f2",
  "deliveryMode": "replay",
  "events": [
    {
      "assessmentRevision": "1",
      "entityId": "idx:v1:source-quality:0x5231b4aec309843f01fdbea761b7119f7f6eb6ef03cf0618e31d90b2241f73d2",
      "eventId": "idx:v1:event:d33b5269929282f5a69162e0c96a97f29daad45593fec0e50379bba74a452f40",
      "eventOrdinal": "0",
      "eventType": "source.gap",
      "evidenceStage": "source_observation",
      "observedAt": "2027-01-15T08:00:00.000000000Z",
      "payload": {
        "capability": "gap",
        "contractScope": "ctf-exchange-v2",
        "network": "polygon:137",
        "reason": "transport",
        "sourceScope": "polygon.pending"
      },
      "rulesVersion": "source-quality.v1",
      "schema": "onchain.lifecycle.v1"
    }
  ],
  "frameSequence": "4",
  "kind": "batch",
  "matchedEventCount": "1",
  "position": "2",
  "sourceEventCount": "1",
  "version": 1
}
```