Repository navigation
Commit c4cd7b4
fix: correct the inverted EEVEE engine id and close the coverage gap that hid it (#204)
* fix: correct the inverted EEVEE engine id in shipping-crate
eevee_engine_id() keyed on >= (4, 2, 0) and returned 'BLENDER_EEVEE_NEXT'
for every version at or above it. Blender 5.x reclaimed the plain
'BLENDER_EEVEE' id and no longer offers 'BLENDER_EEVEE_NEXT', so the
--output path died on 5.1 and 5.2:
TypeError: bpy_struct: item.attr = val: enum "BLENDER_EEVEE_NEXT" not
found in ('BLENDER_EEVEE', 'BLENDER_WORKBENCH', 'CYCLES')
Smoke stayed green because smoke never passes --output.
The correct mapping is already witnessed in the tree: examples/swatch-grid
asserts both the chosen id and the other era's id against the running
build. Use its form and name it as the source, per the copied-not-imported
convention the hygiene helpers already follow.
shipping-crate is the pilot piece the other 27 were modelled on, which is
how one inverted ternary propagated.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* fix: correct the inverted EEVEE engine id in iron-cauldron
Second copy of the same inversion, found by auditing every engine-id
mapping in the tree rather than by grepping for the one known bad file.
Audit method: extract every expression that yields a BLENDER_EEVEE* id and
evaluate it twice, against a stubbed bpy.app.version of (4, 5, 11) and
(5, 2, 1), then compare both results against the canonical mapping. 83
expressions across 85 files; two returned 'BLENDER_EEVEE_NEXT' for 5.2 —
shipping-crate and this one. Everything else was already correct.
Like shipping-crate, its --output path raised TypeError on 5.1 and 5.2 and
smoke could not see it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* test: assert every EEVEE engine-id mapping matches the canonical one
The render path is invisible to CI by construction: smoke runs the default
check path, and --output is exercised only at authoring time, on one
version, by the author. That is how an inverted engine id shipped twice.
tests/smoke/run_smoke.py already asserts the mapping against the running
build, but against its own copy of the helper. It cannot see the other
copies, and showcase and example scripts are standalone by convention, so
each carries its own. Eighty-four mappings across eighty-three files.
This checker closes that gap at zero render cost. It walks examples/,
showcase/, templates/, snippets/, scripts/ and tests/, and for every
function that resolves an EEVEE id it compiles and *calls* the function
twice against a stubbed bpy.app.version of (4, 5, 11) and (5, 2, 1);
conditional expressions yielding an id are evaluated the same way.
AST rather than regex, deliberately. A line-oriented regex misreads the
if/return form as two independent branches and flags
snippets/version-branch-skeleton.py, which is correct. Calling the code is
the only reading that cannot be fooled by formatting.
Resolver detection is narrow on purpose: only a body of returns and
version branches qualifies, so a main() that merely mentions the id is not
compiled and does not need the module's imports.
Three deliberately inverted mappings exist — swatch-grid, turntable and
gn-sdf-remesh each assert that the *other* era's id is rejected by the
build. Those now carry an explicit `# engine-id-exempt:` marker, so the
intent is stated in the source rather than inferred by the checker.
Canary-proven. With the shipping-crate inversion reintroduced:
ERROR: showcase/shipping-crate/shipping_crate.py:103 eevee_engine_id()
5.2.1->BLENDER_EEVEE_NEXT (want BLENDER_EEVEE)
RC=1
Reverted:
engine-id checks passed: 84 mapping(s) across 83 file(s), 3 exempt.
RC=0
Runs in validate.yml beside the other tests/ checkers. No smoke cost, no
blender-smoke.yml change.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* docs: require contact sheets and asset sheets for showcase pieces
showcase/README.md said nothing about either gate, and no showcase piece
has ever shipped one — all 44 contact sheets and all 4 asset sheets in
docs/gallery/ belong to examples. The gates live under CLAUDE.md
"Quality Gates for Example Runs", so the next author had to guess.
Both are now required, each on its own evidence rather than on symmetry.
Contact sheets have caught a real defect in showcase work: the first
sheets for crate-stack and stone-archway showed both wedge pools reading
as cool grey bands instead of the warm pool the house style calls for,
and both pieces were relit. Nothing else in the pipeline puts the still
beside its peers.
Asset sheets cover what nothing else here covers. Showcase is entirely
game props, which is exactly the scope docs/VISUAL-STYLE.md names for the
gate. Budgets measure geometry conformance; the contact sheet measures
staged presentation; neither removes the scene. The recorded evidence is
socket-attach-points, which passed every measurable floor on its first
draft (edge90 0.000, ten materials, no default names) and was still
judged bad by eye and rebuilt — "the floors scored the bevels, not the
design". That is precisely the failure a showcase budget cannot see.
Also records the exit-code collision: check_asset_quality returns 11,
which showcase numbering already spends on the collider ceiling, so call
sites remap rather than sharing a code.
Existing pieces are not retrofitted here; the backlog is filed separately.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* test: assert falsifiers fail the budget they target
Five falsifiers in the previous showcase run had to be retuned because
they tripped an earlier check instead of the budget they were built for.
A falsifier that exits non-zero on an earlier budget is red for the wrong
reason and proves nothing about its target, and the exit code is right
there to catch it.
Documents the rule in CONTRIBUTING.md and showcase/README.md, with
--off-circle replacing --flat-arch as the worked example: a lintel is
0.62 m shorter than the arch, so it failed the bounding box (exit 8) and
never reached the intrados circle fit (exit 19). Widening the bbox
tolerance would have destroyed a real budget to rescue a bad falsifier.
The rule is explicit that the fix is the model or the falsifier, never
the band.
tests/check_falsifier_targets.py enforces it in two modes, one checker
rather than a parallel harness:
- static (default, no Blender, runs in validate.yml): reads each piece's
falsifier table and asserts the flags are real argparse flags, the
declared exit codes appear in that piece's exit-code table, every
falsifier names a target budget, and no falsifier-shaped flag in the
script is undocumented. 160 falsifiers across 25 pieces.
- --run BLENDER: executes each falsifier and asserts the observed exit
equals the declared one. This is the mode that catches an ill-aimed
falsifier. One Blender launch per falsifier, about 150 s for the tree
on one version, so it is an authoring and cron tool rather than a
per-PR smoke step. No blender-smoke.yml change.
Table parsing is header-aware, not positional: wooden-ladder's four-column
"Falsifier | Budget violated | Exit | Measured failure" is as valid as the
three-column form, and an earlier positional regex silently read it as
having no exit column at all.
The bidirectional variant — requiring each exit-code row to name its
falsifier — was tried and dropped. It would have forced a format change
across 23 READMEs to state something the falsifier table's own target
column already carries.
cart, hay-bale and stone-well predate the convention and have no table.
They are listed explicitly in the checker and reported on every run; a new
piece without a table is an error rather than an entry in that list.
Canary-proven at runtime. Declaring --off-circle as targeting the bbox
budget:
MISMATCH stone-archway --off-circle: want 8, got 19
RC=1
Reverted:
ok stone-archway --off-circle: want 19, got 19
falsifier-target checks passed: 167 falsifier(s) across 25 pieces.
RC=0
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
* docs: record the measured runtime sweep cost
The estimate said roughly 150 s. Running the full sweep measured 276 s for
160 falsifiers across 25 showcase pieces on Blender 5.2.1, with zero
mismatches — every declared exit code is the one the falsifier actually
produces.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
---------
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>1 parent 48684a9 commit c4cd7b4
10 files changed
Lines changed: 669 additions & 5 deletions
File tree
- .github/workflows
- examples
- gn-sdf-remesh
- swatch-grid
- turntable
- showcase
- iron-cauldron
- shipping-crate
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
136 | 136 | | |
137 | 137 | | |
138 | 138 | | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
139 | 145 | | |
140 | 146 | | |
141 | 147 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
223 | 223 | | |
224 | 224 | | |
225 | 225 | | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
226 | 259 | | |
227 | 260 | | |
228 | 261 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
119 | | - | |
| 119 | + | |
120 | 120 | | |
121 | 121 | | |
122 | 122 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
265 | 265 | | |
266 | 266 | | |
267 | 267 | | |
268 | | - | |
| 268 | + | |
269 | 269 | | |
270 | 270 | | |
271 | 271 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
135 | 135 | | |
136 | 136 | | |
137 | 137 | | |
138 | | - | |
| 138 | + | |
139 | 139 | | |
140 | 140 | | |
141 | 141 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
48 | 60 | | |
49 | 61 | | |
50 | 62 | | |
| |||
164 | 176 | | |
165 | 177 | | |
166 | 178 | | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
167 | 219 | | |
168 | 220 | | |
169 | 221 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
115 | 115 | | |
116 | 116 | | |
117 | 117 | | |
118 | | - | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
119 | 126 | | |
120 | 127 | | |
121 | 128 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
101 | 101 | | |
102 | 102 | | |
103 | 103 | | |
104 | | - | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
105 | 112 | | |
106 | 113 | | |
107 | 114 | | |
| |||
0 commit comments