Forge — Entry Point, Router & Orchestrator
The front door to the Forge 3D production suite. The suite is 19 focused skills (plus forge-data
reference library) and 5 agents; this hub keeps you from choosing the wrong one. It does four things:
orchestrate — probe project state, decide which pipeline the situation needs, then actually run
it end-to-end by invoking each skill via the Skill tool — plus dispatch a verb to a specific
skill, init FORGE.md project memory, and show the menu.
Project memory: if
FORGE.mdexists at the project root, read it first — it carries the render engine, coordinate system, scale unit, poly budgets, texel density, PBR workflow, output paths, and Atelier aesthetic link for this project. Schema + template:references/project-memory.md.
Suite map (what this routes to). Planning & spec:
forge-brief(define asset + write FORGE.md) ·forge-standards(design tokens: units/scale/pivot/naming/budgets). Modeling:forge-model(bpy/bmesh polygon modeling) ·forge-parametric(OpenSCAD/CadQuery/ Build123d/FreeCAD) ·forge-procedural(Geometry Nodes/SDF/generative) ·forge-topology(retopo/decimation/LOD/boolean cleanup) ·forge-uv(unwrap/seams/packing/UDIMs). Look-dev:forge-material(PBR/glTF/Principled→glTF) ·forge-texture(baking/procedural) ·forge-light(lighting rigs/HDRI/IBL/color management). Output:forge-render(headless Cycles render/turntable/contact-sheet QA) ·forge-export(glTF/GLB/USD/FBX/engine conventions) ·forge-optimize(DRACO/Meshopt/KTX2/web budgets + theatelier-webglhandoff seam). Rigging & Sim:forge-rig(armatures/IK/FK) ·forge-animate(keyframes/F-curves/bake) ·forge-sim(cloth/rigid/particles/hair/fluids). Intake:forge-intake(photogrammetry/Gaussian splat/AI text-to-3D + cleanup). Quality gate:forge-validate(manifold/normals/scale/polycount/UV overlap/glTF-Validator/ printability/render-QA + adversarial escalation; runs after every major stage). Reference library:forge-data(BM25 lookup over render parameters, material presets, lighting rigs, format budgets; called by other skills — not user-facing). Agents:forge-director(Opus orchestrator) fans out toforge-modeler·forge-lookdev·forge-rigtech·forge-pipeline(Sonnet specialists). Full pipeline sequence:references/pipeline.md.
Setup — read project state first
Run the signal probe once (pure-Python stdlib, no network, reads only):
python "$CLAUDE_CONFIG_DIR/skills/forge/scripts/probe.py"
It reports: which 3D tools are on PATH (Blender/OpenSCAD/Python/Node/gltf_validator/toktx), existing
.blend/.scad/.glb/.usd files, prior renders, and whether FORGE.md / ATELIER.md are present.
It recommends nothing — you reason over the facts. Add --json for machine-parseable output; pass
--root <dir> for a specific project. If Python is unavailable, skip it and reason from what you can
see; never block on the probe.
Decide-first gate
Before routing, do the suite's mandatory opening move (FORGE_PLAN §A; mirrors forge-brief's Decide first section): from the probe output, confirm the tool the chosen pipeline needs is present.
- Modeling/render/rig/anim/sim → Blender; parametric/print → OpenSCAD (
openscad.com) or CadQuery (python); web compression → Node + gltf-transform (+toktxfor KTX2). - If the required tool is MISS → stop with the one-line install hint, don't dead-end into a failed render. If only an advisory tool is MISS (gltf_validator, toktx) → degrade (see the table below), don't block.
Routing rules
- No argument (often with a build prompt) → the user wants the suite to move the project forward.
Read probe output + FORGE.md (if present), decide the pipeline the situation needs, and run it
via the orchestration loop by invoking each skill with the Skill tool — don't hand back a list, and
don't name skills in prose. For a new build, run
initinline thenSkill(forge-brief). Scale it: a single UV fix is a single-skill run, not the whole pipeline. - First word is a verb in the dispatch table → invoke that skill via the Skill tool by its exact
forge-*name (pass anything after the verb as its target), and let it run — don't just narrate it. - First word is
init→ run the memory-setup flow below. - First word is
help→ print the stage menu. - Verb maps to an agent (e.g. "orchestrate full pipeline", "run the full 3D pipeline") → invoke the
Agent tool with
subagent_type: "forge-director"— not a skill call. - Verb doesn't match but intent maps to one skill → invoke that skill via the Skill tool by its exact name. If two fit, ask once which.
Dispatch table (verb → forge-* skill or forge-* agent)
| Verb(s) | Routes to | For |
|---|---|---|
brief, spec, define, plan |
forge-brief |
Define asset brief + write/update FORGE.md |
standards, units, scale, naming, budget |
forge-standards |
Design tokens: units/pivot/poly & texel budgets |
model, mesh, box-model, bpy, blender |
forge-model |
Polygon/box modeling via bpy + bmesh + modifiers |
parametric, openscad, cadquery, cad, scad, print |
forge-parametric |
Code CAD: OpenSCAD/CadQuery/Build123d/FreeCAD |
procedural, geonodes, sdf, lsystem, scatter, generative |
forge-procedural |
Geometry Nodes, SDF/implicit, L-systems, scatter |
topology, retopo, decimate, lod, boolean, cleanup, repair |
forge-topology |
Retopo, decimation, LOD, boolean cleanup, transforms |
uv, unwrap, seams, udim, pack, texel |
forge-uv |
UV unwrap, seams, packing, UDIMs, distortion |
material, shader, pbr, principled, gltf-mat |
forge-material |
PBR shading, glTF material model, Principled→glTF |
texture, bake, normal-map, ao, curvature |
forge-texture |
Texture baking (normal/AO/curvature) + procedural |
light, hdri, ibl, lighting, ocio, agx |
forge-light |
Lighting rigs, HDRI/IBL, color management (AgX) |
render, turntable, contact-sheet, qa-render |
forge-render |
Headless Cycles render, turntable, contact-sheet QA |
rig, armature, ik, fk, bone, skin, weight |
forge-rig |
Armatures, IK/FK, skinning/weight painting |
animate, keyframe, fcurve, bake-anim, export-anim |
forge-animate |
Keyframes, F-curves, baking, skeletal+morph export |
sim, cloth, rigid, particles, hair, fluid |
forge-sim |
Cloth/rigid/particles/hair/fluids — bake & export |
intake, photogrammetry, splat, nerf, ai-3d, text-to-3d |
forge-intake |
Photogrammetry/Gaussian-splat/AI text/image-to-3D |
validate, check, manifold, watertight, gltf-validate |
forge-validate |
Full quality gate: mesh + UV + glTF + render QA |
export, glb, usd, fbx, unreal, unity, godot |
forge-export |
Format export: glTF/GLB/USD/FBX + engine conventions |
optimize, draco, meshopt, ktx2, compress, web-budget |
forge-optimize |
gltf-transform compression, KTX2, LODs, web budgets |
handoff, to-web, atelier-webgl, web-delivery |
forge-export → forge-optimize → Skill(atelier-webgl) |
Full web-delivery chain; see §Atelier handoff below |
director, orchestrate, full-pipeline |
Agent: forge-director |
Full orchestration via the director subagent (Opus) |
data, lookup, preset, cheatsheet |
forge-data |
BM25 search over parameter/material/budget tables |
Atelier handoff — the Forge → atelier-webgl seam (§F.4 of FORGE_PLAN)
When the task is web delivery:
- Run
Skill(forge-export)— producepublic/forge/<slug>-hero.glb(DRACO enabled). - Run
Skill(forge-optimize)— gltf-transform Meshopt + quantize (+ KTX2 if texture-heavy). - Write the handoff note to
FORGE.md(## Forge 3D assetsblock — template inreferences/project-memory.md). - Run
Skill(atelier-webgl)— it wires the R3F ForgeScene + HeroPoster pattern, reduced-motion fallback, and perf-a11y gate.
Run = call the Skill tool with its exact name. Nothing else counts.
Orchestration logic — which skills the situation needs
FORGE.mdabsent + new asset brief →initinline →Skill(forge-brief)→Skill(forge-standards), then the modeling stack.ATELIER.mdpresent + Award-grade interactivity → read the aesthetic + signature moment →Skill(forge-brief)(extract Atelier link), then modeling + look-dev + render → web-delivery chain.- Request is geometry-only → pick one of
forge-model/forge-parametric/forge-proceduralbased on the asset type (organic/hard-surface →forge-model; toleranced/print →forge-parametric; L-system/scatter/SDF →forge-procedural) →Skill(forge-validate)after. - Request is look-dev →
forge-material→forge-texture→forge-light→forge-render(verify visually) →forge-validate. - Full production run → spawn
Agent(forge-director); it orchestrates specialists in parallel. - Web delivery only (existing GLB) →
forge-export→forge-optimize→Skill(atelier-webgl).
Pick the shortest pipeline that actually moves this project forward.
Degrade, don't dead-end (partial toolchain)
When the decide-first gate shows a tool MISS, route around it instead of stopping — only a required tool blocks. Common partial-toolchain cases:
| Tool MISS | Effect | Route |
|---|---|---|
| Blender | Cannot model/render/rig/anim/sim | BLOCK — surface install hint; no headless 3D path exists |
| OpenSCAD / CadQuery | Cannot do parametric/print | BLOCK for that path; try the other CAD tool, or forge-model (bpy) if the asset allows |
| Node / gltf-transform | Cannot Draco/Meshopt/quantize | Export raw GLB via forge-export, skip forge-optimize, WARN that the GLB is uncompressed |
| toktx (KTX2) | Cannot GPU-native texture-compress | Fall back to --texture-compress webp (forge/references/windows-headless.md §6); WARN |
| gltf_validator | forge-validate Tier 2 unavailable | Run Tier 1 mesh/UV checks; note glTF spec validation was skipped |
| magick / ffmpeg | No poster WebP / anim preview | Keep the PNG; WARN that web poster / preview bake was skipped |
Always report what was degraded so a later run (with the tool installed) can complete it.
The orchestration loop (how it actually runs)
You have full tool access — including the Skill tool and the Agent tool (for subagents).
Running a skill = calling the Skill tool with its exact name. Nothing else counts. Writing "next: forge-render" or "now apply forge-material" in prose runs NOTHING — that narration is the exact bug this loop exists to kill. Every stage is an explicit
Skill(forge-<name>)call by full name.initis the one exception: it is a mode of THIS skill, so run its flow inline.
Run the pipeline as one continuous flow:
- Invoke → carry forward. Call each stage with the Skill tool; let it execute its full flow. Its output (FORGE.md edits, .blend files, rendered PNGs, GLBs) feeds the next stage.
- FORGE.md is the shared, living brief.
initwrites it;forge-briefwrites the asset spec;forge-standardswrites budgets. Each stage reads it first. - Let forge-validate run after every major stage. Never skip the quality gate.
- Parallel fan-out for independent stages — delegate to
forge-directorwhen geometry, look-dev, and rigging can run simultaneously, each with unique output paths under.forge-build/out/. - Stop conditions. Stop when the pipeline completes, a real blocker occurs (missing tool, failed render), or the user steers. Report what ran and what remains.
init — write the project's 3D memory
/forge init creates FORGE.md at the project root — the persistent brief every Forge skill reads.
Full schema and template: references/project-memory.md — load it first, then:
- Probe + read. Run
probe.py; ifFORGE.mdalready exists, read it and offer to update. IfATELIER.mdis present, read it for aesthetic/world/signature moment/OKLCH hue — populate the## Atelier linksection of FORGE.md from it. - Interview (scaled). Use
AskUserQuestionfor load-bearing choices: target engine (three.js/ R3F | Unreal | Unity | Godot | print | AR/USDZ), coordinate system (Y-up for web/Unity/USD; Z-up for Blender/Godot — confirm handedness), scale unit (meters standard for glTF/Unreal; centimeters for print), poly budget class (hero prop / env set piece / background), and render intent (web delivery → Cycles headless; previz only; print). Infer the rest from the probe and brief; don't interrogate. - Write
FORGE.mdfrom the template (all 7 sections). Set## Render: engine = Cycles— this is the Windows-headless default (EEVEE Next has no headless support on Windows without a virtual display). - Continue — invoke the next skill. After writing FORGE.md, call
Skill(forge-brief)to fill the asset spec.initis the first move; everything downstream reads what it writes.
help — the stage menu
SPEC /forge brief · /forge standards
MODEL /forge model · /forge parametric · /forge procedural
MESH QA /forge topology · /forge uv
LOOK-DEV /forge material · /forge texture · /forge light · /forge render
RIG/ANIM /forge rig · /forge animate · /forge sim
PIPELINE /forge export · /forge optimize · /forge validate
INTAKE /forge intake (photogrammetry / splat / AI text-to-3D)
WEB HAND /forge handoff (export → optimize → Skill(atelier-webgl))
AGENTS /forge director (Opus orchestrator — full autonomous pipeline)
DATA /forge data (BM25 lookup; not user-facing)
SETUP /forge init (writes FORGE.md — do this first on a new project)
Operating principles
- Decide and run — don't just recommend. Probe state, choose the skills the situation needs, then execute the pipeline end-to-end. There is no "proceed?" gate between stages; the only pauses are for a skill's own required input (asset spec, engine target, poly budget class).
- Run = call the Skill tool. Naming a skill in prose ("next: forge-render") runs nothing. Every stage
is an explicit
Skill(forge-<name>)orAgent(forge-director)call — zero ambiguity, no narration in its place. - Render-in-the-loop is the eyes. Every produced asset is verified by headless render to PNG +
Readof that PNG for visual inspection. Never report a model as complete without a render check. - FORGE.md first on substantial work. A persisted FORGE.md keeps every later skill on-brief across sessions — render engine, coordinate system, budgets, and Atelier aesthetic link all live there.
- Deterministic, idempotent rebuilds. Pin seeds (FORGE.md §Determinism /
forge-procedural&forge-sim), write to fixed output paths, overwrite in place — re-running a stage on unchanged input reproduces the same asset. Emit reproducible source (.py/.scad/.json), never hand-tweaked binaries. - Degrade, don't dead-end. Only a required tool blocks. If an advisory tool is absent (Node/ gltf-transform, toktx, gltf_validator, magick), route around it (export raw GLB, WebP fallback, Tier-1-only validate) and WARN — see the §Degrade table. Never stop a pipeline a partial toolchain can still advance.
- Windows headless truths are non-negotiable. Cycles (not EEVEE Next) for all headless renders;
blender -b scene -P s.py -- <args>with mandatory--;openscad.comnot.exe;pythonnotpython3; absolute forward-slash paths in Blenderfilepath. Full details:references/windows-headless.md.