Skip to content

fix: close the mechanical audit issues - #196

Merged
TMHSDigital merged 7 commits into
mainfrom
fix/audit-mechanical-issues
Sep 22, 2026
Merged

TMHSDigital merged 7 commits into
mainfrom
fix/audit-mechanical-issues

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Seven commits, one per audit item. Documentation, site-generator, and workflow changes only — no example or showcase script, assertion, exit code, or falsifier was touched, and LICENSE, VERSION, CHANGELOG.md, release.yml, pages.yml path filters, and the smoke matrix/cron are untouched.

Lands under the main-integrity ruleset added in #194.

Commit Item Closes
fb333e0 SECURITY.md claimed 0.2.x at v0.78.18 #186
7c4ad68 Gallery called 26 showcase pieces examples #187
f8a3e5e label-sync.yml ignored examples/ and showcase/ #188
5a57d9d Render requirement vs. the eight check-only examples #146
a9c2fc7 README promised MCP consumption that does not exist —
112586b Quick start never said where to get Blender —
9be9113 Falsifier, the central convention, absent from README —

#186 — security support table

Named 0.2.x while the repo is at 0.78.18, so it claimed support for releases eleven minors behind and none that exist. Replaced with the policy the project can keep: latest release only, no backports, no maintenance branches, plus the one-line reason (this is content, not a runtime). The supported row points at VERSION rather than naming a number, so it cannot drift again.

#187 — the gallery noun

The grid concatenates 51 examples and 26 showcase pieces, then labelled all 77 with the example noun. Found and fixed, all of it verified in the generated HTML rather than the source JSON:

  • count chip read 77 examples → now 51 examples, 26 showcase pieces, in both the static span and the live-updating JS
  • every showcase card carried aria-label="<name> example detail page" and a View example link → now per-card, derived from the showcase tag via a new kind_noun() helper
  • showcase detail pages titled themselves <name> — Examples and credited Rendered headless by the example itself → now — Showcase — and the showcase piece itself
  • gallery title Examples Gallery → Examples and Showcase; back label follows
  • landing page offered Browse all 51 examples in the gallery for a page holding 77 cards → now names both counts
  • search placeholder, chip toolbar aria-label, and empty-state copy no longer say "examples" for a grid holding both
  • generator summary now prints 77 detail pages (51 examples, 26 showcase pieces)

Verification on the regenerated output, per the CLAUDE.md gate:

$ grep -o 'aria-label="[a-z0-9-]* \(example\|showcase piece\) detail page"' docs/gallery/index.html | ... | uniq -c
     51 example
     26 showcase piece
$ grep -o '<title>[^<]*</title>' docs/gallery/anvil/index.html
<title>anvil — Showcase — Blender Developer Tools</title>
$ grep -o '<title>[^<]*</title>' docs/gallery/bmesh-gear/index.html
<title>bmesh-gear — Examples — Blender Developer Tools</title>
$ grep -rl "Examples Gallery" docs/gallery/          # no matches

Dotted-path alt text re-checked against the PR #68 regression: bmesh.ops.create_grid(...) still renders intact in card alts.

#188 — label-sync

Added examples/ and showcase/ branches in the same shape as the existing ones. Both labels created on the repository (examples green, showcase purple); every label the workflow can now apply — skills, rules, snippets, templates, examples, showcase, documentation, ci — was confirmed to exist, so the gh label create --force fallback stays a fallback instead of quietly inventing grey labels.

#146 — check-only examples

docs/new-example-prompt.md required a render from every example with no exception; CLAUDE.md went further and said "their renders ship in the site gallery" of all 59. Eight examples ship none.

Both now state the exception keyed to a criterion, not a list, 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" line is the test to attempt first. The exception is for contracts that are invisible, not renders that are hard.

Verified on disk rather than taken from the issue — exactly eight examples have no gallery.json entry:

examples dirs: 59   gallery entries: 51
coincident-vert-weld       catalog=Y  --output=N  flags=['--no-duplicate', '--weld']
eval-mesh-datablock-name   catalog=Y  --output=N  flags=['--assume-distinct-names']
exit-pre-sidecar           catalog=Y  --output=N  flags=['--atexit-instead', '--force-run', ...]
gn-bundle-roundtrip        catalog=Y  --output=N  flags=['--bypass', '--force-run', ...]
mesh-automasking-settings  catalog=Y  --output=N  flags=['--assume-brush-attrs']
ngon-triangulate           catalog=Y  --output=N  flags=['--no-dissolve', '--skip-triangulate']
unapplied-scale-gltf       catalog=Y  --output=N  flags=['--bake', '--identity']
vse-linear-modifiers       catalog=Y  --output=N  flags=['--assume-present']

All eight hold a tests/smoke/catalog.json row, none takes --output, each carries at least one falsifier. Smoke coverage is unaffected.

The MCP claim

