Skip to content

fix: cart, grindstone and attribute-domain-shear quality pass - #242

Merged
TMHSDigital merged 4 commits into
mainfrom
fix/cart-grindstone-attribute-domain-shear-quality-pass
Sep 24, 2026
Merged

TMHSDigital merged 4 commits into
mainfrom
fix/cart-grindstone-attribute-domain-shear-quality-pass

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Quality pass on two showcase pieces (Track A) and one gallery example (Track B). All numbers below come from live runs on the local binaries .scratch/blender-4.5.11-windows-x64 (reports Blender 4.5.11 LTS), blender-5.1.2-windows-x64 (Blender 5.1.2) and blender-5.2.1-windows-x64 (Blender 5.2.1 LTS). Hero stills were rendered on 5.2.1 through scripts/render_hero.py, and the framing gate passed without deviation=. Inspection sheets were rendered to .scratch/ and not committed.

Picks: cart and grindstone are the last two showcase pieces without a quality pass in this series. attribute-domain-shear is an unreviewed gallery example. All eight check-only examples already had Track C passes, so there is no Track C item this run.

Track A: cart

Defects (inspection round 0: six orthos, two 3/4 views, clay, wire, 14 joint close-ups, ground contact):

  1. Shaft tips hovered 0.30 m above the floor, with the centre of mass ahead of the axle, so the cart would tip. Seen in the front and back orthos and the ground-contact shot.
  2. Slat ends stuck out under the front board and tailgate as a row of teeth. The walls hung outside the planks at mid-thickness. Seen in the bed_front_shaft joint and the old hero.
  3. The shafts only reached 6 mm into the bed's underside, through a small iron plate. Seen in bed_front_shaft and the front ortho.
  4. The forward bolster was a crosspiece under the bed with nothing under it. Seen in the front ortho.
  5. The hub was a 46 mm disc, not a nave, so it read as a toy wheel. Seen in hub_m and the bottom ortho.
  6. The felloe was 24 mm deep and read as a bent strip. Seen in the tyre close-ups.
  7. The four floor tie plates read as stray blocks. Seen in both 3/4 views.
  8. The walls were single slabs. Seen in the 3/4 views.
  9. Every edge was razor sharp, and the wheels had no chamfer at all. Seen in the clay pass.
  10. The tyre was flat-shaded and threw one highlight per facet. Seen in tyre_top_*.
  11. The wood was one flat tone and the iron rendered as polished steel. Seen in 3/4 a/b.
  12. The stage was 14 m.
  13. Found in round 1: a black staircase on the side wall in the hero. The 0.08 m bake cage reached past the 74 mm wall-to-wheel gap and baked the high-poly felloe onto the board. Raising the bake to 1024 px made it sharper, which is how I isolated the cause.
  14. Found in round 1: sandpaper speckle from a 256 px bake, about 4 px per UV cell.

Generator changes, and why each is structural rather than a nudge: chassis_levels() stacks every level from the axle with named bites (AXLE_BITE, RAIL_BITE, FLOOR_BITE, WALL_SEAT), so a changed wheel radius moves the whole bed. The rails run under the full bed and continue as the shafts, with a pull bar through their tips. Two prop legs tenon LEG_BITE into the rails (1, 3, 4). The walls are stacked boards standing on the floor, inset WALL_INSET from its edge. The end boards are recessed and seated, split and topped differently, so no face lands on a side board's plane (2, 8). The nave is a 130 mm lathe with iron bands and washers (5). The felloe is 40 mm deep, derived from a fixed tread radius (6). The tie plates became L-section corner straps built from the wall's corner (7). Chamfer passes select every wood and iron edge over 50°, and caps are n-gons triangulated after the bevel (9). Shading is smooth, hard at chamfers and material boundaries (10). Wood tone and grain are per shell, the iron is rusted, and the stage is 60 m (11, 12). The cage is 0.01 m and the bake is 1024 px (13, 14).

