executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
scenario-maya-modelingUse when modeling in Autodesk Maya, such as hard-surface props, weapons, vehicles, a sci-fi crate, a game-ready or SubD film model, or a character or creature base mesh, or when asked to "clean up this model" or a scene before rigging or UVs. Also for support loops vs bevels vs creases, Smart Bevel, weighted normals, hard edges, pinching or wobbly highlight…
Independent GitHub snapshot · Automated classification · Original documentation governs
Expert modeling is purposeful topology: every loop exists for the silhouette, a highlight, a bake, a UV seam or a joint, and the model arrives downstream with nothing the next person has to clean. The agent works big to small, measures each stage with the toolkit, and looks at a metal highlight render before believing a surface. If a sibling skill named here is missing from your available skills, ask the user to install it (npx skills add scenario-labs/skills --skill <name>); unattended, proceed from tool schemas and flag the gap.
REQUIRED BACKGROUND: scenario-maya-expert (execution channel, review loop, 2027 version traps). Toolkit: scripts/mx_modeling.py (sys.path[:0] = ["<skills>/scenario-maya-modeling/scripts", "<skills>/scenario-maya-expert/scripts"]; import mx_modeling as MM), used with mx_audit, mx_validate, mx_review, mx_run. Not yet run in Maya: its pure-Python layer passed offline tests; every Maya call is pending tests/code/maya-modeling/run_all.sh.
| Input | Changes | Default when silent |
|---|---|---|
| Destination | edge-holding method, triangulation, normals | game (PC/console) if an engine is named, else offline SubD |
| Budget | how much to strip | ask the lead; meanwhile anchor on On Mars' bands (grenade-class prop): hero seen large on screen 20k to 30k tris, secondary or tertiary props at 10 to 15% of the screen "much less" (no number given), background 10k or 5k. Report tris and engine vertices, justify each kept edge |
| Camera distance | narrowest feature kept, density vs redirection, corner softness | mid-ground, player can walk up to it [assumption, written in the report] |
| Deformation | loops per joint, no weighted normals, symmetry | none for props; characters: yes |
| Size, units | bevel widths, texel math | real size in cm, grounded; the Maya scene stays Y up even for a Z-up engine (FBX export or import converts the axis) |
| Pivot | engine placement | base center at the origin; a corner if the level snaps by corner (Epic) |
| Texture set | stacking, mirroring, UV2 | 2048, unique UVs (UVs belong to scenario-maya-retopology-uv) |
Every stage is a headless mx_run job that saves a new version with preview off; the GUI bridge is for playblasts and interactive tools (substitutes in references/procedures.md). Component lists cross stages only through MM.component_record and MM.carry_components, never by name or by an index read before a topology edit (P18).
cmds.about(version=True) (Smart Bevel changed in 2027.1 and 2027.2), units cm, Y up, brief in numbers (P1). GATE: assumptions written.mx_audit frozen, no default_name or duplicate_short_name, dimensions within 2% [added]; silhouette and clay sheets compared to reference.MM.balance(m)["edges_over_limit"] == 0 before support loops; MM.cage_report(m): n-gons 0, every curved triangle removed or proven by the highlight review; loops continuous on the wire sheet.MM.extrude(faces, offset_cm=...) then recess (P3; refuses the empty extrude); openings from one quad; cylinders with MM.cylinder_sides_for and MM.build_quad_cylinder (P4), support loops cut before the opening; or polyCBoolOp on manifold meshes, then Smart Bevel (P5). GATE: zero-length edges, coincident pairs, non-manifold all 0.MM.crease, MM.crease_report, P6).MM.bevel (Smart Bevel after booleans, legacy Fractional on clean quads) plus MM.weighted_normals, or hard edges on UV seams and a baked normal map (Polycount).MM.cage_report(cage)["ready_to_smooth"] (hard edges 0, since a faceted patch is a hard edge, Mario [01:28:38]; no fan caps; 6+ poles justified); MM.highlight_review(..., subdiv=n) stripes continuous across every cut; bevel problems empty; crease_report clean.MM.smooth_copy the high; duplicate the cage and reach the low only by deleting edges (MM.flat_edges off the silhouette, loops ended with triangles); radius edges on round corners, evenly spaced, one on the crest (On Mars [00:12:50] [00:26:34]); parts touching the body welded in or their hidden faces deleted (Polycount: contiguous low); MM.shrink_wrap; MM.set_hard_by_angle(low, 45); MM.triangulated_copy(low, toward=high) for bake and export. GATE: MM.deviation recorded, silhouettes overlap, tris in budget, engine vertices reported, each separate shell (polyEvaluate(shell=True)) justified, diagonals_wrong_after == 0.MM.bend_test shows no flips and no regression against the previous topology; restored true.MM.cleanup_technical, MM.inverted_shells, MM.handoff_report(roots, out, to=...), mx_validate.validate(profile="model", fix=SAFE_FIXES + ("render_stats",)), report again, save a new version. GATE: report ok; cleanup ok; 0 inverted shells; preview off; pending items named; sheets opened.| Value | Setting | Relative to / source |
|---|---|---|
| Neighbor quad size | under 2:1 | base grid, support loops excluded (Mario [00:08:31]) |
| Minimum density | spacing = narrowest feature | balance the rest to it (Mario [00:17:19]) |
| Cylinder sides | 20, 24, 28, 32 | multiples of 4, aligned with the cut (Mario [01:12:04]) |
| Round feature on a cage | about 6 spans hero, 4 background | OpenSubdiv |
| Valence | 4 regular; flag 6+; GPU limit about 27 | OpenSubdiv |
| Radius edges on a visible round corner | more than 2 to 3, even spacing, one on the crest | On Mars [00:25:29] [00:26:34] |
| Loops per joint | 1 control + 2 support; knuckles 3 | Jessica [01:15:51] [01:17:34] |
| Crease | Maya value N creases N levels; above 5 rarely; 10 tears under displacement | Maya Help; OpenSubdiv |
| Smart Bevel | Width world units; Depth 1 chamfer, 0.5 rounded; 1 segment hard, 2 to 3 typical | Maya 2027 Help |
| Legacy bevel defaults | Fractional, 1 segment, depth 1, smoothing angle 30; 2 segments on box corners | Maya 2027 Help; FlippedNormals [00:18:18] |
| Hard edges on a mechanical low | above about 45 degrees, and on UV seams | Polycount |
| Grenade budgets | cage 61k, low 24k; "polygons" is about half the tris | On Mars [00:04:21] [00:21:31] |
| Sheet share | surface cm² x (px/cm)² / map px² (12,800 cm² at 10.24 = 32% of 2048²) | arithmetic [added] |
| Subdivision cost | x4 polygons per level; preview levels + Arnold iterations add up | Arnold doc |
Measurable, per mesh: mx_audit.verdict(mx_audit.audit(m, texture_size=2048), "game" | "film" | "subd", max_tris=budget) has no error, plus the MM checks named in each GATE; scene: mx_validate.validate(profile="model") no fail; together: MM.handoff_report.
Visual, opened every time: mx_review.review sheet (silhouette vs reference, clay, wire loops, normals); MM.highlight_review with focus= closeups on every cut (kinks, dark streaks, wobbles are pinching, Mario frames 00:12:45, 01:38:42); high and low silhouettes side by side; in a GUI session, two-sided lighting off or backface culling. Judge with references/critique.md.
| Mistake | Looks like | Fix |
|---|---|---|
| Empty extrude | loop stops dead; crease in smooth preview | MM.extrude refuses it; mx_audit zero-length edges |
| Vertical cuts on a cylinder | wobbling highlight | rebuild with more sides, or smooth once |
| Fan cap | dimple at the cap center | cage_report fan poles; MM.build_quad_cylinder |
| Hard edges left on a cage | faceted patches when smoothed | polySoftEdge(angle=180) until cage_report hard edges 0 |
| Cleanup with tessellation on | random triangulation | MM.cleanup_technical; n-gons by hand |
| Preview on at save, plus Arnold iterations | heavy files, huge slow renders | MM.subdiv_setup in one place; mx_validate smooth_preview |
| Creases on an FBX asset | sharpness gone in engine | bevel, or ship a smoothed copy |
| Weighted normals on a deforming mesh | shading stuck while skinning | static meshes only |
| Hard edges off UV seams | vertex count up, nothing gained | seams on hard edges (hard_edge_components) |
| Whole shell inside out | black with two-sided lighting off, fine with it on | MM.inverted_shells, reverse |
| V-snap without weld | seam in smooth preview | Target Weld; coincident_vertices |
| Round high corner, sharp low | bake artifacts | radius edges on the low, one on the crest |
| Low left floating, or parts intersecting | bake misses, overlap errors, UV space on hidden faces | MM.shrink_wrap; weld parts in or delete hidden faces |
| Engine picks the diagonal | ridge instead of valley, zig-zag shading | MM.triangulated_copy(toward=high), export triangulated |
| Component ids reused after an edit | wrong edges deleted, silhouette lost | MM.carry_components refuses; re-derive |
| Spiral limb loops, pole on the chest | muddy weights, kinks | concentric loops, reroute the pole |
<asset>_model_v###.ma, <asset>_GRP with _geo meshes (engine names such as SM_ and UCX_ for games), the cage, <asset>_high with floaters separate and castsShadows off for AO (Polycount), the low if built, handoff_<to>.json with UVs pending, the hard-edge list for UV cuts, and the sheets looked at. Manifold after triangulation too: Unfold3D refuses non-manifold meshes and unfolds a triangulated copy (P17).to="rigging" clean (X symmetry, no locked normals, no history), grounded and centered, eyes separate and looking ahead, symmetric parts combined, bend_test numbers (antCGi e74K checklist).polySmartBevel, 2027): world-unit Width, Depth profile, Filter default Selected Edges; output differs 2027.0, .1, .2; flags unknown until probed (MM.bevel records attr_map). Its box-corner behavior is untested: the 2-segment rule comes from the legacy bevel, so read the problems census. Old bevel is "legacy bevel", with Filter attributes and intersection-only bevels on booleans since 2025.polyBoolean (2023), 3ds Max engine (2025.3), Volume mode (2026).references/procedures.md: full code P1 to P18 with test paths. Load before writing any modeling code.references/critique.md: the judging rubric. Load at every gate and before reporting.references/expert-notes.md: each expert's reasoning, timestamps, disagreements. Load for an unfamiliar asset type or a judgment call.references/gui-paths.md: menus and hotkeys for a GUI or computer-use session.references/sources.md: sources, credentials, best timestamps.