Everything in the game that has a face came through the forge. So did Ember, the chat bot, who is not in the game but needed a portrait, an avatar and a rig for the same reasons. The forge is a set of scripts on a workstation with a GPU: a diffusion model paints, a mesh model lifts a drawing into geometry, a rigging model adds a skeleton, and a runner drives all of it as fifteen declared steps. This post walks the stages with the pictures each one leaves behind.

Diagram: what each cast step is handed and what it must write. Walk the guided views: before the GPU, the paint, the mesh, the rig, the gate.

Stage zero: a reference exists

My own reference, one of five: a plain photograph, front on, even light. This is what the uncle's face in the game was made from.

For everyone else in the family the reference is also a photograph, and those are not published. This placeholder stands in for each of them.

Every character starts from a reference. For a fictional character like Ember that is a drawing I approved. For a family member it is a set of photographs, and the first rule of the whole system is that the kids’ photographs never leave the house: they live in a folder the publishing gate refuses by path, and the gate hashes every one of them so that a copy under another name is refused too. Mine is above because I chose to show it; it is the only reference on this site. Everything else below is what the forge made.

Stage one: paint, and derive the colours

Ember's palette, derived from the art rather than declared: each swatch is the pixels that fed it.

The palette is extracted, not typed in. A script clusters the pixels of the approved art and names the clusters: hair light, hair base, skin, flannel, lineart. Every later stage reads this file. When a garment on a 3D model needs a colour, it gets the one the drawing already had.

Two runs of the same prompt: three seeds with arms at the sides, then one seed with three explicit poses. Describe the pose, not the outcome.

The first thing the painter taught me is that “arms stayed against the torso” is not a prompt. Run one asked for a character; the model gave me the same character three times with her arms glued down. Run two named the pose, hands on hips, and got it on the first seed. The sheet keeps both runs because the failed one is the lesson.

The outfit pass: pose locked, one seed, only the garment varies.

With the pose locked and the seed fixed, one variable at a time. Layered outfits are there on purpose: the step that separates the character into parts for rigging needs an edge to cut on, and a cardigan over a tee gives it one.

The refined pass: the flat, rigging-safe version, then the same seeds with warmer shading and fabric weight.

One phrase removed: same seed, same everything, the drawn circle deleted. The hair survives.

That last sheet answers a question I could not answer by looking: does the prompt phrase that draws the circle behind her also decide the hair? Same seed, one phrase deleted, hair unchanged. A controlled comparison is cheap here and it settles arguments that would otherwise run for an afternoon.

Avatar candidates for the chat rooms: the crop the client will show, at the size it will show it.

Stage two: the mesh, and the head

Ember's hair as a point cloud, before and after a pass on the rig's hair mesh: the same scalp, the strands where the drawing has them.

The mesh stage lifts the painted views into geometry. Hair is where it fails first, because hair is not a surface. The forge keeps a before-and-after of every pass that touches it, as points rather than renders, because a render hides exactly the gaps a point cloud shows.

For the family cast the head is grafted separately. A body mesh at a coarse resolution, a head at five hundred and twelve cubed, and a seam the recipe measures before it accepts the graft. The pictures below are my own head, because I was the test subject and the numbers in the recipe are my numbers.

v4: eyeballs only.

v5: lids.

v6: the grafted head, at the full resolution.

v10: smoothing, a face list, a chin, and the line that used to split the beard.

Each version answered one sentence I said while looking at the previous one. v7 was smoothing. v8 was the face list, which I signed off with “overall v8 is looking good”. v9 was the double chin, which the recipe had predicted would be a bare patch at the nape and which the first measurement showed was a flat bridge of texels with a shelf in the outline. v10 was the line splitting the beard, which was not a shading problem either. Two versions in a row had their own diagnosis overturned by the first measurement, and that is the habit the whole forge is built around: measure before you believe the story.

Stage three: in the game

The uncle in the village, v7: the first time the forge's output walked in the 3D game.

The lineup: three subjects through the same recipe, T-posed for the rig check.

The lineup is the recipe proving it is a recipe. The second subject taught it about things worn on the head. The third taught it something less comfortable: four of its detectors decided “is this skin?” with a hard-coded brightness floor, and a dark-skinned character fell under every one of them. The fix was not a lower floor. A lower floor made the detector confidently wrong in the other direction. The fix was a declaration: the recipe now states the skin colour and the facing, prints what the detector measured beside what was declared, and refuses to guess when the signal is absent.

The rule

A step that exits zero without writing its artefact is fatal. That is the whole contract, and it is the reason the forge can be trusted from a chat message: every step writes one named file, skips when that file is newer than its inputs, never overwrites, and the runner reads the file’s clock before and after. A green run that produced nothing is caught at the step, not at the end, and not by me.