Rule catalog¶
qual defines 92 rule IDs in four families, and all 92 are
implemented. The authoritative catalog definition is
DESIGN.md section 7.
One implemented rule is opt-in: MLP225 has default_enabled: false and
the capabilities cost-report + local-fork-overlay — its home is the
cost command's fork fast-path section under a local-fork knowledge
profile, and only an exact --select MLP225 evaluates it in check.
Rule selection controls diagnostics only. The
StaticFacts v0 public semantic projection
emitted by qual static-facts requests all facts in its contract independently of --select,
--ignore, suppressions, confidence thresholds, and baselines. Renderer risk
facts in that projection are static evidence, not new diagnostics and not
permission to skip or fork rendering.
Columns:
- Default severity —
error/warning/info; what the rule reports unless configuration changes it. - Min confidence — the lowest confidence (
certain/high/medium/low) at which the rule is allowed to fire. Individual diagnostics can carry a higher confidence than this floor, never a lower one. - Implemented IDs link to their full documentation, which is also available
as
qual explain <ID>.
MLC — lifecycle / correctness (31 implemented, 0 reserved)¶
| ID | Status | Default severity | Min confidence | Summary | Blocked on |
|---|---|---|---|---|---|
| MLC000 | implemented | error | certain | Python source cannot be parsed | |
| MLC001 | implemented | warning | certain | Invalid or unknown inline suppression comment | |
| MLC101 | implemented | error | certain | Scene.play requires at least one animation | |
| MLC102 | implemented | error | high | Scene.play argument cannot be converted to an Animation | |
| MLC103 | implemented | error | certain | Bound mobject method passed to Scene.play (pre-0.6 API) | |
| MLC104 | implemented | error | certain | Literal non-positive run_time or wait duration | |
| MLC105 | implemented | error | high | Updater callback cannot bind to Manim's positional invocation | |
| MLC106 | implemented | error | certain | wait() combines stop_condition with frozen_frame=True | |
| MLC107 | implemented | error | high | MoveToTarget without generate_target() on any path | |
| MLC108 | implemented | warning | high | Two animations in one play write the same channel of the same mobject | |
| MLC109 | implemented | error | certain | AnimationGroup / Succession constructed without animations | |
| MLC110 | implemented | error | certain | Mobject.add(self) or a proven parent cycle | |
| MLC111 | implemented | info | medium | Updater-bearing object is in neither the scene family nor an animation | |
| MLC112 | implemented | warning | high | Default wait() freezes while a frame-varying one-argument updater is active | |
| MLC113 | implemented | error | certain | Animation kwargs passed after a .animate method access | |
| MLC114 | implemented | error | high | Unsupported .animate method chain containing an override animation | |
| MLC115 | implemented | warning | high | Scene.remove(child) is undone by re-adding the surviving parent | |
| MLC116 | implemented | info | medium | Later operations confuse post-Transform source/target identity with scene membership | |
| MLC117 | implemented | warning | high | Mobject changed between .animate builder creation and play | |
| MLC118 | implemented | info | medium | Normal animation targets a mobject with an active updater and the suspend/resume state divergence is provable | |
| MLC119 | implemented | error | high | Scene.replace(old, new) with old definitely not in the scene | |
| MLC120 | implemented | error | high | Restore without save_state() on any path | |
| MLC121 | implemented | error | high | Scene.play / wait / pause called from a per-frame callback | |
| MLC122 | implemented | error | high | ApplyMethod receives a method call result, not the bound method | |
| MLC123 | implemented | error | high | ApplyFunction callback returns no mobject on some path | |
| MLC124 | implemented | warning | high | .animate chains a method that does not mutate the target | |
| MLC125 | implemented | warning | high | remove_updater callback identity matches no registered updater | |
| MLC126 | implemented | error | high | Family child is not a Mobject, or not a VMobject in a VGroup | |
| MLC127 | implemented | info | certain | Duplicate child passed twice in one add() / VGroup() / Group() | |
| MLC128 | implemented | error | high | Scene subclass __init__ never calls super().__init__() | |
| MLC129 | implemented | warning | medium | play(..., lag_ratio=...) does not stagger multiple animations |
MLR — rendering / renderer compatibility (27 implemented, 0 reserved)¶
| ID | Status | Default severity | Min confidence | Summary | Blocked on |
|---|---|---|---|---|---|
| MLR101 | implemented | error | high | Create/Write-style animations require a vectorized (VMobject) target | |
| MLR102 | implemented | warning | high | Bare .animate without a method call is played; the animation changes nothing |
|
| MLR103 | implemented | error | high | Python escape in a non-raw Tex/MathTex literal corrupts a TeX command | |
| MLR104 | implemented | error | high | Literal asset path does not resolve in the render search path | |
| MLR105 | implemented | error | high | MarkupText literal contains provably invalid Pango markup | |
| MLR106 | implemented | error | high | Literal NaN/inf flows into mobject geometry | |
| MLR107 | implemented | warning | high | API/mobject is unsupported under a renderer this run targets | |
| MLR108 | implemented | warning | high | Object treated as still visible after a renderer-divergent remove_fixed_* call | |
| MLR109 | implemented | warning | medium | Updater read-after-write ordering makes a one-frame lag definite | |
| MLR110 | implemented | error | high | Literal TeX has a definite brace/environment imbalance | |
| MLR111 | implemented | warning | high | Scene updater mutates a mobject; the change may escape Cairo's moving scope | |
| MLR112 | implemented | warning | high | Raw .points access assumes one renderer's fixed points-per-curve layout |
|
| MLR113 | implemented | info | high | Transform source and target are the same object | |
| MLR114 | implemented | error | high | Literal points array is not N x 3 | |
| MLR115 | implemented | error | certain | Literal font_size is zero or negative | |
| MLR116 | implemented | error | high | add_line_to/close_path on a provably empty path raises at render time | |
| MLR117 | implemented | error | high | register_font() context manager is called without with |
|
| MLR118 | implemented | warning | high | Project SVG uses unsupported text/image/filter/mask/clipPath or an unresolved href | |
| MLR119 | implemented | error | high | MovingCameraScene is incompatible with the OpenGL renderer this run targets | |
| MLR120 | implemented | warning | high | focal_distance camera setter has no effect under the OpenGL renderer | |
| MLR121 | implemented | warning | high | shift(OUT)/set_z has no effect in a 2D Cairo scene; use set_z_index | |
| MLR122 | implemented | warning | high | bring_to_front is defeated by a lower z_index | |
| MLR123 | implemented | error | high | OpenGL-only mesh mobject is added to a scene under a Cairo-target profile | |
| MLR124 | implemented | warning | high | Text() literal contains Pango markup that plain Text renders verbatim | |
| MLR125 | implemented | info | high | Bare Mobject() leaf added to the scene displays nothing | |
| MLR126 | implemented | error | high | Literal opacity outside [0, 1] or negative stroke width | |
| MLR127 | implemented | warning | high | Literal by-tex key cannot occur in the MathTex literal |
MLP — performance (27 implemented, 0 reserved)¶
| ID | Status | Default severity | Min confidence | Summary | Blocked on |
|---|---|---|---|---|---|
| MLP201 | implemented | warning | high | Expensive Text/TeX/SVG/Surface construction inside a per-frame callback | |
| MLP202 | implemented | warning | high | copy/become/align of a confirmed-large mobject inside a per-frame callback | |
| MLP203 | implemented | info | high | Family-walk query of a confirmed-large mobject inside a per-frame callback | |
| MLP204 | implemented | warning | high | Scene graph grows with a fresh mobject every frame inside an updater | |
| MLP205 | implemented | warning | high | wait(frozen_frame=False) re-renders provably identical frames | |
| MLP206 | implemented | warning | certain | Literal play duration shorter than one frame is clamped | |
| MLP207 | implemented | info | medium | Transform whose confirmed family size or curve insertion is large at begin | |
| MLP208 | implemented | info | high | Transform of a large Text/MathTex family (copy + align + per-glyph interpolation) | |
| MLP209 | implemented | info | medium | Animated or updater-bearing object early in Cairo's display order re-rasterizes a large static suffix | |
| MLP210 | implemented | info | medium | Fixed-count loop issues many short sequential plays | |
| MLP211 | implemented | info | medium | Large per-frame allocation inside a per-frame callback | |
| MLP212 | implemented | info | medium | Long animation of a full-screen translucent object or layer | |
| MLP213 | implemented | info | medium | Calibrated workload / renderer mismatch (e.g. a large Cairo 3D Surface) | |
| MLP214 | implemented | info | high | Serial distinct TeX compile keys the local fork could precompile in parallel | |
| MLP215 | implemented | warning | high | Provably no-op updater widens dynamic waits or the play moving scope | |
| MLP216 | implemented | info | medium | always_redraw rebuilds identical curated topology every frame | |
| MLP217 | implemented | warning | high | Frame-varying use_svg_cache=True key in a hot callback grows the process-global cache every frame | |
| MLP218 | implemented | info | high | Provably frame-invariant updater is the only reason a wait renders dynamically | |
| MLP219 | implemented | info | medium | Updater's estimated lifetime spans many subsequent plays | |
| MLP220 | implemented | warning | high | TracedPath without dissipating_time accumulates over a long span | |
| MLP221 | implemented | warning | high | Literal t_range/x_range step proves an excessive sample count | |
| MLP222 | implemented | warning | high | ImageMobject re-rasterized every frame inside Cairo's moving suffix | |
| MLP223 | implemented | info | high | Fully transparent stroke keeps a positive width that is processed every frame | |
| MLP224 | implemented | info | high | point_from_proportion on a confirmed-long path inside a per-frame callback | |
| MLP225 | implemented (opt-in) | info | high | Cost-report-only explanation of features that block local-fork fast paths | |
| MLP226 | implemented | warning | high | Frame-varying Text/TeX cache key inside a per-frame callback | |
| MLP227 | implemented | warning | high | always_update_mobjects=True dynamicizes a provably static wait |
MLD — determinism / portability (7 implemented, 0 reserved)¶
| ID | Status | Default severity | Min confidence | Summary | Blocked on |
|---|---|---|---|---|---|
| MLD301 | implemented | warning | high | Updater applies a fixed per-frame step without dt scaling (FPS-dependent motion) | |
| MLD302 | implemented | warning | medium | Unseeded global random state read inside a frame callback | |
| MLD303 | implemented | warning | high | Literal asset path syntax does not match the profile platform | |
| MLD304 | implemented | warning | medium | Renderer-divergent membership effect reached without a guard in a multi-renderer run | |
| MLD305 | implemented | warning | high | Asset path matches an existing file only case-insensitively on a case-sensitive target platform | |
| MLD306 | implemented | info | high | Literal font is not in the profile's allowed-fonts list | |
| MLD307 | implemented | warning | medium | Wall-clock, filesystem, or network call inside a frame callback |