Skip to content

feat(showcase): add apothecary-shelf - #254

Merged
TMHSDigital merged 1 commit into
mainfrom
feat/showcase-apothecary-shelf
Sep 25, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
feat/showcase-apothecary-shelf

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Adds showcase/apothecary-shelf: a stained shelf unit stocked with fifteen vessels in five forms (bottle, flask, jar, albarello, vial). The carcass has three housed shelves behind gallery rails, lapped back boards, a bank of three drawers with brass knobs and an arched crest. Every vessel is corked or lidded and labelled.

Selection: it is the first unclaimed candidate in the ROADMAP pool now that brazier has shipped. It is a prop, so it goes in showcase. There were no open PRs, and the only feat/showcase-* ref is already-merged work. The pool is restocked with a bookshelf-with-leaning-books candidate identified while building this.

Binaries (all local, .scratch/):

  • blender-4.5.11-windows-x64 reports Blender 4.5.11 LTS
  • blender-5.1.2-windows-x64 reports Blender 5.1.2
  • blender-5.2.1-windows-x64 reports Blender 5.2.1 LTS

The budget that matters: headroom (exit 20)

A vessel that is too tall runs its neck up into the next shelf, and every other check still passes:

  • it still stands on its shelf, so the seat passes;
  • the shelf above is still in its dado, so the joint passes;
  • the neck stops inside the shelf, so the AABB does not move;
  • the triangle count is unchanged.

The piece reads each vessel's top (body or closure) and the underside of the lowest horizontal member above it off the finished mesh, and asserts a 20 mm floor.

  • Default: the tightest vessel clears by 24.05 mm.
  • --tall-flask: stretches the middle-shelf flask by 1.20. It exits 20 at −5.51 mm, with every seat, joint and the envelope still passing.

live-run-proven

Falsifiers: exit codes per binary (live-run-proven)

default --skip-decimate --stray-vert --lift-z --float-side --short-shelves --pop-corks --pull-knobs --float-jars --lift-drawers --float-labels --tall-flask --crowd-jars --uniform-vessels --sharp-rail --output
4.5.11 0 9 15 16 16 17 17 17 18 18 18 20 21 22 23 —
5.1.2 0 9 15 16 16 17 17 17 18 18 18 20 21 22 23 —
5.2.1 0 9 15 16 16 17 17 17 18 18 18 20 21 22 23 0
Flag Target budget Measured Exit
--skip-decimate LOD1 ratio 1.0000 9
--stray-vert hygiene loose_v 1 15
--lift-z grounded zmin 0.050 16
--float-side named sides left side 5 mm up 16
--short-shelves dado bite −4.0 mm 17
--pop-corks closure bite −5.0 mm 17
--pull-knobs knob bite −4.0 mm 17
--float-jars vessel seat −5.0 to −4.2 mm 18
--lift-drawers drawer seat −1.0 mm 18
--float-labels label seat −1.1 mm 18
--tall-flask headroom −5.51 mm (floor 20) 20
--crowd-jars vessel overlaps 3 21
--uniform-vessels form spread 1.000 / 1.000 (floors 2.0 / 1.5) 22
--sharp-rail edge treatment 12 right-angle edges 23

Envelope: every falsifier leaves the AABB unchanged except --pull-knobs, which adds 6 mm in Y, inside the 20 mm BBOX_TOL. live-run-proven

Checks run locally

  • tests/check_falsifier_targets.py: the static check passes (32 pieces). --run <BLENDER> --only apothecary-shelf passes all 14 falsifiers on each of the three binaries. live-run-proven

  • tests/smoke/run_example.py --forbid-skip: [PASS] apothecary-shelf on 4.5.11, 5.1.2 and 5.2.1. live-run-proven

  • Other local checks:

    • check_exit_code_readme, check_import_export_rules, check_engine_id, check_gallery_images, test_harness
    • the inline validate-manifest and validate-counts jobs, run in a clean worktree (32 showcase pieces)
    • the gallery-drift logic (rebuild, then no content diff)

    All pass. live-run-proven

  • Determinism: every budget value is byte-identical across 4.5.11, 5.1.2 and 5.2.1, including both LOD counts. The only difference is the glTF byte count: 448596 on 5.2.1 against 448604 on the others, which is exporter metadata. There is no RNG. Check-only wall-clock is about 4.5–5.7 s on 5.2.1. The 4.5.11 first run took 13 s cold, so its steady-state time is not measured. live-run-proven

  • Remote-only checks: the ecosystem drift check and the 4.5 / 5.1 / 5.2 smoke jobs are CI-proven on this PR.

