diff --git a/CLAUDE.md b/CLAUDE.md
index 2e5071e5..736c74c4 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -122,7 +122,7 @@ example still carries a `tests/smoke/catalog.json` row and a falsifier.
`examples/gallery.json` is the
gallery's source of truth. When authoring a new gallery example, copy the anatomy of
`examples/bmesh-gear/` (script structure, README shape, dark-studio render recipe) and
-wire all of: gallery.json entry, `.cursor-plugin/plugin.json` examples array (CI-gated),
+wire all of: gallery.json entry (with an `alt` sentence describing the still; the build fails without one), `.cursor-plugin/plugin.json` examples array (CI-gated),
a `tests/smoke/catalog.json` row, a README gallery row, hero webp (1280×720) in
`docs/gallery/assets/` + preview webp (1200×675), then run `python scripts/build_gallery.py`.
A check-only example wires only the `.cursor-plugin/plugin.json` entry, the
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 4ce2d6e0..5c79bdba 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -115,8 +115,9 @@ budget conformance, never an API contract.
**named** budget fails.
2. List the directory in `.cursor-plugin/plugin.json` `"showcase"` and add a
`tests/smoke/catalog.json` row. The runner takes opaque script paths.
-3. Add a `showcase/gallery.json` `pieces[]` entry, render a still, and run
- `python scripts/build_gallery.py`. Do not hand-edit `docs/gallery/` HTML.
+3. Add a `showcase/gallery.json` `pieces[]` entry, including an `alt`: one
+ sentence saying what the still shows (the generator fails without it).
+ Render a still, and run `python scripts/build_gallery.py`. Do not hand-edit `docs/gallery/` HTML.
4. Update the README showcase-piece count. `validate-counts` checks it
separately from the example total.
diff --git a/docs/gallery/anvil/index.html b/docs/gallery/anvil/index.html
index 585fd094..96d87649 100644
--- a/docs/gallery/anvil/index.html
+++ b/docs/gallery/anvil/index.html
@@ -16,13 +16,13 @@
-
+
-
+