← Just Build It — the deck · evidence document

3D Fork — Visual Intent → Editable Geometry → Engineering Handoff

Not "AI generates production-ready shoe CAD from an image." The fork studies where AI-generated 3D actually has value inside a footwear design process, when the representation must change, and when the geometry must be handed back to a designer or an engineer.

One-sentence definition

The 3D Fork carries an approved 2D design state into space in staged, gated steps — concept mesh for volume judgment, editable geometry for design correction, and an explicit handoff to real footwear engineering — while measuring at every conversion how much of the approved design intent survived.

The three questions this fork must answer

  1. Does the 2D design intent actually enter the 3D? Not "does the mesh look like a shoe" — does the mesh preserve the views, proportions and part relationships a designer already approved?
  2. Does the AI mesh help a designer judge volume, or does it merely look cool? A mesh that lets a designer reject a direction in thirty seconds is a success even if the topology is garbage.
  3. How much human labor sits between disposable mesh and editable design geometry? Measured in minutes per region, not asserted.

If these three are answered with documented runs, the fork stands as an independent case. Everything else in this document is scaffolding for answering them.

Position in the system

The fork branches off the approved 2D design state — the same state the F-battery produces and the harness measures. It is a tool-side extension (left loop): new workflows, new nodes, same contracts. The Log Node discipline, human gates, and lineage rules carry over unchanged.

What already exists in this repo (the fork is not starting from zero):

Piece Where Status
View contract as a hard gate (front+side+back required, right preferred; violation throws before any API call) src/agents/concept-3d/tripo-view-rules.js working
Identity-locked six-view sheet (single-call sheet, not per-angle generations — per-angle was tried and rejected: different shoes stitched together) consistent-orthographic-views.js working
Double human gate: approve2dViews → mesh → approve3dMesh → publish src/workflow/concept-3d-workflow.js working
"Concept mesh ≠ production CAD" as a code constant, Blender-refine handoff src/agents/concept-3d/index.js:55, blender-handoff.js working
Three-backend method comparison from one six-view input (Hunyuan3D 2 / Tripo 3.1 / Rodin Gen-2, one camera and light rig) deck 14.8 evidence, 3d-method-comparison.jpg evidence
Rhino/GH handoff for editable CAD blender-handoff.js:124 not_implemented
ProjectionCheck, scale envelope, region separation, SubD ledger, handoff package this fork spec

The ladder: four levels, four different product questions

L1, L2, L3 are three different product problems, not three quality settings of one problem. Naming the level names the question, the representation, and the judge.

Level Designer verb Question it answers Representation Success criterion Judge Status
L0 — Visual 3D SEE Can I see the idea spatially? multi-view images, turntable video, (later) splat design identity survives rotation designer, by eye evidence — F06 probe, F09 light sweep
L1 — Concept Mesh JUDGE Does the volume / proportion work? rough AI mesh designer can confidently judge stance, toe/heel volume, sole proportion, silhouette in perspective — or confidently reject designer, at the proportion gate working (Tripo path)
L2 — Editable Geometry EDIT Can the designer correct the spatial hypothesis? SubD cage, selective NURBS designer edits proportion directly; labor per region is known and acceptable designer, in Rhino spec
L3 — Engineering Handoff ENGINEER → MAKE Can footwear engineering take over? last, style lines, patterns, tooling out of scope — deliberately footwear developer, in footwear CAD non-goal

Each representation is only useful for a specific design decision — the verb column is the on-screen vocabulary; the L-numbers stay in the technical layer.

L3 is an explicit non-goal. Real footwear engineering starts from a digital last and proceeds through on-last design, flattening, 2D patterns, grading, and tooling — a different domain with its own systems (Shoemaster, Romans CAD class). The fork's last stage is a handoff package, not a manufactured shoe. This is not a weakness; it is the boundary statement: I know where my tool should stop.

