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-1907  ·  entry 64  ·  line 2138

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.

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

  • 124 preparations
  • 50 resolved
  • 74 unresolved

74 preparations state no base in their prose. 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 itself states no base, and stays unresolved, so a derivation tree can root in an unresolved sauce.

An entry that states two bases counts as unresolved. SHRIMP SAUCE says "fish velouté or, failing this, Béchamel". The source declined to choose, so the parser declines too.

$ uv run saucier parse
source      escoffier-1907
mothers     bechamel, espagnole, hollandaise, tomato, veloute
sauces      124
derived     50 linked to a stated parent
unresolved  74 state no base in their prose

Where to go

First run
Clone the repository and print a derivation tree from a 1907 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 900 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.