The letterhead is the point: one business, two documents, same masthead, so the job sheet and the invoice read as a pair of papers off the same outfit's printer rather than two game screens. DESIGN.md has opened with "you run a small landscaping outfit" since day one and it has never been on the glass. tools/jobsheet/ — paste-ready for Lane A between CUT markers, purely additive (.card/.row/.ledger untouched), rendered to four PNGs before handover, each state addressable as ?v=. The ledger already WAS an invoice; it just never said so. The line worth keeping is .void: a bonus that was on the job sheet and didn't survive the night, struck through in the same column as the money that did — a bonus you never watch fail is one you never learn to protect. Two design calls left as A's with the reasoning beside them, same as the carport's $180: the business name (proposal: HARD YARDS) and the ABN (sequential digits on purpose — a plausible one could be a real business's). bike_kid_01.glb — 1.15 x 0.33 x 0.74 m, 700 tris, lean baked in because a bike doesn't stand up on its own. Two bugs caught by LOOKING at the render, neither catchable by the existing suite: a comment claiming a step-through above a diamond frame, and a fork with negative rake that drew head tube and fork as one pole through the front wheel. Both passed the Blender verify — a bounding box can't answer "is this the right shape". The lean is an export-time axis fact (+Y in Blender is -Z in three.js), so e.test.js now pins it in browser coords. Proved the assert fails: rebuilt at lean=0 and Blender still said PASS while the selftest went red. selftest 299/0/0. 32/32 GLBs byte-identical across three full factory runs.
509 lines
8.2 KiB
JSON
509 lines
8.2 KiB
JSON
{
|
|
"blender": "5.1.2",
|
|
"assets": [
|
|
{
|
|
"name": "ref_capsule",
|
|
"dims": [
|
|
0.4,
|
|
0.4,
|
|
1.7
|
|
],
|
|
"tris": 220,
|
|
"nodes": [
|
|
"head_height",
|
|
"ref_capsule",
|
|
"ref_capsule_mesh"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "tree_gum_01",
|
|
"dims": [
|
|
4.5522,
|
|
4.956,
|
|
7.9702
|
|
],
|
|
"tris": 492,
|
|
"nodes": [
|
|
"branch_anchor_01",
|
|
"branch_anchor_02",
|
|
"branch_anchor_03",
|
|
"canopy",
|
|
"canopy_01",
|
|
"canopy_02",
|
|
"canopy_03",
|
|
"tree_gum_01",
|
|
"trunk"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "tree_gum_02",
|
|
"dims": [
|
|
3.8871,
|
|
2.7787,
|
|
5.4972
|
|
],
|
|
"tris": 352,
|
|
"nodes": [
|
|
"branch_anchor_01",
|
|
"branch_anchor_02",
|
|
"canopy",
|
|
"canopy_01",
|
|
"canopy_02",
|
|
"tree_gum_02",
|
|
"trunk"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "fence_post",
|
|
"dims": [
|
|
0.13,
|
|
0.13,
|
|
2.03
|
|
],
|
|
"tris": 24,
|
|
"nodes": [
|
|
"fence_post",
|
|
"post"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "fence_panel",
|
|
"dims": [
|
|
2.4,
|
|
0.054,
|
|
1.8194
|
|
],
|
|
"tris": 324,
|
|
"nodes": [
|
|
"fence_panel",
|
|
"palings",
|
|
"rails"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "gate",
|
|
"dims": [
|
|
1.045,
|
|
0.0615,
|
|
1.75
|
|
],
|
|
"tris": 220,
|
|
"nodes": [
|
|
"gate",
|
|
"gate_frame",
|
|
"gate_palings",
|
|
"hinge_axis",
|
|
"hinges"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "house_yardside",
|
|
"dims": [
|
|
9.2,
|
|
1.0547,
|
|
2.9
|
|
],
|
|
"tris": 212,
|
|
"nodes": [
|
|
"door",
|
|
"fascia",
|
|
"fascia_anchor_01",
|
|
"fascia_anchor_02",
|
|
"fascia_anchor_03",
|
|
"gutter",
|
|
"house_yardside",
|
|
"roof",
|
|
"wall",
|
|
"window",
|
|
"window_glow",
|
|
"window_light_anchor"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "carport_01",
|
|
"dims": [
|
|
3.24,
|
|
5.5959,
|
|
2.6945
|
|
],
|
|
"tris": 172,
|
|
"nodes": [
|
|
"beam_anchor_01",
|
|
"beam_anchor_02",
|
|
"beams",
|
|
"carport_01",
|
|
"footings",
|
|
"post_anchor_01",
|
|
"post_anchor_02",
|
|
"posts",
|
|
"roof"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "carport_01_wrecked",
|
|
"dims": [
|
|
6.2819,
|
|
5.5704,
|
|
2.1983
|
|
],
|
|
"tris": 144,
|
|
"nodes": [
|
|
"beams",
|
|
"carport_01_wrecked",
|
|
"footings",
|
|
"posts",
|
|
"roof_down"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "shed_01",
|
|
"dims": [
|
|
2.58,
|
|
1.9708,
|
|
2.2224
|
|
],
|
|
"tris": 96,
|
|
"nodes": [
|
|
"door_anchor",
|
|
"doors",
|
|
"roof",
|
|
"shed_01",
|
|
"shell"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "shed_table",
|
|
"dims": [
|
|
1.6,
|
|
0.6,
|
|
0.9
|
|
],
|
|
"tris": 72,
|
|
"nodes": [
|
|
"pickup_anchor",
|
|
"shed_table",
|
|
"table_frame",
|
|
"table_top"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "garden_bed",
|
|
"dims": [
|
|
3.0,
|
|
1.2,
|
|
0.8609
|
|
],
|
|
"tris": 2580,
|
|
"nodes": [
|
|
"bed",
|
|
"garden_bed",
|
|
"plants_dead",
|
|
"plants_full",
|
|
"plants_tattered",
|
|
"soil"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "sail_post",
|
|
"dims": [
|
|
0.507,
|
|
0.52,
|
|
4.0327
|
|
],
|
|
"tris": 528,
|
|
"nodes": [
|
|
"footing",
|
|
"pad_eye",
|
|
"post",
|
|
"rake_pivot",
|
|
"sail_post",
|
|
"top_anchor"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "ladder_01",
|
|
"dims": [
|
|
0.455,
|
|
0.075,
|
|
3.0
|
|
],
|
|
"tris": 276,
|
|
"nodes": [
|
|
"ladder",
|
|
"ladder_01",
|
|
"ladder_base",
|
|
"ladder_top"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "shackle",
|
|
"dims": [
|
|
0.0569,
|
|
0.019,
|
|
0.0744
|
|
],
|
|
"tris": 560,
|
|
"nodes": [
|
|
"bow",
|
|
"pin",
|
|
"shackle"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "carabiner",
|
|
"dims": [
|
|
0.049,
|
|
0.009,
|
|
0.1027
|
|
],
|
|
"tris": 476,
|
|
"nodes": [
|
|
"body",
|
|
"carabiner",
|
|
"gate"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "turnbuckle",
|
|
"dims": [
|
|
0.0292,
|
|
0.0341,
|
|
0.1955
|
|
],
|
|
"tris": 728,
|
|
"nodes": [
|
|
"body",
|
|
"eye_a",
|
|
"eye_b",
|
|
"turnbuckle"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "tramp_01",
|
|
"dims": [
|
|
2.9555,
|
|
2.9555,
|
|
0.78
|
|
],
|
|
"tris": 976,
|
|
"nodes": [
|
|
"legs",
|
|
"mat",
|
|
"pad",
|
|
"rim",
|
|
"tramp_01"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "wheelie_bin_01",
|
|
"dims": [
|
|
0.58,
|
|
0.6808,
|
|
1.1188
|
|
],
|
|
"tris": 120,
|
|
"nodes": [
|
|
"bin_body",
|
|
"lid",
|
|
"lid_plate",
|
|
"wheelie_bin_01",
|
|
"wheels"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "washing_line_01",
|
|
"dims": [
|
|
2.8441,
|
|
2.8441,
|
|
2.2777
|
|
],
|
|
"tris": 336,
|
|
"nodes": [
|
|
"arms",
|
|
"head",
|
|
"mast",
|
|
"washing_line_01"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "garden_gnome_01",
|
|
"dims": [
|
|
0.1427,
|
|
0.15,
|
|
0.365
|
|
],
|
|
"tris": 236,
|
|
"nodes": [
|
|
"garden_gnome_01",
|
|
"gnome"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "bike_kid_01",
|
|
"dims": [
|
|
1.148,
|
|
0.328,
|
|
0.7269
|
|
],
|
|
"tris": 700,
|
|
"nodes": [
|
|
"bars",
|
|
"bike_kid_01",
|
|
"frame",
|
|
"wheel_front",
|
|
"wheel_rear"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "garden_gnome_01_broken",
|
|
"dims": [
|
|
0.3947,
|
|
0.3519,
|
|
0.106
|
|
],
|
|
"tris": 344,
|
|
"nodes": [
|
|
"garden_gnome_01_broken",
|
|
"hat",
|
|
"head",
|
|
"shards",
|
|
"stump"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "hail_stone_01",
|
|
"dims": [
|
|
0.0198,
|
|
0.0176,
|
|
0.0197
|
|
],
|
|
"tris": 20,
|
|
"nodes": [
|
|
"hail_stone_01",
|
|
"stone"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "broom_01",
|
|
"dims": [
|
|
0.3891,
|
|
0.055,
|
|
1.4213
|
|
],
|
|
"tris": 200,
|
|
"nodes": [
|
|
"bristles",
|
|
"broom_01",
|
|
"grip_anchor",
|
|
"handle",
|
|
"head",
|
|
"poke_tip"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
},
|
|
{
|
|
"name": "fence_panel_snapped",
|
|
"dims": [
|
|
2.4125,
|
|
1.0144,
|
|
1.8181
|
|
],
|
|
"tris": 312,
|
|
"nodes": [
|
|
"debris_palings",
|
|
"fence_panel_snapped",
|
|
"palings",
|
|
"rails"
|
|
],
|
|
"status": "PASS",
|
|
"problems": []
|
|
}
|
|
],
|
|
"debris": [
|
|
{
|
|
"file": "BlueCrate_v2.glb",
|
|
"dims": [
|
|
0.36,
|
|
0.36,
|
|
0.29
|
|
],
|
|
"sane": true
|
|
},
|
|
{
|
|
"file": "BlackTub_v2.glb",
|
|
"dims": [
|
|
0.36,
|
|
0.54,
|
|
0.2
|
|
],
|
|
"sane": true
|
|
},
|
|
{
|
|
"file": "WhiteTub_v2.glb",
|
|
"dims": [
|
|
0.36,
|
|
0.54,
|
|
0.2
|
|
],
|
|
"sane": true
|
|
},
|
|
{
|
|
"file": "WoodenBin_v2.glb",
|
|
"dims": [
|
|
0.35,
|
|
0.36,
|
|
0.31
|
|
],
|
|
"sane": true
|
|
}
|
|
]
|
|
} |