Stage map

                 APPROVED 2D DESIGN STATE
                          │
                ┌─────────▼──────────┐
                │ 3D-00 Prepare      │  locks / preserves / interpretation
                │ 3D Design State    │  freedoms, scale reference, lineage
                └─────────┬──────────┘
                          │
                ┌─────────▼──────────┐
                │ 3D-01 View Pack    │  consistent views, not six pretty
                │ (consistency, not  │  images — cross-view agreement is
                │  generation)       │  the deliverable
                └─────────┬──────────┘
                          │
                ┌─────────▼──────────┐
                │ 3D-02 Scale /      │  known length, width/height ranges;
                │ Volume Envelope    │  generation is not free-form
                └─────────┬──────────┘
                          │
                ┌─────────▼──────────┐
                │ L1 Concept Mesh    │  provider-agnostic:
                │ GenerateConceptMesh│  Tripo / Hunyuan / Rodin / future
                └─────────┬──────────┘
                          │
                ┌─────────▼──────────┐
                │ ProjectionCheck    │  deterministic fidelity report —
                │ (triage, not veto) │  runs BEFORE the human gate
                └─────────┬──────────┘
                          │
                ╔═════════▼══════════╗
                ║ HUMAN PROPORTION   ║  reject → back to 2D. A fast,
                ║ GATE               ║  confident reject is a SUCCESS.
                ╚═════════╤══════════╝  No mesh repair before this gate.
                          │ approve
                ┌─────────▼──────────┐
                │ L2 Region          │  2D semantic regions → coarse 3D
                │ Separation + SubD  │  regions; QuadRemesh → SubD cage →
                │ rebuild            │  designer edit → selective NURBS
                └─────────┬──────────┘
                          │
                ┌─────────▼──────────┐
                │ L3 Handoff Package │  mesh + regions + view pack +
                │ (non-goal beyond)  │  design state + known limits
                └────────────────────┘

Two rules the diagram encodes:

3D-00 — the 3D Design State

This is where the fork separates from one-click image-to-3D. Before any generation, the approved 2D state is compiled into an explicit contract:

DesignState3D {
    approved_views          // the identity-locked pack
    semantic_regions        // from F04 layer manifest (SAM3)
    locked_regions          // must not change
    preserved_regions       // approximately held
    editable_regions        // interpretation allowed
    design_intent           // translated feedback, with provenance
    scale_reference         // known length; width/height ranges
    last_reference?         // future: digital last envelope
    parent_iteration        // lineage
}

Example, in designer terms:

LOCK:                collar opening · outsole footprint · eyestay position
PRESERVE ≈:          toe volume · heel proportion · panel boundaries
ALLOW INTERPRETATION: medial secondary details · surface transitions

3D-01 — a consistent View Pack, not six generated images

Six individually attractive views are not a three-dimensional object. The deliverable is cross-view agreement: outsole width agrees between bottom and front; collar opening agrees between top and rear; a named point on the lateral view has a counterpart on the medial view.

Honesty line (enforced in code, must survive into any narrative): six views for review and validation, four for generation. The multiview endpoint takes at most four slots in order [front, left, back, right]; top and bottom are review-only and never feed generation (tripo-view-rules.js:12,24,30).

3D-02 — Scale / Volume Envelope

