Skip to content

fix(examples): redesign attribute-domain-shear as striped patio parasols - #272

Merged
TMHSDigital merged 1 commit into
mainfrom
fix/hero-attribute-domain-shear
Sep 26, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
fix/hero-attribute-domain-shear

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

What changed and why

The gallery review judged the attribute-domain-shear hero weak. The "wrong" POINT umbrella read as a smoother, arguably prettier rainbow gradient, which undercut the lesson. The "CORNER" / "POINT — last write wins" floor labels could not be read at card size.

Redesign: two striped patio parasols.

  • Subject. Each parasol is eight named parts with five materials: Canopy (attribute fabric, fully matte), Ribs (aluminium ribs and stretchers), Runner / Finial / TiltKnuckle (brass), PoleUpper / PoleLower (teak), and Base (cast iron, lathe-turned). The canopy tilts 24° toward the camera so the whole top reads.
  • Witness. The canopy is the check's fan grown into fabric: eight gores around one shared apex vertex, with every gore vertex on a seam. It is painted by the same assign_corner / assign_point_naive functions the check asserts. CORNER (left) keeps crisp crimson and cream stripes. Naive POINT (right) smears the stripes pink along every seam. Gore 0, crimson by intent and turned to face the camera, renders cream, because gore 7 wrote its seam and the apex last. At a glance it reads as broken, not as a nicer gradient.
  • Palette. The render uses a two-tone palette. The check keeps its eight distinct hues, because an off-by-two ordering bug would pass unnoticed under a period-2 palette. The README says so.
  • Labels. There is one bold standing block label per parasol: CORNER and POINT. Both read at 427×240.
  • Code. assign_corner / assign_point_naive gained a faces_per_wedge stride (wedge-major face order). On the check's fan it is 1, the write order is unchanged, and the check output is identical.
  • Gates. The render path now also runs gallery_asset_quality (exit 11) on one parasol.

Evidence

Gate numbers (5.2.1 render path)

  • Framing: fill x=0.800 y=0.639 (band 0.70–0.90), margins L 0.100 / R 0.100 / B 0.083 / T 0.194. framing_ok.
  • Asset quality (left parasol): 8 parts, no default names, 5 materials, edge90 0.061. aq_ok.
  • Drift: measure_hero_drift.py --only attribute-domain-shear gives mean_abs 0.00321 and matches.

Contact sheet verdicts

tile luma stage warmth sat
attribute-domain-shear (candidate) 0.2700 0.2060 +0.0725 0.1441
armature-bend 0.2787 0.2132 −0.4279 0.1436
damped-track-aim 0.1511 0.1448 +0.2772 0.2305
bmesh-gear 0.2358 0.1772 +0.3027 0.2495
  • Stage darkness: pass. The stage (0.206) sits between bmesh-gear and armature-bend.
  • Wedge warmth: pass, weak. The warm pool is visible behind the canopies, but its warmth (+0.07) is lower than damped-track-aim and bmesh-gear. The cream canopy dilutes the tile measurement.
  • Subject fill: pass. Fill is 0.80 in x.
  • Saturation: pass. It matches armature-bend. The saturated crimson carries it.
  • Thumbnail legibility: pass. Crisp stripes against smeared stripes with a missing red panel read in under a second at 427×240, and both labels are legible.
  • Mean luminance: 0.270, against 0.151–0.279 for the calibration set.

Check-only runs (tests/smoke/run_example.py)

binary reported version result
E:\Blender-Developer-Tools\.scratch\blender-5.2.1-windows-x64\blender.exe Blender 5.2.1 LTS PASS, shear 0.751031 = closed form
E:\Blender-Developer-Tools\.scratch\blender-5.1.2-windows-x64\blender.exe Blender 5.1.2 PASS, identical
E:\Blender-Developer-Tools\.scratch\blender-4.5.11-windows-x64\blender.exe Blender 4.5.11 LTS PASS, identical

The render path also ran on 4.5.11 (framing_ok, aq_ok, still written).

Falsifiers (re-proven on 5.2.1 after the authoring-function change)

probe exit measured
CORNER: face 3 painted wedge 2's color 4 corner_hub_max_err 3.895e-01
POINT: wedges written in reverse order 5 hub reads palette[0], not palette[7]
POINT: ring vert 2 overwritten after the loop 6 point_ring_max_err 7.790e-01
constant palette 7 shear 0.000000
--no-overwrite 5 hub is not the last write

Proven by live run vs established by inspection

Proven by live run:

  • The check passes on all three binaries with identical numbers.
  • All five falsifiers fire.
  • The render path passes framing and asset-quality on 5.2.1 and 4.5.11.
  • The hero was regenerated via render_hero.py on 5.2.1, and the drift check reports matches.
  • The contact sheet was built by contact_sheet.py.
  • build_gallery.py was re-run after rebasing onto main, and the generated <img alt> was read in docs/gallery/index.html and docs/gallery/attribute-domain-shear/index.html.

Established by inspection only:

  • Which gores smear, and why gore 0 turns cream. The render path does not assert these; the check asserts the same last-write rule on the fan.
  • The visual verdicts above.

Asset sheet: not committed. This is an attributes teaching example, not an asset-type prop, so the gate does not formally apply. I still ran scripts/asset_sheet.py as a sanity check. The parasol is clean and plausible, but it is the simplest object in that lineup of hydrant, drone, well, wheelbarrow and shelf.

🤖 Generated with Claude Code

The gallery review judged the hero weak. The "wrong" POINT umbrella read
as a smoother, arguably prettier rainbow gradient, which undercut the
message, and the small floor labels could not be read at card size.

The render now shows two striped patio parasols. Each is eight named parts
with five materials: canopy, ribs, brass fittings, teak poles and a
cast-iron base. The canopy is the check's fan grown into fabric: eight
gores around one shared apex, with every gore vertex on a seam, painted by
the same assign_corner / assign_point_naive functions the check asserts.
CORNER keeps crisp crimson and cream stripes. Naive POINT smears them pink
along the seams, and gore 0 (crimson by intent, turned to face the camera)
renders cream because gore 7 wrote its seam and the apex last. The render
uses a two-tone palette. The check keeps its eight distinct hues, since an
off-by-two ordering bug would pass unnoticed under a period-2 palette.
There is one bold standing label per parasol. The render path now also
runs the asset-quality floors (exit 11).

The authoring functions gained a faces_per_wedge stride (wedge-major face
order). On the check's fan it is 1 and the write order is unchanged. The
check output is identical on 4.5.11, 5.1.2 and 5.2.1, and all five
falsifiers were re-proven.

Co-Authored-By: Claude Opus 5.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 labels Sep 26, 2026
@TMHSDigital
TMHSDigital merged commit 2f6b4c6 into main Sep 26, 2026
11 checks passed
@TMHSDigital
TMHSDigital deleted the fix/hero-attribute-domain-shear branch September 26, 2026 23:06
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/

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant