# Step 3 — Content: the believable book

Author the demo data **before composing surfaces**. Data credibility is the single largest scoring dimension in blind judging; this step is where builds are won.

## From the corpus

Fetch the chosen domain's corpus — `search_catalog` (family `corpus`) to find it, `get_entry` to load it: the body (vocabulary, number-shape recipes, the invariants block) arrives with its `people` and `companies` rosters in one payload.

- Names come from the corpus roster; emails derive from names; roles are domain-correct.
- Activity strings use the corpus vocabulary — a CRM logs "Intro call with Elena — pricing discussion", never webhook noise.
- Numbers follow the corpus's shape recipes (log-normal deal values, plausible deltas); dates vary around the corpus's **fixed reference instant**, never around "now".
- **Acceptance is rendered plausibility against the declared invariants**: aggregates reconcile with their rows; legal ranges hold; forbidden repetition (same surname clusters, identical amounts) never shows. The ship gate checks these mechanically — author to them now.
- **Edge-case rows (nulls, zeros, outliers) go only into dedicated state fixtures** (`empty*`, `degraded*`), never into the primary dataset.

## Voice

Load the package-bound voice pack (`data/voices/<id>.md` — the package's §9 names it). All authored strings — buttons, empty states, errors, tooltips, confirmations — speak in that voice, with tone varying by situation per the pack's tone map.

## Chart choice

Every data-bearing surface consults the chart-selection engine — **one graph question per consult**. The census ships beside the engine; nothing is fetched:

1. Author the data signature (the judgment half): the question, measures, dimensions, semantic flags (temporal, parts-form-whole, target-exists, …), constraints. Decompose multi-question asks first.
2. Run `node scripts/select-chart.mjs <signature.json>` and read the typed output: admissible set, eliminations with reason codes, ranking, recommendation, or a refusal code.
3. **Honor refusals** — a refusal means the question isn't chartable as posed (often: it's a table). Never invent a measure to force a chart.
4. `record` the pick in one line. Taking a non-recommended admissible option needs a reason on that line; taking an eliminated option is out of contract.

Chart *styling* is not this step's concern — the package's §8 and the chart-styling axis own it at composition.
