agentleFS
ThanhNguyxnOrgThanhNguyxnOrg/blendops/skills/material-quality-checker/SKILL.md

material-quality-checker

Skill3 starsChanged 6 months agoMITView on GitHub

Validate PBR material sanity, texture budgets, and web/runtime compatibility per material before render or export.

The file

We split this skill into the rules it gives an agent

7 rules. About 0 are common, 6 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈6

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Run a focused pass/warn/fail check on each material in the scene against PBR sanity, texture budgets, and consumer-stack compatibility — …

    line 9
  2. Distinctive:

    check PBR sanity (albedo range, normal map sign, roughness/metallic plausibility)

    line 13
  3. Distinctive:

    check texture budget (resolution, count, format)

    line 14
  4. Distinctive:

    check consumer-stack compatibility (KHR extensions, unsupported features for chosen target)

    line 15
  5. Distinctive:

    after a material change request

    line 21
  6. Distinctive:

    Read the material list from scene plan or measured scene.

    line 104
  7. Distinctive:

    Keep this skill narrow — do not creep into lighting or composition.

    line 201

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

material-quality-checker

Purpose

Run a focused pass/warn/fail check on each material in the scene against PBR sanity, texture budgets, and consumer-stack compatibility — without expanding into lighting or composition concerns.

Quick start

  • enumerate every material referenced in the scene plan or measured scene
  • check PBR sanity (albedo range, normal map sign, roughness/metallic plausibility)
  • check texture budget (resolution, count, format)
  • check consumer-stack compatibility (KHR extensions, unsupported features for chosen target)
  • emit per-material verdicts + a top-line status

When to use

  • before render
  • before GLB export
  • after a material change request
  • as a sub-check during full quality review

When not to use

<!-- blendops:generated:start exclusions -->
  • upstream lookdev and material planning → use ../lighting-material-plan/SKILL.md (use lighting-material-plan)
  • lighting validation → use ../lighting-quality-checker/SKILL.md (use lighting-quality-checker)
  • composition / camera validation → use ../composition-quality-checker/SKILL.md (use composition-quality-checker)
  • broad pass/warn/fail scene readiness → use ../scene-readiness/SKILL.md (use scene-readiness)
  • web integration and viewer handoff → use ../glb-web-handoff/SKILL.md (use glb-web-handoff)
  • to fix or edit materials (this skill validates and emits remediation hints only; it never edits) → use ../lighting-material-plan/SKILL.md (this skill validates and emits remediation hints only; it never edits)
<!-- blendops:generated:end exclusions -->

Trigger phrases

<!-- blendops:generated:start triggers -->
  • "are the materials okay"
  • "check PBR sanity"
  • "texture budget for materials"
  • "will the materials work in Three.js"
<!-- blendops:generated:end triggers -->

Prerequisites / readiness

  • material list known (from scene plan or measured scene)
  • consumer stack target known (Cycles render / Eevee preview / GLB → web)
  • texture budget pinned (typically from mobile-glb-budget)

Input schema

Required inputs

InputWhy it is required
Material listDetermines scope of the check
Consumer targetCycles vs Eevee vs glTF imposes different rules
Texture budgetDrives texture-resolution and count checks

Optional inputs

InputUse
Existing render referenceAllows visual cross-check
Variant listConfigurator materials need separate variant rows

Assumptions to confirm

  • Albedo / base-color textures are sRGB; data textures (normal, roughness, metallic, AO) are linear.
  • Normal maps follow OpenGL convention (+Y up) for glTF-bound exports.
  • Shader graph is glTF-export-compatible if export is in scope.
  • Principled BSDF sockets are resolved by name (not position); version-dependent socket assumptions are marked in Notes.

Output schema

Primary output

A per-material verdict table: name, type (PBR / non-PBR / variant), albedo state, normal state, roughness/metallic state, texture count + resolution sum, consumer-stack compatibility, verdict (Pass / Warn / Fail), notes.

Secondary output

  • top-line status (Pass / Warn / Fail) computed from rows (separate from runtime/artifact truth states)
  • worst-offender highlighting (one or two materials to fix first)
  • remediation hint per Fail row (advisory only, without performing the fix)

