From 7cd3c6ca673c72cbc5076df08e6ebc7013621440 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 7 Jul 2026 17:37:21 +0000 Subject: [PATCH] docs: refresh project status after going public and the site launch Bring the non-recipe docs in line with reality: import, curation, the e-book, public-readiness, and the live website have all shipped and the repo is public. - CLAUDE.md: replace the stale 'Active work / Phase 1 in progress' section with a current 'Project status'; present-tense the intro; fix the static-site 'when it begins' note. - GOVERNANCE.md: publication gate marked satisfied; repo public. - docs/about-this-archive.md: 'Looking ahead' -> 'The website' (live). - docs/phase-1-runbook.md: marked completed/historical (branch merged). - _meta/taxonomy.yml, .working/resume.md, .working/README.md, .claude/rules/*: past-tense the completed phases; note the live site. - docs/site-deploy.md + pages.yml header: setup complete. - tools/README.md: document the curation, build, and guard tools. - ADR 0001: add a superseding note for the go-public decision (record left intact). - Standardize the public contact on jeff@posluns.ca (GOVERNANCE, issue template); add the live site link to README. No recipe content changed. Co-authored-by: Claude Claude-Session: https://claude.ai/code/session_01HpG2vky2XhDtfc6y16TRis --- .claude/rules/README.md | 4 +- .claude/rules/project-overview.md | 6 +-- .github/ISSUE_TEMPLATE/copyright-concern.md | 2 +- .github/workflows/pages.yml | 8 ++-- .working/README.md | 4 +- .working/resume.md | 25 +++++++++--- CHANGELOG.md | 15 +++++++ CLAUDE.md | 42 ++++++++++++++------ GOVERNANCE.md | 19 +++++---- README.md | 11 +++++- _meta/taxonomy.yml | 16 +++----- docs/about-this-archive.md | 15 +++---- docs/adr/0001-archive-architecture.md | 6 +++ docs/phase-1-runbook.md | 19 ++++++--- docs/site-deploy.md | 4 ++ tools/README.md | 43 ++++++++++++++++++++- 16 files changed, 175 insertions(+), 64 deletions(-) diff --git a/.claude/rules/README.md b/.claude/rules/README.md index c331888..c5eeac4 100644 --- a/.claude/rules/README.md +++ b/.claude/rules/README.md @@ -34,7 +34,7 @@ after explicit approval. | Source | Licence | Relevance to this archive | | --- | --- | --- | -| [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills) | MIT | **Useful in the optional site phase**: `frontend-ui-engineering`, `code-review-and-quality`, `documentation-and-adrs`, `git-workflow-and-versioning`, accessibility guidance. | +| [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills) | MIT | **Useful for the site code** (the static site is built and live): `frontend-ui-engineering`, `code-review-and-quality`, `documentation-and-adrs`, `git-workflow-and-versioning`, accessibility guidance. | | [TikiTribe/claude-secure-coding-rules](https://github.com/TikiTribe/claude-secure-coding-rules) | MIT | Low now (no app code). Revisit only if a dynamic site is added. | | [kariedo/claude-code-security-rules](https://github.com/kariedo/claude-code-security-rules) | MIT | Low now. Revisit with dynamic code. | | [wiz-sec-public/secure-rules-files](https://github.com/wiz-sec-public/secure-rules-files) | CC-BY-NC-ND-4.0 | Low now. **NonCommercial/NoDerivatives**: note the licence constraint before adopting. | @@ -45,6 +45,6 @@ after explicit approval. ## Built-in Claude Code skills worth using here -- `artifact-design`: for the optional static site (Phase 3). +- `artifact-design`: for the static site (built and live at new.blimacake.com). - `code-review` / `security-review`: before merging tooling or site code. - `verify`: to confirm the importer and site actually behave as intended. diff --git a/.claude/rules/project-overview.md b/.claude/rules/project-overview.md index 77dd321..37370e3 100644 --- a/.claude/rules/project-overview.md +++ b/.claude/rules/project-overview.md @@ -3,9 +3,9 @@ ## What this archive is -A canonical, portable archive of the **recipes** from blimacake.com. The end -state is a public, CC BY 4.0 collection that stands alone after the WordPress -site retires. +A canonical, portable archive of the **recipes** from blimacake.com. It is a public, +CC BY 4.0 collection that stands alone (it does not depend on the WordPress site) and +is also served as a website at . ## Scope (hard boundary) diff --git a/.github/ISSUE_TEMPLATE/copyright-concern.md b/.github/ISSUE_TEMPLATE/copyright-concern.md index 53acaaf..27f4fdd 100644 --- a/.github/ISSUE_TEMPLATE/copyright-concern.md +++ b/.github/ISSUE_TEMPLATE/copyright-concern.md @@ -20,4 +20,4 @@ assignees: ["jposluns"] - [ ] Remove the material **Anything else we should know?** - + diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 0bb9ad2..4d143e9 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -3,11 +3,9 @@ name: pages # Builds the Eleventy site (with the Pagefind search index) and deploys it to # GitHub Pages at new.blimacake.com. # -# One-time setup by the owner before the first successful run (see -# docs/site-deploy.md): make the repo public, set Settings > Pages > Source to -# "GitHub Actions", and point the DNS CNAME for new.blimacake.com at -# jposluns.github.io. Until Pages is enabled, the deploy step will fail; that is -# expected. +# The one-time setup is complete and the site is live at new.blimacake.com +# (repo public, Pages source = GitHub Actions, DNS CNAME for new.blimacake.com +# pointing at jposluns.github.io). See docs/site-deploy.md for the setup record. on: push: diff --git a/.working/README.md b/.working/README.md index 6ea188a..e4f30cd 100644 --- a/.working/README.md +++ b/.working/README.md @@ -6,9 +6,11 @@ AI-assistant reliability, separately from the archive content itself. | File / dir | Purpose | | --- | --- | +| `resume.md` | Session handoff: the state of the project across phases (import, curation, e-book, public-readiness, site). Read first. | | `hallucination-metrics.md` | Log of AI hallucination **catches** (caught before merge) and **escapes** (caught after), by failure-mode class. The core guard-rail metric. | | `import-log.md` | Per-recipe import record: source, decisions, and any flagged discrepancies. | -| `validate-sweeps/` | Dated records of full-archive validation sweeps (schema + images + links). | +| `review-todo.md` | Flagged-not-fixed items awaiting an owner decision (all currently resolved/closed). | +| `validate-sweeps/` | Reserved for dated records of full-archive validation sweeps (schema + images + links); currently empty. | These files are part of governance, not the published archive. They stay in the repo as an audit trail. diff --git a/.working/resume.md b/.working/resume.md index c12933b..84718c9 100644 --- a/.working/resume.md +++ b/.working/resume.md @@ -1,9 +1,12 @@ # Session resume: Blima Cake recipe archive -**Last session ended:** 2026-06-27. -**Read this first, then `CLAUDE.md` + `.claude/rules/`.** This is the authoritative -handoff. Work on `claude/` branches; **never commit to `main`**. +**Last session ended:** 2026-06-27 (import + curation + readability). Work has +continued since then; for the current, authoritative status see the **Project status** +section of [`CLAUDE.md`](../CLAUDE.md). This file remains the detailed handoff for the +import and curation phases, plus the 2026-07-07 update below. +**Read this first, then `CLAUDE.md` + `.claude/rules/`.** Work on `claude/` +branches; **never commit to `main`**. --- @@ -13,6 +16,15 @@ Everything the owner asked for is merged to `main`. **487 recipes**, all four CI gates green (Frontmatter & images, Markdown lint, Link check, Secret scan). `validate_frontmatter` + `check_images` report 0 errors / 0 missing / 0 orphans. +**Update (2026-07-07): more shipped since this handoff was written.** The +distributable EPUB e-book (`BlimaCake.epub`) plus its release workflow; a +public-readiness pass (welcome-first `README.md`, `docs/read-the-cookbook.md`, +`docs/about-this-archive.md`, and navigation breadcrumbs on every recipe); and the +**static website**, now **live at ** +([ADR 0003](../docs/adr/0003-static-site-phase.md)) with Pagefind search, Recipe +JSON-LD/SEO, a sitemap, and a GitHub Pages deploy workflow. The **repository is now +public.** + ### Phase 1: import (DONE, PRs #3 to #21) All 16 categories imported verbatim from the WXR export and quote-verified, with @@ -129,8 +141,11 @@ After curation, two more owner-directed efforts shipped: `"… ; pending owner review"`. An owner spot-check can flip these. 3. **Optional later phases** (per CLAUDE.md / `.claude/rules/README.md`): the static - site (Phase 3) and re-verification once defects are resolved. The `grc_library` - rule pack and vetted overlays can be layered in then. + site is built and live (see the 2026-07-07 update above). What remains optional is + the verification flip (item 2), re-verification once defects are resolved, and, + later, pointing the apex `blimacake.com` domain at the site once the WordPress site + retires. The `grc_library` rule pack and vetted overlays can be layered in for the + site code if desired. --- diff --git a/CHANGELOG.md b/CHANGELOG.md index ca58ca1..2c7cb43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -420,6 +420,21 @@ Recipe imports are logged both here (summary) and in ### Changed +- **Documentation status refresh (post go-public and site launch).** Brought the + project docs in line with reality now that import, curation, the e-book, the + public-readiness pass, and the live website have all shipped and the repo is public. + Updated `CLAUDE.md` (replaced the stale "Active work / Phase 1 in progress" section + with a current "Project status"), `GOVERNANCE.md` (publication gate marked + satisfied; repo public), `docs/about-this-archive.md` ("Looking ahead" replaced with + "The website"), `docs/phase-1-runbook.md` (marked completed/historical), + `_meta/taxonomy.yml` and `.working/resume.md` and `.working/README.md` comments, + `.claude/rules/` notes, `docs/site-deploy.md` and the `pages.yml` header (setup + complete), and expanded `tools/README.md` to document the curation, build, and guard + tools. Added a superseding note to [ADR 0001](docs/adr/0001-archive-architecture.md) + for the go-public decision (the decision record itself is left intact). Standardized + the public contact on `jeff@posluns.ca` in `GOVERNANCE.md` and the copyright issue + template. Added the live site link to `README.md`. No recipe content changed. + - **Site landing page: the "A few to start with" row now shows only recipes that have a photo** (via a new `withImage` filter), so the featured strip has no placeholder tiles. diff --git a/CLAUDE.md b/CLAUDE.md index 01774f5..6dfa4f0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,9 +8,10 @@ authoritative; this file is the index and the project-specific context. ## What this project is A **canonical archive** of the recipes from blimacake.com, stored as portable -Markdown + co-located images, governed for accuracy and destined to be made -public under CC BY 4.0 once the site retires. Accuracy and provenance outrank -speed, cleverness, and breadth. +Markdown + co-located images, governed for accuracy and published under CC BY 4.0. +The repository is public and the collection is also live as a website at +. Accuracy and provenance outrank speed, cleverness, +and breadth. ## Why it is built this way @@ -57,17 +58,34 @@ python tools/validate_frontmatter.py recipes/ # Check every referenced image exists and flag orphans python tools/check_images.py recipes/ -# Importer (Phase 1+): inspect a WordPress export before importing +# Importer: inspect a WordPress export before importing (used for the initial import) python tools/wxr_to_markdown.py --input wp-export/blimacake.wxr --list-categories ``` -## Active work - -Phase 1 (recipe + image import) is in progress on branch -`claude/phase-1-import`. If asked to "continue" or "run the Phase 1 import", -read [`docs/phase-1-runbook.md`](docs/phase-1-runbook.md) first; it is the -session handoff with the locked decisions, prerequisites (re-upload the WXR -export; egress allowlist), and exact commands. +## Project status + +The archive is complete and public; the major phases are all finished and merged to +`main`: + +- **Import (done):** all 16 categories, 487 recipes and their images, from the WXR + export. +- **Curation (done, [ADR 0002](docs/adr/0002-curation-phase.md)):** inline + metric+imperial measurements, defect corrections, controlled tags, a few + re-categorizations, and an instruction-readability rephrase pass. +- **E-book (done):** `BlimaCake.epub` at the repo root, published by + [`.github/workflows/release.yml`](.github/workflows/release.yml). +- **Public front door (done):** a welcome-first `README.md`, an install guide, and + navigation breadcrumbs on every recipe. +- **Website (done, live):** an Eleventy site with search and SEO, deployed to GitHub + Pages at by + [`.github/workflows/pages.yml`](.github/workflows/pages.yml) + ([ADR 0003](docs/adr/0003-static-site-phase.md)). + +Optional follow-ups that remain: flipping recipe `verification` from +pending-owner-review to verified, and (later) pointing the apex `blimacake.com` +domain at the site once the WordPress site retires. The Phase 1 import handoff, +[`docs/phase-1-runbook.md`](docs/phase-1-runbook.md), is kept for reference only; +that phase is finished and its branch is merged. ## Rule modules (`.claude/rules/`) @@ -88,4 +106,4 @@ corpus they draw on, plus its vetted third-party overlays (TikiTribe, Wiz, Kariedo, addyosmani), lives in the `grc_library` Claude rules pack and can be layered in later via its `setup-generator-prompt.md`. See [`.claude/rules/README.md`](.claude/rules/README.md) for the adoption notes and -which packs are relevant when the optional static-site phase begins. +which packs are relevant to the site code now that the static-site phase has shipped. diff --git a/GOVERNANCE.md b/GOVERNANCE.md index a909610..eaec4e3 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -64,7 +64,7 @@ project's stance and process are stated in [`NOTICE.md`](NOTICE.md): - Known third-party items are flagged per recipe via the `rights` frontmatter field (`status`, `source`, `note`). - Rights holders can report a concern via the **"Copyright / attribution - concern"** GitHub issue template or by emailing ****. We act + concern"** GitHub issue template or by emailing ****. We act in good faith, correcting attribution or removing material, and record the outcome in `CHANGELOG.md`. @@ -72,14 +72,17 @@ When importing, if you have any reason to think an item came from elsewhere, set its `rights.status` to `third_party` or `unknown` and note what you know, rather than leaving it implicitly marked as original. -## Publication gate (Phase 4) +## Publication gate (Phase 4): satisfied -The repository is **private** until **all** of the following hold: +The repository was **private** until the Owner chose to publish it. The gate that +governed that decision was: -1. blimacake.com has ceased operation (or the owner explicitly authorises early - publication). -2. `LICENSE` contains the full, verbatim CC BY 4.0 legal code: **satisfied** +1. blimacake.com has ceased operation, or the owner explicitly authorises early + publication: the owner authorised publication. +2. `LICENSE` contains the full, verbatim CC BY 4.0 legal code: satisfied (installed at Phase 0; attribution to Blima Posluns set). -3. A full validation sweep passes with no outstanding fidelity discrepancies. +3. A full validation sweep passes with no outstanding fidelity discrepancies: + satisfied (the CI gates pass on `main`). -Only the Owner may flip visibility to public. +The repository is now **public**, and the collection is also served as a website at +. Only the Owner may change repository visibility. diff --git a/README.md b/README.md index 4dde361..ab0f264 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,10 @@ one place so they are easy to read, cook from, and keep. **487 recipes** in all: cakes, cookies and bars, main courses, salads, soups, breads, Passover dishes, and much more. Every measurement is given in both cups and metric. +> 🍰 **Browse the whole collection online at [new.blimacake.com](https://new.blimacake.com)**: +> searchable, with a photo and a clean page for every recipe. It is the easiest way to +> read and cook from these. + ## Read the cookbook The whole collection is also a free e-book you can read on your phone, tablet, Kindle, @@ -21,11 +25,14 @@ Kobo, or Apple Books, with no internet needed once it is on your device. has simple, step-by-step instructions for Apple Books, Kindle, Kobo, Google Play Books, and more. -## Browse the recipes here +## Browse the recipes Prefer to read online without downloading anything? -- **[All recipes, by category](recipes/README.md)**: a picture index of every category. +- **[The website: new.blimacake.com](https://new.blimacake.com)**: the friendliest + way to browse, with search and a photo page for every recipe. +- **[All recipes, by category](recipes/README.md)**: a picture index of every category, + here on GitHub. - **[Recipes by tag](recipes/tags.md)**: find things like chocolate, lemon, Passover, or no-cook. diff --git a/_meta/taxonomy.yml b/_meta/taxonomy.yml index 7f7b5c9..f77bbad 100644 --- a/_meta/taxonomy.yml +++ b/_meta/taxonomy.yml @@ -1,10 +1,10 @@ # Recipe taxonomy for the archive. # # This file is the controlled vocabulary for `categories` (and optionally -# `tags`) used in recipe frontmatter. It is populated in Phase 1 after we run -# `tools/wxr_to_markdown.py --list-categories` against the WordPress export and -# decide which WordPress categories are recipes (vs. the dogs and books, which -# are out of scope). +# `tags`) used in recipe frontmatter. It was populated during the Phase 1 import +# from `tools/wxr_to_markdown.py --list-categories` against the WordPress export, +# keeping only the WordPress categories that are recipes (the dogs and books are +# out of scope). # # Format: # categories: @@ -12,12 +12,8 @@ # label: "Human readable name" # wp_categories: ["original WP category name(s)"] # provenance # -# Categories in use. Populated incrementally during Phase 1 import; the three -# below are those used by the initial 5-recipe review batch. The remaining -# recipe categories surfaced by `--list-categories` (Cakes, Main Courses, -# Cookies & Bars, Salads, Passover, Side Dishes, Appetizers, Sauces & Rubs, -# Desserts, Soups, Breakfast & Brunch, Breads, Pies, Muffins, Seafood, Drinks) -# are added as recipes in each are imported in the full run. +# Fully populated: all 16 recipe categories are listed below (the import is +# complete). Add a category here only if a new recipe category is ever introduced. categories: appetizers: label: "Appetizers" diff --git a/docs/about-this-archive.md b/docs/about-this-archive.md index dae3db7..4825956 100644 --- a/docs/about-this-archive.md +++ b/docs/about-this-archive.md @@ -97,10 +97,11 @@ Corrections and additions are welcome. [`CONTRIBUTING.md`](../CONTRIBUTING.md) e how to propose a change, and [`GOVERNANCE.md`](../GOVERNANCE.md) explains how changes are reviewed and how the collection is kept accurate. -## Looking ahead - -A possible next phase would present the collection as a friendly website (the feel of -a recipe blog) generated from this same Markdown and hosted on GitHub Pages. It is -scoped, with options and a rough cost, in -[ADR 0003](adr/0003-static-site-phase.md); it is a proposal awaiting the owner's -decision, not built yet. +## The website + +The collection is also a website at , with a feel closer +to a recipe blog: browse by category, search across every recipe, and a clean page +per recipe. It is generated from this same Markdown by an Eleventy build and deployed +to GitHub Pages, so it always matches the archive. The design and decisions are in +[ADR 0003](adr/0003-static-site-phase.md), and the setup and deploy notes are in +[`site-deploy.md`](site-deploy.md). diff --git a/docs/adr/0001-archive-architecture.md b/docs/adr/0001-archive-architecture.md index df4ceca..a2ec561 100644 --- a/docs/adr/0001-archive-architecture.md +++ b/docs/adr/0001-archive-architecture.md @@ -39,6 +39,12 @@ Claude Code rules pack and vetted third-party overlays can be reused. publication gate (see `GOVERNANCE.md`) controls the flip to public and the application of the full licence text. + > **Superseded (2026-07-07):** the owner authorised publication and the + > repository was made public (ahead of the WordPress site retiring), satisfying + > the publication gate in `GOVERNANCE.md`. The collection is also served as a + > website at ([ADR 0003](0003-static-site-phase.md)). + > The rest of this decision (the licence and the gate itself) still stands. + 6. **Governance & guard rails up front.** Branch protection + CODEOWNERS, PR template with a verification checklist, mandatory CHANGELOG entries, CI gates (schema, images, markdown lint, link check, secret scan), AI diff --git a/docs/phase-1-runbook.md b/docs/phase-1-runbook.md index 10b073a..00f2c5f 100644 --- a/docs/phase-1-runbook.md +++ b/docs/phase-1-runbook.md @@ -1,11 +1,18 @@ # Phase 1 import: runbook / session handoff -This file is the memory for the recipe + image import. A fresh Claude Code -session has no prior chat context, so everything needed to resume is here. +> **COMPLETED (historical).** Phase 1 (the recipe + image import) is finished: all +> 16 categories and 487 recipes were imported, and the tooling was merged to `main` +> (the `claude/phase-1-import` branch no longer exists). This runbook is kept only as +> a record of how the import was run. The commands below refer to that now-merged +> branch and cannot be run as written. For the current project status see +> [`CLAUDE.md`](../CLAUDE.md). -**Branch:** `claude/phase-1-import` (all Phase 1 tooling lives here, not on -`main` yet). Check it out before doing anything: +This file was the memory for the recipe + image import. A fresh Claude Code +session had no prior chat context, so everything needed to resume was here. + +**Branch (at the time):** `claude/phase-1-import` (all Phase 1 tooling lived here +before it was merged to `main`). The import session checked it out first: ```sh git fetch origin claude/phase-1-import && git checkout claude/phase-1-import @@ -33,8 +40,8 @@ git fetch origin claude/phase-1-import && git checkout claude/phase-1-import - **Scope:** recipes only. Import `post_type == post`; exclude Pages (About/Chelsea/Jackson/Brie/Books) and the `Blog of the Day` category. -- **Licence:** CC BY 4.0, attributed to **Blima Posluns**. Repo stays private - until the site retires. +- **Licence:** CC BY 4.0, attributed to **Blima Posluns**. (The repository has + since been made public; it was private during the import.) - **Images (store):** WordPress-hosted (50) and Flickr (110, Blima's own). Download highest quality, **strip ALL metadata/EXIF**, name `-NN.ext`, **commit directly** to the repo (no Git LFS). diff --git a/docs/site-deploy.md b/docs/site-deploy.md index f6e80ef..09cb8f3 100644 --- a/docs/site-deploy.md +++ b/docs/site-deploy.md @@ -5,6 +5,10 @@ The website is built from the Markdown by [`.github/workflows/pages.yml`](../.gi and published to GitHub Pages at `new.blimacake.com`. This note lists the one-time setup the owner does, and how deploys happen after that. +> **Status: complete and live.** The setup below has been done and the site is live at +> . These steps are kept for reference (for example, to +> reconfigure the domain or to redo setup on a new host). + ## One-time setup 1. **Make the repository public.** GitHub Pages needs a public repository on the free diff --git a/tools/README.md b/tools/README.md index c6f9feb..d472235 100644 --- a/tools/README.md +++ b/tools/README.md @@ -8,10 +8,11 @@ dependencies once: pip install -r tools/requirements.txt ``` -## `wxr_to_markdown.py`: importer (Phase 1+) +## `wxr_to_markdown.py`: importer Imports recipes from a native WordPress export. **This is the only sanctioned -way recipe content enters the archive**: no hand-typing or paraphrasing. +way recipe content enters the archive**: no hand-typing or paraphrasing. (Used for +the initial import; kept for any future import.) ```sh # 1. In wp-admin: Tools -> Export -> "All content" -> download the .xml (WXR). @@ -81,3 +82,41 @@ python tools/check_images.py recipes/ --strict # orphans also fail ``` Ensures every referenced image exists and flags unreferenced files. Run by CI. + +## Curation tools (ADR 0002) + +These operate directly on the committed recipes; the WXR export is **not** needed. +They are idempotent (safe to re-run), and several support `--check` to report without +writing. See [ADR 0002](../docs/adr/0002-curation-phase.md). + +- **`add_measurements.py`**: add inline metric+imperial measurements to recipes. The + conversions are dimension-preserving and exact, and it never double-converts. +- **`fix_measurement_defects.py`**: correct clear measurement defects from an explicit + `(file, old, new, reason)` allowlist. Scoped to ingredient/step lines. +- **`fix_structural_defects.py`**: reconstruct garbled or fragmented ingredient/step + lines (each change logged). +- **`add_source_references.py`**: append an in-page "Source reference" footer to + recipes whose gaps or defects were reconstructed with the help of outside sources. +- **`tag_recipes.py`**: assign controlled tags from `_meta/tags.yml` and build the tag + index (`recipes/tags.md`). +- **`add_doc_metadata.py`**: add the light, invisible metadata comment block to every + non-recipe doc. + +## Build and publish + +- **`gen_readmes.py`**: generate the browsing indexes (`recipes/README.md` and each + category README). +- **`add_breadcrumbs.py`**: add the navigation breadcrumb to the top of every recipe + page (idempotent). +- **`build_epub.py`**: build the distributable `BlimaCake.epub` from the Markdown + (published as a GitHub Release by `.github/workflows/release.yml`). +- The website (Eleventy) is built with `npm run build` and deployed by + `.github/workflows/pages.yml`; see [`../docs/site-deploy.md`](../docs/site-deploy.md). + +## Guards (run before commit; some also run in CI) + +- **`check_step_values.py`**: guard cook-from values (quantities, units, temperatures, + times) across the instruction-readability pass; fails if any value token was added, + dropped, or changed. +- **`normalize_dashes.py`**: house-style guard; fails if any en or em dash appears in a + `*.md` or `*.py` file.