Skip to content

Commit 5a29c6f

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase): hitching-post rail on knee braces with iron end caps
The rail now sits on two raking knee braces (40 x 50 mm, housed 22 mm into the post side and the rail underside, stopping inboard of the rings), and both rail ends carry bevelled iron sleeves. seat_audit classifies them by position and a new Brace seat budget asserts 2 braces each overlapping post and rail, and 2 caps gripping the rail; new falsifier --float-braces drops the brace heads 36 mm and exits 18 (brace_arm 0). Budgets moved as they should: base tris 1852 -> 2156 (1400-2400), wood 114 -> 222, metal 828 -> 880 faces, collider 80 -> 72; OUTER_SIZE x 0.500 -> 0.506 follows the caps' 3 mm standoff per end. This commit also carries the showcase/gallery.json and README.md alt updates for fence-kit, wooden-ladder and hitching-post. Evidence (live, local): - Blender 5.2.1 LTS (.scratch): default exit 0, braces=2 brace_post=12 brace_arm=16 arm_caps=2 cap_arm=12; --output framing fill y=0.800. - Blender 4.5.11 LTS (.scratch): default exit 0, base_tris 2156. - check_falsifier_targets.py static: 329 -> passes; --run both binaries: every hitching-post falsifier incl. --float-braces returns its code. - Contact sheet: luma 0.205 / stage 0.207 / warmth +0.087 / sat 0.102. - Asset sheet: braced rail and end caps read; no longer the barest post. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 33051ef commit 5a29c6f

8 files changed

Lines changed: 148 additions & 21 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,14 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
117117
<a href="showcase/street-lantern/"><img src="showcase/street-lantern/preview.webp" width="24%" alt="Street lantern: an iron post with aged brass collars, a knee brace tenoned into post and arm, and a lit muntined amber cage glowing onto the post on a dark studio floor" /></a>
118118
<a href="showcase/treasure-chest/"><img src="showcase/treasure-chest/preview.webp" width="24%" alt="Treasure chest: a slatted wooden chest with iron bands, corner brackets, and an open lid on a dark studio floor" /></a>
119119
<a href="showcase/terrain-scatter/"><img src="showcase/terrain-scatter/preview.webp" width="24%" alt="Terrain scatter: a Geometry Nodes hill tile of patchy grass over dark earth, nine faceted stones sunk into it among grass tufts and pebbles, on a dark studio floor" /></a>
120-
<a href="showcase/fence-kit/"><img src="showcase/fence-kit/preview.webp" width="24%" alt="Fence kit: a run of three weathered post-and-rail sections on a packed-earth strip, joined post to post at the 1.60 m tile pitch, with pyramidal caps, diagonal board braces, and iron bands" /></a>
120+
<a href="showcase/fence-kit/"><img src="showcase/fence-kit/preview.webp" width="24%" alt="Fence kit: a run of three weathered post-and-rail sections on a packed-earth strip sharing one post at each joint, with pyramidal caps, diagonal board braces, and iron bands" /></a>
121121
<a href="showcase/watchtower/"><img src="showcase/watchtower/preview.webp" width="24%" alt="Watchtower: a grained timber lookout seen from low and close, with X-braces, hatch ladder, a plank platform on deck girts, and a weathered cedar shake roof on a dark studio floor" /></a>
122122
<a href="showcase/cart/"><img src="showcase/cart/preview.webp" width="24%" alt="Cart: a two-wheel wooden cart with spoked wheels, slatted bed, and shafts on a dark studio floor" /></a>
123123
<a href="showcase/park-bench/"><img src="showcase/park-bench/preview.webp" width="24%" alt="Park bench: a wrought-iron bench whose round-bar legs curl into scrolled feet, with wooden slats and a reclined back, on a dark studio floor" /></a>
124124
<a href="showcase/wheelbarrow/"><img src="showcase/wheelbarrow/preview.webp" width="24%" alt="Wheelbarrow: a wooden tray with walls of stacked boards and iron straps, a spoked wheel, rear legs, and handles on a dark studio floor" /></a>
125125
<a href="showcase/anvil/"><img src="showcase/anvil/preview.webp" width="24%" alt="Anvil: a forged-steel London-pattern anvil with a hammer-polished face on a hooped timber stump, a hammer at its foot" /></a>
126126
<a href="showcase/water-trough/"><img src="showcase/water-trough/preview.webp" width="24%" alt="Water trough: a watertight wooden trough with plank ends, rippled water, rust-streaked iron straps and trestle legs on a dark studio floor" /></a>
127-
<a href="showcase/hitching-post/"><img src="showcase/hitching-post/preview.webp" width="24%" alt="Hitching post: a square timber post with a pyramidal cap, cross-arm, iron bands wrapped around it, two hitching rings and a nailed horseshoe on a dark studio floor" /></a>
127+
<a href="showcase/hitching-post/"><img src="showcase/hitching-post/preview.webp" width="24%" alt="Hitching post: a square timber post with a pyramidal cap, a cross-arm on two knee braces with iron end caps, iron bands wrapped around it, two hitching rings and a nailed horseshoe on a dark studio floor" /></a>
128128
<a href="showcase/grindstone/"><img src="showcase/grindstone/preview.webp" width="24%" alt="Grindstone: a stone wheel on a timber A-frame with an iron axle, hubs, crank, and tray on a dark studio floor" /></a>
129129
<a href="showcase/hand-pump/"><img src="showcase/hand-pump/preview.webp" width="24%" alt="Hand pump: a green-enamelled cast-iron village pump on a stepped wooden plinth with a spout and handle on a dark studio floor" /></a>
130130
<a href="showcase/signpost/"><img src="showcase/signpost/preview.webp" width="24%" alt="Signpost: a timber crossroads post with three painted fingerboards lettered MILLBROOK 2, OAKHAM 5 and FORD 1, iron straps, and a pyramidal cap on a dark studio floor" /></a>
1.49 KB
Loading
-376 Bytes
Loading
-166 Bytes
Loading