Evidence / caveat output

  • Artifact status defaults to Not Produced unless concrete output evidence exists.
  • Truth states are downgrade-only (never upgrade without recorded evidence) and remain strictly separate from per-material Pass / Warn / Fail validation verdicts.
Runtime status: Not Run | Attempted | Produced | Verified | Failed
Artifact status: Not Produced | Produced | Verified | Failed
Evidence used: <links, paths, logs, or "none">
Limitations: <known gaps>

Required laws

  • ../../laws/evidence-before-done.md
  • ../../laws/non-blender-user-language.md
  • ../../laws/no-arbitrary-python-interface.md
  • ../../laws/official-runtime-only.md

Official runtime boundary

This skill validates plans or measured scene snapshots. It never modifies materials, runs Blender, or exports a GLB. If actual material values are needed, rely on a measured scene description (plan output, runtime tool snapshot) — never invent values.

For runtime path attribution, see ../../docs/runtime-stack-strategy.md.

Operating procedure

  1. Read the material list from scene plan or measured scene.
  2. For each material, evaluate PBR sanity rules (see references/pbr-sanity-rules.md).
  3. Evaluate texture budget per material against pinned budget.
  4. Evaluate consumer-stack compatibility (see references/consumer-stack-rules.md).
  5. Assign per-material verdict; collect notes.
  6. Compute top-line status (any Fail → Fail; any Warn → Warn; otherwise Pass).
  7. Highlight worst offenders; emit remediation hints.
  8. Hand off to scene-readiness (broader review) or render-export-evidence (next runtime step).

Decision tree

Albedo pure white (1,1,1)?
  → Warn (real-world materials rarely are)
Albedo pure black (0,0,0)?
  → Warn (likely error; even charcoal is ~0.04)
Roughness = 0?
  → Warn (perfect mirror very rare)
Metallic between 0 and 1 (not 0 or 1)?
  → Warn (PBR metallic is binary in physical sense)
Normal map sign or convention unknown?
  → Warn until verified
Texture above per-tier cap?
  → Fail
Material count above pinned cap?
  → Fail (whole-scene)
Unsupported shader node for chosen export?
  → Fail (e.g. OSL nodes for glTF)
Unsupported shader feature for glTF export (OSL custom shaders, unbaked procedural noise/wave/voronoi, or drivers on material values)?
  → Fail
Uses KHR glTF extensions (unlit, transmission, volume, ior, specular, clearcoat, emissive_strength, anisotropy, iridescence, variants) without consumer-stack confirmation?
  → Warn (escalate to Fail if target consumer explicitly lacks support)

Playbooks

Playbook A: Single hero product, glTF export

Hard rules: 4-channel ORM (Occlusion / Roughness / Metallic) packed; sRGB albedo; OpenGL normal; ≤ 4 materials; KHR extensions only if consumer stack confirmed.

Playbook B: Configurator with variants

Each variant row separately checked; share material slots where possible; verify KHR_materials_variants consumer support.

Playbook C: Cycles-only render (no GLB)

Looser texture format rules (EXR / Float allowed); still check albedo / normal / roughness sanity; ignore glTF-only constraints.

Mode handling

Text-only mode

Verdicts based on plan / spec only; mark Artifact status: Not Produced.

Runtime-ready mode

Verdicts based on measured scene snapshot; cite tool used. Never upgrade to Verified without recorded measurement.

Blocked runtime mode

Skip rows that depend on measurement; mark explicitly.

Validation checklist

  • Every material listed
  • PBR sanity columns filled (sRGB albedo, linear data textures, OpenGL +Y normal for glTF)
  • Principled BSDF sockets verified by name (version-dependent sockets marked)
  • Texture budget compared to pinned cap
  • Consumer-stack compatibility and KHR extensions checked
  • Per-material verdict assigned (Pass / Warn / Fail, kept separate from truth states)
  • Top-line status derived from rows
  • Worst offenders highlighted
  • Remediation hints advisory only (no material edits performed)
  • Honest downgrade-only evidence label (Artifact status: Not Produced default without concrete output evidence)

Pass / Warn / Fail rubric

VerdictCriteria
PassAll materials pass sanity + budget + consumer compatibility; no Warns escalating to Fail.
WarnOne or more materials have plausibility flags (white albedo, edge metallic) but no hard violations.
FailAny material exceeds texture budget, uses unsupported features for chosen export, or violates per-tier caps.

