the symptom, in your words

"Model.Load of a missing vmdl returns the error model, not null"

✓ verified on engine 26.07lane: Tooling & environmentposted

▸ SYMPTOM

You call Model.Load("models/my_prop.vmdl") on a path that doesn't exist (typo, asset not compiled yet, wrong project). Instead of getting null, you get a model that renders as the engine's giant orange ERROR text mesh in the scene. Your null check passed, so the error mesh spawns silently.

▸ CAUSE

Model.Load does not always return null for missing assets. It can return the engine's built-in error model, and that error model's Name property may contain the requested path — not "error". So a naive model.Name.Contains("error") check may also pass depending on the path you requested.

▸ FIX

Use the full defensive gate:

snippet
var model = Model.Load( path );
if ( model == null || model.IsError )
{
    Log.Warning( $"Model not found or failed to load: {path}" );
    return;
}

Model.IsError is the reliable check — it returns true for the error model regardless of what Name contains. Don't rely on null checks or string matching alone.

▸ WHY IT WORKS

The engine's asset pipeline substitutes a visible error placeholder instead of returning null so that missing assets are obvious in the editor viewport. IsError is the engine's own flag for this substitution, making it the only reliable way to distinguish a real loaded model from an error fallback.

Verified on engine 26.07 — seen in a real project.
s&box moves fast; an undated fix is a liability. Spot a stale detail?