Skip to content

fix: chopping-block, gn-socket-rename and gn-bundle-roundtrip quality pass - #207

Merged
TMHSDigital merged 5 commits into
mainfrom
quality-pass/chopping-block-socket-rename-bundle
Sep 22, 2026
Merged

TMHSDigital merged 5 commits into
mainfrom
quality-pass/chopping-block-socket-rename-bundle

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Quality pass over three items, one per track:

  1. showcase/chopping-block — Track A. First visual pass; the previous run's queue ranked it "take first".
  2. examples/gn-socket-rename — Track B. The weakest hero in a thumbnail grid of all 51 gallery examples: a matte orange bar on a slab.
  3. examples/gn-bundle-roundtrip — Track C. Queued for re-verification of its min_version 5.0 floor.

Plus one showcase/README.md conventions commit and one gallery regeneration commit.

Binaries (exact self-reported versions): .scratch/blender-4.5.11-windows-x64 4.5.11 LTS, .scratch/blender-5.0.1-windows-x64 5.0.1 (downloaded this run for the Track C floor), .scratch/blender-5.1.2-windows-x64 5.1.2, .scratch/blender-5.2.1-windows-x64 5.2.1 LTS.


1. showcase/chopping-block — Track A

The inspection sheet was rendered on 5.2.1 into .scratch/ (untracked) and every image was opened and looked at: six flat-lit orthos, two material three-quarter views, clay, wireframe overlay, nine joint close-ups (axe eye, bit bury, haft shoulder/waist/knob, hoop, top grain, log base, and later the lap rivets) and ground contact. It took two rounds of fixes after the round-0 baseline.

Defects, and the view that revealed each

  1. The bark read as coopered staves. The log side was 36 flat-shaded vertical facets of equal width in one flat colour, so the block read as a tub or bucket. Revealed by the front/back/left/right orthos, both three-quarters and the clay pass.
  2. The iron hoop showed piano-key faceting. Its outer face was flat-shaded, so each facet threw its own highlight as alternating white and black plates. Revealed by the ground-contact and hoop close-ups.
  3. The hoop read as a painted stripe, not a forged hoop. Constant section, no lap, no rivets. Revealed by both three-quarters.
  4. The end grain rendered as a sunburst. A 36-triangle fan into one hub, flat-shaded at dish slopes; no growth rings, and the drying checks only showed as faint facets. Revealed by the top ortho and the wireframe, where the Wireframe modifier spikes at the hub.
  5. A pale ring ran round the base. The bottom chamfer carried the end-grain material, so it read as the foot of a tub. Revealed by the log-base close-up and ground contact.
  6. The haft was a round 12-gon dowel. It read as a broom handle. Revealed by the front and left orthos (same width in both) and the haft-waist close-up.
  7. The knob was a pencil stub. It tapered from 22.5 to 12.4 mm into a flat 12-gon end. Revealed by the haft-knob close-up.
  8. The haft shared the bark's material slot. That made the hickory handle the darkest wood on the piece. Found in the code, confirmed in the material views.
  9. All three materials were flat single colours with constant roughness. Visible in every material view.
  10. Found in round 1: the iron's blotch noise was too coarse and contrasty and read as marbling, and the bark streaks at an 11:1 stretch read as planed timber. Revealed by the round-1 joint close-ups and the hero crop.
  11. Found while locking budgets: radially aimed rivets seated 1.87 and 2.82 mm against a 1.5 mm design bite, one edge sunk and the other lifted. The log's wobble drops the hoop surface 1.4 mm across a single 12 mm head. Revealed by a per-vertex seat probe.

Fixes in the generator, and why each is structural

  • Defects 1, 2 and 4: shading is decided per part. Only the axe head, a chamfered forging whose facets are its form, stays flat. The log and hoop are smooth-shaded, and every material boundary is a hard edge. The surface detail moved into the materials: vertical bark furrows with a bump, growth rings about an off-centre pith, and radial checks drawn at the same TOP_CRACKS angles the geometry notches. These are the same constants, so they cannot drift apart.
  • Defect 3: the hoop is a lapped strip. lap_thickness(u) is a piecewise function of angle: a step up, a flat lap, then a taper-out. band_angles() adds a band section at every kink and at every rivet station, so the lap follows the log whatever its radius function does.
  • Defect 11: rivets are placed from band_outer_radius, aimed down the hoop's surface normal. The normal is differentiated from that same function, not taken as the radial. Measured seats are now 1.50 and 1.54 mm.
  • Defect 5: the bottom chamfer row is assigned to bark.
  • Defects 6 and 7: haft_rings sweeps an oval section (1.35 wide over thick, long axis in the swing plane) plus a smoothstep hook toward the bit over the last fifth. The knob holds its width to within 2 mm of the butt before rounding off.
  • Defect 8: the haft gets a fourth material slot (HAFT_IDX) with its own face floor.
  • Defects 9 and 10: procedural materials for bark, end grain, iron and hickory. Mix and Map Range sockets are looked up by enabled name, because their identifiers changed in 5.2.
  • Incidental fix: the temp glTF is deleted after it is measured. It was leaking into the working directory, which is the repo root under CI.

New hygiene budgets, measured identically on 4.5.11 / 5.1.2 / 5.2.1

Budget Exit Declared Measured
Rivet seat into the hoop, each rivet (radial, per vertex, against the mesh) 18 0.0008–0.0025 m 0.00150, 0.00154
Rivet dome proud of the hoop, each rivet 18 ≥ 0.0025 m 0.00419, 0.00432
Haft section, wide over thick at the grip station 19 1.25–1.60 1.3500
Shell count (was 4) 17 exactly 6 6
Haft material face floor 5 ≥ 150 176

All existing hygiene budgets are still 0 on all three binaries: non-manifold, loose geometry, doubles, zero-area faces, n-gons, coplanar cross-shell pairs, zmin, plumb.

Exit codes, default and every falsifier (4.5.11 / 5.1.2 / 5.2.1)

Flag Target budget Before After
(none) — 0 / 0 / 0 0 / 0 / 0
--skip-decimate LOD1 ratio 9 / 9 / 9 9 / 9 / 9
--stray-vert loose verts 15 / 15 / 15 15 / 15 / 15
--lift-z zmin 16 / 16 / 16 16 / 16 / 16
--fat-haft eye clearance 17 / 17 / 17 17 / 17 / 17
--round-band hoop bite 18 / 18 / 18 18 / 18 / 18
--float-rivets (new) rivet seat: −0.00152 m — 18 / 18 / 18
--round-haft (new) haft section: 1.0000 — 19 / 19 / 19

tests/check_falsifier_targets.py --run (5.2.1, --only chopping-block) confirms all seven declared targets.

One falsifier collision was fixed on the falsifier side. Once the haft became oval, --fat-haft's ×1.85 also scaled the swing-plane width, and the knob grew 16 mm past the AABB, so it exited 8 on all three binaries. It now thickens across the cheeks only, the axis the eye clearance measures, and exits 17 with the identical clearance as before (0.00057 m). No band was widened.

Triangles and determinism

Base triangles went from 1472 to 1800. LOD1/LOD2 went from 736/322 to 900/396. The collider went from 434 to 538 triangles (ceiling 470 → 560); for the record, excluding the rivets from the collider source saved only 4. These were re-fitted to the measurements: triangle band 1730–1870 (± 4 %), AABB (0.526, 0.526, 1.006). Two default runs on each binary print identical measurements, and all three binaries agree on every gated axis. Export bytes differ by 16 B on 5.2.1, which is not gated.

Hero

Re-rendered on 5.2.1. check_framing passes with no deviation=: fill y 0.794, margins ≥ 0.072. It reads at a glance as a log round with bark, growth rings and checks, a riveted hoop, and an axe standing in it. I'd put it on a landing page. Contact sheet: docs/gallery/contact-sheets/chopping-block-contact-sheet.webp.

Criterion Verdict
Stage darkness unchanged stage; dark fraction 0.036 before and after
Wedge warmth warm pool on the back wall, as the calibration set has
Subject fill 0.794
Saturation 0.134 against 0.150–0.248 for the calibration set; the stage is unchanged and so is the number (0.138 before)
Thumbnail legibility reads as chopping block + axe
Mean luminance 75.5, inside the calibration band (44.5 damped-track-aim … 77.7 bmesh-gear)

No asset sheet: following #205/#206, no showcase piece has one yet, and the backfill for all 28 is #202.


2. examples/gn-socket-rename — Track B

The contract, assertions and exit codes are unchanged. Every change is on the --output render path. The build's material creation and check() are untouched.

What was wrong in the before inspection

The inspection covered the hero angle, clay, a wireframe attempt and three close-ups. The wireframe pass drew no lines, because GN Set Material bypasses object slots; the topology is the two asserted 8-vert cubes, so nothing was hidden.

  • The Random Value axis was invisible. With Random unwired the still looked identical, contrary to VISUAL-STYLE.md: "if the contract failed, the render should visibly break".
  • The column read as matte orange cardboard.
  • The plinth rendered as a black void.
  • The floor right of the column was lifted to mid grey-blue. A probe with each light disabled in turn traced it to the rim light's glossy floor reflection: patch mean 104, 62 with the rim off. The fill made no difference.
  • The column's bottom face is coplanar with the plinth top. That is the contract (zmax = plinth + HEIGHT, exit 8), and the region is hidden under the column, so it stays.

What changed

  • The column shader draws gauge graduations from the evaluated gauge_h attribute: a tick every 0.1 m from each vertical corner, a heavier one every 0.5 m, and only up to the stored height. Proven with a probe that unlinks Random Value from the Store: check() exits 9 and the column renders blank. Both axes are now visible in pixels.
  • Brushed copper, with emission 0.24 so it holds its colour at thumbnail.
  • The plinth is a steel block (metallic 0.8, roughness 0.42).
  • The rim light is cut from 300 W to 120 W.
  • An 18° presentation turn in render_still so two faces show. check() reads object-space vertices, so the turn cannot reach an assertion.
  • check_framing passes on 5.2.1 (fill y 0.756). The render path also runs clean on 4.5.11 and 5.1.2.
  • Contact sheet: docs/gallery/contact-sheets/gn-socket-rename-contact-sheet.webp. Mean luminance is 67.8 (73.1 before), inside the band; dark fraction 0.188.

Exit codes, before and after (4.5.11 / 5.1.2 / 5.2.1)

Flag Before After
(none) 0 / 0 / 0 0 / 0 / 0
--legacy-ids 0 / 0 / 5 0 / 0 / 5

The measured check line is identical on every binary: 16 verts / 12 faces, zmax 1.940000, gauge_h hi = 8 / lo = 8.


3. examples/gn-bundle-roundtrip — Track C

Re-verification

Probed on 4.5.11, 5.0.1, 5.1.2 and 5.2.1. Every behaviour claim in the README holds; one was stated too narrowly.

  • 4.5.11: use_bundle_and_closure_nodes exists and reads False. GeometryNodeCombineBundle can be created with the flag off, and a Combine → Separate of a cube evaluates to 0/0 off and 8/6 on. NodeCombineBundle is undefined.
  • 5.0.1 / 5.1.2 / 5.2.1: GeometryNodeCombineBundle is undefined, NodeCombineBundle exists, and the flag is gone. The README said "undefined on 5.2"; it is undefined on all of 5.x.
  • The 5.0 floor is correct: the example passes on 5.0.1 and every falsifier lands its code there.

Improvements

  • Exit 5 had no falsifier. Nothing could make the Float-item check fail. The new --mismatch-mark renames only Separate's Float item, so count and bbox pass and bundle_mark reads 0.0: exit 5 on 5.0.1, 5.1.2 and 5.2.1. This adds a falsifier only; the assertions and exit codes are unchanged.
  • The README now opens with a per-version RNA table aimed at someone hitting the "undefined" error while porting. It documents --force-run on 4.5 as exit 1 (it was listed under exit 3) and carries the full measured exit-code grid across the four binaries.
  • Doc links added and checked (all HTTP 200): current/…NodeCombineBundle, current/…NodeSeparateBundle, 4.5/…GeometryNodeCombineBundle, 4.5/…PreferencesExperimental.
Flag 4.5.11 5.0.1 5.1.2 5.2.1
(none) 77 0 0 0
--force-run 1 0 0 0
--bypass 77 4 4 4
--legacy-rna 77 2 2 2
--mismatch 77 3 3 3
--mismatch-mark (new) 77 5 5 5
--pack-scale 1 77 4 4 4

Before this change, every row except --mismatch-mark matched this table on 4.5.11 / 5.1.2 / 5.2.1.


4. showcase/README.md conventions

Four conventions now apply to every future piece:

  • Equal facets on an organic or turned body read as staves: smooth it and carry the surface in the material, with hard edges at material boundaries.
  • One substance, one material slot.
  • Fasteners are aimed down the host's surface normal and seated by a radial band (--float-rivets, exit 18).
  • A cross-section that carries the read is a ratio budget (--round-haft, exit 19).

It also records that a thickening falsifier scales only the axis its budget measures.

5. Gallery regeneration

Output of python scripts/build_gallery.py. It also refreshes the cart and stone-well detail pages, which were not regenerated after #206. The generated card alts and witness callouts for chopping-block and gn-socket-rename were read in the HTML.

Proven by live run vs. inspection

  • Live run: every exit code and measurement above; determinism (two runs per binary); the Random-unwired render; the 4.5 / 5.0 / 5.1 / 5.2 RNA probes; framing gates; the static and runtime falsifier-target checks; check_exit_code_readme.py and check_engine_id.py pass.
  • Inspection only: the visual verdicts, and the contact-sheet criteria other than luminance, dark fraction and saturation.

🤖 Generated with Claude Code

TMHSDigital and others added 5 commits September 22, 2026 18:38
…ts and section budgets

Adds four conventions from the chopping-block quality pass: equal facets on an organic or turned body read as staves, so smooth it and carry the surface in the material; one substance per material slot; fasteners aimed down the host's surface normal with a radial seat band (--float-rivets, exit 18); a recognisable cross-section asserted as a ratio band (--round-haft, exit 19). Also records that a thickening falsifier scales only the axis its budget measures.

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

The log read as a tub: flat-shaded equal facets made staves, the hoop was a flat-shaded stripe with piano-key highlights, the end grain was a triangle-fan sunburst, a pale ring ran round the base, and the haft was a round dowel with a pencil-stub knob in the bark's material. The generator now smooth-shades the log and hoop and carries bark furrows, growth rings and drying checks in the materials, keeps bark down to the ground, builds the hoop as a lapped strip with two rivets aimed down the host normal, and sweeps an oval haft that hooks at the knob in its own material slot. New budgets: rivet seat band and proud minimum (exit 18, --float-rivets) and haft section ratio (exit 19, --round-haft). --fat-haft now thickens across the cheeks only so it still fails on eye clearance. Triangle band, AABB and collider ceiling re-fitted to the new measurements. The temp glTF is removed after measuring.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Presentation only; the contract, assertions and exit codes are unchanged. The column shader now draws gauge graduations from the evaluated POINT gauge_h attribute, so an unwired Random Value renders a blank column where before the still looked identical either way. Brushed copper with engraved ticks from each corner, a steel plinth that no longer mirrors the dark stage into a void, the rim light cut so its floor reflection stops lifting the stage, and an 18 degree presentation turn so two faces show.

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

Exit 5 had no falsifier. --mismatch-mark renames only Separate's Float item, so count and bbox pass and bundle_mark reads 0.0, exit 5. The README now states the RNA per version as a table, re-verified by probe on 4.5.11, 5.0.1, 5.1.2 and 5.2.1: GeometryNodeCombineBundle is undefined on all of 5.x, not only 5.2; on 4.5 it exists with the experimental flag off and evaluates empty. --force-run on 4.5 is documented as exit 1, not under exit 3. 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>
… pages

Output of scripts/build_gallery.py. The cart and stone-well detail pages were not regenerated after #206 changed their scripts and READMEs.

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 22, 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 22, 2026
@TMHSDigital
TMHSDigital merged commit 4d7468f into main Sep 22, 2026
13 checks passed
@TMHSDigital
TMHSDigital deleted the quality-pass/chopping-block-socket-rename-bundle branch September 22, 2026 22:45
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