Skip to main content

saucier

Structured procedure extraction from culinary sources.

Reads a cookbook and returns a catalogue. Each preparation carries its names, the language of each name, the parent it derives from, and the source line the claim came from. No model runs. Every output is traceable to the text.

Try it

No GPU, no API key, no database, no network. Both source texts are committed.

$ git clone https://github.com/Alberto-Codes/saucier
$ cd saucier && uv sync
$ 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
                124 sauces, 50 derived, 74 unresolved
escoffier-1907  no edition stated, copyright 1907
                ocr of Internet Archive cu31924000610117
                mothers: bechamel, espagnole, hollandaise, tomato, veloute
                115 sauces, 36 derived, 79 unresolved

The five mothers were not supplied. Escoffier names them in his own text, and the parser reads them out of it.

Neither is the edition supplied. Each source states its own printing history on its own title page, and the id is built from that reading. See ADR-0009.

$ uv run saucier tree espagnole
BROWN SAUCE OR ESPAGNOLE  [espagnole]
├── LENTEN ESPAGNOLE  (fr)
│   └── GENEVOISE SAUCE  (en)
├── ORDINARY POIVRADE SAUCE  (en)
│   └── REFORM SAUCE  (en)
└── POIVRADE SAUCE FOR VENISON  (en)

A parent may be any catalogued preparation, not only a mother. Marrow Sauce resolves to Bordelaise, and Bordelaise itself states no base. A derivation tree can therefore root in an unresolved sauce.

The interesting number is 74

74 of 124 preparations never state what they are built on. Escoffier wrote for a reader who already knew, so he did not write it down. That gap is the point: it is the measured bar that anything cleverer has to beat. See why there is no model in this yet.

The catalogue holds 124 entries, not every sauce in the book. An entry gets in when its own heading says "sauce", or when it names a mother inside a chapter Escoffier titles as sauces. Both tests read the source. Neither guesses.

Two witnesses, and a diff that names its causes

The corpus holds two texts of one book. One is proofread and one is a raw scan, so every difference between them has two explanations.

$ uv run saucier diff escoffier-1907 escoffier-1909
...
  9 unmatched, 18 parent-changed, 35 ocr-suspected
  entries read  2679 of escoffier-1907, 2963 of escoffier-1909, a blind spot of 284

QENEVOISE SAUCE is GENEVOISE SAUCE with one letter misread, and the diff says so rather than reporting a removal it cannot support.

It reports no additions at all. The 1907 witness is a scan and 284 of its entries are unread. So a concept found in one witness and not the other is unmatched rather than added. No editorial difference between the two printings has been confirmed. Every candidate so far has been the scanner or the reader.

Documentation

The rendered site is https://alberto-codes.github.io/saucier/. Its API reference is generated from the docstrings, so it cannot drift from the code.

  • Tutorial — clone it and print a family tree
  • How-to — point it at a different book
  • Reference — commands and data model
  • Explanation — why a parser comes first
  • Decisions — the fourteen records, and what each one accepted

Licence

MIT for the code.

corpus/escoffier-1909.txt is Project Gutenberg ebook #71395, public domain, redistributed with its licence wrapper intact. It transcribes the January 1920 impression of the New and Revised Edition of January 1909.

corpus/escoffier-1907.txt is Internet Archive item cu31924000610117, the Cornell University Library copy of the 1907 first printing. Cornell records no known United States copyright restrictions on the text, and a 1907 publication date puts it in the public domain.

No third-party corpus is shipped in the published package.

Metadata

Release files for saucier 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for saucier 0.3.0
File Size Uploaded
saucier-0.3.0.tar.gz 43.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for saucier 0.3.0
File Interpreter ABI Platform
saucier-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 99.5 kB

Release files / saucier-0.3.0.tar.gz

Download URL saucier-0.3.0.tar.gz
Size 43.3 kB
Tags Source
SHA-256 checksum
How to use checksums
76a9ccc4645e11e63e4ca05049589be10bdefa9ead6729af7375efb6bcbb4e1e
BLAKE2b-256 checksum
How to use checksums
4341675dd4cd1bc654ca25265139293f89117379e67e228a160f685b5bd1f1c4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.

Transparency log

Release files / saucier-0.3.0-py3-none-any.whl

Download URL saucier-0.3.0-py3-none-any.whl
Size 56.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d5e674a6e5ceafe33236d2d352c5f13500f9558eb4e0702aa9e4499df51a8672
BLAKE2b-256 checksum
How to use checksums
be2de74d4fa731decd1351ee2bb7f8b2bfe99cdd474959f1e82b2dfd482c3ca8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.

Transparency log

Release history Release notifications | RSS feed

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.0

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page