Skip to content

MLD305: Asset path exists only under a case-only mismatch on a case-sensitive target

qual reports MLD305 when a relative literal path passed to SVGMobject() / ImageMobject() matches no file exactly, but one of Manim's extension-augmented search candidates matches an existing file case-insensitively — for render profiles whose target platform is case-sensitive (platform = "linux").

  • Default severity: warning
  • Minimum confidence: high
  • Implementation phase: 4
  • Fix: none (the correction cannot map 1:1 back onto the literal)

The scan follows exactly Manim's search order: working directory, then assets_dir, then assets_dir with the known extensions appended (.svg for SVGMobject; .jpg .jpeg .png .gif .ico for ImageMobject). A case-insensitive development filesystem (macOS, Windows) masks the mismatch locally — the render then fails only on the case-sensitive target platform, typically CI.

The two case scans split by specificity so one span carries one finding (DESIGN 7.3 prose): a literal-level mismatch — where the literal itself rewrites 1:1 to the on-disk case — is MLR104's finding, which carries the SAFE case correction. This rule covers the extension-augmented candidates that scan cannot map back onto the literal. Windows-style literals, ~ paths, absolute paths, non-literals, and case-insensitive target platforms stay silent. A case-only mismatch whose affected profiles all target case-insensitive platforms (windows/macos) is silent under both rules: the declared renders resolve the file as written, so there is no failure to report.

Wrong (target platform linux, on-disk file assets/icon.svg):

SVGMobject("ICON")     # assets/ICON.svg only matches case-insensitively
ImageMobject("Picture")  # assets/picture.png exists, Picture.png does not

Right:

SVGMobject("icon")             # assets/icon.svg found via extensions
ImageMobject("assets/picture.png")