Skip to content

Per-appellation grapes and colours where one document covers several - #29

Merged
bdevloed merged 5 commits into
mainfrom
fix/fr-shared-cahier
Oct 4, 2026
Merged

bdevloed merged 5 commits into
mainfrom
fix/fr-shared-cahier

Conversation

@bdevloed

@bdevloed bdevloed commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Found through the MCP server: a grape filter returned all 51 Alsace grands crus for Pinot noir, because each cru carried the union of the shared cahier. The same pattern — a document that singles out an appellation or sub-denomination, read whole for every record — turned up across the corpus. Each record now reads the clauses, rows or annex that name it, and keeps the parent's rules where its document names none.

  • Alsace grand cru / Anjou / Pouilly (shared_cahier.py): red is Hengst, Kirchberg de Barr and Vorbourg only; Sylvaner Zotzenberg only; Cot is Rosé d'Anjou's; Pouilly-Fumé is Sauvignon, Pouilly-sur-Loire Chasselas. Kaefferkopf regains VT / SGN (SIQO product names over a mis-set categorie).
  • FR DGCs (dgc_rules.py): 78 of 1,074 changed — Touraine Oisly white Sauvignon, Saumur Puy-Notre-Dame red Cabernet franc, the red-only Languedoc and Côtes du Rhône Villages DGCs, Côtes de Bordeaux Cadillac / Castillon red only. Two-column pdftotext tables are read by column (headings scope rows, labels pair with the value block they overlap).
  • IT sottozone (MASAF parser v5): 37 take their own annex's roster and styles (Pignolo di Rosazzo is Pignolo); Curtefranca, Colli Berici and Colli di Parma gain varieties the article-2 parser missed; "chiaretto" is rosé.
  • PT Vinho Verde's nine sub-regiões read their own caderno tables; CH Valais Grands Crus take OVV art. 88's list, Ticino's Rosso / Bianco / Rosato tiers their colour's list and style; ES subzonas read their DO's national pliego, Vinos de Madrid's subzona principals applied.

Every change was checked against the source text; documents that name sub-areas only for area or terroir keep the parent's roster (listed in the last commit). No parent record outside Alsace grand cru / Anjou / Pouilly changed. 1,115 tests pass; audit_empty_grapes --strict clean.

Not done: five Valais Grand Cru varieties absent from the lexicon (Amigne, Humagne blanc, Rèze, Cornalin du Valais, Humagne rouge — needs a VIVC pass); Rías Baixas' ≥ 70 % subzona-label rule; ~30 MASAF annex sottozone with no record yet.

Needs a full rebuild before deploy (stage 02 FR, IT 02f --all --include-nonstub, PT / CH stage 02, stage 03, stage 04).

🤖 Generated with Claude Code

bdevloed and others added 5 commits October 4, 2026 19:18
… the Alsace grands crus

The 51 Alsace grands crus share one cahier; sections III and V state a
general rule, then name the crus that depart from it. Stage 02 read both
sections whole, so every cru carried Pinot noir, red, Sylvaner, Chasselas
and Pinot blanc, and a grape filter returned all 51 (found through the MCP
server). shared_cahier.own_text / own_encepagement keep the units that name
the record (lettered clause, table row block, sentence), else the general
ones; "à l'exception de « X »" excepts X, a "X ou Y" register name answers
to either alias, and "pour les vins rouges / rosés" items drop when the
record's own colour lacks them.

Red is now Hengst, Kirchberg de Barr and Vorbourg only; Sylvaner Zotzenberg
only; the accessories Altenberg de Bergheim's and Kaefferkopf's. The same
rule splits Anjou / Cabernet d'Anjou / Rosé d'Anjou (Cot is Rosé d'Anjou's)
and Pouilly-Fumé (Sauvignon) / Pouilly-sur-Loire (Chasselas).

A SIQO product named "… vendanges tardives …" / "… sélection de grains
nobles …" now adds that category when its categorie column says "Vin
tranquille" — Kaefferkopf had lost VT / SGN, Monbazillac gains sweet.

