# DATA-DICTIONARY — ERC-8004 tokenURI resolvability (hop H2), 2026-09-02

Field-by-field schema for the two distributions of this dataset:

- `dataset.csv` — tidy per-scope summary table (6 data rows + header,
  three scopes × two metrics).
- `tokenuri_resolvability.json` — raw observational probe payload
  (top-level metadata + `corpus` + `usable_card_definition` +
  `buckets_defined` + `per_chain` + `pooled`).

Everything below is captured verbatim from the probe at the probe
instant (`2026-09-02T20:06:20Z`); nothing is synthesised.

## Raw JSON — top-level fields

| Field | Type | Source | Definition |
|---|---|---|---|
| `dataset` | string | assigned | Human-readable name of the measurement. |
| `publisher` | string | assigned | `"On-Chain Agent Intel"`. |
| `license` | url | assigned | CC BY 4.0 licence URL. |
| `license_name` | string | assigned | `"CC BY 4.0"`. |
| `generated_at` | iso8601 | assigned | UTC instant at which the raw JSON was serialised. |
| `measured_at` | iso8601 | measured | UTC instant at which the probe window closed. |
| `task` | string | assigned | Identifier of the measurement run. |
| `seed` | int | assigned | Fixed PRNG seed for sample draw (`415`). |
| `n_per_chain_target` | int | assigned | Target per-chain sample size (`600`). |
| `wall_clock_cap_s` | int | assigned | Hard cap on total probe elapsed time. |
| `elapsed_s` | float | measured | Observed probe elapsed time. |
| `truncated` | boolean | measured | `true` iff the wall-clock cap bit (always `false` in this snapshot). |
| `global_rate_per_sec` | int | assigned | Global rate limit on outbound requests. |
| `per_host_concurrency` | int | assigned | Max concurrent requests to any single host. |
| `timeout_s` | int | assigned | Per-request timeout in seconds. |
| `user_agent` | string | assigned | HTTP `User-Agent` string sent with every request. |
| `corpus` | object | measured | Eligible-population metadata (see below). |
| `usable_card_definition` | object | assigned | Pre-pinned usable-card rule (see below). |
| `buckets_defined` | array | assigned | 9-element list of bucket names (see below). |
| `per_chain` | object | measured | Per-chain aggregates and sub-fields (see below). |
| `pooled` | object | measured | Pooled (Base + Ethereum combined) aggregates. |
| `source_research_path` | string | assigned | Repo-relative path to the task research JSON. |

## Raw JSON — `corpus` sub-fields

| Field | Type | Source | Definition |
|---|---|---|---|
| `corpus.source_dir` | string | assigned | Absolute path to the agent memory directory that was read. |
| `corpus.files_read` | int | measured | Number of per-agent memory files parsed. |
| `corpus.raw_lines_with_nonempty_uri` | int | measured | Count of raw memory lines with a non-empty `tokenURI` string. |
| `corpus.eligible_after_dedup_per_chain.base` | int | measured | Eligible population on Base after dedup. |
| `corpus.eligible_after_dedup_per_chain.ethereum` | int | measured | Eligible population on Ethereum after dedup. |

## Raw JSON — `usable_card_definition` sub-fields

| Field | Type | Source | Definition |
|---|---|---|---|
| `usable_card_definition.requires` | string list | assigned | Three pre-conditions (see METHOD.md § Usable-card definition). |
| `usable_card_definition.pinned_before_probing` | boolean | assigned | `true` — the rule was pinned before probing began. |

## Raw JSON — `buckets_defined`

A 9-element string array of bucket names, in the order they were
defined before probing: `ok_json`, `non_json_body`, `empty_body`,
`http_4xx`, `http_5xx`, `dns_or_conn_fail`, `timeout`,
`ipfs_gateway_fail`, `bad_scheme_or_unparseable_uri`.

## Raw JSON — `per_chain.<chain>` sub-fields

For each chain (`base`, `ethereum`):