The overview said the content is consumed by "any MCP-capable client". There is no MCP server here and never has been. Replaced with the real mechanism: Cursor applies rules/*.mdc by scope glob and takes skills by name; Claude Code reads skills/ and rules/ from the workspace or a referenced checkout.

mcp-tools.json is not removed-feature residue — git log --all -- mcp-tools.json is empty, so it has never existed here. It is fleet-template scaffolding: scripts/site/build_site.py:274 reads it optionally and returns [] when absent. The pages.yml path-filter reference is inert (a filter on a file that cannot change never matches) and is filed as #195 rather than edited here, since pages.yml path filters were out of scope.

Falsifiers in the README

Added a section above Showcase: what a falsifier is, that it changes input so a real assertion fails rather than skipping the check, that all 59 examples carry one, and the concrete bmesh-gear --no-extrude case (breaks the closed-form topology match, exits 3). Names --api, --check-pixels, and --output as the flags commonly mistaken for falsifiers, and links to CONTRIBUTING.md#exit-codes.

Where to get Blender

One bullet above the run command: the LTS download link, which of 5.2 and 4.5 is primary, and the macOS app-bundle path for when blender is not on PATH.

Evidence status

Everything above is established by inspection and by running the generator locally. No Blender run was required — no example script changed. The generated gallery was rebuilt with python scripts/build_gallery.py and read character by character as the CLAUDE.md gate requires. Smoke on this PR proves the 59 examples still pass unchanged.

Closes #186
Closes #187
Closes #188
Closes #146
Refs #195

🤖 Generated with Claude Code

TMHSDigital and others added 7 commits September 21, 2026 20:36
The supported-versions table named 0.2.x while the repository is at 0.78.18,
so it claimed support for releases eleven minors behind and none of the ones
that exist.

Replace it with the policy the project can actually keep: latest release
only, no backports, no maintenance branches. The row points at VERSION rather
than naming a number, so it cannot drift again on the next release. Adds the
one-line reason there are no backports — this is content, not a runtime.

Closes #186

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
The gallery grid concatenates 51 examples and 26 showcase pieces, then
labelled all 77 with the example noun: the count chip read "77 examples",
every showcase card carried aria-label "<name> example detail page" and a
"View example" link, each showcase detail page titled itself "<name> —
Examples" and claimed "Rendered headless by the example itself", and the
landing page offered to "Browse all 51 examples in the gallery" for a page
holding 77 cards. The two categories are distinct everywhere else in the
repository; the site was the last place conflating them.

Derive the noun per entry from the `showcase` tag instead of hardcoding it
(`kind_noun`), and split the counts:

- count chip and its live-updating JS: "51 examples, 26 showcase pieces"
- card aria-label and card link: "example" or "showcase piece" per card
- showcase detail pages title as "— Showcase —" and credit "the showcase
  piece itself"
- gallery title "Examples Gallery" -> "Examples and Showcase"; description
  now says showcase pieces share the grid and carry the tag
- landing CTA names both counts
- search placeholder, chip toolbar, and empty-state text no longer say
  "examples" for a grid holding both
- the generator's summary line prints the breakdown

Verified against the generated HTML, not the source JSON: 51 "example" and
26 "showcase piece" nouns on the index, correct titles on a showcase detail
page and an example detail page, no residual "Examples Gallery" string, and
dotted-path alt text still intact.

Closes #187

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
label-sync.yml covered skills, rules, snippets, templates, docs, and .github
but not examples/ or showcase/ — the two directories that carry the bulk of
content work. A PR adding an example got no path label at all unless it also
touched a README, and showcase PRs were labelled `documentation` for their
README alone.

Add both branches in the same shape as the existing ones. The `examples` and
`showcase` labels have been created on the repository (green and purple);
every label this workflow can now apply — skills, rules, snippets, templates,
examples, showcase, documentation, ci — exists, so the `gh label create
--force` fallback in the apply step stays a fallback rather than the thing
that silently invents grey labels.

Closes #188

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
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>
The overview claimed the content is consumed by "any MCP-capable client".
There is no MCP server in this repository and never has been: Cursor and
Claude Code read the files directly from a checkout. The line promised a
capability that does not exist, which is a defect rather than a wording
preference — a reader evaluating the project would go looking for a server
to register.

Describe the real mechanism instead: Cursor applies rules/*.mdc by scope
glob and takes skills by name; Claude Code reads skills/ and rules/ from the
workspace or a referenced checkout; any agent that can read workspace files
works the same way.

`pages.yml` also path-filters on a `mcp-tools.json` that has never existed in
this repository's history — it comes from the shared fleet site builder,
which supports tool repos that do ship an MCP server. Filed separately rather
than edited here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
The quick start hands the reader a `blender --background --python ...`
command without ever saying where `blender` comes from or which versions the
repository supports. The supported-versions table is further down the page
and links nowhere.

Add one bullet above the run command: the LTS download link, which of 5.2
and 4.5 is primary, and the macOS app-bundle path that trips people up when
`blender` is not on PATH.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
The falsifier is this repository's central convention — it is what makes a
green example run evidence rather than decoration — and it appeared only in
CLAUDE.md, CONTRIBUTING.md, and the PR template. A reader evaluating the
project from the README never met the word, so the examples read as scripts
that happen to print OK.

Add a short section above Showcase: what a falsifier is, that it changes
input so a real assertion fails rather than skipping the check, that all 59
examples carry one, and the concrete bmesh-gear case (`--no-extrude` breaks
the closed-form topology match and exits 3). Names the three flags that are
commonly mistaken for falsifiers and links to CONTRIBUTING.md for the
exit-code model.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
@github-actions github-actions Bot added examples Runnable smoke-gated examples under examples/ documentation Improvements or additions to documentation ci labels Sep 22, 2026
@TMHSDigital
TMHSDigital merged commit 4d23e70 into main Sep 22, 2026
11 checks passed
@TMHSDigital
TMHSDigital deleted the fix/audit-mechanical-issues branch September 22, 2026 00:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci documentation Improvements or additions to documentation examples Runnable smoke-gated examples under examples/

Projects

None yet

1 participant