Exit codes#
Per-script sequential checks. 9 is a valid check code; there is no rule against it. 10 is the shared framing helper.
| Code | Meaning |
|---|
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage; also an active object existed after the data-API build |
| 3 | Custom ID property did not land |
| 4 | property_unset on a custom ID key did not TypeError, or it deleted the key |
| 5 | del did not report removal |
| 6 | Keep lamp lost the ID property |
| 7 | Clear lamp still has the ID property (--skip-delete / --unset-instead land here) |
| 8 | Registered-prop contract broke: attribute/property_unset failed, the prop sits on the wrong side of the 5.0 ID-property split, or scene["name"] raised KeyError (--subscript-registered on 5.0+; exits 0 on 4.5, where subscript access still works) |
| 10 | Gallery framing violation |
| 12 | --output produced no file |
-The blender-smoke workflow runs the check on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron, the needs-5.1 PR label, or manual dispatch). Smoke does not pass --output or --unset-instead. Its catalog falsifiers are --skip-delete (expects exit 7); --subscript-registered (expects exit 8; 5.0+ only; SKIP on older Blender).
+The blender-smoke workflow runs the check on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron, the needs-5.1 PR label, or manual dispatch). Smoke does not pass --output. Its catalog falsifiers are --skip-delete (expects exit 7); --unset-instead (expects exit 7); --subscript-registered (expects exit 8; 5.0+ only; SKIP on older Blender).
Source
diff --git a/docs/gallery/gn-modifier-inputs/index.html b/docs/gallery/gn-modifier-inputs/index.html
index 153209fe..c4696771 100644
--- a/docs/gallery/gn-modifier-inputs/index.html
+++ b/docs/gallery/gn-modifier-inputs/index.html
@@ -84,7 +84,7 @@
diff --git a/docs/gallery/gn-sim-fountain/index.html b/docs/gallery/gn-sim-fountain/index.html
index 15c5aa1a..2f28b277 100644
--- a/docs/gallery/gn-sim-fountain/index.html
+++ b/docs/gallery/gn-sim-fountain/index.html
@@ -84,7 +84,7 @@ FalsifiersExit codes#
Per-script sequential checks. 10 is the shared framing helper.
| Code | Meaning |
|---|
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage |
| 3 | Point count or frame-start state off the launch data |
| 4 | Stepped frames off the closed-form arc (position or velocity) |
| 5 | Direct jump did not reproduce the one-step trap |
| 6 | After the cache fill, random-access frames off the arc (or fill not FINISHED) |
| 10 | Gallery framing violation |
| 12 | --output produced no file |
-The blender-smoke workflow runs the check on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron, the needs-5.1 PR label, or manual dispatch). Smoke does not pass --output or any falsifier.
+The blender-smoke workflow runs the check on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron, the needs-5.1 PR label, or manual dispatch). Smoke does not pass --output. Its catalog falsifiers are the three in the table above: --euler (expects exit 4), --prebake-trap (expects exit 5) and --calc-to-frame (expects exit 6).
Source
diff --git a/docs/gallery/gn-zone-iterate/index.html b/docs/gallery/gn-zone-iterate/index.html
index f2b6ec6d..ac1ead1e 100644
--- a/docs/gallery/gn-zone-iterate/index.html
+++ b/docs/gallery/gn-zone-iterate/index.html
@@ -77,7 +77,7 @@ Run
Exit codes#
Per-script sequential checks. 9 is a valid check code; there is no rule against it. 10 is the shared framing helper.
| Code | Meaning |
|---|
| 0 | Success |
| 1 | Uncaught exception (FATAL wrapper) |
| 2 | argparse / usage; also carrier mesh was rewritten |
| 3 | Repeat evaluated vert/face count off closed form |
| 4 | Repeat X-centers off closed form |
| 5 | For Each evaluated vert/face count off closed form |
| 6 | For Each Z-centers off closed form |
| 10 | Gallery framing violation |
| 12 | --output produced no file |
-The blender-smoke workflow runs the check on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron, the needs-5.1 PR label, or manual dispatch). Smoke does not pass --output, --no-offset, or --unpair-foreach. Its catalog falsifier is --unpair-repeat (expects exit 3).
+The blender-smoke workflow runs the check on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron, the needs-5.1 PR label, or manual dispatch). Smoke does not pass --output. Its catalog falsifiers are --unpair-repeat (expects exit 3), --no-offset (expects exit 4), --unpair-foreach and --foreach-main (each expects exit 5).
Source
diff --git a/examples/coincident-vert-weld/README.md b/examples/coincident-vert-weld/README.md
index c417560d..8eca3cb4 100644
--- a/examples/coincident-vert-weld/README.md
+++ b/examples/coincident-vert-weld/README.md
@@ -88,4 +88,4 @@ against it.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
-Smoke does not pass `--weld`. Its catalog falsifier is `--no-duplicate` (expects exit 3).
+Its catalog falsifiers are `--no-duplicate` (expects exit 3) and `--weld` (expects exit 4).
diff --git a/examples/cross-version-property-delete/README.md b/examples/cross-version-property-delete/README.md
index 2335c7cb..e33ac6e0 100644
--- a/examples/cross-version-property-delete/README.md
+++ b/examples/cross-version-property-delete/README.md
@@ -90,4 +90,4 @@ against it. `10` is the shared framing helper.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
-Smoke does not pass `--output` or `--unset-instead`. Its catalog falsifiers are `--skip-delete` (expects exit 7); `--subscript-registered` (expects exit 8; 5.0+ only; SKIP on older Blender).
+Smoke does not pass `--output`. Its catalog falsifiers are `--skip-delete` (expects exit 7); `--unset-instead` (expects exit 7); `--subscript-registered` (expects exit 8; 5.0+ only; SKIP on older Blender).
diff --git a/examples/exit-pre-sidecar/README.md b/examples/exit-pre-sidecar/README.md
index 486b3bab..07b50876 100644
--- a/examples/exit-pre-sidecar/README.md
+++ b/examples/exit-pre-sidecar/README.md
@@ -96,4 +96,6 @@ against it. `77` is the smoke skip protocol, not a product check.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS (5.1 on the
weekly cron, the `needs-5.1` PR label, or manual dispatch) and skips on 4.5
-LTS. Smoke does not pass the falsifier flags.
+LTS. Every falsifier in the table above is a catalog falsifier: the harness
+must fail the sidecar for `--atexit-instead`, `--no-handler`, `--silent-handler`,
+`--wrong-text` and `--write-in-main`. Smoke does not pass `--force-run`.
diff --git a/examples/gn-bundle-roundtrip/README.md b/examples/gn-bundle-roundtrip/README.md
index 5bacf994..fa6bd5f7 100644
--- a/examples/gn-bundle-roundtrip/README.md
+++ b/examples/gn-bundle-roundtrip/README.md
@@ -102,5 +102,6 @@ Measured on 4.5.11 / 5.0.1 / 5.1.2 / 5.2.1:
The `blender-smoke` workflow runs the check on Blender 5.2 LTS (5.1 on the
weekly cron, the `needs-5.1` PR label, or manual dispatch) and skips on 4.5
-LTS. Its catalog falsifier is `--legacy-rna` (expects exit 7). Smoke does
-not pass `--bypass`, `--mismatch`, `--mismatch-mark`, or `--force-run`.
+LTS. Its catalog falsifiers are `--legacy-rna` (expects exit 7), `--mismatch`
+(expects exit 3), `--bypass` (expects exit 4) and `--mismatch-mark` (expects
+exit 5). Smoke does not pass `--force-run`.
diff --git a/examples/gn-modifier-inputs/README.md b/examples/gn-modifier-inputs/README.md
index 324803bf..921532a4 100644
--- a/examples/gn-modifier-inputs/README.md
+++ b/examples/gn-modifier-inputs/README.md
@@ -75,7 +75,7 @@ against it. `10` is the shared framing helper.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
-Smoke does not pass `--output` or `--api dict`/`rna`. Its catalog falsifier is `--same-height` (expects exit 7).
+Smoke does not pass `--output`. Forcing the RNA path is not smoke-tested (it raises on 4.5 and is the default on 5.2). Its catalog falsifiers are `--same-height` (expects exit 7) and `--api dict` (expects exit 5; 5.2+ only, where the dict write raises; SKIP on older Blender, where it exits 0).
## Falsification
diff --git a/examples/gn-sim-fountain/README.md b/examples/gn-sim-fountain/README.md
index 5b3f2b9a..b9d329a3 100644
--- a/examples/gn-sim-fountain/README.md
+++ b/examples/gn-sim-fountain/README.md
@@ -106,4 +106,4 @@ Per-script sequential checks. `10` is the shared framing helper.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
-Smoke does not pass `--output` or any falsifier.
+Smoke does not pass `--output`. Its catalog falsifiers are the three in the table above: `--euler` (expects exit 4), `--prebake-trap` (expects exit 5) and `--calc-to-frame` (expects exit 6).
diff --git a/examples/gn-zone-iterate/README.md b/examples/gn-zone-iterate/README.md
index 308f1d77..4289cfb4 100644
--- a/examples/gn-zone-iterate/README.md
+++ b/examples/gn-zone-iterate/README.md
@@ -69,4 +69,4 @@ against it. `10` is the shared framing helper.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
-Smoke does not pass `--output`, `--no-offset`, or `--unpair-foreach`. Its catalog falsifier is `--unpair-repeat` (expects exit 3).
+Smoke does not pass `--output`. Its catalog falsifiers are `--unpair-repeat` (expects exit 3), `--no-offset` (expects exit 4), `--unpair-foreach` and `--foreach-main` (each expects exit 5).
diff --git a/examples/ngon-triangulate/README.md b/examples/ngon-triangulate/README.md
index 37520ee4..800e2f57 100644
--- a/examples/ngon-triangulate/README.md
+++ b/examples/ngon-triangulate/README.md
@@ -110,4 +110,4 @@ against it.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
-Smoke does not pass `--skip-triangulate`. Its catalog falsifier is `--no-dissolve` (expects exit 3).
+Its catalog falsifiers are `--no-dissolve` (expects exit 3) and `--skip-triangulate` (expects exit 4).
diff --git a/examples/unapplied-scale-gltf/README.md b/examples/unapplied-scale-gltf/README.md
index f1557686..327ef111 100644
--- a/examples/unapplied-scale-gltf/README.md
+++ b/examples/unapplied-scale-gltf/README.md
@@ -92,4 +92,4 @@ against it.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
-Smoke does not pass `--bake`. Its catalog falsifier is `--identity` (expects exit 3).
+Its catalog falsifiers are `--identity` (expects exit 3) and `--bake` (expects exit 4).
diff --git a/examples/usd-export-evaluation-mode/README.md b/examples/usd-export-evaluation-mode/README.md
index ef426bf5..0bbf0ba6 100644
--- a/examples/usd-export-evaluation-mode/README.md
+++ b/examples/usd-export-evaluation-mode/README.md
@@ -71,4 +71,4 @@ against it. `10` is the shared framing helper.
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
-Smoke does not pass `--output` or `--evaluation-mode`. Its catalog falsifier is `--subdivision BEST_MATCH` (expects exit 4).
+Smoke does not pass `--output`. Its catalog falsifiers are `--subdivision BEST_MATCH` (expects exit 4) and `--evaluation-mode VIEWPORT` (expects exit 4).
diff --git a/tests/smoke/catalog.json b/tests/smoke/catalog.json
index 5d2b2df2..45884786 100644
--- a/tests/smoke/catalog.json
+++ b/tests/smoke/catalog.json
@@ -15,7 +15,7 @@
{"name": "shader-node-group", "script": "examples/shader-node-group/shader_node_group.py", "falsifiers": [{"args": ["--same-tint"], "expect_exit": 6}]},
{"name": "temp-override-join", "script": "examples/temp-override-join/temp_override_join.py", "falsifiers": [{"args": ["--no-override"], "expect_exit": 3}]},
{"name": "gn-instance-grid", "script": "examples/gn-instance-grid/gn_instance_grid.py", "falsifiers": [{"args": ["--one-cell"], "expect_exit": 4}]},
- {"name": "gn-modifier-inputs", "script": "examples/gn-modifier-inputs/gn_modifier_inputs.py", "falsifiers": [{"args": ["--same-height"], "expect_exit": 7}]},
+ {"name": "gn-modifier-inputs", "script": "examples/gn-modifier-inputs/gn_modifier_inputs.py", "falsifiers": [{"args": ["--same-height"], "expect_exit": 7}, {"args": ["--api", "dict"], "expect_exit": 5, "min_version": "5.2"}]},
{"name": "shape-key-blend", "script": "examples/shape-key-blend/shape_key_blend.py", "falsifiers": [{"args": ["--zero-blend"], "expect_exit": 5}]},
{"name": "curve-bevel-arc", "script": "examples/curve-bevel-arc/curve_bevel_arc.py", "falsifiers": [{"args": ["--no-caps"], "expect_exit": 6}]},
{"name": "compositor-glare", "script": "examples/compositor-glare/compositor_glare.py", "falsifiers": [{"args": ["--threshold-high"], "expect_exit": 3}]},
@@ -57,15 +57,15 @@
{"name": "lightmap-uv-channel", "script": "examples/lightmap-uv-channel/lightmap_uv_channel.py", "falsifiers": [{"args": ["--overlap-islands"], "expect_exit": 7}]},
{"name": "socket-attach-points", "script": "examples/socket-attach-points/socket_attach_points.py", "falsifiers": [{"args": ["--skip-mpi"], "expect_exit": 3}]},
{"name": "vertex-color-ao", "script": "examples/vertex-color-ao/vertex_color_ao.py", "falsifiers": [{"args": ["--uniform-hemisphere"], "expect_exit": 3}]},
- {"name": "cross-version-property-delete", "script": "examples/cross-version-property-delete/cross_version_property_delete.py", "falsifiers": [{"args": ["--skip-delete"], "expect_exit": 7}, {"args": ["--subscript-registered"], "expect_exit": 8, "min_version": "5.0"}]},
- {"name": "usd-export-evaluation-mode", "script": "examples/usd-export-evaluation-mode/usd_export_evaluation_mode.py", "falsifiers": [{"args": ["--subdivision", "BEST_MATCH"], "expect_exit": 4}]},
- {"name": "gn-zone-iterate", "script": "examples/gn-zone-iterate/gn_zone_iterate.py", "falsifiers": [{"args": ["--unpair-repeat"], "expect_exit": 3}]},
- {"name": "gn-sim-fountain", "script": "examples/gn-sim-fountain/gn_sim_fountain.py", "falsifiers": [{"args": ["--unpair"], "expect_exit": 3}]},
+ {"name": "cross-version-property-delete", "script": "examples/cross-version-property-delete/cross_version_property_delete.py", "falsifiers": [{"args": ["--skip-delete"], "expect_exit": 7}, {"args": ["--subscript-registered"], "expect_exit": 8, "min_version": "5.0"}, {"args": ["--unset-instead"], "expect_exit": 7}]},
+ {"name": "usd-export-evaluation-mode", "script": "examples/usd-export-evaluation-mode/usd_export_evaluation_mode.py", "falsifiers": [{"args": ["--subdivision", "BEST_MATCH"], "expect_exit": 4}, {"args": ["--evaluation-mode", "VIEWPORT"], "expect_exit": 4}]},
+ {"name": "gn-zone-iterate", "script": "examples/gn-zone-iterate/gn_zone_iterate.py", "falsifiers": [{"args": ["--unpair-repeat"], "expect_exit": 3}, {"args": ["--no-offset"], "expect_exit": 4}, {"args": ["--unpair-foreach"], "expect_exit": 5}, {"args": ["--foreach-main"], "expect_exit": 5}]},
+ {"name": "gn-sim-fountain", "script": "examples/gn-sim-fountain/gn_sim_fountain.py", "falsifiers": [{"args": ["--unpair"], "expect_exit": 3}, {"args": ["--euler"], "expect_exit": 4}, {"args": ["--prebake-trap"], "expect_exit": 5}, {"args": ["--calc-to-frame"], "expect_exit": 6}]},
{
"name": "gn-bundle-roundtrip",
"script": "examples/gn-bundle-roundtrip/gn_bundle_roundtrip.py",
"min_version": "5.0",
- "falsifiers": [{"args": ["--legacy-rna"], "expect_exit": 7}]
+ "falsifiers": [{"args": ["--legacy-rna"], "expect_exit": 7}, {"args": ["--mismatch"], "expect_exit": 3}, {"args": ["--bypass"], "expect_exit": 4}, {"args": ["--mismatch-mark"], "expect_exit": 5}]
},
{
"name": "exit-pre-sidecar",
@@ -73,11 +73,11 @@
"min_version": "5.1",
"expect_sidecar": "$OUT/exit-pre-sidecar.sidecar",
"sidecar_contains": "exit_pre-ok",
- "falsifiers": [{"args": ["--atexit-instead"], "expect_sidecar_fail": true}]
+ "falsifiers": [{"args": ["--atexit-instead"], "expect_sidecar_fail": true}, {"args": ["--no-handler"], "expect_sidecar_fail": true}, {"args": ["--silent-handler"], "expect_sidecar_fail": true}, {"args": ["--wrong-text"], "expect_sidecar_fail": true}, {"args": ["--write-in-main"], "expect_sidecar_fail": true}]
},
- {"name": "ngon-triangulate", "script": "examples/ngon-triangulate/ngon_triangulate.py", "falsifiers": [{"args": ["--no-dissolve"], "expect_exit": 3}]},
- {"name": "unapplied-scale-gltf", "script": "examples/unapplied-scale-gltf/unapplied_scale_gltf.py", "falsifiers": [{"args": ["--identity"], "expect_exit": 3}]},
- {"name": "coincident-vert-weld", "script": "examples/coincident-vert-weld/coincident_vert_weld.py", "falsifiers": [{"args": ["--no-duplicate"], "expect_exit": 3}]},
+ {"name": "ngon-triangulate", "script": "examples/ngon-triangulate/ngon_triangulate.py", "falsifiers": [{"args": ["--no-dissolve"], "expect_exit": 3}, {"args": ["--skip-triangulate"], "expect_exit": 4}]},
+ {"name": "unapplied-scale-gltf", "script": "examples/unapplied-scale-gltf/unapplied_scale_gltf.py", "falsifiers": [{"args": ["--identity"], "expect_exit": 3}, {"args": ["--bake"], "expect_exit": 4}]},
+ {"name": "coincident-vert-weld", "script": "examples/coincident-vert-weld/coincident_vert_weld.py", "falsifiers": [{"args": ["--no-duplicate"], "expect_exit": 3}, {"args": ["--weld"], "expect_exit": 4}]},
{"name": "bake-normal-high-to-low", "script": "examples/bake-normal-high-to-low/bake_normal_high_to_low.py", "falsifiers": [{"args": ["--flat-source"], "expect_exit": 5}]},
{"name": "vse-linear-modifiers", "script": "examples/vse-linear-modifiers/vse_linear_modifiers.py", "falsifiers": [{"args": ["--assume-present"], "expect_exit": 4, "min_version": "5.2"}]},
{"name": "gn-socket-rename", "script": "examples/gn-socket-rename/gn_socket_rename.py", "falsifiers": [{"args": ["--legacy-ids"], "expect_exit": 5, "min_version": "5.2"}]},