Full stage 02: 57 records changed, grapes / styles / categories only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Stage 04 synthesized every sottozona as a copy of its parent, so Friuli
Colli Orientali Pignolo di Rosazzo listed nineteen varieties and white,
Romagna Cesena Albana and Trebbiano. 02f (parser v5) now records, per
sottozona annex of the disciplinare PDF, the sottozona names its title
declares (after the last "sottozona"; Barbera d'Asti's Colli Astiani title
opens on Tinella's labelling rule), its Article 2 roster when that article
is a variety article, and its styles when it has an organoleptic article
(found by its opening — annexes renumber); stage 04 gives them to the
sottozona the annex names. 37 of 78 sottozone take their annex's roster;
Riviera Ligure di Ponente's annexes carry no variety article and keep the
parent's.

Parser: a participle closes a "vitigno X" name ("uve del vitigno Pignolo
prodotte"), "uva X" reads like "vitigno X" (Isera's "dall'uva Marzemino
gentile prodotta"), "per un minimo del 30%" is a share tail (Valtènesi's
Groppello), and a sottozona's own name never reads as a grape ("Tinella"
had fuzzy-matched Grenache). Outside the annexes this adds Curtefranca's
rosso / bianco roster, Colli Berici's Tai rosso (Grenache) and Colli di
Parma's Moscato bianco. "chiaretto" reads as rosé.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
INAO publishes one cahier per appellation and a DGC is a section of it;
stage 02 copied the parent's colours and roster onto every DGC, so Touraine
Oisly read red and rosé with Cot and Pinot noir, Saumur Puy-Notre-Dame
white with Chenin, the red-only Languedoc and Côtes du Rhône Villages DGCs
white and rosé. dgc_rules.dgc_text reads the part of section III / V that
names the DGC: a prose reservation sentence or clause, or — for the
two-column pdftotext tables — a centred or full-width heading scoping the
rows below it, else the left label paired with the value block it
overlaps. A DGC section V does not name keeps the parent's roster minus
the clauses / rows of a colour it is not allowed (Côtes de Bordeaux
Cadillac). Only a reservation counts in prose (an IGP's description of a
unit's whites is not a rule), "hormis / sauf" except, and a clause ending
"la liste suivante :" takes the list after it (Var Correns).

78 of 1,074 DGCs changed grapes or styles, 47 more record `dgc_rules`
only; no parent changed. shared_cahier's table-row splitter no longer
fires on a prose list wrapped onto a line opening with a name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s for them

Vinho Verde: the caderno says wines with a sub-região name "devem ser
exclusivamente obtidos a partir das castas enumeradas nos quadros
seguintes para a respetiva sub-região"; each of the nine sub-regiões now
reads its own table (Monção e Melgaço: seven varieties with Alvarinho, not
the DOC's 46). A two-word row whose words both resolve is a name and its
synonym with the ";" lost ("Vinhão Sousão", "Alvarelhão Brancelho" had
fuzzy-matched a white variety).

Valais: OVV art. 88 reserves Grand Cru to fifteen varieties; the twelve
communal Grands Crus carried the 45-variety Valais AOC list. Ticino: art. 23
splits the DOC roster by grape colour and art. 20 reserves «Rosso - Bianco -
Rosato del Ticino» to one colour, so each tier takes its colour's list and
style (Bianco del Ticino was tagged red); the DOC Ticino loses Alphonse
Lavallée, Léon Millot and Plantet, read from the list of varieties barred
from blending. `list_varieties` reads these short lists (footnote digits,
wrapped names, Italian articles); "Sauvignon Grigio" folds to Sauvignon gris.

Spain: a subzona reads its DO's national pliego (Rioja Alta lacked the
Malvasía the Rioja pliego adds), and Vinos de Madrid's "Principales Subzona
de …" lines make those varieties a subzona's principal grapes.

Checked and left inheriting, the documents stating no own roster: ES Rioja,
Ribeira Sacra, Monterrei, Costers del Segre, Alicante, Valencia; PT
Alentejo, Douro, Porto, Trás-os-Montes, Tejo; CH GE premiers crus, VD, BE,
SZ, FR; LU communes. 42 records changed, grapes / styles only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…napshot

CI installs no py7zr (bootstrap group), so the sottozona annex test could
not load scripts/it/02f_extract_masaf.py. annex_entry moves into
_lib/it/masaf.py and the script keeps a thin wrapper. The committed
vocabulary snapshot CI matches against predated the "Sauvignon Grigio"
alias; regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@bdevloed
bdevloed merged commit 0a33e02 into main Oct 4, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant