Skip to content

saucier

Structured procedure extraction from culinary sources.

saucier reads a cookbook and returns a catalogue. Each preparation carries its terms, the language of each term, the parent it derives from, and the source line the claim came from. No model runs.

One preparation, as the catalogue holds it

BÉARNAISE TOMATÉE SAUCEfr

CHORON SAUCEen

derives fromtomato

source escoffier-1909  ·  entry 64  ·  line 2138  ·  fidelity transcription

One preparation, two terms, two languages. Neither term is translated into the other, and both are kept exactly as Escoffier set them. BÉARNAISE folds to bearnaise to give the concept its id, and the accented surface form is what the catalogue stores. The citation is the point: entry 64 at line 2138 is a line you can open in corpus/ and read. The source is Escoffier's A Guide to Modern Cookery, tracked here in full, in two printings.

The five mothers

Escoffier names his own foundational sauces in his own text. The parser reads them out of that sentence. Nobody supplied the list.

  • bechamel
  • espagnole
  • hollandaise
  • tomato
  • veloute

The number this release is judged on

  • 151 preparations
  • 57 resolved
  • 94 unresolved

94 preparations state no base in their prose, or state more than one. The parser records those as unresolved and does not guess at them. The hatched share is what the source declined to say, not what the extraction failed to find. Lowering that count by guessing would be the one unrecoverable mistake here, so the number is published rather than hidden.

A parent may be any catalogued preparation, not only a mother. Marrow Sauce says it is "only a variety of the Bordelaise", so it resolves to Bordelaise. Bordelaise says "add one-half pint of half-glaze", half glaze says it is Espagnole despumated, and Espagnole opens with brown roux. Two of the five mothers state a parent of their own.

An entry that states two candidates counts as unresolved. CARDINAL SAUCE says "Boil one pint of Béchamel" and then "finish ... with lobster butter". The source stated one base and one finish. The parser reads names and cannot tell which is which, so it declines, and saucier show prints both names. Seven sauces that were resolved at v0.3.0 are unresolved for that reason, and three more because half glaze now sits beside their old parent. ADR-0015 names all ten.

$ uv run saucier parse
escoffier-1909  New and Revised Edition, January 1909 (impression: January 1920)
                transcription of Project Gutenberg 71395
                mothers: bechamel, espagnole, hollandaise, tomato, veloute
                151 sauces, 57 derived, 94 unresolved
escoffier-1907  no edition stated, copyright 1907
                ocr of Internet Archive cu31924000610117
                mothers: bechamel, espagnole, hollandaise, tomato, veloute
                140 sauces, 51 derived, 89 unresolved

Two witnesses of one book, each naming itself from its own title page. The 1907 text is a scan, so its numbers are read through OCR and every record says so.

Where to go

First run
Clone the repository and print a derivation tree from a 1909 cookbook. No GPU, no key, no database, no network.
Add a source
Point the extractor at another public-domain book, and find out whether the entry pattern fits it.
Reference
The commands, the data model, the glossary, and the API generated from the docstrings.
Explanation
Why a parser comes before a model, why four layers on 1,100 lines, and what the unresolved count is for.
Decisions
The architecture decision records, each with a status and a date.

What this is part of

saucier backs a blog series that ends with a robot making mole. Each published post corresponds to a tag, and every tag runs and produces output. This release is the first: a parser, no model, and a number to beat.