You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
content: drop 4 unnumbered cocktails (negroni, margarita, paper-plane, mac-nut chi-chi)
These orphans lacked rank: and used a different schema (difficulty,
no year/source_author/footnotes) than the 1-150 numbered corpus.
Per ROADMAP.md item 89; also resolves item 88 (the unnumbered
macadamia-nut-chi-chi.cook was a duplicate of 099-).
Drops the negroni snapshot fixture along with it.
Copy file name to clipboardExpand all lines: ROADMAP.md
-66Lines changed: 0 additions & 66 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -72,42 +72,6 @@ No sitemap is emitted, so search engines have to discover all 161 recipe pages p
72
72
-**Impact:** Faster initial indexing; large win for a 200-page site that just doubled in size.
73
73
-**Risk:** None. Pair with `robots.txt` for the `Sitemap:` pointer (item 13 missed 6/7 by a hair).
74
74
75
-
#### Resolve the Macadamia Nut Chi Chi duplicate
76
-
Two `.cook` files describe the same drink: `099-macadamia-nut-chi-chi.cook` (rank 99, hurricane glass, full Phase-3 schema, 4 oz pineapple) and orphan `macadamia-nut-chi-chi.cook` (no rank, tiki mug, 8 oz pineapple, malformed `2 1/2%oz` quantity). Both slugify to the same URL — one will silently overwrite the other depending on filesystem traversal order.
77
-
-**Difficulty:** Easy (S) — pick one, delete the other, possibly merge useful content.
78
-
-**Impact:** Removes a real correctness bug; future-proofs URL-uniqueness assumption.
79
-
-**Risk:** Lose the variant interpretation if not consciously merged.
80
-
81
-
#### Renumber the 4 orphan cocktails
82
-
`negroni.cook`, `margarita.cook`, `paper-plane.cook`, and `macadamia-nut-chi-chi.cook` lack a `rank:` field and use a different schema (have `difficulty`, no `year`/`source_author`/footnotes). They sort inconsistently on listings and break the 1–150 numbered convention everyone else follows.
83
-
-**Difficulty:** Easy (S) — `git mv` + frontmatter edits.
84
-
-**Impact:** Restores cataloging consistency; eliminates one-off code paths in any future `rank`-based feature.
85
-
-**Risk:** Slug changes break inbound links — add 301 redirects via `_redirects` (or accept the breakage on a personal site).
Facet aggregation produces three "old-fashioned"-style buckets (`old-fashioned`, `old fashioned`), two "collins" (`collins`, `collins glass`), two "hurricane" (`hurricane`, `hurricane glass`), and four moai mug variants. Each becomes a separate `/cocktails/glass/<slug>/` page with a fraction of the inventory.
89
-
-**Difficulty:** Easy (S) — search/replace across `recipes/cocktails/*.cook`.
90
-
-**Impact:** Consolidates thin facet pages; fewer dead-end clicks for the user.
91
-
-**Risk:** Best done after item 81 (controlled vocabulary) lands so the canonical list is decided.
92
-
93
-
#### Ingredient capitalization splits cleanup
94
-
`Gosling's Black Seal rum` and `Gosling's Black Seal Rum` co-exist as distinct ingredients across the corpus. Cooklang dedupes lowercased keys *within* a file but not *across* files, so any future ingredient index treats them as separate items.
95
-
-**Difficulty:** Easy (S).
96
-
-**Impact:** Foundational for the ingredient ontology (item 86).
97
-
-**Risk:** None.
98
-
99
-
#### `lime juice` vs `fresh lime juice` canonicalization
100
-
95 occurrences of `fresh lime juice` and 8 of `lime juice` mean the same liquid, two ingredient buckets. Same shape: `orange juice` (9) vs `fresh orange juice` (29), `pineapple juice` (18) vs `fresh pineapple juice` (13) vs `unsweetened pineapple juice` (12).
101
-
-**Difficulty:** Easy (S) — search/replace, with judgement on the canonical form ("fresh ___ juice" preferred for citrus).
102
-
-**Impact:** Future ingredient index, search facet, and shopping list aggregation all become correct.
103
-
-**Risk:** Loses some authorial nuance ("unsweetened pineapple juice" carries information).
104
-
105
-
#### Populate or remove `recipes/basics/` + `season`/`occasion` fields
106
-
The schema documents `season` and `occasion` and the site generator builds `/season/<value>/` and `/occasion/<value>/` pages, but **zero**`.cook` files set them — every facet route is empty. Same for the `basics` category folder.
107
-
-**Difficulty:** Easy (S) for removal; Moderate if backfilling content.
108
-
-**Impact:** Removes dead code paths and empty pages, OR turns an unused affordance into a real browsing dimension.
109
-
-**Risk:** Removal + future re-add is more code churn than backfilling — decide which way.
110
-
111
75
#### Add HTML link-checker to CI (lychee or htmltest)
112
76
Recipes cross-reference each other via `serve_with`/`pairs_with`/`uses` slugs, and `BASE_URL` rewriting is brittle. A `lychee docs/` step after build catches broken internal links and stale external sources before they hit `main`.
113
77
-**Difficulty:** Easy (S) — one CI step.
@@ -154,18 +118,6 @@ Today `Recipe.from_path` parses then defers validation to `validate()`, and `Rec
154
118
-**Impact:** Eliminates an entire class of silent build defects.
155
119
-**Risk:** May surface real existing errors that have been silently shipping — fix those first or run with a warn-only flag for one deploy.
156
120
157
-
#### Estimated reading time + step count
158
-
Add "12 steps · ~6 min read · 30 min active cooking" near the H1. Helps readers with chronic fatigue or time pressure scope a recipe before diving in. Also good for SR users to understand size before traversing all steps.
-**Impact:** UX wins on every recipe page; small SEO benefit (rich snippet eligibility).
161
-
-**Risk:** Step counting depends on parser segmentation — verify the count matches what users see.
162
-
163
-
#### Backfill `variations` + cross-refs (`serve_with`/`pairs_with`/`uses`) across recipes
164
-
The schema supports these and the template renders them — but no recipe uses them. A Negroni page with linked variations (Boulevardier, Sbagliato, White Negroni) would feel like a real cookbook chapter; carbonara → cacio e pepe → amatriciana is the same play.
165
-
-**Difficulty:** Moderate (M) for tooling; content effort scales with editorial ambition.
166
-
-**Impact:** Massive — turns a flat catalog into a navigable cookbook; strong internal linking for SEO.
167
-
-**Risk:** Pure content work — easy to start, hard to "finish." Set a target subset (e.g., classic cocktails first).
168
-
169
121
#### Surface ingredients in search index
170
122
Search currently scores titles, tags, descriptions, cuisine/spirit — but not ingredients. Yet ingredients are how cooks actually search ("what can I make with leftover guanciale?"). Add ingredient names to `search-data.json` and the scoring function so a query for "campari" finds Negroni, Boulevardier, and Jungle Bird.
171
123
-**Difficulty:** Moderate (M) — extend `generate_search_data` and `search.ts` scoring.
@@ -176,26 +128,8 @@ Search currently scores titles, tags, descriptions, cuisine/spirit — but not i
176
128
177
129
### 3. Most difficult / architectural (2 items)
178
130
179
-
#### Allergen / dietary filter facet
180
-
Today the only way to know if a recipe is gluten-free, dairy-free, nut-free, shellfish-free, or alcohol-free is to read the full ingredient list. Surface filter chips on listing pages and indicators on recipe pages. Critical for users with celiac, severe allergies, or in recovery — and a strong content-discovery feature for everyone else.
181
-
-**Difficulty:** Hard (L) — requires (a) an ingredient-to-allergen map, (b) per-recipe derivation, (c) listing-page facet UI, (d) authorial overrides for borderline cases.
182
-
-**Impact:** Real accessibility/inclusion win; major discovery feature.
183
-
-**Risk:** Allergen claims have legal/health implications. Frame as "appears to contain X" with a disclaimer; require manual confirmation for severe allergens. Depends on item 86 (ingredient ontology).
184
-
185
131
#### Ingredient alias / `canonical_id` / `category` taxonomy
186
132
Build an ingredient ontology layer: each canonical ingredient gets an ID, an alias list (for parser canonicalization), and a category (`spirit/modifier/juice/syrup/bitters/garnish/ice/other`). Powers items 48 (allergens), 92/91 (canonicalization at the source), 106 (search), and the future build-a-bar / shopping-list-grouping features.
187
133
-**Difficulty:** Hard (L) — content modeling decision + parser integration + likely a new `ingredients/` directory of YAML files.
188
134
-**Impact:** Unlocks a generation of features (ontology-backed everything). Without it, items 48/86/92 keep being one-off patches.
189
135
-**Risk:** Schema design takes time; resist scope creep into "complete cocktail database." Start with the ~50 ingredients used in 5+ recipes.
20 items, 11 of them landable in a day each. The DevOps persona's domain bias means reasonable content/UX wins were under-represented in his ballot — the 6/7 set is genuinely the high-consensus list.
0 commit comments