Failure handling

  • Missing texture file → Fail with path note.
  • Invented values without measurement → refuse; produce empty rows + ask for plan or measurement.
  • User pushes for "Pass" without checks → restate requirement, do not relabel.

Troubleshooting

ProblemResponse
Material visible in viewport but missing from listConfirm linked vs appended status; re-check measured scene snapshot.
Roughness, metallic, normal, or AO texture looks wrongVerify color space is linear (not sRGB); add Warn/Fail with remediation hint.
Normal map looks inverted in glTF viewerVerify OpenGL (+Y up) convention; add Warn until convention confirmed.
GLB export fails or drops material featuresCheck for OSL custom shaders, unbaked procedural nodes (noise, wave, voronoi), or drivers on material values; add Fail with node/driver names.
KHR extension appearance missing in target viewerConfirm consumer support for unlit, transmission, volume, ior, specular, clearcoat, emissive_strength, anisotropy, iridescence, or variants.
Value lands on the wrong shader inputSocket was resolved by index across Blender versions; re-resolve Principled BSDF inputs by name.

Best practices

  • Pair every Fail with the rule that triggered it.
  • Mark Warn rows that escalate to Fail when consumer is mobile (e.g. 4K texture warns on desktop, fails on mobile).
  • Cite consumer stack in every verdict.
  • Resolve Principled BSDF inputs by name across Blender versions; never by position.
  • Keep this skill narrow — do not creep into lighting or composition.

Good examples

  • "Albedo (0.04, 0.04, 0.04), Roughness 0.4 (linear), Metallic 0, ORM packed 1024², GLB-compatible. Verdict: Pass."

Bad examples

  • "Materials look fine." — no per-material rows, no verdicts.
  • "Verified PBR" — without a sanity rule cited.

User-facing response template

Consumer target: <Cycles / Eevee / glTF mobile / glTF desktop>
Texture budget cap: <N MP total>

| Material | Type | Albedo | Normal | Rough/Met | Tex count + res | Consumer | Verdict | Notes |
|---|---|---|---|---|---|---|---|---|
| <name> | PBR | <state> | <state> | <state> | <N x Wpx> | <ok/warn/fail> | Pass/Warn/Fail | <note> |

Top-line: <Pass / Warn / Fail>
Worst offenders: <list 1-2>
Remediation hints: <advisory hints per Fail/Warn row, no edits performed>
Runtime status: <Not Run | Attempted | Produced | Verified | Failed>
Artifact status: <Not Produced | Produced | Verified | Failed>
Evidence used: <links, paths, logs, or "none">
Limitations: <gaps>
Next: <scene-readiness | render-export-evidence | glb-web-handoff | lighting-material-plan>

Anti-patterns

  • Performing material edits inside this skill.
  • Inventing values to make rows pass.
  • Resolving shader sockets by index instead of by name.
  • Assuming a Principled socket exists on every Blender version.
  • Marking Verified without measurement.
  • Mixing lighting / composition checks here.

Cross-skill handoff

<!-- blendops:generated:start handoffs -->
  • [retry] Upstream lookdev & material planning → ../lighting-material-plan/SKILL.md
  • [upstream_reference] Mobile/web texture budget definition → ../mobile-glb-budget/SKILL.md
  • [progression] Broad readiness review → ../scene-readiness/SKILL.md
  • [progression] Lighting validation → ../lighting-quality-checker/SKILL.md
  • [progression] Composition validation → ../composition-quality-checker/SKILL.md
  • [progression] Polycount budget → ../polycount-budget-checker/SKILL.md
  • [progression] Render / GLB export evidence → ../render-export-evidence/SKILL.md
  • [progression] Web handoff → ../glb-web-handoff/SKILL.md
<!-- blendops:generated:end handoffs -->

Non-goals

  • Edit materials.
  • Generate shader code.
  • Replace scene-readiness (this skill is one of its inputs).
  • Run Blender.

References

  • references/pbr-sanity-rules.md
  • references/texture-budget-rules.md
  • references/consumer-stack-rules.md
  • ../../laws/evidence-before-done.md
  • ../../docs/skill-system.md

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.