The common failure of AI 3D is not "can't make a shoe" — it is "made an arbitrary object that resembles a shoe." The envelope is the cheap, deterministic fix: length is known; overall width, sole height and heel height carry known ranges. The mesh is normalized to length and the rest is checked against range. Later, a digital last can replace the box envelope. (Autodesk's canvas-to-mesh work in automotive uses the same logic: multi-view input plus a controlled dimensional envelope, targeted at proportion and volume judgment — not surfacing.)

ProjectionCheck — the fidelity instrument

The fork's own measurement. It extends the project's evaluation philosophy from 2D into 3D, and it is fully deterministic — no VLM judgment anywhere in the loop.

Generated mesh ──→ orthographic renders ──┐
                                          ├──→ per-view, per-region drift report
Approved view pack ───────────────────────┘

Three layers, cheapest first:

  1. Registration. Normalize by length, align. Without this every downstream number is noise.
  2. Silhouette layer. Mesh projection outline vs approved view outline — IoU plus maximum contour deviation, per view.
  3. Region layer. Reuse the F04 SAM3 masks directly: per component (heel, toe, quarter, midsole, outsole, tongue…), how far did position and area drift in each projection? No 3D segmentation needed — the comparison lives in the projection plane.

The question it answers is never "does it look like a shoe" but "how much of the approved 2D design intent does this 3D hypothesis preserve?"

Two instruments, one philosophy

The project now carries two rulers. They must never be conflated.

Exploration Harness ProjectionCheck
Measures breadth — where a system stops opening useful directions fidelity — how much approved intent survives a representation change
Output capability boundary + E/U/R/O profile per-view, per-region drift report
Method blind deck, designers sort, provenance hidden deterministic geometry comparison
Human role the sort is the measurement the number triages, the human gates
Boundary becomes a work order on the tool (model / workflow / controls / task / sampling) a work order on the 3D stage (view pack / envelope / provider / region lock)

Shared philosophy: both produce a boundary read as a work order, both refuse to collapse into a single score, and both keep the designer as the final judge. The harness finds where generation stops being useful; ProjectionCheck finds where conversion starts losing intent.

L2 — the deliverable is a labor ledger

The realistic path (Rhino 8): QuadRemesh → SubD cage → designer edits → selective ToNURBS. Not everything is rebuilt, and nothing is rebuilt uniformly — the shoe is partitioned by geometry requirement:

Component Concept mesh SubD Precise CAD
Upper volume later
Soft textile panels pattern stage
Collar later
Midsole visual form eventually ✓
Outsole tooling reference maybe
Mechanical interfaces
Last reference
Pattern pieces reference

The research output of L2 is not an automated retopo pipeline. It is a ledger: minutes of human work per region, which regions QuadRemesh handles, where the cage must be rebuilt by hand, where SubD is never enough. The ledger is the evidence that the stage was done, not diagrammed. (Mesh→BRep conversion is deliberately not the default path: converting succeeds technically and still yields thousands of unusable faces — "editable" is a property of the rebuild, not of the conversion.)

Agents: one, and only one

No "3D Agent — fix my shoe." The single agent seat in this fork is interpretation — and it is the existing translate node (LLM + guardrails) aimed at the 3D region schema, not a new component:

"heel feels too bulky, but keep the tension here"
        ↓  interpretation (existing translate node)
{ region: heel, preserve: [collar_connection, midsole_transition_front],
  modify: rear_volume, direction: reduce, amount: moderate }
        ↓  deterministic node / CAD command executes

Geometry operations are performed by deterministic nodes or the designer — never by the agent.

3D-P — Physical Reference Fork (deferred)

Gaussian splatting belongs in a separate fork: physical prototype → phone capture → splat → free-viewpoint review → compare against the approved digital concept. It closes the loop design intent → geometry → physical sample → digital feedback. It is appearance, not CAD — a particle/radiance representation with no surface, edge or component semantics — and it enters this project only when a physical sample exists to capture. Until then it is a named slot, not a page.

MVP — one documented run

The MVP is a single chain, run once, end to end, on one shoe, fully logged:

approved side concept → consistent view pack → scale envelope → concept mesh
→ ProjectionCheck report → human approve/reject → region separation
→ editable SubD → manual adjustment → handoff package

Evidence discipline (same as the F-battery): every step writes a LogRun sidecar — prompt, seed, model, workflow id, source-asset ids; only designer-approved assets feed the next stage. The run must produce, at minimum:

Honesty block

Unproven until the MVP run exists: ProjectionCheck thresholds are unset (what drift is "acceptable" must come from designer gate decisions, not be invented); the L2 ledger has no numbers; region separation is spec only; no claim is made that any current provider's mesh survives the proportion gate. The one measured fact today: three backends given the same six views produce three different boundaries (deck 14.8). Everything else in this document is a plan wearing its status labels.

Next documents