analyze_texture assigns metal finish classes to fabric and silently rewrites authored roughness

Author: jarvisthegreat2-svgCreated Sep 10, 2026Updated Sep 10, 2026
Labelstriage: needs-review

Version: 2.0.0 (6e60b5e) · Profile: generic, no domain plugins installed

Summary

Run against verified interior crops of a wool/leather/knit garment with --spec ... --in-place, analyze_texture.py assigned every fabric a metal finish class and silently rewrote the authored roughness scalars to match.

material actual finish assigned finishClass roughness before → after
wool melton woven matte painted-metal 0.92 → 0.50
leather pebbled dielectric brushed-steel 0.50 → 0.35
rib knit knit matte candy-coat 0.85 → 0.18

A rib knit at roughness 0.18 renders as polished plastic.

What I think is happening

The finish vocabulary looks weapon-skin oriented (painted-metal, brushed-steel, candy-coat). With no domain plugin installed there is no fabric class available, so each crop is forced into the nearest class rather than the classification being refused. No warning is emitted, and the spec is patched in place.

The crops themselves were verified first — I had already checked each one visually to confirm it was on the part I thought it was, and the corresponding extract_pbr_evidence runs returned 0.80–0.86 confidence on the same pixels.

Suggested fix

Two things, either of which would have caught this:

  1. Refuse to classify when no finish class is within some confidence bound, rather than returning the nearest match. "I do not have a class for this" is a useful answer.
  2. Never silently overwrite an authored roughness scalar. The repo's own rule (grimoire/build/threejs_skin_and_cloth_materials.md:115-116) is that roughness is reported, never gated, because screen-space geometryRoughness is added at shade time — so an authored value being replaced by an inferred one is a meaningful loss, and it happens with no record in the spec that it occurred.

Related: #135, #136 — all three surfaced in the same run, and all three share a root cause in the intake and material tooling assuming a rigid, saturated object photographed against a background.