Skip to content

fix(examples): re-review of the 20 judged-fine examples; seat the gear, buckler and crystal - #247

Merged
TMHSDigital merged 3 commits into
mainfrom
fix/rereview-judged-fine
Sep 25, 2026
Merged

TMHSDigital merged 3 commits into
mainfrom
fix/rereview-judged-fine

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

A second review of the 20 gallery examples an earlier pass had marked "fine". I re-inspected all 20 as Track B: each example's contract, assertions and exit codes are frozen, and only presentation and demo scaffolding may change. Three examples had real defects and are fixed here. The other 17 are unchanged, with evidence below.

Binaries:

  • .scratch/blender-4.5.11-windows-x64 (reports Blender 4.5.11 LTS)
  • blender-5.1.2-windows-x64 (Blender 5.1.2)
  • blender-5.2.1-windows-x64 (Blender 5.2.1 LTS)

The heroes were rendered on 5.2.1 through scripts/render_hero.py.

Method: I intercepted each example's own hero render, which covers the 14 render paths that have no framing gate, and shot these views from the scene as staged:

  • a clay three-quarter view and a wireframe three-quarter view (Workbench);
  • real-engine close-ups of the six largest subject objects;
  • a low ground-contact view.

A probe then printed the world-space extents of every evaluated mesh at render time. All inspection output stays in .scratch/.

Fixed

triangulate-tangents

Defects:

  1. Floating stand. The display stand hung between z = 0.49 and 0.61 m, with nothing under it. Revealed by ground_contact (shadow far below) and confirmed by the extents probe.
  2. No support behind the lean. The buckler leans back 20° with nothing behind it.

Fix: everything is derived from the posed mesh.

  • The stand rests on the floor, and the rim's lowest evaluated vertex sits 1 cm into its top.
  • A kickstand strut runs from the buckler's back, found by a local-space ray_cast, to the floor behind it.
  • The camera and aim move up with the derived lift, so the composition is unchanged.

Measured: rim 0.110 m against a stand top at 0.120 m; stand from 0 to 0.12 m; strut foot at −0.028 m.

Framing: own gate, fill 0.833, minimum margin 0.028 (it was 0.834 and ok before).

Rounds: 1.

bmesh-gear (pinned contact-sheet calibration reference)

Defects:

  1. Unsupported lean. The gear leans 46° back with nothing behind it (hero, clay).
  2. Sunk into the floor. Its lowest tooth was 4.5 cm below the floor (extents probe).

Fix:

  • The gear is seated on the floor from its lowest evaluated vertex, with a 3 mm bite.
  • A matte inclined wedge carries it. The wedge's slope lies in the gear's back-cap plane.
  • The camera moves up with the seat height.

Why it took 4 rounds: the wedge first read as a pale sheet of paper. A diagnostic render with the wedge painted pure red showed that about 45/255 of its brightness was specular, not albedo, so the final material cuts the specular level.

Round limit: my plan allowed three rounds per example; this one took four.

Residual: the wedge is only moderately darker than the floor, about 60/255 against 77/255.

Framing: out of band, fill 0.856 and top margin 0.033, both as before.

Calibration shift (this tile is in every contact sheet):

before after
luma 0.305 0.302
stage 0.237 0.236
warmth +0.370 +0.374
sat 0.195 0.195

gp-lineart-contour

Defects:

  1. Malformed crystal. build_crystal duplicated an open cone and flipped it over the original. The two crossed into an hourglass with open hexagonal ends, and the top view looked into a bowl with a spike inside. The old gallery alt even read "A translucent hourglass-shaped solid". Revealed by the clay and wire views.
  2. Hovering crystal. It floated 0.13 m above the floor (ground_contact, extents probe).

Fix:

  • The crystal is now the hexagonal bipyramid the docstring intends: one equator ring and two apexes.
  • The render path builds a two-tier hex mount after the check, derived from the crystal's lowest evaluated vertex, and the crystal's lower tip sits in it.
  • The still's camera lowers its aim and dollies in along the check camera's bearing. The check camera itself is untouched.

Measured-line change (disclosed): the crystal is demo scaffolding, not asserted geometry, but Line Art counts come from it. The counts move from 10 strokes / 34 points to 2 / 12, identical on all three binaries. The gates are lower bounds (≥1, ≥4) and are unchanged, as is every assertion and exit code. The README, gallery teaches and the version-witness line were updated to match.

Framing: own gate, fill 0.761, minimum margin 0.056.

Contact sheet: luma 0.192 → 0.155, which is inside the 0.151–0.305 band but near its floor. Saturation went 0.242 → 0.184, because more of the frame is the translucent body and less is cyan stroke. It is legible at thumbnail size.

Why it took 5 rounds: rounds 3–5 re-fit framing for the corrected crystal, which is smaller.

Exit codes, before and after

Identical on 4.5.11, 5.1.2 and 5.2.1, and identical before and after:

default falsifier --output
triangulate-tangents 0 4 (--zero-uv) 0
bmesh-gear 0 3 (--no-extrude) 0
gp-lineart-contour 0 4 (--no-contour) 0

