# Schema: Recipes

Dataset `wpvc-recipes`, version 1.0.0, published 2026-09-17. One row per record; the CSV and the "Records" sheet of the XLSX carry the same columns in the same order.

| Column | Type | Description |
| --- | --- | --- |
| `card_id` | string | Stable Our Clarke identifier for the recipe card. Does not change between versions. |
| `title` | string | The dish name as printed or contributed, capitalization kept. |
| `source_book_citation` | string | The book and year the recipe is printed in, or "Contributed to OurClarke" for a recipe a Clarke cook sent in. |
| `source_page` | integer | The printed page number in the book. Empty for a contributed recipe. |
| `yield_raw` | string | The yield exactly as printed. Empty when the source prints none. |
| `yield_parsed` | string | JSON: {"count": n} or {"min": a, "max": b}, with "unit" as printed (null when none is printed) and "approximate": true for "about". Empty when the source prints no yield, or when the printed words are not one number or range of a unit (see yield_state). |
| `ingredients_json` | string | JSON list of the card's ingredient lines, each {"quantity", "item"} as printed, with the book's sub-headings as {"heading"} where they line up exactly. Empty when the list is withheld (see ingredients_state). |
| `directions_text` | string | The directions as printed, scan warts kept. Empty when withheld or not printed (see directions_state). |
| `directions_state` | string | present; not_printed (the source prints no method); or withheld_<reason>, where the reason is the projection's own: scan_debris (garbled by the scan), headnote, or layout (misread from the page layout). |
| `notes` | string | Our Clarke's note on the card: a correction made by hand against the book page, a note that the book prints no method or step, and one sentence for each withheld value saying why. Empty when there is nothing to say. |
| `macros_json` | string | JSON: the estimated nutrient totals for the card from USDA FoodData Central SR Legacy (2018-04) through a declared mapping; estimates, not measured values. "state" is computed, computed_totals_only (no single printed number of servings, so per_serving is null), partial or withheld (totals and per_serving are null, and hold_reasons, unmapped_ingredients or unresolved_ingredients say why). A null nutrient inside totals is one FDC does not report for a counted food. Method: docs/recipes/macros_methodology_2026-09-16.md. |
| `license_note` | string | The card's own rights status and basis, as the recipe page states it. It governs the recipe itself; the dataset license covers Our Clarke's compilation. |
| `contributed_by` | string | The cook the recipe is credited to, as the book prints the name or as a contributing cook gave it. |
| `ingredients_state` | string | present; not_printed; withheld_<reason> when the whole list is withheld; or present_heading_withheld_<reason> when the list ships but one of the book's sub-headings is withheld. Reasons as in directions_state. |
| `yield_state` | string | recorded (yield_parsed is filled), unparsed (printed, but not as one number or range of a unit) or not_printed. |
| `recipe_notes` | string | The note printed with the recipe, or the contributing cook's own note, verbatim. Empty when withheld or not printed (see recipe_notes_state). |
| `recipe_notes_state` | string | present, not_printed or withheld_<reason>, as in directions_state. |
| `card_url` | url | The card on the Our Clarke recipes page. |

An empty cell means the value is not recorded in the source, or could not be read from it. It never means zero.
