Open codebook · schema v1.0.0

A source-level observation ledger for local-service AI answers.

A reusable CSV template, JSON Schema, and field codebook for teams that need reviewable evidence—not a vanity visibility score.

Download CSV template View JSON Schema

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.

Use responsibly: replace the synthetic row with observations you are permitted to collect. Do not paste personal information, private prompts, credentials, or confidential answer captures.

Field codebook

FieldTypeOperational meaning
observation_idstringStable identifier for the source-level row.
prompt_idstringStable identifier for the exact prompt text.
prompt_set_versionsemver stringVersion of the frozen prompt instrument, such as 1.0.0.
answer_surfacestringVisible product or interface where the answer was observed.
observed_atdate-timeISO 8601 timestamp with an explicit time zone.
marketstringDocumented geographic or language market for the run.
brand_mentionedbooleanWhether the target brand is visibly named in the answer.
target_domain_citedbooleanWhether a visible citation resolves to the target domain.
entity_consistentboolean or nullWhether answer details agree with the frozen business entity card; null means not yet reviewed.
cited_urlURL or nullExact visible destination after resolving only observable redirects.
normalized_hostnamestring or nullLowercase hostname used for publisher-concentration analysis.
source_roleenumDefinition, evidence, comparison, implementation, entity, experience, unknown, or none.
support_statusenumSupports, partial, contradicts, not found, needs review, or not applicable.
evidence_artifactURL or nullPermissioned answer-level artifact used by the reviewer.
is_syntheticbooleanTrue when the row is fictional and intended only as an implementation example.
review_notesstring or nullShort 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

  1. Require unique observation identifiers.
  2. Reject rows with missing prompt versions, answer surfaces, markets, or timestamps.
  3. Use actual booleans rather than the strings “true” and “false.”
  4. Require a cited URL when target_domain_cited=true.
  5. Flag target citation claims whose normalized hostname does not match the target domain.
  6. Require source_role=none only when no citation is present.
  7. Send unknown roles, contradictory evidence, and missing artifacts to human review.
  8. 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

This open codebook accompanies the local-service audit protocol. Corank maintains additional AI visibility measurement guidance and citation-evidence utilities.