Skip to content

fix(examples): give gn-bundle-roundtrip a falsifier that can fail - #408

Merged
TMHSDigital merged 1 commit into
mainfrom
fix/gn-bundle-falsifier
Oct 4, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
fix/gn-bundle-falsifier

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Closes #349.

Problem

The gn-bundle-roundtrip catalog falsifier expected exit 2 for --legacy-rna, but exit 2 meant four different things:

  • 5.x rejects the legacy node, which is the expected outcome;
  • the legacy node unexpectedly exists, meaning the contract broke;
  • the carrier mesh was rewritten;
  • argparse rejected an unknown flag.

So the row passed whether or not the contract held, and would have passed even if the flag were deleted.

Change

  • gn_bundle_roundtrip.py: the carrier-rewritten check moves to 6, the expected legacy-node rejection to 7, and an unexpectedly accepted legacy node to 8.
  • tests/smoke/catalog.json: expects 7.
  • tests/check_smoke_catalog.py: FORBIDDEN_EXITS now includes 2 (argparse usage). CLAUDE.md § Smoke and the checker docstring are updated to match.
  • README: the exit table, the failure list and the measured matrix are updated. The smoke line now states the catalog falsifier (this example's instance of examples: 60 of 64 READMEs say smoke 'does not pass' the flag CI actually runs as the falsifier #359).

Evidence

Proven by live run (--factory-startup --python-exit-code 1; binary reports 5.2.1 LTS):

Args Exit stderr
(none) 0
--legacy-rna 7 ERROR: RuntimeError: Error: Node type GeometryNodeCombineBundle undefined
--legacy-rnaX (simulated deleted flag) 2 error: unrecognized arguments: --legacy-rnaX

The old row (expect_exit: 2) would have accepted that last line.

Lint falsified: with the catalog row set back to expect_exit: 2, python tests/check_smoke_catalog.py prints ::error::catalog row 'gn-bundle-roundtrip' falsifier 0: expect_exit 2 must be an int other than 0, 1, 2, 77 and exits 1. Restored, it passes.

Not run locally:

  • The README's 5.0.1 and 5.1.2 columns were updated by inspection. The renumbered branch does not depend on the version.
  • 4.5 skips with exit 77, unchanged.
  • check_exit_code_readme.py, check_falsifier_targets.py and check_smoke_catalog.py pass.

🤖 Generated with Claude Code

The catalog falsifier expected exit 2 for --legacy-rna, but both outcomes
of that branch returned 2 (5.x rejects the legacy node, and the legacy node
unexpectedly exists), 2 also meant "carrier mesh rewritten", and argparse
exits 2 for an unknown flag. The row passed whether or not the contract
held, and would have passed with the flag deleted.

Each outcome now has its own code: 6 carrier rewritten, 7 legacy node
rejected (the catalog expectation), 8 legacy node accepted. The catalog
lint now rejects expect_exit 2 for every row, since a usage error can
always satisfy it.

Closes #349

Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added examples Runnable smoke-gated examples under examples/ documentation Improvements or additions to documentation labels Oct 4, 2026
@TMHSDigital

Copy link
Copy Markdown
Owner Author

CI evidence before merge: all checks pass ( 13 pass ). Blender Smoke on PR head: Blender 5.2.2 LTS / Blender 4.5.14 LTS. Summaries (happy path; falsifiers) per leg: 143 passed, 1 skipped, 0 failed;142 passed, 0 skipped, 0 failed;141 passed, 3 skipped, 0 failed;136 passed, 6 skipped, 0 failed;

@TMHSDigital
TMHSDigital merged commit 9548e80 into main Oct 4, 2026
13 checks passed
@TMHSDigital
TMHSDigital deleted the fix/gn-bundle-falsifier branch October 4, 2026 23:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation examples Runnable smoke-gated examples under examples/

Projects

None yet

Development

Successfully merging this pull request may close these issues.

testing: gn-bundle-roundtrip catalog falsifier cannot fail (both branches return 2, which is also argparse's code)

1 participant