‎showcase/gallery.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@
115115
"name": "fence-kit",
116116
"dir": "showcase/fence-kit",
117117
"teaches": "A procedural post-and-rail fence section that fits its 1.60 m tile, with one-shell iron bands and a board brace housed in both posts, through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
118-
"alt": "A run of three weathered post-and-rail fence sections on a packed-earth strip, joined post to post at the tile pitch, each with a diagonal board brace and dark iron bands.",
118+
"alt": "A weathered post-and-rail fence run of three sections on a packed-earth strip, one capped post at each joint, each bay with a diagonal board brace and dark iron bands.",
119119
"witnessesFix": "Recomputed: 1012 tris, two materials with 116 metal and 390 wood faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.596×0.134×1.232 m inside the 1.60 m tile, grounded zmin, 2 iron shoes, brace housed 12 mm in both posts and bearing 2 mm on the middle rail, rail-to-post gap 0.93 mm, rail span 1.362 m, LOD ratios in band (5.2 COLLAPSE leaner on LOD2), convex collider 24 tris, hygiene all zero, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-shoes 16; --short-brace 17; --gap-rails 18; --long-rails 19; --float-brace 20; --wide-tile 21.",
120120
"hero": "docs/gallery/assets/fence-kit-hero.webp",
121121
"preview": "showcase/fence-kit/preview.webp",
@@ -208,7 +208,7 @@
208208
"name": "hitching-post",
209209
"dir": "showcase/hitching-post",
210210
"teaches": "A procedural hitching post (eaved cap, one rail, cup shoe, rings hung through eyes, a face-nailed horseshoe) through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
211-
"alt": "A tall wooden hitching post with a pointed cap, a crossbar with two hung iron rings, iron bands, and a horseshoe nailed heels-up to its face.",
211+
"alt": "A tall wooden hitching post with a pointed cap, a cross-rail on two knee braces with iron end caps and two hung rings, iron bands, and a horseshoe nailed to its face.",
212212
"witnessesFix": "Recomputed: 1852 tris, two materials with 114 wood and 828 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.500×0.149×1.246 m, zmin 0, hygiene and coplanar pairs 0, post seated at z 0.010, ring centerline error 0, bands 6.5 mm proud of the post, horseshoe biting 1.5 mm and 7.5 mm proud, LOD ratios in band, convex collider 80 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert and --twin-sole exit 15; --lift-z exits 16; --clip-ring, --sunk-bands and --float-horseshoe exit 18; --short-post exits 19.",
213213
"hero": "docs/gallery/assets/hitching-post-hero.webp",
214214
"preview": "showcase/hitching-post/preview.webp",
@@ -326,7 +326,7 @@
326326
"name": "wooden-ladder",
327327
"dir": "showcase/wooden-ladder",
328328
"teaches": "A procedural timber ladder with raked tapered stiles, six turned rungs, ferrule caps, and level shoe plates through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
329-
"alt": "A timber ladder with tapered stiles and six evenly spaced turned rungs, leaning on a weathered board wall with a coil of hemp rope hung over its second-highest rung.",
329+
"alt": "A timber ladder with tapered stiles and six evenly spaced lathe-turned rungs, leaning on a weathered board wall with a coil of hemp rope hung over its second-highest rung.",
330330
"witnessesFix": "Recomputed: 2536 tris, two materials with 612 wood and 736 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.490×0.376×1.487 m, zmin 0, hygiene and coplanar pairs 0, tenon clearance 8 mm, shoe bite 20 mm, rung pitch even to 0.002 m, LOD ratios in band, convex collider 24 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert and --twin-sole exit 15; --lift-z exits 16; --fat-rungs exits 17; --short-stile exits 18; --drift-rungs exits 19.",
331331
"hero": "docs/gallery/assets/wooden-ladder-hero.webp",
332332
"preview": "showcase/wooden-ladder/preview.webp",

