Skip to content

Commit 5a57d9d

Browse files
TMHSDigitalclaude
andcommitted
fix: carve out check-only examples from the render requirement
docs/new-example-prompt.md required every example to produce a deliberate render and wire gallery metadata and assets, with no exception. Eight of the 59 examples ship no render, no gallery.json entry, and no hero asset — an established, deliberate category the authoring prompt did not acknowledge, so the prompt described a rule the repository does not follow. CLAUDE.md stated it more strongly still: "their renders ship in the site gallery", of all 59. State the exception in both, keyed to a criterion rather than a list of the eight so it stays true as the set changes: an example is check-only when its witness is a data or state fact that no scene redesign can make visible — a datablock name, an RNA attribute's presence, a post-exit sidecar, a topology count, export metadata — so the render would be identical whether the API held or broke. The existing "redesign the scene until failure would be visible" instruction is the test to attempt first; the exception is for contracts that are invisible, not renders that are hard. CLAUDE.md now says 51 of 59 ship a render, and records that a check-only example wires only the plugin manifest entry, the smoke catalog row, and its README. Verified on disk: exactly eight examples have no gallery.json entry (coincident-vert-weld, eval-mesh-datablock-name, exit-pre-sidecar, gn-bundle-roundtrip, mesh-automasking-settings, ngon-triangulate, unapplied-scale-gltf, vse-linear-modifiers); all eight have a tests/smoke/catalog.json row, none takes --output, and each carries at least one falsifier flag. Smoke coverage is unaffected. Closes #146 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
1 parent f8a3e5e commit 5a57d9d

2 files changed

Lines changed: 36 additions & 4 deletions

File tree

‎CLAUDE.md‎

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,25 @@ AI asset pipeline track: `decimate_to_budget.py`, `convex_hull_collider.py`, `lo
105105
Runnable scripts at `examples/<name>/`, each asserting a real API contract with
106106
deterministic checks (exit non-zero on failure) and optionally rendering a still via
107107
`--output`. All of them run headless on Blender 5.2 LTS and 4.5 LTS in `blender-smoke.yml` (5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch);
108-
their renders ship in the site gallery at `docs/gallery/`. `examples/gallery.json` is the
109-
gallery's source of truth. When authoring a new one, copy the anatomy of
108+
**51 of the 59 ship a render in the site gallery** at `docs/gallery/`. The other
109+
eight are **check-only**: they carry no `--output` path, no gallery entry, and no
110+
hero asset. The criterion is whether the contract is expressible in pixels. An
111+
example is check-only when its witness is a data or state fact that no scene
112+
redesign can make visible — a datablock name, an RNA attribute's presence, a
113+
post-exit sidecar, a topology count, export metadata — so a render would look
114+
identical whether the API held or broke. That is a category, not a shortcut: a
115+
subject whose render *could* be made legible must be rendered, per
116+
`docs/new-example-prompt.md`. Smoke coverage is unaffected; every check-only
117+
example still carries a `tests/smoke/catalog.json` row and a falsifier.
118+
`examples/gallery.json` is the
119+
gallery's source of truth. When authoring a new gallery example, copy the anatomy of
110120
`examples/bmesh-gear/` (script structure, README shape, dark-studio render recipe) and
111121
wire all of: gallery.json entry, `.cursor-plugin/plugin.json` examples array (CI-gated),
112122
a `tests/smoke/catalog.json` row, a README gallery row, hero webp (1280×720) in
113123
`docs/gallery/assets/` + preview webp (1200×675), then run `python scripts/build_gallery.py`.
124+
A check-only example wires only the `.cursor-plugin/plugin.json` entry, the
125+
`tests/smoke/catalog.json` row, and its README — it is deliberately absent from
126+
`examples/gallery.json` and `docs/gallery/`.
114127
Renders must conform to the gallery look spec at `docs/VISUAL-STYLE.md`.
115128
Render paths gate framing through the shared helper `examples/gallery_framing.py` —
116129
imported via a `__file__`-relative `sys.path` shim, the repo's only

‎docs/new-example-prompt.md‎

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,21 @@ you write code:
4949
to infer what contract is being demonstrated. If the render would look the same
5050
whether the API worked or not, redesign the scene until failure would be visible.
5151

52+
**The check-only exception.** A small, established category of examples ships with
53+
no render at all: no `--output` path, no `examples/gallery.json` entry, no hero or
54+
preview asset, no `docs/gallery/` page. The criterion is whether the contract is
55+
expressible in pixels. An example is check-only when its witness is a data or state
56+
fact that *no* scene redesign can make visible — a datablock name, the presence or
57+
absence of an RNA attribute, a post-exit sidecar file, a topology count, export
58+
metadata — so the render would be identical whether the API held or broke. The
59+
"redesign the scene until failure would be visible" instruction above is the test:
60+
attempt it first, and only when it cannot succeed in principle does the example
61+
become check-only. The exception is for contracts that are invisible, not for
62+
renders that are hard. Eight of the 59 examples currently qualify, and `CLAUDE.md`
63+
carries the same rule. A check-only example is otherwise a full example: it still
64+
asserts a real contract, still exits non-zero on failure, still carries a falsifier,
65+
and still takes a `tests/smoke/catalog.json` row so it runs on every PR.
66+
5267
Where an API diverges between 4.5, 5.1, and 5.2, asserting each side's actual contract is
5368
part of the witness—version-gate explicitly and document the divergence rather than
5469
papering over it. Version-gate on the `bpy.app.version` tuple, not
@@ -73,12 +88,16 @@ The example must:
7388
witnesses, what failure it would catch, and any version-gated divergence between
7489
4.5 LTS, 5.1, and 5.2 LTS;
7590
- produce a deliberate, well-framed render rather than a mockup, primitive dump, or
76-
placeholder.
91+
placeholder — unless it meets the check-only exception above, in which case it
92+
ships no render and no gallery entry, and the PR body says which criterion put it
93+
there.
7794

7895
Complete every integration required for a shipped example. Infer the exact current
7996
shape from neighboring examples and repository configuration, including the example
8097
directory, README, gallery metadata and assets, plugin manifest, smoke catalog
81-
(`tests/smoke/catalog.json`), top-level README, and generated gallery pages. After regenerating the gallery with
98+
(`tests/smoke/catalog.json`), top-level README, and generated gallery pages. A
99+
check-only example skips the gallery metadata, assets, and generated pages — it wires
100+
the plugin manifest, the smoke catalog row, and its README, and nothing else. After regenerating the gallery with
82101
`python scripts/build_gallery.py`, read the **generated** output character by
83102
character—not only `examples/gallery.json` source fields. Open
84103
`docs/gallery/index.html` and `docs/gallery/<name>/index.html` and inspect the

0 commit comments

Comments
 (0)