Current: v0.88.0
Themes are listed in order. Shipped themes note the release they landed in (for reference, not a commitment); upcoming themes are intentionally not pinned to a version number, so shipping another example or skill never forces a roadmap renumber. The release pipeline derives the actual version from conventional-commit types.
| Theme | Skills | Rules | Templates | Snippets | Status |
|---|---|---|---|---|---|
| Foundation | 8 | 4 | 1 | 10 | Shipped (v0.1.0) |
| Materials, drivers, migration | 12 | 6 | 2 | 17 | Shipped (v0.2.0) |
| Examples and demos (smoke-gated) | 12 | 6 | 2 | 17 | Shipped (v0.3.0) |
| More examples (turntable, SDF remesh) | 12 | 6 | 2 | 17 | Shipped (v0.4.0) |
| 5.2 LTS targeting, GN modifier inputs | 12 | 6 | 2 | 17 | Shipped |
| VSE COLOR strip intrinsic size (undocumented 5.2) | 13 | 6 | 2 | 17 | Shipped |
| Modal operators, USD, mathutils | — | — | — | — | Upcoming |
| AI asset pipeline: post-generation cleanup | 14 | 8 | 2 | 21 | Shipped (v0.54.0) |
| AI asset pipeline: engine export presets | 15 | 9 | 2 | 24 | Shipped |
| AI asset pipeline: headless template | 15 | 9 | 3 | 24 | Shipped |
| AI asset pipeline: high-to-low bake | 16 | 9 | 3 | 27 | Shipped |
| AI asset pipeline: live-session bridge (spike) | - | - | - | - | Upcoming |
| Stable | — | — | — | — | Upcoming |
The 8 skills:
addon-scaffolding-- Extensions Platform manifest, file layout, register/unregister symmetryoperators--bpy.types.Operatorlifecycle,bl_idname, redo, defensive context handlingui-panels--bpy.types.Paneldeclarativedraw(), layout primitives, conditional UIcustom-properties--bpy.propsannotations, PropertyGroup, PointerProperty, storage tradeoffsmesh-editing-and-bmesh-- when to use bpy.data vs bpy.ops vs bmesh, foreach_set, depsgraph evalheadless-batch-scripting--blender --background --python, temp_override, argparse after--slotted-actions-animation-- Blender 5.x Slotted Actions, channelbag, 4.5 LTS fallback bridgegeometry-nodes-python-- programmatic GN tree construction, interface sockets, NODES modifier
The 4 rules:
prefer-data-over-ops-in-loopsalways-free-bmeshtarget-extensions-platform-formattype-annotate-props-and-defend-context
The 1 template:
extension-addon-template-- Extensions Platform format, register_classes_factory, PointerProperty binding, symmetric register/unregister
The 10 snippets:
canonical-object-creation.pycanonical-object-deletion.pydepsgraph-evaluated-mesh.pybmesh-load-edit-free.pytemp-override-context.pyforeach-set-vertices.pyregister-classes-factory.pypointerproperty-binding.pycross-version-property-delete.pyaction-ensure-channelbag-for-slot.py
The 4 new skills:
procedural-materials-and-shaders-- node tree construction for Principled BSDF, emissive, node groups; cross-version socket-name handling forSpecular IOR Leveldepsgraph-and-evaluated-data--evaluated_getplusto_meshplusto_mesh_clearlifetime contract, OBJ-style exporter worked exampledrivers-and-app-handlers-- driver expressions,bpy.app.driver_namespaceescape hatch, application handler pattern with@persistent, the new 5.1exit_prehandlerbl-info-migration-- three-step migration from legacybl_infoto Extensions Platform, before-and-after diff, dual-format pattern
The 2 new rules:
prefer-temp-override-over-context-copy--bpy.context.copy()deprecation in 4.x, removal in 5.x,temp_overridereplacementuse-foreach-set-for-bulk-data-- per-element Python loops over mesh data versusforeach_setandforeach_get
The 1 new template:
headless-batch-script-template-- argparse after--, mesh iteration, modifier apply via temp_override, glTF export, explicit exit codes
The 7 new snippets:
principled-bsdf-material.pydriver-with-custom-function.pyapp-handler-registration.pyshader-node-group.py(cross-versioninterfacevsinputs/outputs)foreach-get-vertices.pyversion-branch-skeleton.pyusd-export-evaluation-mode.py
Audit pass on v0.1.0 content: standards-version markers bumped from 1.9.1 to 1.9.4 across all skills, rules, AGENTS.md, CLAUDE.md, and ROADMAP.md. Verified the bpy_extras.anim_utils.action_ensure_channelbag_for_slot import path against the current Blender 5.1 API reference and removed the stale "verify before production" caveat in slotted-actions-animation/SKILL.md.
Provider-agnostic GLB-in / engine-ready-out. This repo does not generate meshes.
- Post-generation cleanup skills. Import and unit-scale normalization, transform apply and origin, poly-budget decimate, LOD chain, collision mesh. Phase 1 shipped in v0.54.0 as
ai-mesh-cleanup, four snippets, two rules. - High-to-low normal bake. Delivered. Skill
bake-high-to-low, snippetssetup_bake_target_image.py/bake_normal_high_to_low.py/save_baked_image.py, witnessexamples/bake-normal-high-to-low/. Cycles CPU cage bake; statistical gates, not byte-identity. UV transfer and atlas packing remain a later phase. Template integration remains a later phase. - Engine export presets. Delivered. Unity (Y-up glTF), Godot (Z-up glTF, meters), Unreal (centimeter glTF bake and FBX
global_scale). Skillengine-export-presets, three snippets, ruleuse-correct-axis-rna-per-exporter, witnessexamples/export-preset-axis/. Draco remains opt-in viagltf_draco_export.py. ai-asset-pipeline-template/. Delivered. Third template. Headless: GLB path in; LOD set, convex or box collider, engine-preset export; explicit CI exit codes. Pattern:templates/headless-batch-script-template/.- Live-session agent bridge. Research spike, not a committed deliverable. MCP server or socket listener so an agent can execute against a running Blender instance instead of blind
--backgroundscripts. Built ontemplates/extension-addon-template/. Needs its own design pass. Unpinned.
Not committed; target list for the next content version. (v0.3.0 shipped the smoke-gated examples/ track.)
-
Showcase sibling tree + shipping-crate pilotSHIPPED asshowcase/shipping-crate/— budget-conformance crate composing bake, LOD, collider, Unity glTF;--skip-decimateexits 9 on the LOD1 ratio band; DECIMATE COLLAPSE ratios diverge on 5.2 vs 4.5/5.1 -
Round stone well showcaseSHIPPED asshowcase/stone-well/— running-bond brick well, shingled pyramid roof, windlass/rope/bucket;--skip-decimateexits 9 on the LOD1 ratio band -
Wooden barrel showcaseSHIPPED asshowcase/wooden-barrel/— bulged staves, four iron hoops, lid heads;--skip-decimateexits 9 on the LOD1 ratio band -
Campfire showcaseSHIPPED asshowcase/campfire/— two-course fire ring, log tripod;--skip-decimateexits 9 on the LOD1 ratio band -
Market stall showcaseSHIPPED asshowcase/market-stall/— timber frame, slatted counter, striped awning;--skip-decimateexits 9 on the LOD1 ratio band -
Procedural terrain or landscape showcase using Geometry Nodes scatterSHIPPED asshowcase/terrain-scatter/— GN sine-hill Mesh Grid, Index-jittered Instance-on-Points scatter replaced with bevelled masonry;--skip-decimateexits 9 on the LOD1 ratio band -
Hero prop with a more complex silhouette (lantern or treasure chest) as a second showcase pieceSHIPPED asshowcase/street-lantern/andshowcase/treasure-chest/— hanging iron lantern with muntined amber cage; slatted chest with iron bands and an open lid;--skip-decimateexits 9 on the LOD1 ratio band -
Timber watchtower showcaseSHIPPED asshowcase/watchtower/— corner posts through a plank platform, lower-bay X-braces, hatch ladder, coursed shake roof;--skip-decimateexits 9 on the LOD1 ratio band -
Two-wheel wooden cart showcaseSHIPPED asshowcase/cart/— slatted bed, shafts, spoked wheels, iron hubs and axle;--skip-decimateexits 9 on the LOD1 ratio band -
Wrought-iron park bench (slatted seat, scrolled legs) as a game-prop showcase pieceSHIPPED asshowcase/park-bench/— scrolled iron legs, slatted seat and back;--skip-decimateexits 9 on the LOD1 ratio band -
Wooden wheelbarrow (staved tray, single wheel, handles) as a game-prop showcase pieceSHIPPED asshowcase/wheelbarrow/— staved U-tray, iron straps, spoked wheel, rear legs;--skip-decimateexits 9 on the LOD1 ratio band -
Blacksmith anvil on a timber stump as a game-prop showcase pieceSHIPPED asshowcase/anvil/— London-pattern horn, face, heel, waist, hooped stump;--skip-decimateexits 9 on the LOD1 ratio band -
Staved wooden water trough on a stand as a game-prop showcase pieceSHIPPED asshowcase/water-trough/— watertight U-hull, plank ends, contained water, iron straps, trestle legs;--skip-decimateexits 9 on the LOD1 ratio band -
Hitching post with iron ring as a game-prop showcase pieceSHIPPED asshowcase/hitching-post/— square post, pyramidal cap, cross-arm, iron shoe, bands, two rings;--skip-decimateexits 9 on the LOD1 ratio band -
Grindstone on a timber trestle as a game-prop showcase pieceSHIPPED asshowcase/grindstone/— stone wheel, A-frame trestle, iron axle, hubs, crank;--skip-decimateexits 9 on the LOD1 ratio band -
Cast-iron village hand pump as a game-prop showcase pieceSHIPPED asshowcase/hand-pump/— wooden plinth, column, spout, handle, wooden grip;--skip-decimateexits 9 on the LOD1 ratio band -
Timber fingerboard signpost as a game-prop showcase pieceSHIPPED asshowcase/signpost/— square post, pyramidal cap, two painted boards, iron shoe and straps;--skip-decimateexits 9 on the LOD1 ratio band -
Blacksmith bellows as a game-prop showcase pieceDROPPED — leather bag never read; removed from the showcase tree rather than shipping a crate-shaped miss -
Chopping block with embedded axe as a game-prop showcase pieceSHIPPED asshowcase/chopping-block/— hooped timber stump, kerf, embedded axe;--skip-decimateexits 9 on the LOD1 ratio band -
Wooden bucket with iron bands and a rope bail as a game-prop showcase pieceSHIPPED asshowcase/wooden-bucket/— overlapping staves, sealed bottom, iron hoops, ears, rope bail;--skip-decimateexits 9 on the LOD1 ratio band -
Wall-mounted torch sconce as a game-prop showcase pieceSHIPPED asshowcase/wall-torch/— coursed stone plaque, iron bracket and cup, wooden haft, emissive flame;--skip-decimateexits 9 on the LOD1 ratio band -
Wooden tavern stool (turned legs, round seat, stretchers) as a game-prop showcase pieceSHIPPED asshowcase/tavern-stool/— round seat, turned splayed legs, stretchers, iron ferrules;--skip-decimateexits 9 on the LOD1 ratio band -
Cast-iron cooking cauldron on a tripod as a game-prop showcase pieceSHIPPED asshowcase/iron-cauldron/— bulged open pot, bail, timber tripod, hook;--skip-decimateexits 9 on the LOD1 ratio band -
Wooden ladder (rungs, stiles, iron shoes) as a game-prop showcase pieceSHIPPED asshowcase/wooden-ladder/— raked stiles, six rungs, iron shoes and straps;--skip-decimateexits 9 on the LOD1 ratio band -
Bound hay bale as a game-prop showcase pieceSHIPPED asshowcase/hay-bale/— bevelled loaf, end nap, two sisal twine belts;--skip-decimateexits 9 on the LOD1 ratio band -
Stack of shipping crates as a game-prop showcase pieceSHIPPED asshowcase/crate-stack/— one generator called three times with a per-instance seed driving yaw and plank widths, crates seated on the lid below;--same-seedexits 20 on the per-instance variation budget,--float-stackexits 18 on the seat -
Keystone archway with voussoirs as a game-prop showcase pieceSHIPPED asshowcase/stone-archway/— coursed piers, projecting imposts, nine voussoirs, proud keystone; the intrados circle fit is recomputed from vertex positions and--off-circleexits 19 on it while leaving every other budget passing -
Rope bridge (planks, rope rails, sag between anchors) as a game-prop showcase pieceSHIPPED asshowcase/rope-bridge/— log posts, through-tenoned sills, twenty planks seated on laid foot ropes, lashed hand ropes, suspenders, staked tie-offs; a least-squares parabola is fitted to the plank tops and--vee-deckexits 19 on it with the sag still in band -
Grain sacks (cloth sacks, some slumped, tied necks) as a game-prop showcase pieceSHIPPED asshowcase/grain-sacks/— three settled, pleated burlap sacks, one lying, twine ties seated in the neck waist, sacks pressed into one another; flat contact patch summed from the mesh,--round-bottomexits 19 on it while zmin still passes -
Brazier (iron bowl on legs, coals, ash) as a game-prop showcase pieceSHIPPED asshowcase/brazier/— spun bowl with a rolled rim, three one-sweep forged legs, ash bed biting the wall, 36 cleaved coals packed without interpenetration; tip angle from a density-weighted mass centre and the support polygon,--tuck-legsexits 19 on it while the feet still ground -
Apothecary shelf (shelf unit, bottles and jars of varied form) as a game-prop showcase pieceSHIPPED asshowcase/apothecary-shelf/— housed shelves, gallery rails, lapped back boards, a drawer bank and an arched crest, stocked with fifteen lathed vessels in five forms, each corked or lidded and labelled on its own rings; per-vessel headroom under the member above is read off the mesh,--tall-flaskexits 20 on it while every seat and the envelope still pass -
Wooden yoke (oxbow, iron rings) as a game-prop showcase pieceSHIPPED asshowcase/wooden-yoke/— lofted oak beam with neck saddles and upturned ends, two bent-hickory bows through it and pinned above it, a staple and a threaded hung ring; each neck opening measured between the bow legs and up to the saddle,--pinch-bowsexits 19 on it while the bows still ground and the envelope is unchanged -
Butter churn (staved tub, lid, dasher) as a game-prop showcase pieceSHIPPED asshowcase/butter-churn/— sixteen tapered staves with canted ends, three hoops seated vertex-for-vertex on them, a three-board bottom in a croze, a two-board lid and a cross dasher; the plunge stroke is recomputed from the inner wall and the plunger's reach,--wide-dasherexits 20 on it while the plunger still clears the staves at rest -
Bookshelf with leaning books (upright and toppled volumes of varied size, one leaning on its neighbour) as a game-prop showcase pieceSHIPPED asshowcase/bookshelf/— housed shelves on a recessed plinth, lapped back boards and a stepped cornice, thirty-eight rounded-spine hardbacks with glued page blocks and gilt bands, standing, stacked and leaning; each leaning board's contact with its neighbour's head edge is read off the mesh as a plane depth,--air-leanand--deep-leanexit 22 on it while every seat and the envelope still pass -
Library ladder or book trolley with loose books as a game-prop showcase pieceSHIPPED (the trolley half) asshowcase/book-trolley/— a double-sided library book truck on four swivel casters: arched end panels standing in skids, four sloped troughs each a tilted shelf and a backrest square to it, forty-seven spines-out hardbacks and two loose stacks on the deck; each trough book's fore-edge depth in its backrest is read off the mesh beside its shelf seat,--off-backand--deep-backexit 21 on it while every seat and the envelope still pass -
Library rolling ladder (hooked top rollers riding a round rail, raked stiles, treads, floor wheels) as a game-prop showcase piece — the unbuilt half of the item above: a hook riding a round rail is a curved-on-curved contact that neither the trolley's flat backrests nor the yoke's hung ring exercise
-
Ox cart tongue or plough beam that hitches to the yoke's ring as a game-prop showcase piece — a hitch is a ring-on-hook contact the yoke's hung ring only tests against a fixed bar
-
Mine cart on a rail segment as a game-prop showcase piece — flanged wheels seated on the railheads: every tread contact within a band of the rail top and every flange clearing the rail's inner face by a gauge band, so a cart riding up on a flange or dropping between the rails fails while seats and bbox still pass
-
Hinged garden gate as a game-prop showcase piece — strap hinges whose knuckles sit coaxial on the post pintles: knuckle axis-to-pintle axis distance within a band and the swing arc clearing the latch post, a pin-in-knuckle contact no existing piece tests
-
Mooring bollard with a coiled rope as a game-prop showcase piece — rope turns laid as stacked helices around the barrel: each turn resting on the one below (not interpenetrating, not floating), measured turn-to-turn off the mesh
-
Ship's wheel as a game-prop showcase piece — spokes and handles by exact radial repetition: equal angular spacing, every spoke end seated in the rim, hub/rim concentric, handles on the computed radius
-
Sawhorse pair carrying a plank as a game-prop showcase piece — splayed legs and a board spanning two supports: the plank's underside rests on both saddles within a band (a two-support span, not a single seat) and every foot lands on the floor
-
Tiered stone fountain as a game-prop showcase piece — concentric basins on a column: every basin coaxial, each upper basin's lip overhanging the one below by a stated band so the overflow line lands inside the next basin
-
Cannon on a wooden field carriage as a game-prop showcase piece — trunnions seated in the carriage's cap-square cradles: trunnion axis coaxial with both cradles and wheels resting on the ground at the axle's computed height
-
Spinning wheel as a game-prop showcase piece — a drive band running from the wheel groove to the whorl: band path tangent to both pulleys within a band (a belt-on-pulley contact), treadle linkage reaching the crank
-
Hanging tavern sign as a game-prop showcase piece — sign board hung from a wall bracket by chain: each link threaded through its neighbour without interpenetration and the board hanging plumb under the bracket hooks
-
Tiered skep beehive on a stand as a game-prop showcase piece — coiled straw courses as stacked tori: each course seated on the one below, the dome closing on its axis
-
Rowboat with oars in oarlocks as a game-prop showcase piece — oar shafts passing through the oarlock horns with clearance inside a band, hull resting on its keel line on a flat deck/floor
-
Weathervane as a game-prop showcase piece — arrow and cardinal arms on a spindle: the arrow's pivot bore coaxial with the spindle and the arrow statically balanced (centroid on the pivot axis within a band)
-
persistentapp-handler witness — handlers registered without@bpy.app.handlers.persistentare dropped bywm.read_homefile/file load while persistent ones survive; assert the registered-handler set before and after a reload (silent loss AI code hits) -
Link vs append witness —
bpy.data.libraries.load(link=True)yields a linked, non-editable datablock (libraryset,is_editableFalse) while append yields a local copy; write a temp .blend withbpy.data.libraries.write, then assert both paths -
Orphan purge witness —
bpy.data.orphans_purge(do_recursive=...)removes exactly the zero-user datablocks computed independently beforehand, andbpy.data.batch_removeremoves a given set in one call (counts closed-form) -
Local vs world ray-cast witness —
Object.ray_casttakes object-local origin/direction whileScene.ray_casttakes world space; a transformed target hit at closed-form points both ways, and passing world coords toObject.ray_castmisses (the trap) -
mathutils.bvhtreewitness —BVHTree.FromObjecton evaluated geometry:find_nearestdistances andoverlappairs match closed forms on a known arrangement -
Curves datablock witness — the modern
bpy.types.Curveshair API (add_curves,positionattribute,curve_offset_data) vs legacy particle hair: point and curve counts closed-form, every root on the emitter surface -
Non-Color normal-map witness — an image used as a normal map must be
colorspace_settings.name = 'Non-Color'; a baked/sampled value round-trips only then, and sRGB shifts it by the transfer curve (a silent shading error AI code ships) -
Solidify even-thickness witness —
use_even_offsetkeeps shell thickness constant at sharp corners, while without it the corner thins by 1/cos(θ/2): measured thickness at a known angle matches both closed forms -
Boolean solver witness — EXACT solver union/difference volumes match closed forms on overlapping primitives, and the result is manifold; FAST on coplanar faces is the documented failure case
-
Lattice deform witness — a 2×2×2 lattice with one displaced point deforms interior verts by exact trilinear weights (
interpolation_type_u/v/w = 'KEY_LINEAR') -
FBX unit-scale witness —
export_scene.fbxwithapply_unit_scale/apply_scale_optionschanges exported coordinates by the closed-form ×100 cm factor; re-import restores metres only on the matching option -
Collection-instance witness —
instance_type = 'COLLECTION'instances appear only indepsgraph.object_instances(never inscene.objects); instance world matrices match the closed-form offsets -
Asset-marking witness —
ID.asset_mark(),asset_data.tagsand catalog UUIDs written toblender_assets.cats.txt, re-read from a saved library file (check-only if no legible still) -
Flagship showcase: working clock-tower movement — a tower clock with a visible gear train (great wheel, intermediate pinions, escape wheel, anchor and pendulum, dial motion works driving hour and minute hands): every meshing pair on its computed centre distance (pitch radii sum) with teeth interleaved not interpenetrating, train ratio hour:minute exactly 1:12 recomputed from tooth counts off the mesh, pendulum bob hanging plumb;
--wrong-ratio/--gear-clashfalsifiers -
Flagship showcase: counterweight trebuchet — A-frame, throwing arm on an axle, hinged counterweight box, sling and pouch, release pin: axle bore coaxial in both uprights, arm pivot on the axle, counterweight hanging plumb from its hinge, sling length within a band of the arm's short-side ratio, all four skids on the ground
-
Flagship showcase: steam locomotive (narrow-gauge) — boiler barrel, smokebox, cab, drivers linked by coupling and connecting rods, valve gear: every driver on the rail at the axle's computed height, coupling-rod length equal to axle spacing so the rods stay parallel (a four-bar invariant measured off the mesh), crankpins at equal quartering angle
-
Flagship showcase: windmill with sail stocks and brake wheel — tower cap, four lattice sails on a windshaft, brake wheel meshing the wallower: sails at exact 90° about the shaft axis, shaft tilt as a stated constant, brake-wheel/wallower centre distance from pitch radii
-
Flagship showcase: fairground carousel — canopy, centre pole, crank rods, 12 horses on twisted brass poles in two rings: exact radial and angular spacing per ring, every pole plumb and passing through a horse's saddle bore, platform concentric with the canopy
-
Flagship showcase: pirate sloop — lofted hull from stations, deck planking, mast, boom, gaff, shrouds and ratlines to chainplates, cannon ports: hull mirror-symmetric to the keel plane, every shroud terminating on its chainplate and masthead within a band, ratlines horizontal and evenly spaced
-
Flagship showcase: full chess set on a board — 32 lathe-turned pieces (king to pawn, two woods) on an inlaid board: every piece centred on its square's computed centre, base seated on the board, lathe profiles revolved exactly (radii match profile closed form), 64 squares alternating by (file + rank) parity
-
Flagship showcase: modular dungeon kit — floor, wall, corner, arch, stair and pillar tiles on a 2 m grid composed into a room: every open-edge boundary vert on the grid, zero gap/overlap at every joint, stair riser × count equal to one storey height, per-tile budgets plus a composed-room budget
-
Flagship example: GN simulation-zone ballistic fountainSHIPPED asexamples/gn-sim-fountain/— 20 jets integrated by the exact constant-g update land on p₀ + v₀t − ½gt² every stepped frame; an unbakedframe_set(N)jump runs one step,calculate_to_frameis PASS_THROUGH headless, only a bake gives random access. The 4.x vs 5.x divergence the entry anticipated does not exist: zone and bake operators measured identical on 4.5.11, 5.1.2 and 5.2.1. Falsifiers--unpair/--euler/--prebake-trap/--calc-to-framereplace the proposed--no-cache-reset, which had no failing check to target -
Flagship example: GN procedural building generator — one node tree with floor count, bay count and roof type as modifier inputs driving storeys, windows (instanced), cornices and a pitched or flat roof: window instance count = floors × bays × faces closed-form, storey heights exact, three buildings from the same tree side by side
-
Flagship example: GN road along a curve — a Bezier path swept into a road with kerbs, lane markings and lamp posts instanced at equal arc-length spacing aligned to the tangent: post count = floor(length / spacing) + 1, every post perpendicular to the curve tangent within a band
-
Flagship example: L-system tree via GN repeat zone — branching generated by a Repeat Zone: branch/leaf counts closed-form in the iteration depth, each child branch attached to its parent's tip, total height the closed-form series sum
-
Flagship example: UDIM texture set —
Image.tiles.newfor 1001–1004, a UV layout spanning four tiles, per-tile bake/paint writes: tile numbers map to UV offsets exactly, each tile's pixels land only in its tile,<UDIM>filepath round-trips through save and reload -
Flagship example: channel-packed ORM bake — Cycles-bake AO, roughness and metallic of a prop into R/G/B of one Non-Color image: each channel matches its independently baked single-channel reference within a stated tolerance, and sRGB tagging is the falsifier
-
Flagship example: Cryptomatte ID witness — a multi-object scene rendered with Cryptomatte passes to multilayer EXR: decoded object IDs (MurmurHash3 of the names) cover exactly each object's coverage mask, re-read with the stdlib-only EXR reader
-
Flagship example: walk cycle with planted feet — slotted-action walk cycle on a leg rig with IK and NLA strip blending: planted-foot world position constant during each contact phase (foot slide below a band), stride length × cycles equals root travel, 4.5 vs 5.x channelbag paths
-
Simulation-zone cache interpolation witness — frames between two cached simulation frames read as a linear interpolation of the endpoints (measured: steps 1.27 at frame 4 between cached 1 and 12), not a simulated state; assert the interpolant closed form and that a bake removes it (found authoring
gn-sim-fountain) -
Operator PASS_THROUGH trap snippet — an operator whose poll fails headless (
simulation_nodes_cache_calculate_to_frame) logs "Invalid operator call" and returns{'PASS_THROUGH'}without raising; check the returned set, never assume a non-raisingbpy.opscall ran (found authoringgn-sim-fountain) -
Simulation-zone substeps witness — a Repeat Zone inside the Simulation Zone splitting Delta Time into k substeps: explicit Euler error shrinks exactly by 1/k against the closed-form arc, the exact update is invariant in k
-
Small modular kit showcase on recognizable geometry (SHIPPED asmodular-kit-snapcontract)showcase/fence-kit/— tiling post-and-rail section (AABB X is the tile width; does not re-witness the snap contract);--skip-decimateexits 9 on the LOD1 ratio band -
Custom ID-property delete witnessSHIPPED asexamples/cross-version-property-delete/— IDs built viabpy.data.objects.new(notactive_object);property_unsetis TypeError and leaves the key;delremoves it on 4.5 LTS and 5.x -
USD export evaluation_mode witnessSHIPPED asexamples/usd-export-evaluation-mode/— probedwm.usd_exporton CI Linux portables 5.2.1 (9e2066aef7ef) and 4.5.13 (daeeeca98fb0); TESSELLATE+VIEWPORT 26/24, TESSELLATE+RENDER 98/96; BEST_MATCH writes the 8-vert catmullClark cage so the mode is silent -
Repeat Zone / For Each Element pairing witnessSHIPPED asexamples/gn-zone-iterate/—pair_with_outputis load-bearing (unpaired evaluates 0 verts); Repeat8×(1+N)with X-centers atk×STEP; For Each8×Pwith Z-centers ati×STEP; For Each main Geometry is a passthrough (6 verts); count-only is insufficient (--no-offsetstill 32 verts, one X-center) -
Geometry Nodes bundle round-tripSHIPPED asexamples/gn-bundle-roundtrip/— 5.x RNANodeCombineBundle(GeometryNodeCombineBundleundefined on 5.2); closed form 8/6 + x[0.5, 2.5]+bundle_mark=0.314159; 4.5 SKIP via catalogmin_version5.0 (experimental flag off evaluates empty;--force-runhits 5.x RNA undefined) -
Tighten inverted smoke canaries: assert the expected
[FAIL]marker text (skipped on ... should run/missing post-exit sidecar) alongside wrapper exit 1, so a canary that dies for the wrong reason does not satisfy the gate -
exit_pre sidecar witnessSHIPPED asexamples/exit-pre-sidecar/— 5.1+handlers.exit_prewrites$BDT_SMOKE_SIDECAR; harness--expect-sidecar+sidecar_contains=exit_pre-okafter process exit; 4.5 SKIPmin_version5.1;--force-runis AttributeError;--silent-handler/--no-handlermissing sidecar;--wrong-text/--write-in-main/--atexit-insteadwrong contents -
N-gon / unapplied-scale / coincident-vert pathology witnessesSHIPPED asexamples/ngon-triangulate/,examples/unapplied-scale-gltf/,examples/coincident-vert-weld/— two-stage pre-assert then handling; no gallery stills (defects not thumbnail-legible);--no-dissolve/--identity/--no-duplicatered on detection;--skip-triangulate/--bake/--weldred on handling -
Overlapping / mirrored UV islands as a shipped pathology (not lightmap
--falsify): SAT hits matching a constructed overlap, then glTF TEXCOORD survival. Deferred —lightmap-uv-channelalready owns the zero-overlap gate. -
Vendor CC0 asset fixtures (Kenney, Quaternius, ambientCG only — no aggregators) as
.glbnot.blend, with per-fixture provenance records mirroring the Free-Game-Dev-Assets frontmatter schema. Permitted only where the assertion is an invariant over the fixture rather than a measurement of it. Deferred pending a decision on repo weight and CI fetch policy. -
Falsification flags on shipped examples (Phases 6–8
--skip-delete/--unpair-*/--bypass, Phase 9--silent-handler/--wrong-text, Phase 10--no-dissolve/--identity/--no-duplicate) were proven local-Windows only — chat and.scratch, not CI history. Decide later whether a cron should exercise them or whether flags in the scripts are sufficient record. -
Fleet Pages facelift + examples supportRESOLVED differently (2026-07-03): the meta-repo migration was dropped — the fleet template only scaffolds new tools, and each tool's site evolves independently after that. This repo vendored the site build intoscripts/site/, redesigned landing + gallery as the Blender-viewport system (seedocs/gallery/DESIGN_NOTES.md), added the examples grid, nav link, and full hero stats locally.scripts/build_gallery.pyandexamples/gallery.jsonare now permanent, not a prototype awaiting lift-and-shift. -
modal-operatorsskill --invokereturningRUNNING_MODAL, themodal()event handler, modal cancellation patterns -
usd-pipelinesskill -- USD export options,evaluation_mode, instancing, the USD vs glTF tradeoffs -
mathutils-patternsskill --mathutils.Vector,Matrix,Quaternion, common transforms, the@operator -
Blender 5.2 LTS sweepSHIPPED as targeting + smoke matrix (5.2 + 4.5 on PRs, 5.1 weekly) plusexamples/gn-modifier-inputs/— NodesModifier dict assignment raises TypeError on 5.2; RNAmod.properties.inputs.<id>.valueis the replacement -
Additional snippets for asset library scripting, EXR baking, multi-file extensions
-
UV-layer authoring witnessSHIPPED asexamples/uv-layer-grid/—create_grid(..., calc_uvs=True)silent no-op without a pre-existing UV layer; closed-form UV fill + explicit assignment fallback; dual-panel render (flat texel (0,0) vs neon checker) -
Image save-format witnessSHIPPED asexamples/png-exr-alpha/— float→PNG is RGBA16 and false-unpremultiplies as if associated-alpha (closed-form err 0.98 at RGB 0.02 / a=1/255); OpenEXR preserves float RGBA; byte→PNG is straight RGBA8;EXR color_mode='RGB'drops alpha -
Attribute domain witnessSHIPPED asexamples/attribute-domain-shear/— POINT vs CORNER semantics on an 8-wedge pinwheel with one shared hub: CORNER authoring exact (hub corners disagree by face, err ≤ 1e-6), naive per-wedge POINT loop shears to the last write at hub + ring verts, measured deviation == palette closed form (0.751031); byte-identical on 4.5.11 and 5.1.2; crisp-vs-smeared dual pinwheel still — companion tocolor-attribute-wheel -
Light-linking collection witnessSHIPPED asexamples/light-link-studio/— the API isobj.light_linkingon the light OBJECT (ld.light_linkingis an AttributeError on both versions); linked ratio 4.0x at projected-center luminance samples, unlink raises the decoy 244–251% with 0.0% hero drift in the same two-render check; EEVEE Next honors linking too (5.5x on 4.5.11, 5.9x on 5.1.2), Cycles pinned for deterministic samples -
VSE sequences-to-strips witnessSHIPPED asexamples/vse-cut-list/—.sequencesremoved on 5.x (4.5 bridges to.strips),new_effectend kwargframe_end=(4.5) vslength=(5.x),frame_final_*deprecated in favor ofleft_handle/right_handle/duration, TRANSFORM effect type removed, GAMMA_CROSS clamps to the source overlap, effect strips consume inputs only when stacked above them, same-scene scene strips render transparent; save/reload round-trip + tiny-render pixel witness. 5.2 COLORwidth/heightbake (not in the python_api notes) taught inskills/vse-python/; the example--check-pixelspath is the witness (set scene resolution beforenew_effect) -
glTF export round-trip witnessSHIPPED asexamples/gltf-export-roundtrip/—export_yupbakes(x,y,z)→(x,z,−y)into vertex data with no node rotation (probed identical on 4.5.11 and 5.1.2),export_applyships the evaluated mesh (one disk vertex per evaluated loop), TEXCOORD_0 is V-flipped on disk, per-triangle material bindings survive; exporter/importer RNA signatures byte-identical between 4.5.11 and 5.1.2 (guarded against future renames);Mesh.calc_normals()removal on 5.x surfaced during authoring -
LOD decimate chain witnessSHIPPED asexamples/lod-decimate-chain/— Decimate COLLAPSE evaluated through the depsgraph is non-destructive (obj.data keeps closed-form counts), evaluated tris hitratio × basewithin 5% (measured 0.00–0.13%), silhouette bbox survives within 1e-3 (measured 2.6e-10); a stacked Decimate halves the effective ratio, an oblique fin's plate corner is shaved at ratio 0.18 — both caught failure modes -
Vertex weight limit witnessSHIPPED asexamples/vertex-weight-limit/— the 4-influence engine cap enforced via the data API (v.groups+VertexGroup.remove+ renormalize); unit sums (measured 3e-8), pose preserved (4.9e-3), exact LBS from the mesh's own deform layer (2.7e-7), Root mount pinned -
Triangulate + tangent-space witnessSHIPPED asexamples/triangulate-tangents/—calc_tangentsaborts on any ngon (back cap must be an explicit fan); mikktspace matches the edge/UV-delta formula within welding tolerance on smooth fields (2.3e-6 measured); planar UVs on a cylindrical wall collapse tangents onto normals (dot 0.998);MeshUVLoopLayerhandle dangles acrosscalc_tangents()on 4.5 (471 phantom flips, silent exit 0) while the mikktspace math is byte-identical on 4.5.11 and 5.1.2 -
UV-handle lifetime snippet: re-fetch attribute/UV layers by name after any CustomData-reallocating call (
calc_tangents,VertexGroup.add, modifier edits) — held handles dangle silently on 4.5, survive by luck on 5.1 (found authoringtriangulate-tangents; confirmed harder authoringlightmap-uv-channel: iterating a heldMeshUVLoopLayer.dataafter edit-mode UV ops segfaults 4.5.11 headless, EXCEPTION_ACCESS_VIOLATION 5/5, survives on 5.1.2) -
glTF skinned-mesh export witness: follow-up toSHIPPED asgltf-export-roundtrip+vertex-weight-limitexamples/gltf-skin-roundtrip/—skins[0].jointsnames every bone, JOINTS_0/WEIGHTS_0 with unit sums (3e-8), weights bit-exact, rest matrices to 2.4e-07, deformation to 4.8e-07; exporter welds duplicate loops (sorted-multiset comparisons mispair — compare by rest-key); unparented skinned meshes make the exporter bind an armature by name -
Degenerate-bevel weld hazardSHIPPED asexamples/degenerate-bevel-weld/— atoffset == min_dim/2the bevel band collapses to exactly 12 zero-area faces (4 min-axis edges × 3 segments) with 16 coincident verts (4 × (segments+1)) and min_area down 3.2e5×; a stdlib GLB re-parse counts 32 degenerate triangles crossing the export boundary (MEASURED regression constant) versus 0 for the safe mesh — the loops an engine merge-by-distance welds; byte-identical on 4.5.11 and 5.1.2 -
Modular kit snap witnessSHIPPED asexamples/modular-kit-snap/— tiling corridor segment: 16 boundary verts onx ∈ {0, TILE}within 1e-6 m, end rings coincident under the tile offset (nearest-key match), linked-duplicate joint deviation 0.0, shell bbox == declared tile (dev 0.0), manifold except the 16 open-end edges, 20 detail parts contained inside the tile; unsnapped probe (3 mm skew, 2 mm nudge) fails at exits 3/4 with measured errors; sorted-zip ring matching mispairs displaced verts — match by nearest key (authoring hazard, fixed); byte-identical on 4.5.11 and 5.1.2 -
Lightmap UV channel witnessSHIPPED asexamples/lightmap-uv-channel/— two-channel UV contract on a market cart: per-partUVMap/UVLightwithactive/active_renderre-asserted after the ops (edit-mode UV ops clear both flags;uv_layers.new()never moves them), UV0 drift 0.0 (clobber trap measured 2.068), every UV1 loop in [0,1], 0 overlapping islands via independent binned strict-SAT (15 hits when falsified), min island distance 0.00401 vs nominal margin 0.002 (MARGIN_DIV × 0.01semantics measured live); heldMeshUVLoopLayer.dataafter edit-mode UV ops segfaults 4.5.11 (5/5, EXCEPTION_ACCESS_VIOLATION), silent no-op pack without prior unwrap; byte-identical on 4.5.11 and 5.1.2 (3680 islands) -
Socket attach-point witnessSHIPPED asexamples/socket-attach-points/— namedSKT_empties as the spawn contract on a survey drone: 7 socket world matrices within 1.788e-07 of the authored transform with orthonormal right-handed bases (Gram 3.576e-07, det err 2.980e-07), socket +Z == the mount pad's Newell normal (1.794e-07) by a quaternion-swing construction independent of the Gram-Schmidt basis, origin on the mount-face centroid (6.687e-08), documented up-axis fallback for the +Z/−Z mounts, module seating offset exactly 0.0 with strictly identity local matrices, rigid invariance under a re-pose (2.384e-07);transform_applyon an Empty root preserves world matrices (2.235e-07) but clears 7/7matrix_parent_inverseand pushes the root scale down into every child (0.35 for an applied 1.35) — both halves asserted; a child left selected during the apply drifts sockets 2.335 m;bm.normal_update()does not fix inward winding (recalc_face_normalsdoes — the lofted fuselage rendered as a flat white panel); no-parent-inverse probe jumps 0.690128 m; byte-identical on 4.5.11 and 5.1.2 -
Vertex-colour AO witnessSHIPPED asexamples/vertex-color-ao/— baked occlusion in a colour attribute on a stone village well, checked against a closed form rather than a captured value: the cosine-weighted hemisphere integral for an infinitely wide wall of height H at distance d isAO = 1 − ½(1 − 1/√(1+k²)),k = H/d, matched to 6.760e-04 across k = 60.0…0.60 (gate 2.5e-03, QMC noise ~1/√n at 4096 samples); unoccluded plate bakes to exactly 1.0; strictly monotone 0.508301 → 0.928467; asset values in [0,1] with spread 1.0;BYTE_COLORis sRGB-encoded 8-bit, not linear (0.735 → 0.7379107, peak round-trip error 3.782e-03, matching an independent encode/quantise/decode model to 3.189e-07) whileFLOAT_COLORis exact; both survive depsgraph evaluation at deviation 0.0;bmesh.ops.beveloffsets along cached face normals and flips outward past 90° of staleness (12 mm below ground on a ring of boxes, fixed bynormal_update()); point-domain AO needs subdivision or the crevice gradient never reaches the attribute;color_attributesenumeration order differs between 4.5.11 and 5.1.2 — look up by name; byte-identical on 4.5.11 and 5.1.2 (6966 verts) -
High-to-low tangent normal bakeSHIPPED asexamples/bake-normal-high-to-low/— Cycles CPUtype='NORMAL'cage bake onto aDECIMATE COLLAPSEhatch; statistical gates (detail frac 0.7211 / MAD 0.09356 vs flat 0.0000 / 0.00277);--flat-sourceexits 5; RNA identical on 4.5.11, 5.1.2, 5.2.1; byte-identity is not the contract -
UV atlas utilization witness — coverage/wasted-texel closed forms for a packed lightmap atlas (the non-overlap, unit-square, margin, and active/active_render contracts shipped in
lightmap-uv-channel; utilization is the remaining unbuilt slice of the old "UV atlas pack" candidate) -
VSESHIPPED asuse_linear_modifiersremovalexamples/vse-linear-modifiers/— bool on 4.5.11 and 5.1.2,AttributeErroron 5.2.1;--assume-presentred only on 5.2; pathology, no gallery still -
GN Compare / Random Value socket identifier renameSHIPPED asexamples/gn-socket-rename/—A_INT/Min_001present on 4.5.11 and 5.1.2, absent on 5.2.1; enabled-name lookup wires all three;--legacy-idsred only on 5.2 -
Evaluated mesh datablockSHIPPED asevaluated_get().data.nameis genericMeshon 4.5.11 and 5.1.2 and equals the source name on 5.2.1 (to_mesh().namestays the source name on all three)examples/eval-mesh-datablock-name/—evaluated_get().data.nameisMeshon 4.5.11 and 5.1.2,SourceMeshon 5.2.1;to_mesh().namestaysSourceMeshon all three;--assume-distinct-namesred only on 5.2; pathology, no gallery still -
SHIPPED asMeshAutomaskingSettingsmove: oldBrushautomasking attributes gone on 5.2examples/mesh-automasking-settings/— type absent on 4.5.11 and 5.1.2, present on 5.2.1; oldBrushattrs gone;--assume-brush-attrsred only on 5.2; pathology, no gallery still -
GAMMA_CROSS blend-curve witnessSHIPPED asexamples/vse-gamma-cross/— the cross blends in a gamma-0.5 space:((1-t)·√A + t·√B)²witht = (frame − start)/duration, never 1 inside the effect; mid-cross dips 0.115 below the sRGB lerp from crimson/teal (closed form (0.341, 0.349, 0.463) confirmed per frame); AgX-default sampling poisons the fit (0.146 red-channel error,view_transform='Standard'mandatory); deleting a consumed input orphans-and-deletes the effect — follow-up tovse-cut-list -
Falsy
bpy_prop_collectiontrap snippet: an empty collection is falsy, soeditor.strips or editor.sequencessilently falls through to the legacy accessor on an empty timeline — always branch onhasattr; likely generalizes across the API (found authoringvse-cut-list) -
Collision compound witnessSHIPPED asexamples/collision-hull-proxy/— game-prop collision as a compound of convex pieces, each abmesh.ops.convex_hullof a coarsesec(π/n)-inflated cage (containment 4.4e-08, watertight, positive signed volume, Euler 2, per-piece 255-face budget: body 70, caps 60×3, compound 250); a hull of the dense render mesh measures 380 faces — over budget — which is why pipelines hull cages; proud details cost cage rows, concave grooves are free; byte-identical on 4.5.11 and 5.1.2 -
Custom-normals / shade-by-angle witnessSHIPPED asexamples/custom-normals-shade/— the post-4.1 shading contract:use_auto_smooth/use_custom_normals/calc_normalsare AttributeError on BOTH 4.5.11 and 5.1.2;set_sharp_from_anglesharp sets match an independent dihedral recompute exactly (188/388 edges, 3 meshes); evaluated normal welds/splits exact (0.0 dev); custom split normals survive depsgraph evaluation within int16 quantization (1.407e-04, not float-exact); divergence: the legacyshade_auto_smoothoperator CANCELS headless on 4.5 ("Asset loading is unfinished", mesh untouched, no exception) while 5.1 FINISHES with the Smooth-by-Angle NODES modifier — the data API is the portable path -
Sky Texture / sun_elevation witnessSHIPPED asexamples/sky-texture-sun-elevation/— WorldShaderNodeTexSky→ Background;sky_typeisNISHITAon 4.5 andMULTIPLE_SCATTERINGon 5.1 (NISHITAgone);dust_densityis 4.5-only (aerosol_densityon 5.1); zenith EXR rise 8°→55° measured 2.25x (5.1.2) / 1.50x (4.5.11), gate ≥ 1.25; dual-elevation gallery diptych -
Grease Pencil Line Art contour witnessSHIPPED asexamples/gp-lineart-contour/— GPv3 +modifiers.new(..., "LINEART");source_objectclear → 0 strokes; contour+crease off → 0; restore recovers 10 strokes / 34 points on 4.5.11 and 5.1.2;thicknessis 4.5-only (AttributeErroron 5.1; portableradius) -
Camera DOF + focus_distance witness:
cam.dof.use_dof, focus plane vs defocus variance on high-freq cards (Stage deviation — depth needs background content) -
Volumetric scatter optical-depth witness: Volume Scatter density → Beer–Lambert transmittance along a known path (Cycles; Stage deviation)
-
Freestyle SVG / line-set witness: Freestyle line set on a silhouette (full render pass; prefer Line Art first)
-
prop-origin-transform witnessSHIPPED asexamples/prop-origin-transform/— origin to base center + data-API scale apply +matrix_parent_inversefor a bolted accessory; scale(1,1,1), localmin.z==0, world AABB delta 0, bare jump ~0.43 m, MPI err ~3e-8; stalematrix_worlduntilview_layer.update(); byte-identical on 4.5.11 and 5.1.2 -
Goldberg polyhedron topology witnessSHIPPED asexamples/soccer-ball-goldberg/— soccer ball as a truncated icosahedron: bmesh icosphere cut at 1/3 per edge, faces ordered by link-topology walks; closed forms 60/90/32 + Euler 2, census 12×5+20×6, uniform degree 3, edge dev 6.5e-06, planarity 1.9e-06 (independent Newell normal), circumsphere dev 9.0e-06, panels bound by face vertex count (enumeration-order probes exit 13); float32 noise floor ~9e-6 → 3e-5 gates; byte-identical on 4.5.11 and 5.1.2 -
Mirror-modifier symmetry witness: half-model completed by Mirror evaluated through the depsgraphSHIPPED asexamples/car-mirror-symmetry/— generic hatchback loft (14 stations × 9-point half-rings); datablock keeps the half (126/231/106, 28 centerline), evaluated is exactly 2n−c (224/434/212), watertight Euler 2, ±X partner dev 0.0; wheels/lamps mirror about origins parked on the plane; probes: merge off → 252 (exit 5), centerline off-plane → 27≠28 (exit 4), axis off → 126 half-car (exit 5), applied → exit 3; byte-identical on 4.5.11 and 5.1.2 -
Chess-piece lathe witness: a turned piece (rook/pawn) via Screw modifier or bmesh spin from an authored profile — evaluated verts == profile × steps (minus pole merges), ring radii match the profile closed form, axis of revolution exact
-
Dice-pair per-face witness: material/attribute assignment driven by face normal direction, opposite-faces-sum-to-7 as an independently computed invariant, pip placement from a closed-form lattice
-
Bicycle-wheel radial witness: spokes via radial Array with object offset — exact angular spacing, spoke count, hub/rim concentricity, every evaluated spoke endpoint on its computed rim coordinate
-
mesh-hygiene-audit witnessSHIPPED asexamples/mesh-hygiene-audit/— engine-ingest topology checklist on a stepped street electrical pedestal: no ngons, no loose verts, manifold edges (exactly 2 faces), no zero-area faces (min_areaprinted), positive signed volume, EulerV−E+F==2(24/44/22, volume 0.989248); byte-identical on 4.5.11 and 5.1.2; dual-panel dirty vs clean still -
Gallery framing recomposition worklistDRAINED: all four recomposition cases restaged and gated withcheck_framing— depsgraph-export (0.984x/touch→0.812x; cube+dome recentered, aim-based camera), vertex-weight-limit (touch B→0.867y; more frontal camera, lower aim, base in frame), triangulate-tangents (0.334x→0.833y; 2x-class move-in plus Key/Glint trim that also cleared a pre-existing dome blowout), text-version-stamp (0.663x→0.719x; moved in with aim on the stamp center, dead third gone). The seven marginal cases were camera-nudged in the preceding sweep; deviations documented in #108 (damped-track-aim, wave-displace); sky-texture-sun-elevation is a measurement artifact (world subject — report-only if wired). Remaining: nothing on the framing worklist — future examples inherit the gate at authoring time.
The neutral asset-sheet harness sized its camera from the subject's bounding
box diagonal, which cropped tall subjects and shrank wide ones, so panels
in one sheet were at different effective scales. It now solves the required
distance from the real field of view on both axes. Sheets committed before
this fix (modular-kit-snap, lightmap-uv-channel) show mis-scaled panels
and must not be cited as evidence for or against an asset; re-render them if
that comparison is ever needed.
Full-gallery floor survey after the gate landed (feat/asset-quality-gate).
26 of 42 examples pass all floors. The 14 below-floor entries, with
measured numbers — every one is a contract-vehicle or display subject
(testcard TV, VSE monitors, text bars, swatch/display rigs, single honest
primitives), not a game asset meant for reuse, so none is a remodeling
mandate; the floors exist to catch future asset-type examples at authoring
time. Two non-mesh subjects (curve-bevel-arc, grease-pencil-rosette) are
not measurable by the floors (curve/GP data, no mesh hero). Re-survey after
any example remodel.
- naming (default datablock names): gltf-skin-roundtrip (3 parts), gn-sdf-remesh (
Torus), turntable (Suzanne) - materials (multi-part, single material): armature-bend (3 parts/1 mat — vertex-color weight bands are the honest display), degenerate-bevel-weld (2/1), driver-wave (16/1, also edge90 1.0)
- edge90 (raw right angles, 1.0): depsgraph-export (also naming + materials), image-pixels-testcard, png-exr-alpha, text-version-stamp, vse-cut-list; vse-gamma-cross at 0.92
- reference: gallery best-modeled measure collision-hull-proxy 0.044, custom-normals-shade 0.288, vertex-weight-limit 0.150, lod-decimate-chain 0.019; calibration details in
docs/VISUAL-STYLE.md§ Asset quality
- Asset library and asset browser scripting skill
- Cycles vs EEVEE Next render API skill
- Geometry Nodes 5.x feature parity (volumes, fields)
- Animation rigging from Python (constraints, drivers across bones)