‎showcase/hitching-post/README.md‎

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@
22

33
A showcase piece, not an example. Procedural timber hitching post: a
44
125 mm square post seated in a closed iron shoe, one cross-rail through
5-
the post, a pyramidal cap with eaves, two rings hung through eyes
6-
under the rail, and a horseshoe nailed heels-up to the post's face. Then the shipped pipeline: unique-cell UVs, Cycles
7-
high-to-low normal bake, LOD chain, convex collider, Unity glTF export.
5+
the post, carried on two raking knee braces and capped with iron end
6+
sleeves, a pyramidal cap with eaves, two rings hung through eyes under
7+
the rail, and a horseshoe nailed heels-up to the post's face. Then the
8+
shipped pipeline: unique-cell UVs, Cycles high-to-low normal bake, LOD
9+
chain, convex collider, Unity glTF export.
810

911
It asserts **budget conformance** of the generated result. It does not
1012
witness an API contract. "It rendered without error" is not a check.
1113

1214
Intended size: post 0.125 m square and 1.16 m of timber, cap 0.096 m,
13-
cross-rail 0.50 m. Outer AABB 0.500 × 0.149 × 1.246 m.
15+
cross-rail 0.50 m (0.506 m over its end caps). Outer AABB
16+
0.506 × 0.149 × 1.246 m.
1417

1518
**Composes** skills `mesh-editing-and-bmesh`, `bake-high-to-low`,
1619
`depsgraph-and-evaluated-data`, `engine-export-presets`, and snippets
@@ -27,22 +30,23 @@ materials, UVs, evaluated LOD, collider, or export file.
2730

2831
| Axis | Declared | Measured (4.5.11 / 5.2.1) |
2932
| --- | --- | --- |
30-
| Base triangles | 1400–2400 | 1852 / 1852 |
33+
| Base triangles | 1400–2400 | 2156 / 2156 |
3134
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 |
32-
| LOD2 ratio | 0.10–0.35 of base | 0.2192 / 0.2192 |
33-
| Materials | exactly 2 distinct, ≥70 wood, ≥560 metal | 2 slots, 114 wood, 828 metal |
35+
| LOD2 ratio | 0.10–0.35 of base | 0.2199 / 0.2199 |
36+
| Materials | exactly 2 distinct, ≥70 wood, ≥560 metal | 2 slots, 222 wood, 880 metal |
3437
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
35-
| Outer AABB | (0.500, 0.149, 1.246) m ± 0.01 | (0.5000, 0.1490, 1.2460) |
38+
| Outer AABB | (0.506, 0.149, 1.246) m ± 0.01 | (0.5060, 0.1490, 1.2460) |
3639
| Grounded zmin | within 1e-4 of 0 | 0 / 0 / 0 |
3740
| Hygiene | loose/nonman/zero-area/doubles/n-gons/coplanar pairs = 0 | all 0 |
3841
| Post seat | world zmin in (0.004, 0.014), XY centroid within 0.010 of origin, arm axis cos ≥ cos(0.5°) | 0.01000, 0, 1.000 |
3942
| Hung ring | centerline error ≤ 0.008 m, ring–wood overlap 0, eye–wood overlap 0, shank–ring overlap 0, shank bites the eye | 0, 0, 0, 0, 40 |
4043
| Shoe | each band overlaps the post, shoe overlaps the sole | band gap 0, sole–shoe 8 |
4144
| **Band seat** | each band above the shoe stands ≥ 0.004 m proud of the post faces | 0.00650 |
4245
| **Horseshoe seat** | exactly 1; back bites the post face 0.0005–0.004 m, face ≥ 0.004 m proud | 1, 0.00150, 0.00750 |
46+
| **Brace seat** | exactly 2 knee braces, each housed in the post and in the rail (triangle overlap ≥ 1 with each); exactly 2 end caps, each gripping the rail | 2 braces, worst post 12 / rail 16; 2 caps, worst 12 |
4347
| Wood–metal gap | BVH surface < 0.008 m | 0.00075 |
44-
| Collider tris | ≤ 280 | 80 |
45-
| Export | written, size > 0 | 139464 / 139452 bytes |
48+
| Collider tris | ≤ 280 | 72 |
49+
| Export | written, size > 0 | 160548 / 160532 bytes |
4650

4751
Base triangles rose from **1598 to 1680**. The old rings were faceted
4852
tori clipped into the arm; the new eyes, shanks, and 24-segment hung
@@ -76,6 +80,29 @@ AABB, collider (80 tris) and every other seat are unchanged. The hero key
7680
light rose from 660 to 960 W so the still sits in the calibration luma
7781
band.
7882

83+
### Knee braces and end caps
84+
85+
After the horseshoe the post was still among the simplest objects in the
86+
asset-sheet lineup: a stub rail pinned through a post reads as a cross, not
87+
as a load-bearing hitch. The rail now sits on two raking knee braces, one
88+
under each arm, as a hitch rail that takes a pulling horse needs. Each brace
89+
is a 40 × 50 mm strut from the post's side face at 0.66 m up to the rail's
90+
underside, housed 22 mm into both (`BRACE_BITE`), and it stops at x = 0.090,
91+
inboard of the hung rings. The ring–wood overlap gate now counts the braces
92+
as wood. Both rail ends carry an iron sleeve 36 mm long, with bevelled
93+
edges and 5 mm walls, standing 3 mm past the end grain.
94+
95+
`seat_audit` classifies the new shells by position. A wood shell off the
96+
post's centre line is a brace; the cap sits on it. A metal shell out at the
97+
rail ends is an end cap, not a band. **Brace seat** asserts exactly two
98+
braces, each overlapping the post and the rail, and two caps gripping the
99+
rail. `--float-braces` drops each brace head 36 mm below the rail and exits
100+
18 (brace_arm 0). The additions moved the budgets they should: base
101+
triangles 1852 → 2156 (inside the declared 1400–2400), wood faces
102+
114 → 222, metal faces 828 → 880. The outer AABB widened by the caps' 3 mm
103+
standoff per end, from 0.500 to 0.506 m, and `OUTER_SIZE` follows the
104+
measurement. The collider went from 80 to 72 triangles.
105+
79106
### Bands, wood and stage
80107

81108
The two iron bands were sized from `half - grip`: an inner half-width of
@@ -104,6 +131,7 @@ Each falsifier violates exactly one named budget. Proven on Blender
104131
| `--short-post` | Seated post | 19 | post zmin 0.030 |
105132
| `--sunk-bands` | Band seat | 18 | band proud −0.0015 |
106133
| `--float-horseshoe` | Horseshoe seat | 18 | bite −0.0025 |
134+
| `--float-braces` | Brace seat | 18 | brace_arm 0 |
107135

108136
Default exit is 0 on all three. `--clip-ring` also overlaps the rail;
109137
the centerline gate is the one that fires.
@@ -120,6 +148,7 @@ blender --background --python hitching_post.py -- --clip-ring
120148
blender --background --python hitching_post.py -- --short-post
121149
blender --background --python hitching_post.py -- --sunk-bands
122150
blender --background --python hitching_post.py -- --float-horseshoe
151+
blender --background --python hitching_post.py -- --float-braces
123152
blender --background --python hitching_post.py -- --output preview.webp --engine cycles
124153
```
125154

@@ -150,5 +179,5 @@ File-local. `9` is a valid check code. `10` is reserved for
150179
| 15 | Hygiene, including coplanar pairs (`--stray-vert`, `--twin-sole`) |
151180
| 16 | Grounded zmin (`--lift-z`) |
152181
| 17 | Wood–metal BVH gap above 8 mm |
153-
| 18 | Hung ring, shoe, band or horseshoe seat (`--clip-ring`, `--sunk-bands`, `--float-horseshoe`) |
182+
| 18 | Hung ring, shoe, band, horseshoe, brace or end-cap seat (`--clip-ring`, `--sunk-bands`, `--float-horseshoe`, `--float-braces`) |
154183
| 19 | Post plumb, origin, and cup seat (`--short-post`) |

0 commit comments

Comments
 (0)