| Field | Type | Source | Definition |
|---|---|---|---|
| `eligible_population` | int | measured | Size of the chain's eligible population (= `corpus.eligible_after_dedup_per_chain.<chain>`). |
| `sample_target_n` | int | assigned | `= n_per_chain_target` (`600`). |
| `actual_draw_n` | int | measured | Count of agents actually drawn. |
| `realized_n` | int | measured | Count of agents with a classification (= `actual_draw_n` in this snapshot). |
| `buckets.<name>` | int | measured | Per-bucket count. Only buckets with ≥1 observation are present. |
| `ok_json` | int | measured | Convenience mirror of `buckets.ok_json`. |
| `usable_card` | int | measured | Count of `ok_json` responses that satisfy the pinned usable-card rule. |
| `json_but_not_a_card` | int | measured | Count of `ok_json` responses that fail the pinned usable-card rule. |
| `resolve_rate.p` | float | computed | Point estimate = `ok_json / realized_n`. |
| `resolve_rate.lo` | float | computed | Wilson 95% CI lower bound. |
| `resolve_rate.hi` | float | computed | Wilson 95% CI upper bound. |
| `usable_card_rate.p` | float | computed | Point estimate = `usable_card / realized_n`. |
| `usable_card_rate.lo` | float | computed | Wilson 95% CI lower bound. |
| `usable_card_rate.hi` | float | computed | Wilson 95% CI upper bound. |
| `host_share_by_bucket.<bucket>.top_host` | string | measured | DNS domain only (e.g. `ipfs.io`, `api.normies.art`). Special sentinels: `<data>` for `data:` URIs, `<unparseable>` for URIs that failed parsing. **No per-agent data.** |
| `host_share_by_bucket.<bucket>.top_host_share` | float | computed | `top_host_n / bucket_n` as a fraction. |
| `host_share_by_bucket.<bucket>.top_host_n` | int | measured | Count of responses in this bucket served by `top_host`. |
| `host_share_by_bucket.<bucket>.bucket_n` | int | measured | Total count of responses in this bucket. |
| `near_miss_shape_examples` | array of string list | measured | Up to 3 example shapes — each a sorted list of top-level JSON keys from an `ok_json` response that failed the usable-card rule. No per-agent id, wallet, or ENS name. |

## Raw JSON — `pooled` sub-fields

The `pooled` block has the same shape as `per_chain.<chain>` for the
numeric fields, computed on the combined (Base + Ethereum) sample.
`host_share_by_bucket` and `near_miss_shape_examples` are not present
on `pooled` in this snapshot.

| Field | Type | Source | Definition |
|---|---|---|---|
| `realized_n` | int | measured | `= 1200` (per-chain `realized_n` summed). |
| `buckets.<name>` | int | measured | Per-bucket count across both chains. |
| `ok_json` | int | measured | `= per_chain.base.ok_json + per_chain.ethereum.ok_json`. |
| `usable_card` | int | measured | `= per_chain.base.usable_card + per_chain.ethereum.usable_card`. |
| `json_but_not_a_card` | int | measured | `= per_chain.base.json_but_not_a_card + per_chain.ethereum.json_but_not_a_card`. |
| `resolve_rate.{p,lo,hi}` | float | computed | Point + Wilson 95% CI on `ok_json / realized_n`. |
| `usable_card_rate.{p,lo,hi}` | float | computed | Point + Wilson 95% CI on `usable_card / realized_n`. |

## CSV columns (6)

The CSV is a tidy summary of the two rates across three scopes
(`base`, `ethereum`, `pooled`). It carries no per-agent / per-bucket /
per-host data; the full detail stays in the raw JSON.

| # | Column | Type | Null semantics |
|---:|---|---|---|
| 1 | `scope` | enum (`base`, `ethereum`, `pooled`) | Always populated. |
| 2 | `metric` | enum (`resolve_rate`, `usable_card_rate`) | Always populated. |
| 3 | `value` | decimal | Point estimate (`.p`). Preserved at source-JSON precision; no rounding. |
| 4 | `ci_lo` | decimal | Wilson 95% CI lower bound (`.lo`). |
| 5 | `ci_hi` | decimal | Wilson 95% CI upper bound (`.hi`). |
| 6 | `realized_n` | int | `realized_n` for the scope. |

Row ordering: `base` → `ethereum` → `pooled`, with `resolve_rate` before
`usable_card_rate` within each scope.

## Privacy / aggregation

All distributions in this dataset are **aggregate-only**: scope-level
counts, rates, CIs, and bucket-level DNS-domain summaries. No
per-agent id, no per-wallet address, no ENS name, no personal data. The
`top_host` fields are DNS domain names only.

## License

[Creative Commons Attribution 4.0 International (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/).
