---
name: asset-style-check
description: Verify chosen assets share visual style (realism, detail, color treatment) before scene build; flag style drift between assets early.
---

# asset-style-check

## Purpose
Catch style mismatches between assets before they end up in the same scene where the inconsistency reads as compositing error.

## Quick start
- list every asset planned for the scene
- evaluate each on style axes (realism / detail / color / surface)
- flag drift between assets
- recommend remediation (drop / restyle / replace)

## When to use
- after `asset-license-checker` clears the assets
- before scene build
- when a scene preview shows visible style mismatch
- when assets come from multiple sources

## When not to use
<!-- blendops:generated:start exclusions -->
- single isolated asset where no multi-asset or scene-brief consistency check is requested → use `../asset-discovery/SKILL.md` (Delegates out-of-scope requests to asset-discovery)
- pure planning before candidate assets are picked → use `../asset-discovery/SKILL.md` (use asset-discovery)
- intentionally mixed-style art direction, ONLY when the locked brief explicitly specifies mixed styles → use `../asset-license-checker/SKILL.md` (Delegates out-of-scope requests to asset-license-checker)
- checking asset licenses (asset-license-checker), polygon/performance budgets (polycount-budget-checker), topology, or planning materials/lighting (blender-light → use `../asset-license-checker/SKILL.md` (lighting-material-plan)
<!-- blendops:generated:end exclusions -->

## Trigger phrases
<!-- blendops:generated:start triggers -->
- "do these assets fit together"
- "style check the assets"
- "scene feels like a collage"
<!-- blendops:generated:end triggers -->

## Prerequisites / readiness
- candidate asset list with previews sourced via `asset-discovery`
- all candidate assets cleared by `asset-license-checker`
- scene brief visual style locked (via `intent-to-3d-brief-writer` if needed)
- target scene quality bar set

## Input schema

### Required inputs

| Input | Why it is required |
|---|---|
| Asset list with previews | Subject of the check |
| Brief style locked | Reference for consistency |

### Optional inputs

| Input | Use |
|---|---|
| Reference image / mood board | Style baseline |
| Existing scene preview | Real-world consistency check |

### Assumptions to confirm
- Brief style is unambiguous.
- Asset previews are representative of final use.

## Output schema

### Primary output
A per-asset row table containing: asset name, realism axis, detail axis, color axis, surface axis, drift verdict (`None | Minor | Major`), validation verdict (`Pass | Warn | Fail`), and remediation hint (`none | drop | restyle | replace`).

### Secondary output
- top-line scene consistency verdict (`Pass | Warn | Fail`)
- summary list of assets to drop, restyle, or replace
- downstream handoff routing
- evidence and truth-state block (kept strictly separate from `Pass | Warn | Fail` validation verdicts)

### Evidence / caveat output

```txt
Runtime status: Not Run | Attempted | Produced | Verified | Failed
Artifact status: Not Produced | Produced | Verified | Failed (default: Not Produced)
Evidence used: <links, paths, logs, or "none">
Limitations: <known gaps>

```

Note: Truth states are downgrade-only (never upgrade without verified evidence) and remain strictly separate from per-asset `Pass | Warn | Fail` validation verdicts.

## 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

Validation-only skill — never modifies or re-styles assets, and never executes Blender or Python. Per-asset verdicts (`Pass | Warn | Fail`) and drift classifications (`None | Minor | Major`) are derived solely from documented asset previews and the locked style brief, and are tracked separately from runtime/artifact truth states (which default to `Not Produced` for artifacts and are downgrade-only).

## Operating procedure
1. Confirm the asset list is sourced from `asset-discovery` and cleared by `asset-license-checker`.
2. Read the locked brief style baseline (if missing or ambiguous, hand off to `intent-to-3d-brief-writer`).
3. For each asset, evaluate all 4 style axes (`realism`, `detail`, `color`, `surface`) against the locked brief (see `references/style-axes.md`).
4. Assign a drift verdict (`None | Minor | Major`) and a validation verdict (`Pass | Warn | Fail`) per asset row.
5. Provide remediation hints only (`drop | restyle | replace`) for any asset with `Minor` or `Major` drift — never modify or re-style the asset here.
6. Route approved rows (`Pass`) to `asset-library-plan` for organization and `scene-readiness` for broad scene review; route rejected rows (`Fail`) to `asset-fallback-strategy` or back to `asset-discovery`.

## Decision tree

```txt
Brief explicitly locks mixed-style art direction?
  → Evaluate each asset against its assigned role in the brief; allowed contrast = None drift (Pass row)
Asset matches brief baseline across all 4 axes (realism / detail / color / surface)?
  → Drift: None | Verdict: Pass | Remediation: none
Asset off on 1 axis?
  → Drift: Minor | Verdict: Warn | Remediation: restyle or drop (verify intent)
Asset off on 2+ axes, or clashes severely with hero asset?
  → Drift: Major | Verdict: Fail | Remediation: replace or drop (hand off to asset-fallback-strategy)
Two or more assets in the same scene have Major drift between them without explicit mixed-style brief?
  → Top-line Verdict: Fail; cannot combine without breaking visual hierarchy
```

## Playbooks

### Playbook A: All-realistic product hero
All assets realistic; same detail density; PBR materials. One stylized prop → drop or restyle.

### Playbook B: Stylized character + flat background
Character is stylized; background must be equally simplified. Detailed background asset → drop.

### Playbook C: Mixed-style intentional (collage / editorial)
Brief explicitly mixed-style; verify with brief; drift becomes feature, not bug.

## Mode handling

### Text-only mode

Evaluate rows from documented previews and metadata. Set `Runtime status: Not Run` and `Artifact status: Not Produced`.

### Runtime-ready mode

Evaluate rows using rendered scene preview snapshots alongside asset previews. Downgrade truth states if any preview is incomplete; never upgrade truth states beyond verified evidence.

### Blocked runtime mode

Skip rows that depend on a live rendered preview and mark limitations clearly. Keep `Runtime status: Not Run` (or `Failed` if attempted and blocked) and `Artifact status: Not Produced`.

## Validation checklist
- [ ] Every asset has a 4-axis row (`realism`, `detail`, `color`, `surface`) evaluated against the locked brief
- [ ] Every asset row includes both a drift verdict (`None / Minor / Major`) and a validation verdict (`Pass / Warn / Fail`)
- [ ] Top-line consistency verdict (`Pass / Warn / Fail`) is stated
- [ ] Remediation hints (`drop / restyle / replace`) are provided for any drift without modifying assets
- [ ] No license, polycount budget, or topology checks are mixed into the evaluation
- [ ] Runtime and artifact truth states (default `Not Produced`, downgrade-only) are reported separately from `Pass / Warn / Fail` verdicts

## Pass / Warn / Fail rubric

| Scope | Verdict | Criteria |
| --- | --- | --- |
| Per-asset row | Pass | Matches locked brief across all 4 axes (`realism`, `detail`, `color`, `surface`), or matches explicit mixed-style brief rule; drift is `None`. |
| Per-asset row | Warn | `Minor` drift on 1 axis against the locked brief; usable with a `restyle` or `drop` remediation hint. |
| Per-asset row | Fail | `Major` drift on 2+ axes against the locked brief; requires `replace` or `drop` via `asset-fallback-strategy`. |
| Top-line scene | Pass | All asset rows are `Pass` (or `Warn` with accepted remediation); locked brief style is respected. |
| Top-line scene | Warn | One or more assets show `Minor` drift (`Warn`), but no unresolved `Major` drift exists. |
| Top-line scene | Fail | Any asset has unresolved `Major` drift (`Fail`) or two+ assets clash, creating a visible collage error against the brief. |

Note: `Pass / Warn / Fail` validation verdicts measure style consistency only and must never be conflated with Runtime or Artifact truth states.

## Failure handling
- `Major` drift (`Fail` row) → recommend `replace` or `drop`; hand off rejected assets to `asset-fallback-strategy` or `asset-discovery`.
- Brief unclear or unlocked regarding visual style → stop evaluation and hand off to `intent-to-3d-brief-writer`.
- Claim that "mixed style is intentional" → accept ONLY if the locked brief explicitly specifies mixed styles; otherwise mark drift and hand off to `intent-to-3d-brief-writer` or `scope-guard`.

## Troubleshooting

| Problem | Response |
|---|---|
| Hard to tell style from preview | Request higher-quality preview; mark asset row `Warn` with limitation noted until clarified. |
| Style is on the boundary | Lock the style axis early against the brief; do not invite repeat boundary calls. |
| User changes style mid-scene | Treat as scope creep; hand off to `scope-guard`. |

## Best practices
- Lock style early; revisions are cheap pre-build.
- Always evaluate against the brief, not against vibe.
- Prefer 1 source for related assets to reduce drift risk.
- Keep this skill narrow — do not check license / budget / topology here.

## Good examples
- "`shoe-base.glb`: realism=realistic, detail=high, color=neutral, surface=PBR | Drift: `None` | Verdict: `Pass` | Remediation: `none`. `shoe-laces.glb`: realism=realistic, detail=high, color=neutral, surface=PBR | Drift: `None` | Verdict: `Pass` | Remediation: `none`. `shoe-environment-stylized.glb`: realism=stylized, detail=low, color=saturated, surface=flat | Drift: `Major` | Verdict: `Fail` | Remediation: `replace` via `asset-fallback-strategy`."

## Bad examples
- "Assets look like they go together." — no axis-by-axis verdict.

## User-facing response template

```txt
Brief style: <one line locked baseline>

| Asset | Realism | Detail | Color | Surface | Drift (None/Minor/Major) | Verdict (Pass/Warn/Fail) | Remediation (none/drop/restyle/replace) |
|---|---|---|---|---|---|---|---|

Top-line consistency: Pass / Warn / Fail
Assets to drop / restyle / replace: <list or "none">
Runtime status: Not Run | Attempted | Produced | Verified | Failed
Artifact status: Not Produced | Produced | Verified | Failed (default: Not Produced)
Evidence used: <links, paths, logs, or "none">
Limitations: <known gaps>
Next: asset-library-plan & scene-readiness (Pass) / asset-fallback-strategy (Fail)
```

## Anti-patterns
- "Vibe match" verdicts.
- Skipping the brief reference.
- Mixing license / budget / topology checks here.
- Inventing axis values.

## Cross-skill handoff
<!-- blendops:generated:start handoffs -->
- [upstream_reference] Upstream discovery → `../asset-discovery/SKILL.md`
- [upstream_reference] Upstream license gate → `../asset-license-checker/SKILL.md`
- [upstream_reference] Upstream brief lock → `../intent-to-3d-brief-writer/SKILL.md`
- [boundary_delegation] Scope enforcement → `../scope-guard/SKILL.md`
- [fallback] Rejected asset fallback → `../asset-fallback-strategy/SKILL.md`
- [progression] Approved asset organization → `../asset-library-plan/SKILL.md`
- [progression] Broad scene review → `../scene-readiness/SKILL.md`
- [progression] Material & lookdev boundary (lighting-material-plan) → `../lighting-material-plan/SKILL.md`
- [progression] Material & lookdev boundary (material-quality-checker) → `../material-quality-checker/SKILL.md`
- [progression] Budget & topology boundary → `../polycount-budget-checker/SKILL.md`
<!-- blendops:generated:end handoffs -->

## Non-goals
- Never modify or re-style assets.
- Never check asset licenses (belongs to `asset-license-checker`).
- Never check polycount budgets or mesh topology (belongs to `polycount-budget-checker`).
- Never execute Blender or Python code.

## References
- `references/style-axes.md`
- `references/drift-classification.md`
- `references/intentional-mixed-style.md`
- `../../docs/skill-system.md`
