Skip to content

fix(showcase): rebuild chopping-block as a log round with a felling axe - #173

Merged
TMHSDigital merged 2 commits into
mainfrom
fix/showcase-chopping-block-quality
Sep 16, 2026
Merged

TMHSDigital merged 2 commits into
mainfrom
fix/showcase-chopping-block-quality

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Summary

A showcase visual quality pass on chopping-block. It was picked because it
and wheelbarrow were the two worst silhouettes among the eleven pieces that
have never had a pass, and of those two it was the only one whose hero did not
read as any recognisable object: a tapered pail with a grey lump on the lid.

Every budget it declared was green throughout. The budgets could not see a
single one of the eleven defects below, which is the point of the pass.

Three inspection rounds. Renders stayed in .scratch/ and are not committed.

Defects found (Step 3)

# Part Defect View that revealed it
1 Stump Truncated cone, wider at the base, tapering inward toward the top. Reads as a bucket or butter churn, not a block. Front/left ortho, clay 3/4
2 Stump 1:1 diameter-to-height. Even once the taper was gone it read as a canister; a chopping block is a wide squat round. Clay 3/4 (round 2)
3 Top disc Raised as a separate plate with a shadow gap under its rim, giving a lid seam. Front ortho, top-joint close-up
4 Top disc Flat, featureless pale disc. No dish, no scarring, no drying checks. Top ortho
5 Axe head Four flat plates with visible daylight between them, stair-stepped in silhouette. Reads as debris, not a tool. Bit-to-block close-up, 3/4
6 Axe head Does not enter the wood. It balances on the top face, touching at one corner. Bit-to-block close-up, front ortho
7 Axe head Undersized against the block: a trowel, then a paddle, depending on the round. 3/4 views, rounds 1 and 2
8 Haft Untapered 10-sided cylinder with a wide pommel stub. Reads as a bead-chain dowel. Wireframe 3/4, head-to-haft close-up
9 Hoop 14-gon torus on a round host: alternately pokes proud of the surface and sinks into it, with hard bright/dark banding and polygon corners through the wood. Hoop close-ups, both sides
10 Hoop Positioned just under the rim, reinforcing the lid-and-clamp read. 3/4 views
11 Kerf mark A stray rounded bar resting on the top face. Reads as loose debris. Top ortho, bit close-up

Two more surfaced from the audits once the rebuild was underway and are fixed
in the same pass: a bmesh.ops.bevel on the head produced 16 non-manifold
edges, 2 doubles and 53 coplanar face pairs; and the hoop seat check reported a
clean fit on a hoop that visibly gapped.

Fixes, and why each is structural

Stump (1, 2). Replaced the cone with a loft whose radius is a closed-form
function of angle and height — three wobble harmonics with a height-dependent
twist. The hoop profile, the rim scale and the drying checks are all evaluated
from that same function, so they stay seated when a dimension changes. The
proportion moved to 0.535 m across by 0.360 m tall and is now asserted against
the README's stated size.

Top (3, 4). The top is a ring stack, not a single fan, so the sawn face can
carry a dish, hack scarring and three radial checks. The disc is no longer a
separate plate; the rim is chipped by an angular scale function so there is no
clean horizontal seam to read as a lid.

Axe head (5, 6, 7). One lofted shell from poll to bit. Its chamfers are
modelled into the section profile rather than bevelled on afterwards —
bevelling a four-sided loft with a thin bit is what produced the 16 boundary
edges, so removing the operator is the fix, not tuning its offset. The head is
sized off the block (roughly half the block diameter) rather than off an
absolute idea of an axe, and bury depth is asserted rather than positioned.

Haft (8). Swept along a quadratic Bézier through the eye with a
shoulder-waist-swell radius profile. It passes through the head rather than
being pushed against it, and the joint is asserted three ways.

Hoop (9, 10). Generated from the log's own radius function, so it conforms
to an out-of-round host by construction. Moved to stump height.

Kerf (11). Deleted. The wobble supplies the variation it was there for.

Shading. The log is flat-shaded. Smoothed, a wobbled 36-gon is a
featureless drum and rounds 1 and 2 both failed on this alone — the geometry
was already correct and invisible.

New hygiene budgets

Recomputed from the generated mesh. Identical on all three binaries.

Budget Declared 4.5.11 / 5.1.2 / 5.2.1
Non-manifold edges 0 0
Loose verts / edges 0 / 0 0 / 0
Doubles at 1e-5 0 0
Zero-area faces 0 0
N-gons 0 0
Coplanar disjoint face pairs 0 0
Grounded zmin within 1e-5 of 0 0.0000
Log plumb ≤ 2e-4 0.0000000
Log size 0.535 × 0.360 m ± 0.03 / ± 0.02 0.5464 × 0.3600
Shell count exactly 4 4
Haft clearance in the eye ≥ 0.006 m 0.01800
Haft engagement through the eye ≥ 0.020 m 0.08049
Haft breakout margin ≥ 0.006 m 0.02351
Bit bury below the sawn top ≥ 0.030 m 0.07871
Bit inset from the rim ≥ 0.030 m 0.14647
Hoop bite, every segment 0.002–0.007 m 0.00371–0.00400
Haft clearance above the log ≥ 0.015 m, 0 verts inside 0.07858, 0

The hoop bite is binned per angular segment against the log's own radius at
each vertex's own angle. A single global midpoint radius classifies outer
chamfer vertices as inner ones on an out-of-round host, which is exactly how a
visibly gapping hoop passed before.

Coplanar pairs are counted over faces that share no vertex. Counting fan-cap
triangles, which are coplanar and close-centred by construction, makes the
budget unsatisfiable rather than meaningful.

Exit codes, all three binaries

Invocation Budget violated 4.5.11 5.1.2 5.2.1
default 0 0 0
--skip-decimate LOD1 ratio band 9 9 9
--stray-vert loose vertex count is 0 15 15 15
--lift-z bounding box zmin is 0 16 16 16
--fat-haft haft clearance in the eye 17 17 17
--round-band hoop bite band 18 18 18

--fat-haft measured 0.00057 against the 0.006 minimum. --round-band
measured a 0.00000–0.01720 bite against the 0.002–0.007 band: it floats clean
off the wood at the narrow angles and sinks 17 mm at the wide ones, which is
the original defect reproduced exactly.

Triangle counts

Before 2016, after 1472, on all three binaries. The drop is not hidden-face
removal — the head lost its bevel and gained modelled chamfers, which is a net
saving, and the deleted kerf bar took its faces with it. The log gained
segments and the top gained rings. Collider 188 → 434, a real increase: the
convex hull of a 36-gon out-of-round log with an axe through it is genuinely
larger than the hull of a 20-gon cone. LOD ratios agree exactly across all
three series here; the gate is still a band.

Materials went from 2 to 3. The sawn end grain is its own material because a
log round's cut face is much paler than its bark, and that contrast is what
makes the silhouette read. Face floors are asserted per material.

Convention changes

showcase/README.md gains seat conformance (exit 18), plumb and real-world
size (exit 19), coplanar pairs in the hygiene family, the reservation of
15–19 across pieces, and a note that shading is part of the model.

Rounds

Three. Round 1 fixed topology and the four-plate head but left a canister.
Round 2 fixed proportions and added cracks but the log was still smooth-shaded
so none of it read. Round 3 flat-shaded the log, scaled the head to the block,
and widened the haft profile.

Evidence

Proven by live run on 4.5.11, 5.1.2 and 5.2.1 (.scratch/ binaries, versions
confirmed from the binaries themselves): all measured values above, all six
exit codes, the smoke harness [PASS], and the framing gate on the re-rendered
hero.

Established by inspection only: the generated docs/gallery/ HTML was read
directly rather than trusted from gallery.json — card alt is capped at 160
characters with an ellipsis and is not truncated at a dotted path, and the
detail-page callout carries the full witnesses text. The previous entry
contained mojibake (× for ×) which is now plain ASCII.

TMHSDigital and others added 2 commits September 16, 2026 05:48
The chopping-block pass found three defect classes the existing
conventions did not cover, and each one had already shipped past a green
check on at least one piece.

A hoop generated as a circle on an out-of-round host gaps on one side and
sinks on the other, but a seat check that compares against a single
global midpoint radius classifies the outer chamfer vertices as inner
ones and reports a clean fit. Seat depth has to be banded and sampled per
angular segment against the host's own radius function.

A prop with an appendage has an outer AABB that is the appendage, so the
body underneath can drift to any size while the AABB budget stays green.
Plumb measured off the exact zmin and zmax rings is meaningless once a rim
is notched, because those rings are a handful of vertices.

Coplanar face pairs belong in the hygiene family, counted over faces that
share no vertex; counting fan-cap triangles makes the budget
unsatisfiable rather than meaningful.

Shading is not measurable, which is why it needs saying: smoothing a
wobbled 36-gon erases every bit of surface modelling in it.

Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The piece passed every budget it declared and still read as a tapered
pail with a hammer balanced on the lid. Eleven defects came out of the
inspection sheet; the budgets could not see any of them.

The stump was a truncated cone wider at the base, so the silhouette was a
bucket. It is now an out-of-round loft whose radius is a closed-form
function of angle and height, with real log-round proportions: 0.535 m
across by 0.360 m tall, where it was 1:1 and read as a canister no amount
of surface detail could rescue.

The axe head was four flat plates with visible daylight between them,
built from stacked boxes and resting on the top face without entering it.
It is one lofted shell from poll to bit, buried 78.7 mm below the sawn
face. Its chamfers are modelled into the section profile because
bevelling a four-sided loft left sixteen boundary edges and two doubles at
the bit -- the chamfer is now structural rather than an operator applied
to geometry that cannot take it.

The hoop was a 14-gon torus that alternately poked through the wood and
floated off it. It is generated from the log's own radius function, so it
seats uniformly by construction, and it moved from under the rim, where
it read as a lid clamp, down to stump height.

The log is flat-shaded. Smoothed, its wobble and the drying checks in the
end grain were invisible and the whole point of the surface modelling was
lost.

Every defect that can be measured is now an assertion recomputed from the
generated mesh: hygiene at exit 15, grounded at 16, four-shell axe joint
fit at 17, hoop seat band and haft clearance at 18, plumb and stated size
at 19. Five falsifiers prove them, each against a named budget.

Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.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 16, 2026
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 16, 2026
@TMHSDigital
TMHSDigital merged commit bb29acc into main Sep 16, 2026
13 checks passed
@TMHSDigital
TMHSDigital deleted the fix/showcase-chopping-block-quality branch September 16, 2026 10:02
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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant