What this ledger records
The ledger stores one source-level observation for one versioned prompt run. It keeps brand mentions separate from target-domain citations, records whether entity details agree with a frozen business card, assigns an operational role to each cited page, and preserves the reviewer’s support judgment.
The downloadable CSV contains one explicitly synthetic row so spreadsheet software can infer the columns. It does not contain observed performance, customer information, rankings, or claims about a real business.
Field codebook
| Field | Type | Operational meaning |
|---|---|---|
observation_id | string | Stable identifier for the source-level row. |
prompt_id | string | Stable identifier for the exact prompt text. |
prompt_set_version | semver string | Version of the frozen prompt instrument, such as 1.0.0. |
answer_surface | string | Visible product or interface where the answer was observed. |
observed_at | date-time | ISO 8601 timestamp with an explicit time zone. |
market | string | Documented geographic or language market for the run. |
brand_mentioned | boolean | Whether the target brand is visibly named in the answer. |
target_domain_cited | boolean | Whether a visible citation resolves to the target domain. |
entity_consistent | boolean or null | Whether answer details agree with the frozen business entity card; null means not yet reviewed. |
cited_url | URL or null | Exact visible destination after resolving only observable redirects. |
normalized_hostname | string or null | Lowercase hostname used for publisher-concentration analysis. |
source_role | enum | Definition, evidence, comparison, implementation, entity, experience, unknown, or none. |
support_status | enum | Supports, partial, contradicts, not found, needs review, or not applicable. |
evidence_artifact | URL or null | Permissioned answer-level artifact used by the reviewer. |
is_synthetic | boolean | True when the row is fictional and intended only as an implementation example. |
review_notes | string or null | Short explanation of uncertainty, conflicts, or exclusions. |
One answer can create several rows
If an answer cites three pages, use three rows with the same prompt and run metadata and a different observation_id and cited_url. This supports source-role coverage and hostname concentration without storing an ambiguous list inside one cell.
If an answer has no visible citations, retain one row with target_domain_cited=false, null citation fields, source_role=none, and support_status=not_applicable. Dropping citation-free answers would bias later rates.
Validation rules before aggregation
- Require unique observation identifiers.
- Reject rows with missing prompt versions, answer surfaces, markets, or timestamps.
- Use actual booleans rather than the strings “true” and “false.”
- Require a cited URL when
target_domain_cited=true. - Flag target citation claims whose normalized hostname does not match the target domain.
- Require
source_role=noneonly when no citation is present. - Send unknown roles, contradictory evidence, and missing artifacts to human review.
- Aggregate only comparable prompt versions and documented answer conditions.
The JSON Schema checks data shape and enumerated values. It cannot determine whether an answer is accurate, a cited page genuinely supports a claim, or a source is independent.
Transparent aggregate measures
Calculate measures from unique prompt runs rather than raw source rows. A three-citation answer should not count as three mentions.
mention_rate = prompt runs with brand_mentioned=true / all prompt runs citation_rate = prompt runs with target_domain_cited=true / all prompt runs publisher_concentration = rows from top hostname / all cited-source rows role_coverage = observed source roles / required roles for that prompt intent
Publish the numerator, denominator, prompt-set version, observation window, and answer surfaces alongside every percentage. Keep citation rate separate from mention rate and source-role coverage.
Change control
A new column, changed enum meaning, or different rule for normalizing hostnames changes the measurement system. Version the schema and keep the previous codebook available. Do not overwrite an earlier dataset after changing a classification rule; record the correction and its effect.
When adding prompts, report a stable cohort shared by both windows and the full current set separately. Never backfill invented historical observations for new prompts.
Limitations
- AI answers can vary by model, date, market, account, interface, retrieval mode, and personalization.
- A visible citation does not prove that the page caused the answer or supports every claim.
- A schema-valid record may still reflect a mistaken human judgment.
- Publisher concentration is a review signal, not a quality verdict.
- Local-service facts can change; preserve the entity-card version used for the audit.
- No measurement protocol guarantees rankings, citations, traffic, leads, or revenue.
This open codebook accompanies the local-service audit protocol. Corank maintains additional AI visibility measurement guidance and citation-evidence utilities.