New budgets (identical on 4.5.11 / 5.1.2 / 5.2.1):

Budget Declared Measured
Named supports incl. 2 prop legs (16) each zmin ≤ 1e-4 tyres 0, legs 0
Wall boards (17) 2 per side, seams 1.5–5 mm (2,2), 3.0 mm
One BVH-contact assembly (18) 1 component 1 of 59 shells
Edge treatment (20) right-angle edges 0 0 / 0
Bake texels (21) ≥ 12 px per cell 17.45
Hygiene, coplanar, tyre seat, mirror unchanged all 0 / [4.0, 4.0] mm / 0 mm

The re-declared envelope is 1.580 × 0.842 × 0.640 m. Triangles went from 2856 to 5284, with the band re-centred at 5160–5410. The collider is 192 against a ceiling of 360.

Exit codes, identical on all three binaries: default 0. --skip-decimate 9, --flush-tyre 15 (144 pairs), --lift-z 16, --float-wheel 16, --short-props 16, --wide-seams 17, --sink-tyre 18, --lift-bed 18 (2 components), --skew-wheel 19, --sharp-bar 20 (24 edges), --low-bake 21 (4.36 px). My first edge falsifier skipped the whole iron pass. It exited 4, because 1200 fewer triangles tripped the triangle floor, so I replaced it with --sharp-bar, which squares only the pull bar's rims. Inspection rounds: 2, plus the hero-driven bake fix.

Track A: grindstone

Defects (round 0):

  1. The iron shoes were exactly the sill's width and flush with its end, so they shared three planes with every sill, seen as a lit slit in the foot_m / foot_p close-ups. The old z-fight budget matched only faces whose centres fell within 0.1 mm of each other, so it reported 0.
  2. The trough floated 6 mm above the end stretchers: a dark slit in stretcher.
  3. A tenon box inside every shoe was fully hidden, costing triangles nobody sees. Seen in the wire view.
  4. Every timber edge except the trough's was razor sharp. Seen in the clay pass.
  5. The stone was a flat-shaded 32-gon, a polygon in the front ortho with one highlight per facet on the tread.
  6. The stone rendered chalk-white and plastic. Seen in the hero and 3/4 views.
  7. The wood was one tone and the iron was black plastic. Seen in 3/4 a/b.
  8. Found in round 1: both diagonals of each A-frame met at one apex, and their chamfered end faces formed 6 coplanar pairs inside the bearing block.
  9. The stage was 14 m.

Generator changes: each shoe is a cup built from the sill end plus SHOE_REVEAL. The coplanar budget is now the cross-shell KD-tree version (1). The stretcher top is derived from the trough bottom plus TROUGH_BITE, and the stretchers are stationed inboard of the shoes (2). The tenon boxes are removed (3). All wood and iron is chamfered, with n-gon caps triangulated after the bevel (4). The stone is 48 segments, smooth with hard chamfer rings, in a sandstone material with bump and speckle roughness. The baked normal is chained under the bump (5, 6). Wood tone and grain are per member and the iron is rusted (7). Each diagonal ends DIAG_BITE inside the king post's face (8). The stage is 60 m (9).

New budgets: coplanar cross-shell pairs 0 (15). Trough bearing is 2 stretchers biting 2–8 mm; measured [4.0, 4.0] mm (18). Right-angle edges 0 (20). Texels ≥ 12 px, measured 29.44 (21). Material face floors were raised to about 70% of measured (280 / 190 / 260).

Triangles went from 928 to 1668, with the band at 1560–1780. The collider ceiling was re-fitted from 240 to 320, because the 48-segment stone puts more of its rim on the hull (304 measured). The envelope is 0.722 × 0.419 × 0.610 m. The dip is 24.2 mm, because the rim chamfer lowers the trough top; it is within its 15–45 mm band.