Fix cycles (live-run-proven unless marked)

  • Coplanar corks. The coplanar budget found 64 pairs. A 1.10 × cork flare put the cork wall 0.1 mm off the neck cylinder. The flare is now 1.20 × and the count is 0.
  • Part matching. 12 of 15 labels matched a body on another shelf, because vessels stack in near-identical plan positions. The label seat read −23 mm and there were 7 false overlaps. Closures and labels are now matched only among bodies at their own height.
  • Collider. convex_hull returned the same vertex in both the interior and unused sets, and delete raised an exception. The two sets are now deduplicated.
  • Glass (inspection-only). EEVEE transmission rendered every bottle as grainy speckle. It persisted with and without raytracing and at 256 samples. The glass is now a facing ramp with a clear coat.
  • Daylight through the back (inspection-only). A butt seam between back boards showed as a bright line in a close-up. The boards are now lapped 2 mm, and every other board steps 1.5 mm forward so the lap is not a coplanar pair.
  • Other inspection-only changes: an arched crest replaced a flat slab, the label ink was thinned from a birch-bark hatch to ruled handwriting, and the bake dropped to 512 px (≈15 px per UV cell) to save about 2.5 s of smoke time.

Visual gates

Contact sheet: docs/gallery/contact-sheets/apothecary-shelf-contact-sheet.webp

criterion apothecary-shelf calibration verdict
mean luminance 0.2450 0.151–0.302 in band
stage darkness 0.2021 0.145–0.236 in band
wedge warmth +0.162 −0.43 … +0.37 warm pool visible behind the right side
saturation 0.2485 0.144–0.231 0.018 above the three tiles; inside the shipped showcase range (hay-bale 0.234, wall-torch 0.266). The colour is the glass and glaze, and the spec asks for a saturated hero.
subject fill 0.889 tall 0.70–0.90 passes the framing gate, min margin 0.022
thumbnail legibility — — a shelf of bottles and jars over drawers reads at tile size

Asset sheet: docs/gallery/asset-sheets/apothecary-shelf.webp. The four reference panels were re-rendered with the current harness, because the stored panels predate the camera-fit fix. Verdict: passes.

  • Alone under neutral light, it shows jointed casework, an arched crest, drawers with knobs, and five distinct vessel forms with corks, lids and labels.
  • It sits with the hydrant and jerry can, above the rocket and arm.

inspection-only

Close-ups (lit and clay: bottom shelf, necks, drawers, crest, dado, back, label): corks sit in the mouths, lids overhang their rims, and knobs are seated. There is no z-fight speckle. After the lap fix, no daylight shows through the back. inspection-only

The hero was rendered on 5.2.1 through scripts/render_hero.py, and build_gallery.py was run last. I read the generated <img alt> and the witnesses callout in docs/gallery/index.html and docs/gallery/apothecary-shelf/index.html. inspection-only

🤖 Generated with Claude Code

The apothecary shelf was the first unclaimed showcase candidate. What an
envelope check cannot see on a stocked shelf is whether each vessel fits
under the shelf above: a flask too tall still stands on its shelf, the
shelf above is still in its dado, and the bounding box does not move.
The piece reads every vessel's top and the underside of the member above
it off the mesh and asserts a 20 mm headroom floor; --tall-flask exits 20
at -5.5 mm while every seat, joint and the envelope still pass.

Also asserts dado bites into both sides, cork, lid and knob bites,
vessel, drawer and label seats, zero vessel overlaps, form spread and
chamfered wood, each with a falsifier proven 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>
@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 showcase Budget-conformance props under showcase/ documentation Improvements or additions to documentation labels Sep 25, 2026
@TMHSDigital
TMHSDigital merged commit d8765fb into main Sep 25, 2026
14 checks passed
@TMHSDigital
TMHSDigital deleted the feat/showcase-apothecary-shelf branch September 25, 2026 21:57
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 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. showcase Budget-conformance props under showcase/

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant