Skip to content

feat: asset-quality gate + remodel modular-kit-snap and lightmap-uv-channel assets#117

Merged
TMHSDigital merged 4 commits into
mainfrom
feat/asset-quality-gate
Jul 24, 2026
Merged

feat: asset-quality gate + remodel modular-kit-snap and lightmap-uv-channel assets#117
TMHSDigital merged 4 commits into
mainfrom
feat/asset-quality-gate

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

What this is

Codifies "modeled with intent" as a measured gate, then applies it to the two examples that exposed the gap (modular-kit-snap, lightmap-uv-channel — both passed every existing gate and still shipped placeholder-reading assets). Four commits: the gate, two remodels, integration.

The floors (calibrated empirically, measurements reported)

Implemented in examples/gallery_asset_quality.py (render path only, same call pattern as gallery_framing, exit 11, never in check-only paths):

  • Naming — no default datablock names on hero parts.
  • Material variation — heroes with ≥ 2 parts carry ≥ 2 distinct materials. (Single-part subjects exempt: one honest material is their truth.)
  • Edge treatment — right-angle (90° ± 2°) manifold edges ≤ 75%. Calibration: reference assets 0.019–0.288, bmesh-gear's honest machined teeth 0.667, raw boxes 1.0.

Calibration table (measured on Blender 5.1.2 via the survey harness):

asset parts mats edge90 compactness (info)
collision-hull-proxy (ref) 16 6 0.044 65.9
custom-normals-shade (ref) 39 2 0.288 31.0
vertex-weight-limit (ref) 1 4 0.150 34.8
lod-decimate-chain (ref) 3 4 0.019 79.1
depsgraph-export (weak) 2 1 1.000 23.9
text-version-stamp (weak) 1 1 1.000 405.3
bmesh-gear (simple, honest) 1 1 0.667 18.3
soccer-ball-goldberg (simple, honest) 1 2 0.000 10.0

Dropped floors, with evidence (a floor that can't be set without failing a genuinely good asset is not a floor; a floor hand-tuned to pass everything isn't one either):

  • Part countvertex-weight-limit's mech arm is a single skinned mesh and reference-quality.
  • Silhouette compactnesssoccer-ball-goldberg 10.0, bmesh-gear 18.3, turntable 19.1 are good simple subjects. Kept as printed information only.
  • Dominant-material share — the jerry can and the rocket carry accents in per-face assignment (both measure 1.0 dominant). Printed information only.

Floor falsification (blender --background): raw default-named cube → exit 11 (naming + edge90); two-part single-material assembly → exit 11 (materials + edge90); designed restore → exit 0. Watched fail and pass.

Goodhart warning written into docs/VISUAL-STYLE.md: greebles for the metric's sake do not count; detail must serve plausibility.

Reference bar + asset sheet gate

Reference set pinned in CLAUDE.md (canonical): collision-hull-proxy, custom-normals-shade, vertex-weight-limit, lod-decimate-chain. Asset sheet: hero alone, neutral 3/4 studio, composited beside the reference set, committed:

  • docs/gallery/asset-sheets/lightmap-uv-channel.webp
  • docs/gallery/asset-sheets/modular-kit-snap.webp

Both sheets are [before, after, chp, cns, vwl, lod] with the befores re-rendered from the pre-remodel code in the same neutral rig. Verdicts: both pass — neither remodeled asset is identifiable as the least-designed in the lineup; both befores clearly were.

lightmap-uv-channel remodel

Found and fixed: the wheel DarkWood material was silently never applied (prefix lookup bug — exact per-part mapping now). Rebuilt as 21 named watertight parts: plank-grooved bed + side rails + corner brackets + fasteners, real wheel assemblies (disc + hub + iron band + bolt ring) on a capped axle, ribbed canvas canopy, enlarged atlas board. Closed forms moved deliberately (contracts identical): parts 9 → 21, islands 1114 → 3680, byte-identical on 5.1.2 and 4.5.11. Re-falsified: clobber drift 2.068, overlap 15 SAT hits, margin collapse 2e-5. The MeshUVLoopLayer re-fetch ordering that avoids the documented 4.5.11 segfault is preserved and verified on 4.5.11 (no EXCEPTION_ACCESS_VIOLATION; hazard note still accurate).

modular-kit-snap remodel

Panels → assemblies (backing plate + inset + 4 bolt heads); palette teal-slate (no longer twins the cart); luminance 82.7 → 66.1 (calibration ceiling 77.7) — no longer a fourth over-bright card, so only the documented framing deviation (interior run) remains. Detail parts 12 → 20, hygiene 13 → 21; boundary contract untouched (16 verts/edges, probes exit 3/4 with measured 3 mm/2 mm errors).

Survey worklist (in ROADMAP)

Full 42-example survey: 26 pass, 14 below floors, 2 non-mesh subjects (n/a). Every below-floor entry is a contract-vehicle/display subject (testcard TV, VSE monitors, text bars, display rigs, honest single primitives) with measured numbers — none a game asset, none a remodeling mandate. Worklist committed in ROADMAP.

Visual passes (iteration log)

  • luv: 4 iterations (frame margin violation → reframe; giant-triangle geometry bug from bm.verts[n0:] slicing — bolts fanned outward, found by extents probe, fixed with set-difference; bed/iron material tuning) + falsify render + 4.5.11 parity.
  • mks: 1 iteration to target (panels/palette/luminance in one pass against measured luminance) + falsify render + 4.5.11 parity.
  • Staging contact sheets re-committed for both heroes (mks 66.1, luv 52.8 vs calibration 44.5–77.7).
  • In-situ Playwright: both cards read distinctly in compact mode at 1280 and 390; detail pages re-read (3680 islands / twenty detail parts / 66.1 present; alts untruncated).

Test plan (exact binaries)

  • E:\Blender-Developer-Tools\.scratch\blender-5.1.2-windows-x64\blender.exe (Blender 5.1.2): all checks, probes, renders, surveys, floor falsification, asset sheets.
  • E:\Blender-Developer-Tools\.scratch\blender-4.5.11-windows-x64\blender.exe (Blender 4.5.11 LTS): both check-only paths (byte-identical outputs), both render parity passes, hazard-ordering verification.
  • CI: both smoke jobs run the two example steps on their floating series.

Live run vs inspection-only

Live run: everything above. Inspection only: the 4.5 series smoke on CI runs 4.5.12 (local binary is 4.5.11 — stated exactly), Cycles engine paths (renders used EEVEE), Firefox/Safari rendering (Chromium only).

'Designed, not placeholder' becomes a measured gate: three floors in
examples/gallery_asset_quality.py (naming, material variation scoped to
assembled heroes, right-angle edge fraction <= 0.75), a pinned reference
bar (CLAUDE.md canonical membership: collision-hull-proxy,
custom-normals-shade, vertex-weight-limit, lod-decimate-chain), and the
asset sheet (hero alone, neutral 3/4 studio, composited beside the
reference set, committed under docs/gallery/asset-sheets/).

Floors calibrated empirically against the gallery's best and weakest;
three candidates dropped with evidence: part count (vertex-weight-limit's
skinned mech arm is one mesh and reference-quality), silhouette
compactness (soccer-ball-goldberg 10.0, bmesh-gear 18.3 are good simple
subjects), dominant-material share (jerry can and rocket carry accents in
per-face assignment, both measure 1.0). Floor falsification: raw cube and
single-material assembly exit 11, designed restore exits 0. Goodhart
warning written into VISUAL-STYLE: greebles for the metric's sake do not
count.

Signed-off-by: fOuttaMyPaint <TMhospitalitystrategies@gmail.com>
The shipped cart read as placeholder: uniform tan (its DarkWood wheel
material was silently never applied - a prefix lookup bug, replaced with
exact per-part mapping), wheels as lumpy polygons with a black dot for a
hub, no fittings. Rebuilt as an assembly of 21 named watertight parts:
plank-grooved bed with side rails, corner brackets, and fasteners, real
wheel assemblies (disc + hub + iron band + bolt ring) on a capped axle,
and a ribbed canvas canopy. Atlas board enlarged for card-scale
legibility. Render path now gates through gallery_asset_quality (exit
11): 5 materials, edge90 0.069, naming clean.

Closed forms moved deliberately, contracts unchanged: parts 9 -> 21,
islands 1114 -> 3680 (byte-identical on 5.1.2 and 4.5.11; the
MeshUVLoopLayer re-fetch ordering that avoids the documented 4.5.11
segfault is preserved and verified). Re-falsified: clobber drift 2.068,
overlap 15 SAT hits, margin collapse 2e-5.

Signed-off-by: fOuttaMyPaint <TMhospitalitystrategies@gmail.com>
Three defects fixed: flat grey wall panels are now assemblies (backing
plate + inset panel + four bolt heads each), the palette shifted
teal-slate so the card no longer twins with lightmap-uv-channel's warm
cart, and mean luminance was brought into the calibration range (82.7 ->
66.1, ceiling 77.7) by dimming fixtures/spill/rim - the interior run no
longer reads as a fourth over-bright card, so only the documented
framing deviation remains. Detail parts 12 -> 20 (hygiene 13 -> 21),
boundary contract untouched (16 verts/edges, probes still exit 3/4 with
measured errors), materials now cached per design key instead of
duplicated per part per segment.

Signed-off-by: fOuttaMyPaint <TMhospitalitystrategies@gmail.com>
…rated pages

ROADMAP carries the full-gallery floor survey: 26 of 42 pass; the 14
below-floor entries are all contract-vehicle/display subjects with
measured numbers, none a game asset, none a remodeling mandate. Asset
sheets for both remodeled examples committed under
docs/gallery/asset-sheets/ (before/after beside the reference set).
Staging contact sheets refreshed for both heroes. gallery.json,
blender-smoke comments, and generated gallery pages updated for the moved
closed forms (21 parts/3680 islands; 20 detail/21 hygiene parts).

Signed-off-by: fOuttaMyPaint <TMhospitalitystrategies@gmail.com>
@github-actions github-actions Bot added documentation Improvements or additions to documentation ci labels Jul 24, 2026
@TMHSDigital
TMHSDigital merged commit cc1ccb8 into main Jul 24, 2026
9 checks passed
@TMHSDigital
TMHSDigital deleted the feat/asset-quality-gate branch July 24, 2026 21:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant