From 70fc77038bcc88fc7b1aef98440eba26af1afd44 Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Wed, 23 Sep 2026 05:18:31 -0400 Subject: [PATCH] fix(gallery): describe each still in its alt text instead of the API it teaches Every gallery image's alt was derived from `teaches`, which says what the code proves, not what the picture shows, and 29 of 79 card alts were cut at 160 characters. Detail-page, zoom and landing images said only " render". - Each examples/ and showcase/ gallery.json entry gains an `alt`: one sentence written from the committed still (all 79, longest 135 chars). - build_gallery.py uses it for the card, the detail hero, the zoom image and the zoom button label, and fails the build on a missing or overlong alt. The teaches-derived card_alt/first_sentence helpers go. - The landing template uses it for both card grids. - CLAUDE.md, CONTRIBUTING.md and docs/new-example-prompt.md say new entries need one. Closes #213 Co-Authored-By: Claude Opus 5.5 (1M context) Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> --- CLAUDE.md | 2 +- CONTRIBUTING.md | 5 +- docs/gallery/anvil/index.html | 6 +- docs/gallery/armature-bend/index.html | 6 +- .../gallery/attribute-domain-shear/index.html | 6 +- .../bake-normal-high-to-low/index.html | 6 +- docs/gallery/bmesh-gear/index.html | 6 +- docs/gallery/campfire/index.html | 6 +- docs/gallery/car-mirror-symmetry/index.html | 6 +- docs/gallery/cart/index.html | 6 +- docs/gallery/chopping-block/index.html | 6 +- docs/gallery/collision-hull-proxy/index.html | 6 +- docs/gallery/color-attribute-wheel/index.html | 6 +- docs/gallery/compositor-glare/index.html | 6 +- docs/gallery/crate-stack/index.html | 6 +- .../cross-version-property-delete/index.html | 6 +- docs/gallery/curve-bevel-arc/index.html | 6 +- docs/gallery/custom-normals-shade/index.html | 6 +- docs/gallery/damped-track-aim/index.html | 6 +- docs/gallery/degenerate-bevel-weld/index.html | 6 +- docs/gallery/depsgraph-export/index.html | 6 +- docs/gallery/driver-wave/index.html | 6 +- docs/gallery/export-preset-axis/index.html | 6 +- docs/gallery/fence-kit/index.html | 6 +- docs/gallery/gltf-export-roundtrip/index.html | 6 +- docs/gallery/gltf-skin-roundtrip/index.html | 6 +- docs/gallery/gn-instance-grid/index.html | 6 +- docs/gallery/gn-modifier-inputs/index.html | 6 +- docs/gallery/gn-sdf-remesh/index.html | 6 +- docs/gallery/gn-socket-rename/index.html | 6 +- docs/gallery/gn-zone-iterate/index.html | 6 +- docs/gallery/gp-lineart-contour/index.html | 6 +- docs/gallery/grease-pencil-rosette/index.html | 6 +- docs/gallery/grindstone/index.html | 6 +- docs/gallery/hand-pump/index.html | 6 +- docs/gallery/hay-bale/index.html | 6 +- docs/gallery/hitching-post/index.html | 6 +- docs/gallery/image-pixels-testcard/index.html | 6 +- docs/gallery/index.html | 158 +++++++++--------- docs/gallery/iron-cauldron/index.html | 6 +- docs/gallery/light-link-studio/index.html | 6 +- docs/gallery/lightmap-uv-channel/index.html | 6 +- docs/gallery/lod-decimate-chain/index.html | 6 +- docs/gallery/market-stall/index.html | 6 +- docs/gallery/mesh-hygiene-audit/index.html | 6 +- docs/gallery/modular-kit-snap/index.html | 6 +- docs/gallery/parent-inverse-orrery/index.html | 6 +- docs/gallery/park-bench/index.html | 6 +- docs/gallery/png-exr-alpha/index.html | 6 +- docs/gallery/prop-origin-transform/index.html | 6 +- docs/gallery/shader-node-group/index.html | 6 +- docs/gallery/shape-key-blend/index.html | 6 +- docs/gallery/shipping-crate/index.html | 6 +- docs/gallery/signpost/index.html | 6 +- .../sky-texture-sun-elevation/index.html | 6 +- docs/gallery/soccer-ball-goldberg/index.html | 6 +- docs/gallery/socket-attach-points/index.html | 6 +- docs/gallery/stone-archway/index.html | 6 +- docs/gallery/stone-well/index.html | 6 +- docs/gallery/street-lantern/index.html | 6 +- docs/gallery/swatch-grid/index.html | 6 +- docs/gallery/tavern-stool/index.html | 6 +- docs/gallery/temp-override-join/index.html | 6 +- docs/gallery/terrain-scatter/index.html | 6 +- docs/gallery/text-version-stamp/index.html | 6 +- docs/gallery/treasure-chest/index.html | 6 +- docs/gallery/triangulate-tangents/index.html | 6 +- docs/gallery/turntable/index.html | 6 +- .../usd-export-evaluation-mode/index.html | 6 +- docs/gallery/uv-layer-grid/index.html | 6 +- docs/gallery/vertex-color-ao/index.html | 6 +- docs/gallery/vertex-weight-limit/index.html | 6 +- docs/gallery/vse-cut-list/index.html | 6 +- docs/gallery/vse-gamma-cross/index.html | 6 +- docs/gallery/wall-torch/index.html | 6 +- docs/gallery/watchtower/index.html | 6 +- docs/gallery/water-trough/index.html | 6 +- docs/gallery/wave-displace/index.html | 6 +- docs/gallery/wheelbarrow/index.html | 6 +- docs/gallery/wooden-barrel/index.html | 6 +- docs/gallery/wooden-bucket/index.html | 6 +- docs/gallery/wooden-ladder/index.html | 6 +- docs/new-example-prompt.md | 7 +- examples/gallery.json | 51 ++++++ scripts/build_gallery.py | 74 +++----- scripts/site/template.html.j2 | 4 +- showcase/gallery.json | 28 ++++ 87 files changed, 426 insertions(+), 377 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index d727ea89..17c62fc2 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 339f2475..e3d83347 100644 --- a/docs/gallery/anvil/index.html +++ b/docs/gallery/anvil/index.html @@ -263,8 +263,8 @@

anvil

A procedural blacksmith anvil on a timber stump through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.

-

Rendered headless by the showcase piece itself — click to zoom.

witnesses Recomputed: 2988 tris, two materials with 1040 wood and 822 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.621×0.414×0.489 m, LOD ratios in band, convex collider 134 tris, hygiene 0, 16 grounded staves, hoop bite 0.003 m, foot-on-head gap 0.003 m, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-staves 16; --float-anvil 17; --round-band 18.
@@ -1672,7 +1672,7 @@

Source

- anvil render, full size + A black iron anvil mounted on a hooped timber stump.