Exit codes, identical on all three: default 0. --skip-decimate 9, --stray-vert 15, --flush-shoes 15 (4 pairs), --lift-z 16, --short-legs 16, --float-crank 17, --float-legs 17, --narrow-trough 18, --no-dip 18, --low-stretchers 18 (−5.9 mm bite), --sharp-handle 20 (20 edges), --low-bake 21 (7.36 px). Inspection rounds: 2.

Track B: attribute-domain-shear

Render path only. At ±1.15 the two canopies met tip to tip at x=0, so the pair read as one shape. Each stick was near-black steel that stopped 0.6 m under its hub, holding nothing. The stands are now at ±1.36 with a 44 mm lens. The stick runs from the floor into the hub, with both ends derived from the stand's tilt, in a wooden-dowel material. The umbrella shape is build_fan, the checked mesh, and was left alone.

Contract unchanged: check(), the assertions and the exit codes are untouched. Before and after, on 4.5.11, 5.1.2 and 5.2.1: default 0, --no-overwrite 5. The measured shear is 0.751031 on every run. Framing: fill x 0.850, minimum margin 0.075.

Contact sheets

Mean luma against the pinned calibration set (0.151–0.305): cart 0.182, grindstone 0.180, attribute-domain-shear 0.265. Stage darkness is in family, the wedge is warm on both showcase pieces, the subject fills the frame, and saturation is 0.19 / 0.12 / 0.17. All three are legible at thumbnail size.

Checks run locally

tests/check_falsifier_targets.py (223 falsifiers, 28 pieces), check_exit_code_readme.py, check_gallery_images.py, check_engine_id.py and check_import_export_rules.py all pass. I read the generated alt text in docs/gallery/index.html and in each detail page.

Established by inspection only: I checked determinism by repeating the default run on 5.2.1 (5284 / 1668 triangles and identical measurements on every run), not by a byte diff of the mesh.

🤖 Generated with Claude Code

TMHSDigital and others added 4 commits September 24, 2026 18:34
…legs

The shaft tips hovered 0.30 m off the floor with the centre of mass ahead
of the axle, slat ends poked out under the front board as a row of teeth,
the hub was a 46 mm disc and every edge was razor sharp. The chassis is
now stacked from the axle by named bites (bolster, rails that run on as
shafts, floor, board walls), two prop legs stand it level, and the wheels
get long banded naves. New budgets: prop legs as named supports (16), wall
board seams (17), one BVH-contact assembly (18), edge treatment (20) and
bake texel density (21), each with a falsifier. A 0.08 m bake cage was
baking the wheel rim onto the side wall; it is 0.01 m now.

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

Iron shoes exactly as wide as the sill shared three planes with it, which a
centre-coincidence z-fight test never saw; the trough hovered 6 mm over
its stretchers; both diagonals met at one apex; only the trough was
chamfered and the stone was a flat-shaded chalk-white 32-gon. Shoes are
now cups with a 6 mm reveal, the coplanar budget is cross-shell, the
stretchers carry the trough (bite asserted, exit 18), diagonals tenon into
the king post, every edge is chamfered (exit 20), and the stone is 48
smooth segments in a sandstone material with a texel-floored bake (21).

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

Render path only. The two canopies met tip to tip at the centre of the
frame, and each dark steel stick stopped 0.6 m under its hub. The stands
now sit 2.72 m apart and a wooden stick runs from the floor into each hub.
Check, assertions and exit codes unchanged.

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

Also refreshes the gallery cards and alts for the rebuilt cart and
grindstone.

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 24, 2026
@github-actions github-actions Bot added examples Runnable smoke-gated examples under examples/ showcase Budget-conformance props under showcase/ documentation Improvements or additions to documentation labels Sep 24, 2026
@TMHSDigital
TMHSDigital merged commit d1caf5b into main Sep 24, 2026
13 checks passed
@TMHSDigital
TMHSDigital deleted the fix/cart-grindstone-attribute-domain-shear-quality-pass branch September 24, 2026 22:41
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. showcase Budget-conformance props under showcase/

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant