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-zbrush-paint-renderUse when polypainting in ZBrush (skin color zones, fills, cavity or AO passes, Spotlight), baking polypaint to a texture or vertex color, rendering a ZBrush model with BPR or Redshift, making render passes, a turntable or portfolio shots, or when paint looks like uniform beige or clown makeup, is blurry, is hidden under a texture or in Redshift, or a render…
Independent GitHub snapshot · Automated classification · Original documentation governs
Expert paint in ZBrush is observation made systematic: color zones placed by what lies under the skin, pushed enough to survive the shader, judged on neutral and flat views, and baked at a resolution the mesh can hold. For an agent without a tablet most of it is buttons: fills at a chosen intensity through generated masks, zone images projected onto the mesh, and renders that are both measured and looked at. 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-zbrush-expert (bridge, stroke engine, review loop, 2026 traps).
| Input | Changes | Default when the brief is silent |
|---|---|---|
| Purpose: game albedo, film lookdev reference, stills, color print, concept paintover | whether painted shadow is allowed; map size; deliverable | presentation stills, color kept as polypaint |
| Renderer | materials, passes, turntable route | BPR. Redshift is a separate application and mx1 product list shows it uninstalled on this Mac (2026-09-24); ask before installing it |
| Style | saturation target, zone simplification | the upstream skill's style: scenario-zbrush-character-creature is realistic, scenario-zbrush-stylized is stylized |
| Subject: sex, age, build, skin tone | zone layout and hues | ask once; if still silent, assume an adult of average build with light skin and say so |
| Color deliverable | UVs, map size, Flip V | vertex color; add a texture only when UVs exist |
| Images | document size, views, turntable | 1920 x 1080 (Pavlovich); front, three-quarter, profile and back; turntable 36 frames for review, 180 (Movie default) at 30 fps for delivery [added] |
Toolkit: scripts/zb_paint.py, ZBrush-side functions through zp.remote("name", ...); full code in references/procedures.md. Save a versioned ZTL after every stage: there is no undo control.
paint_state() (level, points, UVs, texture display), recommend_map_size(points), texture_off(), save a ZTL. GATE: top level, map_budget(points, side) passes, v001 on disk. Divide now if needed, never after painting.set_paint_mode("rgb") (Zadd and Zsub off), fill(colour, 100): a dull skin base (FlippedNormals, doc) or pure yellow for the zone route (Pablo). GATE: the Flat front shows the fill color; Colorize reads on.fill_subtools. Polygroups: review with polypaint_from_polygroups(), fill exactly with zone_fill_by_split() (Duplicate, Groups Split, fill each piece, Project All back with Colorize on). Anatomy on one mesh: skin_zone_plan → zone_image → polypaint_from_image (planar UVs, before real UVs); synthesized Color Spray strokes as the fallback. GATE: skin_zone_checks(stage="zones"): forehead yellower than midface, midface redder, a man's lower third bluer, each by at least one JND (2.3 Lab); visually a clown on purpose (Pablo), every zone on its anatomy.stage="covered": no clown (at most 5 percent of skin pixels above saturation 0.75 [added]), speckle present.mask_pass: cavity darker and redder at 20 to 40 percent; PeaksAndValleys (PVRange 14) or Smoothness with a pale warm fill; ao_plugin mask with a purple-red undertone (ping after). Pablo's Adjust Colors is a dialog [verify live_p06]; a low fill through the same mask replaces it. Mask data cannot be read: prove a mask with mask_coverage(masked, cleared). GATE: each pass shifts the region statistics a little, together they read as skin, back of the head included.skin_zone_checks with eye contrast, then the Flat, SkinShade4 and MatCap White01 sheets (paint_review) judged with references/critique.md.texture_from_polypaint(path, side, flip_v=True) needs UVs (UV Master on a clone, Paste UVs keeps polypaint); or OBJ vertex color; or Substance Bridge Send PolyPaint. GATE: map budget passes, an asymmetric mark lands where expected, file on disk.set_document_size (small for tests; Resize clears the canvas, the function redraws), render_setup (perspective, shadows, AO), bpr_render or paint_views(..., "bpr") for matched views. GATE: render_checks pass and the renders were looked at at 100 percent.export_bpr_pass (may open a dialog); clown pass by subtool_solo_views plus id_pass (paint and polygroups untouched); composite (shadow and AO Multiply through the mask); turntable_frames in short chunks, assemble_turntable. GATE: every frame upright with constant framing; the composite beats the beauty toggled against it.colorize_all(False), zb_review.review, restore), albedo and beauty views, ID pass, turntable, one sheet. Report what was measured, what was only looked at, what did not run.| Value | Relative to | Source |
|---|---|---|
| About 4M points per 2K map; 2K = 4M pixels, about 3M usable at 70 percent UV coverage | map side vs vertex count | FlippedNormals 00:30:32; doc |
| FillObject at N percent RGB Intensity = N percent blend | the current color | FlippedNormals 00:02:51 |
| Zones at RGB about 30, wash about 10; cover Draw Size 150, zones 100 or less | brush strokes | doc Painting a Head |
| PVRange 14 | Mask PeaksAndValleys | Pablo 01:26:37 |
| Map Border high (frames 4 and 16), FlipV on | Multi Map Exporter | FlippedNormals 00:31:22 |
| 1920 x 1080 final; 1280 x 720 or 720 x 405 tests; 3200 x 2133 postcard; inches x 300 ppi print | document | Pavlovich; doc |
| Error Threshold 0.01 final, 1 tests (4 s vs 9 s); Progressive 64, 25 with denoise | Redshift | Pavlovich 040h 00:44:03 |
| Main light 0.1 (never 0) with an HDRI; EXR gamma 2.2; macOS Redshift gamma 1.8 | Light, Background | Pavlovich 00:23:12; doc |
| Crease Level one below SmoothSubdiv (3 and 4) | soft edge highlight | Pavlovich 00:21:26 |
| Movie Turntable 180 frames by default | Movie > Modifiers | Pavlovich FvpG 00:19:56 |
| Realistic mean HSV saturation < 0.5 | skin regions, Flat render | Pablo 01:10:30 (middle of the picker) |
| 1 JND = 2.3 Lab; clown share 5 percent; L* span 50; clipping 0.5 percent; noise sigma 2 | gates | [added], calibrate on live renders |
paint_state (top level, Rgb on, Zadd off, texture off); map_budget; mask_coverage above 0 before a masked fill; skin_zone_checks on a front Flat render with head_regions_front() or regions projected from landmarks; render_checks (framing, value span, clipping, noise); upright_score on turntable frames with a top marker; files on disk with sizes.references/critique.md.| Mistake | Looks like | Fix |
|---|---|---|
| Painting below the top level, or dividing afterwards | blurry, pixelated paint; artifacts | paint last at the top level; divide first |
| Judging on a tinted MatCap | colors fine in ZBrush, wrong elsewhere | SkinShade4, MatCap White01, Flat Color |
| Mrgb left on while painting | the review MatCap no longer shows; material painted in | Rgb only while painting; M or Mrgb fills only for render materials, on a saved ZTL [added] |
| Gray sheet of a painted model | color shows on MatCap Gray | colorize_all(False), then restore |
| Texture displayed | new paint invisible | texture_off() |
| Raw cavity mask | harsh rings | Mask Adjust with Blur; low intensity |
| Mask By AO on millions of polygons | slow, inaccurate | the Ambient Occlusion plugin |
| UV Master on the painted original | polypaint erased | Work on Clone, Copy UVs, Paste UVs |
| 4K map on 4M points | wasted map, soft texels | recommend_map_size |
| Redshift with a preset material or SSS Weight 1 | paint gone | Polypaint material, Use Material Color 0, white Base |
| Smooth Surface on low-poly hard parts | shading bruises | off; creases with Dynamic Subdivision |
| Orthographic beauty render | flat, technical look | perspective on |
| Movie > Turntable from a script | cannot stop; asks about an existing movie | scripted frames plus assemble_turntable |
| Adding degrees for each frame | flips past 90 degrees | absolute triples from turntable_rotations |
stats() and its last review sheet, plus eyes and parts as named SubTools. From scenario-zbrush-hard-surface, parts as SubTools with creases. From scenario-zbrush-pose-print, a posed ZTL (paint with symmetry before posing when possible [added]).recommend_map_size, and either the exported color map (texture_from_polypaint) or a request for UVs on a clone before the bake. Multi Map Exporter's Texture from Polypaint runs in that skill's map batch.zb_paint.PATHS tags each path; many are [strings] (label exists in this build) or [verify]. Run live_p01_paint_paths.py first: set() on a missing path is silent.zb_paint has run in ZBrush yet; 36 offline tests pass; live tests tests/code/zbrush-paint-render/live_p01 to p06.references/procedures.md: full bridge code for every stage. Load before writing any paint or render code.references/critique.md: the rubric, the Z1 and Z2 finishing test cases, and the two evaluation prompts. Load at every gate.references/expert-notes.md: the depth by expert with timestamps, the disagreements and what transfers without a tablet. Load when a decision is not covered here.references/gui-paths.md: palettes, hotkeys and settings for a human or computer-use agent. Load for Spotlight, dialogs and GUI-only steps.references/sources.md: every source with credentials, URLs and timestamps.