I diffed every measured-value line across all 27 runs. The only differences are the gp-lineart-contour stroke counts above, plus the use_nodes deprecation warnings printed for the new staging materials.

Contact sheets:

Unchanged: verdicts

Fine with no qualification:

  • png-exr-alpha, uv-layer-grid, grease-pencil-rosette, vse-gamma-cross, image-pixels-testcard, armature-bend: fine.
  • lod-decimate-chain, compositor-glare, light-link-studio: fine.
  • collision-hull-proxy, custom-normals-shade, vertex-weight-limit: fine.

Fine, with reasons:

  • socket-attach-points: a hovering drone is correct for a drone, and the battery module sits where the socket contract places it.
  • modular-kit-snap: the odd shapes in the exterior close-ups are just the backs of wall panels.
  • damped-track-aim: its needles bleed off the frame edges by design.
  • gltf-skin-roundtrip: the blocky scorpion is the asserted geometry; vertex counts are part of the check. The wireframe view showed a stray icosphere, but it is the glTF importer's bone-shape object in an excluded collection and never renders.
  • car-mirror-symmetry: the dark rear half is consistent with the dark-studio look. This is the weakest of the unchanged renders.

Out-of-band framing: the 14 paths without a gate

No gate was added, because that would introduce exit 10. Each example's own hero render was measured, before this PR:

Example Fill (max axis) Minimum margin Result
armature-bend 0.867 0.039 ok
bmesh-gear 0.856 0.033 ok (after: 0.856 / 0.033)
car-mirror-symmetry 0.772 0.059 ok
collision-hull-proxy 0.839 0.033 ok
compositor-glare 0.734 0.117 ok
custom-normals-shade 0.819 0.069 ok
damped-track-aim 1.000 0.000 FAIL: bleed composition by design
gltf-skin-roundtrip 0.791 0.078 ok
grease-pencil-rosette 0.750 0.122 ok
image-pixels-testcard 0.772 0.067 ok
light-link-studio 0.831 0.084 ok
lod-decimate-chain 0.831 0.084 ok
uv-layer-grid 0.738 0.109 ok
vse-gamma-cross 0.833 0.033 ok

modular-kit-snap has its own measure_framing_deviation cap for its interior corridor, so a plain fill measurement does not apply to it.

Checks

Run locally and passing:

  • check_exit_code_readme.py
  • check_gallery_images.py
  • check_falsifier_targets.py

build_gallery.py was run last. I read the generated alt text in docs/gallery/index.html and on the three detail pages.

🤖 Generated with Claude Code

TMHSDigital and others added 3 commits September 24, 2026 22:26
The display stand hung 0.49 m above the floor with nothing under it, and
nothing held the buckler's 20-degree backward lean. The stand now rests on
the floor, the rim's lowest evaluated vertex bites 1 cm into its top, and a
kickstand strut runs from the buckler's back (found by a local-space ray) to
the floor. The camera and aim ride with the derived lift. Render path only;
exit codes are unchanged on 4.5.11, 5.1.2 and 5.2.1.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
The gear leaned 46 degrees back with nothing behind it, and its lowest tooth
was sunk 4.5 cm into the floor. The gear is now seated from its lowest
evaluated vertex (3 mm bite) and carried by a matte inclined wedge whose
slope lies in the back-cap plane. The camera rides with the seat height.
bmesh-gear is a pinned calibration reference: luma 0.305 -> 0.302, stage
0.237 -> 0.236, warmth +0.370 -> +0.374, saturation 0.195 -> 0.195.
Render path only; exit codes are unchanged on all three binaries.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
… mount it

build_crystal duplicated an open cone and flipped it over the original. The
two crossed into an hourglass with open hexagonal ends and an inner spike,
which the old gallery alt described as an hourglass-shaped solid. It is now
the hexagonal bipyramid the docstring intended. The crystal also hovered
0.13 m above the floor; a two-tier hex mount, built after the check from the
lowest evaluated vertex, now holds its lower tip. The still dollies along the
check camera's bearing so the mount stays in frame.

The corrected mesh changes the measured Line Art counts from 10 strokes /
34 points to 2 / 12, identical on 4.5.11, 5.1.2 and 5.2.1. The gates are
lower bounds (>=1, >=4) and are unchanged, as are every assertion and exit
code (default 0, --no-contour 4, --output 0).

Shared gallery.json and gallery index updates for all three examples ride here.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
@TMHSDigital TMHSDigital added the needs-5.1 Opt-in Blender 5.1 smoke on this PR. Default matrix stays 4.5 + 5.2. Auto-label will not apply this. label Sep 25, 2026
@github-actions github-actions Bot added examples Runnable smoke-gated examples under examples/ documentation Improvements or additions to documentation labels Sep 25, 2026
@TMHSDigital
TMHSDigital merged commit 38e6f1d into main Sep 25, 2026
13 checks passed
@TMHSDigital
TMHSDigital deleted the fix/rereview-judged-fine branch September 25, 2026 02:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation examples Runnable smoke-gated examples under examples/ needs-5.1 Opt-in Blender 5.1 smoke on this PR. Default matrix stays 4.5 + 5.2. Auto-label will not apply this.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant