Skip to content

fix: street-lantern, watchtower, parent-inverse-orrery and ngon-triangulate quality pass - #239

Merged
TMHSDigital merged 5 commits into
mainfrom
fix/quality-pass-street-lantern-watchtower
Sep 24, 2026
Merged

TMHSDigital merged 5 commits into
mainfrom
fix/quality-pass-street-lantern-watchtower

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Quality pass: four items, one per track plus a second showcase piece. Everything below comes from live runs on .scratch/blender-{4.5.11,5.1.2,5.2.1}-windows-x64/blender.exe, which report 4.5.11 LTS / 5.1.2 / 5.2.1 LTS, unless it is labelled inspection. Baselines were taken on the pristine tree before any edit.

(The prompt asks for "four or five pieces" in its intro and "two or three items" in Step 2. This run takes four.)

Picks. No showcase piece is unreviewed, so Track A took the two whose earlier pass had aged worst: street-lantern and watchtower both still had the 14 m stage, set-ordered bevel input, flat materials, and a leaked temp .glb (157 of them had piled up in %TEMP% from local runs). Track B: parent-inverse-orrery, never reviewed and outside both pinned reference sets. Track C: ngon-triangulate, the only check-only example never reviewed.

A — showcase/street-lantern

Took 2 inspection rounds.

Defects

  1. The knee brace read as a loose stick (ortho_left, ortho_right, joint_arm_post, joint_brace). Its post end was centred 0.35 × BRACE_T outside the post, and its arm end sat under the arm. One bevelled corner grazed each host: −0.0059 m into the post, 0.0000 m into the arm.
  2. The existing gap budget could not see it. A grazing corner is a BVH gap of zero, so the brace-to-arm check passed, and nothing measured the post end at all.
  3. The brass read as polished gold (0.72, 0.46, 0.14, roughness 0.28) and outshone the lamp (hero).
  4. The wall edge showed in the hero corner (14 m stage). Temp .glb leak. Set-ordered bevel input.

Fixes, and why each is structural

  • 1: the post end now starts half a brace inside the post wall, computed from post_radius_at(z), and the arm end sits at arm_z − 0.35 × ARM_R. Both ends follow their hosts' dimensions instead of an offset.
  • 2: a new signed-distance budget checks that each end is actually inside its host.
  • 3: aged, rougher brass. 4: stage 60 m; export removed after measuring; bevel input sorted by edge index.

New budget, identical on 4.5.11, 5.1.2 and 5.2.1:

Budget Band Measured
Brace bite (exit 20): deepest brace vertex inside the post / inside the arm, signed distance to the host shell ≥ 0.004 m each 0.01305 / 0.01282

It runs last, after plumb, so --rake-post still reports as plumb (19).

Triangles: 3338 → 3338. Same-binary deterministic (three runs of the measured output hash identically).

Falsifier: --shallow-brace restores the first build's ends → 20 on all three binaries (post −0.00593, arm −0.00000).

Existing exit codes, before → after, identical on all three: default 0→0, --skip-decimate 9→9, --stray-vert 15→15, --lift-z 16→16, --float-brace 17→17, --sink-arm 18→18, --rake-post 19→19.

Hero: check_framing without deviation= (fill y 0.711, min margin 0.072). Contact sheet: docs/gallery/contact-sheets/street-lantern-contact-sheet.webp, luma 0.171 (band 0.151–0.305).

A — showcase/watchtower

Took 3 inspection rounds. Round 1 fixed the rails; a full-resolution ortho in round 2 exposed the floating deck, which the downsampled contact tile had hidden.

Defects

  1. Side guardrails ended in the air (ortho_left / ortho_right at full resolution, joint_platform_post). They stopped 0.30 m short of the front posts (−0.246 m of engagement) for a "hatch clearance". The hatch sits at the centre of the front edge, nowhere near them.
  2. The deck floated (ortho_left full resolution, then a dump of the deck-level shells).
    • There were no bearers at deck level.
    • The two joists spanned y −0.326…+0.526, ending in the air 0.19 m short of the front edge and at the back edge.
    • The plank ends at x ±0.53 hung over nothing.
    • The hatch trims ran out to y −0.568, past the front edge.
  3. Flat single-tone timber, flat grey roof, iron that read as chrome (metallic 1.0, roughness 0.30).
  4. The wall edge in the hero corner (14 m stage). Temp .glb leak. Set-ordered bevel input.

Fixes

  • 1: side rails span post to post: the same span and tenon as the back rail.
  • 2:
    • Four deck girts tenon into the posts under the planks, with the same member and section rule as the girts below.
    • The joists run girt centre to girt centre, 2 mm below the girt tops so the faces are not coplanar.
    • The hatch trims end on the front girt.
  • 3: grained per-piece wood, weathered shakes, rusted iron. 4: stage 60 m; export removed; bevel input sorted.

New budgets, identical on all three binaries:

Budget Band Measured
Side-rail engage (exit 17): 4 side rails, each tenoned into the front and the back post ≥ 0.012 m at both ends 0.0180
Deck bearing (exit 17): 4 deck girts; each of 2 joists inside the front and the back girt ≥ 0.012 m at both ends 0.0315

Both count their members, so a dropped rail or girt cannot pass vacuously.

Triangles: 6408 → 6840 (the four deck girts; band 6200–8200). Envelope unchanged (1.594 × 1.594 × 2.973 m). Z-fight pairs 0. Same-binary deterministic (three runs).

Falsifiers, identical on all three binaries:

  • --open-sides restores the old side rails → 17 (−0.2460).
  • --short-joists restores the old joist span with the girts kept, so the triangle floor and envelope cannot steal it → 17 (−0.1625).

Existing exit codes, before → after, identical on all three: default 0→0, --skip-decimate 9→9, --stray-vert 15→15, --lift-z 16→16, --short-shoes 16→16, --short-rails 17→17 (still on the back-rail check), --float-band 18→18, --rake-posts 19→19.

Hero: framing passes (fill y 0.767, min margin 0.083). Contact sheet: docs/gallery/contact-sheets/watchtower-contact-sheet.webp, luma 0.180.

B — examples/parent-inverse-orrery

Checked first: the render path samples no pixels, and the rig the checks measure is not touched.

Presentation changes (render path only):

  • Standard view transform. Under the default AgX the orange sun clipped to a peach-white bulb and read as a lamp. The sun emission also dropped from 3.2 to 1.3.
  • House lighting (shaped key, faint fill, rim, warm wedge) on the dark matte studio floor. The old rig (key 1500 W, fill 500 W, glossy grey floor) put the committed hero at mean luma 0.329, above the calibration band. It is 0.237 now. Stage 60 m.
  • A framing gate the render never had: check_framing, exit 10, which was unused in this example. Falsified with a scratch copy at a 90 mm lens → 10 (fill 1.000, all edges touched).
  • README: staging section and the exit-10 row.

Contract unchanged. Before → after, identical on all three binaries: default 0 → 0, --skip-mpi 6 → 6. Re-run after the final lighting edit.

Framing: passes (fill y 0.828, min margin 0.039). Contact sheet: docs/gallery/contact-sheets/parent-inverse-orrery-contact-sheet.webp, luma 0.237 (was 0.329).

C — examples/ngon-triangulate

Assertion strength: real. It counts the n-gon's loops and faces, requires the tris/quads abort (not merely a raise), and re-counts after the repair. Both falsifiers land on real assertions.

Re-verified live on all three binaries with a scratch probe:

Claim 4.5.11 5.1.2 5.2.1
n-gon + UV map: tris/quads abort, byte-identical text yes yes yes
n-gon, no UV map: UV-map error instead, placeholder "(null)" "" ""
glTF tris, dissolved mesh / plain cube 12 / 12 12 / 12 12 / 12
default / --no-dissolve / --skip-triangulate 0 / 3 / 4 0 / 3 / 4 0 / 3 / 4
Scratch copy with the UV layer removed exit 4 exit 4 exit 4

Every documented claim holds.

README improvements:

  • It now names the error someone would actually hit first. calc_tangents checks for a UV map before face sizes, so a mesh with both problems shows only the UV error, and its placeholder differs by version.
  • States that nothing is version-gated, so no falsifier is expected to exit 0 anywhere.
  • Adds the re-verification table.
  • Corrects the exit-1 row: the wrapper prints ERROR: <type>: <message>, not "FATAL".

Doc links were already current (4.5 and current). No code change.

Also

  • showcase/README.md conventions: A joint bites; touching is not joining; A platform bears on something (exit 17).
  • Gallery alts, witnessesFix text and root README alts updated. Gallery regenerated, with the generated <img alt> read back.
  • tests/check_falsifier_targets.py: passed, 204 falsifiers across 28 pieces.
  • Known gaps, not closed here:

🤖 Generated with Claude Code

TMHSDigital and others added 5 commits September 23, 2026 20:55
The brace ends sat just outside the post and under the arm, so one bevelled
corner grazed each host and it read as a loose stick; the BVH gap budget
passed on the graze. Both ends now tenon in, and a brace-bite budget asserts
each end inside its host (exit 20, --shallow-brace). Aged brass, sorted
bevel input, 60 m stage, temp glb removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
The platform floated: no deck bearers, joists ending in the air, plank ends
over nothing, and side rails stopping 0.30 m short of the front posts. Four
deck girts, girt-to-girt joists and post-to-post side rails, with deck-bearing
and side-rail budgets (exit 17, --short-joists, --open-sides). Grained wood,
weathered shakes, rusted iron, sorted bevels, 60 m stage, temp glb removed.

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

Render path only: Standard view transform (AgX turned the sun into a peach
bulb), house lighting that brings mean luma from 0.33 into the calibration
band, a 60 m stage, and a framing gate the render never had. Contract and
exit codes unchanged on 4.5.11, 5.1.2 and 5.2.1. Also regenerates the index.

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

Re-verified on 4.5.11, 5.1.2 and 5.2.1: the abort text, the glTF 12-tri
claim and all exits hold. Documents the UV-map error that calc_tangents
raises first and that differs by version, states nothing is version-gated,
and corrects the exit-1 wrapper description. No code change.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
From the street-lantern and watchtower passes.

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 99ca76d into main Sep 24, 2026
13 checks passed
@TMHSDigital
TMHSDigital deleted the fix/quality-pass-street-lantern-watchtower branch September 24, 2026 01: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 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