The making-of
It's all in the details.
The idea was to replace the still images on the stream with a character who lives on air: TheSlumdogeMillionaire, a Shiba Inu in a pinstripe suit who talks in a synthetic voice, laughs, smokes a cigar and greets the chat between sentences. It started with thirteen generated images. Then came a sculpt of the head and torso, a paw file, a watch and a pair of trousers.
We built all of it without touching a mouse. First in Blender, driven by scripts, with every version rendered from the angle of the images so it could be compared with them. Then in a three.js page that runs live in the stream overlay, on a test bench where probes measure what the eye misses, like the distance between a claw and a cheek. The result fits on this page: fourteen chapters, from the first gray volume to the glass-and-steel desk, then what he gained once on air, during his first streams: postures, gestures, a daytime living room, and a keyboard he really types on.
The hours on this page aren't clock hours. Everything sits on an axis of the AI's working hours, from 0 to 88.5 h, with waiting time left out: “around 40 h” means after forty hours of that work.
Fourteen chapters, piece by piece.
01The head11.3 h · 4 steps
02The eyes≈ 1.0 h · 4 steps
03The ears≈ 4.9 h · 5 steps
04The muzzle and nose3.0 h · 2 steps
05The mouth and teeth3.1 h · 3 steps
06The fur and colors6.1 h · 3 steps
07The suit≈ 10.5 h · 8 steps
08The arms3.8 h · 6 steps
09The paws≈ 9.2 h · 7 steps
10The watch, the glass and the cigar≈ 4.6 h · 12 steps
11The keyboard6.8 h · 3 steps
12Animation and voice≈ 5.8 h · 15 steps
13The sets and the seated body≈ 11.5 h · 11 steps
14The bench and the tooling≈ 6.9 h · 18 steps
Where the time went
Each chapter with the time spent on it. Spread over five chapters (the head, the eyes, the ears, the muzzle, the mouth), the face takes 26.4% of the time, far ahead of everything else: next come the sets and the seated body (13.0%) and the suit (11.8%).
The face, five chapters together≈ 23.4 h · 26.4%
On the work axis
Each mark is a step; click one to read its story.
Chapter 1
The head
Where it stands
The head is built on the supplied sculpt, adopted at 22.9 h of work and remeshed symmetrically. Before that, it came from a volume fitted to six silhouettes, at 93.5% overlap. The mouth isn't hollowed out: it is cut into the mesh, along the lip line.
This chapter also holds the long pass that reworked the whole face from one version to the next, between 11.2 and 17.8 h of work.
Known limits
- The head is still a little less round than in the reference images.
Front view, version by version
- v4 · 5.7 h
- v6 · 9.3 h
- v7 · 11.0 h
- v9.2 · 17.8 h
- v10 · 20.0 h, unpublished
- v11 · 22.7 h, on the sculpt
- bench · 28.8 h
- final state · 88.5 h
How we got there
around 0.0 hFitting a volume to silhouettes53 min1.0%3msg9iter.Steady
What was wrong
No geometry, only images that didn't agree with each other.
What was done
Silhouettes cut out from the gray background, key points placed (one eye corrected by hand), one camera per image, then a head described by simple shapes (ellipsoids, rounded cones, a box for the muzzle, two flattened ears) whose dimensions a program adjusts to match all six outlines at once.
The first volume, set by hand, covers the outlines at 71% in profile and 87% from the front. The automatic fit moves the shape, the six cameras and the ear pose in each image together: 76% at the start, 91% at the 55th iteration, 95.3% at the end.
around 1.3 hA head that can be animated1.0 h1.2%2msg18iter.Intense
What was wrong
A smooth shape can't be animated: it needs a regular mesh, a real mouth opening, eyes in sockets, a skeleton.
What was done
Eyes, nose, lips and eyelids placed on the images; head closed, then remeshed into 13,506 quads; mouth cut into the mesh; jaw hinged where it hinges on a dog's skull, at the temporomandibular joint.
around 11.2 hA six-hour pass over the whole face6.7 h7.5%1msg98iter.Intense
What was wrong
Ears not yet up to the reference in every pose, cream lip edges instead of dark ones, skin that didn't hang down at the sides of the muzzle, a nose melting into the fur, eyes not real enough, no rolls in the fur, no thick fur collar.
What was done
Four versions published back to back: v8 at 14.9 h, v9 at 16.3 h, v9.1 at 17.0 h, v9.2 at 17.7 h of work, each with its comparison contact sheet.
Airplane ears. In the image, the base of the ear slides about 0.6 units down along the skull. A rotation around the junction can't do that. A slide bone was added under each ear, centered on the curve of the skull. Adding it shifted the bone numbering in the exported file, because the exporter sorts bones by depth, then by name; the fur, which found the ear bones by number, now finds them by name.
Smile. At full smile, a flap of pale skin appeared at the corner of the mouth. The displacement was projected onto tangent planes that turn sharply at that spot, with a distance measured along edges that came out two to four times too large at the end of the cut. With normals smoothed over a hundred passes and a straight-line distance, the folded faces go from 28 to one.
A black head. One reconstruction came out two-thirds black. An island of skin that no image saw, with no colored neighbor, made the fill computation singular, and a single missing value contaminates the whole system. A guard now blocks the write if any color is missing.
Eyes. Eye rim twice as thin, pupil softened, iris lit from below, and a light box in the environment so the cornea and the nose return a window-shaped highlight instead of a dot.
Lips. Tucking the lower lip under the upper one to make it hang opened the mouth at rest, with teeth and pink showing through the gap. The overhang came back as a shadow instead. The lip line was retraced from the three-quarter view, which had never been used: projected back onto the surface, it showed a line that dove backward and gave a sulky look.
Details. A raised fur collar, rolls running across the lie of the fur (otherwise you get dapples), follicle dots on the whisker pads, mostly dark whiskers, and a key light moved further to the side to shape the cheeks.
around 20.2 hSwitching to the supplied sculpt as a base2.8 h3.1%3msg51iter.Intense
What was wrong
The cheeks, mouth, neck and ears needed accurate proportions, and the images alone couldn't provide them.
What was done
Five sculpts supplied as .glb: neutral bust in a suit, airplane ears, open mouth, nose, tongue, about a million vertices each, 8K textures. The neutral bust becomes the base of the head; the ears, eyes, skeleton, muscles and fur remain the pipeline's own.
The sculpt was fitted to the silhouettes, with 87.6% average overlap. The fit had introduced 2.6° of yaw; since the sculpt is almost perfectly symmetrical, its plane of symmetry was put back exactly at the center. Then: suit removed by color, collar edge cleaned up, neck extended downward, the sculpt's ears erased by reprojecting the skin onto the skull of the old head. Simply filling the holes left bear-ear domes in their place, which would have filled the shells of the new ears.
The volume was converted to a signed distance grid, symmetrized, and computed only near the surface: 22 seconds instead of twenty minutes.
For the lips, measuring settled things. The sculpt's fold is only 0.02 to 0.03 units deep and dies in the remesh. The thick line in the images isn't relief anyway: it's the fur of the upper flew hanging over, and under it the lower lip, black and in shadow, forms a band that thickens toward the corner. The shader now paints that band per pixel. As vertex colors, it came out jagged.
Colors are read from the images first; the sculpt's texture only fills the areas no image sees, because it was washing out the face. On this new base the eyes came out 35% too large and too round, and were shrunk.
1 steady 3 intense
Chapter 2
The eyes
Where it stands
Almond eyes set deep in the socket, with no ridge around the lid and two dark marks at the inner and outer corners. Wide open, they show the whites; in astonishment, the iris shrinks by 12%, ringed by a dark limbus, with a sharp point of light on the cornea. The pouts narrow them (wary, bored) or open them up (alert, ooh). They also lead the gaze: a glance at the chat screen at every message, the watch dial before the head follows, the screen rather than the keyboard when he types.
The eye, version by version
- 3.0 h · thick rim
- 15.2 h · finer rim, reflection
- 28.8 h · on the sculpt, darkened corner
- 29.2 h · relaxed lid
- final state
How we got there
around 28.6 hThe ridge around the eyes43 min0.8%4msg7iter.Steady
What was wrong
A sharp line ran all the way around the eye, as if two layers of skin met there. It stayed visible even with the fur at zero, and this dog doesn't have sockets that deep.
What was done
The second and third eyelid rings are laid back onto the slope running from the eyelid edge to the skin, rotating around the center of the eyeball. The socket shadow now fades, from 0.26 at the edge to 0.03 on the skin, instead of stopping dead.
around 43.9 hThe whites of the eyes in surprise5 min0.1%1msg2iter.Quick
What was wrong
In surprise, the eyes showed no white.
What was done
The iris shrinks by 28% and the pupil by 22% when the eyes widen. The neutral eye is unchanged.
around 48.7 hA smaller iris, a crisp highlight≈ 8 min0.2%2msg3iter.Quick
What was wrong
In astonishment, the iris was too light and too large, with no crisp highlight.
What was done
A point of light on the cornea, a dark limbus, the iris reduced in two steps down to −40%, the pupil to −16%.
around 49.5 hA mark at the outer corner of the eye4 min0.1%1msg3iter.Quick
What was wrong
The outer corner of the eye lacked the black mark of the inner corner.
What was done
A tapered mark, tried at 0.07, then kept at 0.10 in length.
3 quick 1 steady
Chapter 3
The ears
Where it stands
Domed shells with a thick russet rim. Inside, cream fluff combed toward the tip, longer at the bottom and on the sides, lets the taupe skin show in the middle, darker toward the canal. The ears fold back airplane-style by sliding along the skull, and prick up at the start of each sentence.
The ear, version by version
- 11.0 h · domed shell
- 16.6 h · dark hollow
- 26.8 h · on the sculpt
- 28.8 h · fine tufts
- 29.5 h · cream tufts
- 71.4 h · fluff
- final state
How we got there
around 0.9 hEars that drooped toward the sky27 min0.5%2msg2iter.Steady
What was wrong
The ears had to swing from upright to folded down at the sides, as in the airplane-ears image. The first animation folded them down all right, but with the hollow facing up.
What was done
An explicit constraint on the direction of the hollow: forward and down. The first attempt left them edge-on, so a forward component had to be added.
around 9.3 hAlmond eyes, shell ears1.9 h2.1%5msg28iter.Intense
What was wrong
The eyes seemed to pop out of their sockets, where the images show almond-shaped outlines. A white streak ran from the forehead up into the ears. The ears were flat, when they should have been thin, curved, hollow enough to hold a shadow, with a russet edge and white only on the inside.
What was done
Eyes set deeper, almond outline tilted slightly outward. Ear rebuilt as a thin curved shell, with a computed shadow in the hollow and colors that follow the ear's geometry instead of the skull's.
The thin shell set off a chain of failures. The remesher rejected the ear with a message about normals, when the real cause was edges shorter than a ten-thousandth. Once the ear got through, four new defects showed up when it rotated: a ledge lifting off the skull, the ear peeling away at the edges, the texture on top of the head stretching, a crumpled side edge.
around 26.8 hEar tufts, whiskers, eye corners1.8 h2.0%12msg36iter.Intense
What was wrong
Long pale hairs in the ears, starting from the inner edge and sweeping across the dark hollow. Almost black hairs under the nose, fading down to the base of the whiskers. Pointed, darkened eye corners on the nose side. Slightly drooping whiskers, with two or three finer ones in the pale eyebrow patch and two on the chin.
What was done
Whiskers, eye corners and the underside of the nose in place. The ear tufts went through five states: a russet tuft at the base, a torn foam, tufts on one side only, fine strands over the whole inner surface, and finally five strands per root, thicker and shorter.
At first the black eye corner didn't touch a single vertex: the skin only starts after the five eyelid rings, 0.12 units from the corner, and the drawn point was finer than the mesh. It now sits on the rings themselves.
around 47.9 hLess pink ears≈ 5 min0.1%1msg2iter.Quick
What was wrong
From the front, you look straight into the back light, and the whole ear turned pink.
What was done
Translucency cut to a third, a less red tint, the effect concentrated on the edges.
around 70.7 h · v96 → v96cDown inside the ears≈ 43 min0.8%13msg15iter.Intense
What was wrong
The inside of the ears was a carpet of white strands drawn as lines, uniform and flat.
What was done
The reference is now photos of real dog ears: a thick russet edge, fine cream down combed toward the tip along the edges, taupe skin showing in the center, darker toward the ear canal. The hollow mask is computed at load time, on each ear's plane. The long cream hairs then come back, only at the bottom and on the sides, shorter and shorter toward the tip, with none in the middle at the bottom. The brown band at the base, which was head fur, gives way to cream.
1 quick 1 steady 3 intense
Chapter 4
The muzzle and nose
Where it stands
A matte nose with a leather grain and a cleaned-up outline, with no wings on the sides. Whiskers planted in follicles, whose lift and droop are set for all four groups at once.
The muzzle, version by version
- 3.0 h · truncated muzzle
- 17.6 h · sharp black line
- 20.0 h · lip rolls, the dead end
- 27.4 h · on the sculpt
- 28.8 h · leather-grain nose
- 31.1 h · cleaned-up outline
- final state
How we got there
around 2.4 hMuzzle, nose and first eyes1.4 h1.6%5msg17iter.Intense
What was wrong
The nose stuck out noticeably and the muzzle ended in a point, where the images show a blunt corner with the nose forming the angle without protruding. The mouth corners had to be able to pull far up for the laugh, and the eyes deserved more care than the rest.
What was done
A muzzle fit with hard bounds on its width, its roundness and how far the nose projects. Eyes as spheres, modeled on the ones drawn for the live stream's PNGs, with eyelids that slide over them.
Left free, the silhouettes always rebuild a point ending in a ball. The muzzle bounds are drawing choices turned into numbers. The eyes can close, widen, squint, stay half-shut, frown, and the gaze follows the cursor.
At the end of the step, three defects showed up in the viewer: a triangular, jagged lower jaw, when it should come round in a U up under the nose; eyes too small; a nose outline that made it look as if it sat under a cracked eggshell. The jaw was redrawn, the eyes enlarged, and every color boundary became a fade. That last rule hasn't moved since.
around 29.5 hA notched nose edge, two wings1.6 h1.8%7msg25iter.Intense
What was wrong
The nose leather spilled onto the fur just below it, in a sawtooth, with a gray-black border that was too strong. Its edge was notched where it should be continuous. In three-quarter view, two tabs of leather stuck out on the sides. A cream band ran across the top, and the fur didn't start right at the edge.
What was done
The leather outline is regularized rather than cut: radius measured angle by angle around the center, symmetrized, filtered down to four harmonics; depth along the muzzle median-filtered across neighboring sectors; a final smoothing near the edge. Vertices handed back to the fur take their neighbors' color by diffusion, and the fur grows back to within 0.06 units of the leather.
The edge was notched at first because the distance to the leather was clamped to zero inside it: its interpolation followed the vertex polygon, and the shader cut the black along that broken line. It became a signed distance, negative inside the leather, then smoothed along the mesh. The black pigment now stops 0.003 units from the edge instead of 0.010, and no strand is drawn over the leather.
That left the two wings. An elliptical cut seen from the front also shaved the top of the nose and left a detached wing in three-quarter view; a vertical cut left a hole. The measurements explain why: seen from the front, one of these tabs is hidden behind the nose, ten degrees above center, and runs back along the muzzle to 0.707 when all the rest of the edge stops around 0.78. A front outline can't see it. A median filter over neighboring sectors treats it as the isolated spike it is.
2 intense
Chapter 5
The mouth and teeth
Where it stands
No visible lips: two thick cheeks hang down on either side and meet under the nose, and the edge of the opening is the shadow of their roll. The lower lip is continuous, and the back of the mouth is darkened by a shadow computed vertex by vertex. When he talks, the lips stretch, round or lift with the sound; when he laughs, the mouth opens wide.
Thirty-six teeth in a full arch, tested against the skin with the mouth closed and half open, and a tongue with almost straight sides that moves forward and curls up when he laughs. Offered a treat, he chews.
Known limits
- He doesn't stick his tongue out: the idea was noted and never picked up again.
How we got there
around 24.3 h36 teeth and a tongue2.5 h2.8%20msg41iter.Intense
What was wrong
A tongue too small in the middle of the mouth, sunk into the floor. Tiny teeth, two small upper teeth floating at the back, gray flaps at the mouth corners.
What was done
A full arch on each jaw: canines at the corners, six incisors between them, premolars along the jaw back to the molars. A redesigned tongue, and gums as a wide dark band.
In the sculpts, only the canines were usable; the rest of the teeth are just a thin, ragged shell. So the canines keep the sculpt's shape, enlarged and set at the corners of the jaw. The incisors, the premolars (blades longer than they are tall, with one main cusp and small cusps behind it) and the molars are computed crowns, with the carnassials noticeably larger.
The tongue took four attempts. Computed tooth by tooth, its width followed the space between the teeth, with a cut-out shape that was obvious from above. It now has nearly straight sides, touches the lower canines with a slightly raised edge without narrowing between them, stops earlier, and ends in a thick, rounded tip. Its pink is darker, and the floor beside it no longer shines.
around 29.3 hThe lower lip: too thin, then with a hole9 min0.2%5msg1iter.Intense
What was wrong
Three defects around the mouth. The black band of the lower lip was too thin. With the mouth open, it faded out in the middle, under the incisors, and didn't join up from one side to the other. And the chin whiskers stayed up in the air, level with the upper teeth, instead of going down with the jaw.
What was done
The distance that controls the width of the dark band went from 0.35 to 0.24 on the lower-lip side, which thickens it. The groove under the nose is restricted to the flew side and the gum band stops earlier, which closes the hole in the middle. The chin whiskers form a separate group, attached to the jaw bone.
around 34.4 hA less brightly lit mouth30 min0.6%1msg19iter.Steady
What was wrong
The front light fell squarely on the tongue and palate: the inside of the mouth was bright pink.
What was done
A per-vertex shadow that falls off with distance from the lip line and gets stronger near the mouth corners. “Deep shadow” slider at 0.92, eased to 0.3 when the mouth opens wide.
1 steady 2 intense
Chapter 6
The fur and colors
Where it stands
Layered fur, calibrated on the images, with dark guard hairs scattered through the russet, a fur collar that fades in gradually and more than two thousand stray hairs breaking up the outline. On the paws, the same russet, strands twice as thick and white tips. The color and density settings picked on the bench became the defaults.
How we got there
around 5.7 hWhat made it look crude3.6 h4.1%2msg49iter.Intense
What was wrong
Polygon count had almost nothing to do with it: uniform velvet fur with no direction, colors set per vertex, ears as flat triangles, eyes with no cornea to catch the light, stiff movement.
What was done
Fur lying backward with tufts, short on the muzzle, longer at the ruff. Colors redone and calibrated, domed corneas, springs on the ear tips. Cheeks and neck that follow the head with a slight lag, flews that bounce when he talks, breathing, a leather grain on the nose.
The head was pale, with a white neck and light patches on the skull. A diagnostic tool showed where each color came from: vertices on the silhouette edge and the whole neck were reading the gray background of the images or the shirt collar, and both grays passed for cream. Colors are now read only inside a silhouette shrunk by a few pixels, areas no image sees are filled by extending their neighbors, and the russet is calibrated by comparing the render and the image under the same camera, vertex by vertex. Picked by eye, it came out pale and yellow once under the fur.
around 17.8 hDense fur, gradual collar, muscles2.4 h2.7%10msg39iter.Intense
What was wrong
A fur collar reduced to a band, when the fur should lengthen gradually up to the top of the collar. A muzzle cut with a knife. Not enough muscles for the expressions. Fur that clumps, where the reference's is dense and soft without being shiny.
What was done
Collar as a gradual swelling in the volume, with fur that lengthens in a gradient. Muzzle with rounded corners and a slightly domed front. Six muscles: cheeks, flews, wrinkled muzzle, pout, furrowed brows, forehead. Round, tapered strands, then more contrast and dark guard hairs.
Fur in animated films is made of millions of real strands, grown from a few thousand guide hairs, lit fiber by fiber, with light bouncing from hair to hair through the mass. In real time, all of that is approximated with layers. Ours had three defects: each hair was a little square, present or absent, with no tip or soft edge; it was lit like a matte surface; and random variation from one strand to the next made it grainy.
The strands became round and tapered, with edges softened by multisampling. The result came out too smooth: you could no longer see the hairs. The cells had to be stretched along the lie of the fur, the contrast between strands raised, and 4.4% dark guard hairs scattered in, which give the russet its depth. Under ambient light, the near-black drifted toward blue-gray; it became a very dark brown. The satin sheen usually given to hair was dropped, since the character's fur isn't shiny, and tufts remain only in the ears.
That left the mouth, and the mouth is what forced the change of base. This dog has no real visible lips: two thick cheeks hang down at the sides and meet under the nose in a neat, symmetrical vertical line, and the edge of the opening is only the shadow of their roll. Rolls carved out of spheres and cones never got there, too thin at first, then puffed up like sausages. The generated images disagree with each other on this area, by up to 0.15 units on the height of the muzzle corner, and simple shapes lack the finesse it needs.
around 46.2 hGuard hairs6 min0.1%1msg1iter.Quick
What was wrong
The outline of the head was too smooth, with a velvety look.
What was done
2,185 guard hairs, updated in 0.28 ms per frame.
1 quick 2 intense
Chapter 7
The suit
Where it stands
A black pinstripe suit, refitted to the supplied model and snug at the neck, with stripes that are computed rather than painted. The fabric has smoothed normals, the pocket is a new piece with piping and a pocket square folded into a diamond, and the buttons are real horn buttons. Trousers, oxfords and socks complete the outfit, and the bottom of the jacket drapes over his thighs when he sits down. At the front, the skin of the neck is pushed against the inside of the collar: you can no longer see through it.
The tie is the one from the supplied model. Its area was traced by hand, its side faces are painted down to the shirt, and the edge of the lapels has its suit fabric back.
Known limits
- A dark square patch, painted into the original trouser texture, shows on the crossed leg in the armchair.
- The tie knot is the supplied model's own, untouched.
How we got there
around 31.1 hFitting the suit, adjusting the collar2.2 h2.5%11msg51iter.Intense
around 31.1 h
Fitting the suit
15 min0.3%1msg12iter.Quick
What was wrong
The head ended in a bare neck cut. A full suit sculpt had just been supplied, in its own frame of reference and at its own scale.
What was done
Registered against the fabric of the original bust, decimated from 1.9 million to 86,314 faces, texture reduced to 2K and embedded in the page, attached to the root bone. The neck fur is masked under the collar by a height map of the edge, and the back of the neck is recolored russet.
Automatic registration looked for a full similarity transform, rotation included, and tilted the suit back by 10.6° to match the slanted cut of the bust. A torso stands upright, so the rotation was removed, leaving only a scale and a translation. Fine-tuning was then done by hand, aiming for the collar under the chin as on the original bust: down 0.55, forward 0.05, scaled up 12%.
around 32.5 h
The collar, and the neck that has to fit in it
28 min0.5%2msg11iter.Steady
What was wrong
From the front, the head sat on the suit with no neck, chin buried in the shirt. From behind and in three-quarter view, the nape spilled over the jacket and the collar disappeared, front and back.
What was done
The head stays put: under the chin, its neck already has the taper meant to go into the suit (circumference 8.3 then 7.1 units going down, constant after that). The suit is what moves, down 0.40 and back 0.30, which raises the head relative to it. Its collar then opens angle by angle, by whatever the neck lacks at that point, up to 0.66 units at the back; at the front the throat already fit, and the tie and the V stay where they are.
The measurement taken before touching anything shows why nothing fit: the shirt collar was cut for a 1.5 by 1.3 unit neckline, the character's is 2.4 by 2.1, and his nape sat 0.8 behind the collar. The first script lowered the suit by 0.45 and spread its collar by fixed factors, 1.40 at the sides and 1.45 at the back. The result sank the head into the collar, with no neck visible at all.
Three variants were then built and rendered from the same six angles: suit lowered only, lowered and moved back, then the same with a longer fade at the back. The first two left a hood-like bump behind the nape, where the opening is widest. The back fade went from 1.2 to 2.0 units.
around 33.3 h
Resting the nape on the collar
36 min0.7%4msg13iter.Steady
What was wrong
The head leaned forward and stuck too far out of the suit, and the roll of fur at the nape floated above the collar instead of resting on it with a slight overhang.
What was done
The suit is no longer registered by eye but against the original bust, overlaid image by image under the same cameras: factors of 0.917 in width and height, 1.135 in depth, median error 0.038 units. The collar comes down 0.35 around the true center of the neck, and the hidden neck is pulled in at the back by 0.2 at most, only under the collar's edge, so the fur falls over it.
The first check cleared one suspicion: the head had never been shrunk. Its vertices have been bit-for-bit identical since the suit was fitted, and so has the suit's scale. What had moved was the suit's position and its collar opening.
around 33.9 h
A tailored suit
23 min0.4%2msg7iter.Steady
What was wrong
The whole thing looked warped and badly cut, a long way from the character's classy suit. Seen from the front, the collar gaped at the sides, the tie knot was stretched, and the fabric rippled.
What was done
Four fixes, each aimed at a measured cause: the collar band pressed against the neck at every height, the collar displacement smoothed in space instead of applied point by point, the suit re-decimated four times finer with a texture twice as large, and a light ironing of the mesh.
The collar gaped below its edge. It was only tight at the top; just below, it flared out toward the jacket, leaving a gap of 0.26 to 0.47 units at the neck. The band now follows the neck at every height, within 0.03 or 0.04 all the way up.
The knot and the collar points were stretching. To open the collar, each point was pushed outward along its own angle. The knot, sitting on the axis, got spread sideways and its stripes stretched. The displacement is now computed once on the full-resolution suit and then smoothed in space, on a 0.04 grid with a 0.18 kernel: the knot, the collar points and the lapel notches move as one block, and only the collar band grows.
The wrinkled fabric came from the page. There the suit was decimated to 86,314 faces with a 2,048-pixel texture, while the original texture is 8,192. At that density the fine stripes smeared. It goes up to 384,000 faces, four and a half times finer, with a 4,096-pixel texture extracted straight from the original file. The bench page weighs 32 MB.
And the model has small bumps that are not folds, which the page's lighting picked out as blotches, with the stripes rippling over them. A light, volume-preserving Laplacian smoothing removes them without touching the lapels, the collar or the pockets.
around 34.3 h
Shoulders, and a snug collar
32 min0.6%2msg8iter.Steady
What was wrong
The shoulders sloped: a 0.94 drop between collar and shoulder, against 0.76 on the model. The collar formed a funnel, and the knot and the top of the lapels stuck out by 0.45 to 0.55.
What was done
Width set separately, collar lift limited to its band, edge height taken from the model angle by angle. Shoulder tops raised by up to 0.24, suit lowered by 0.25 instead of 0.35, hidden neck pulled in all the way around over 6,122 vertices. Shoulder drop measured afterwards: 0.71. The error on the front face drops to about ±0.1.
around 35.3 hThe stripes and the fabric≈ 1.0 h1.2%7msg20iter.Intense
around 35.3 h
Redrawn stripes, a straight pocket
49 min0.9%2msg16iter.Steady
What was wrong
The pocket square and the pocket rippled, the stripes were broken and the line too pale, with no control to adjust it.
What was done
The texture is cleaned (morphological opening then closing, normalized blur), then the stripes are redrawn procedurally on a pattern cut like a jacket: two fronts, two backs, two sleeve halves. Spacing 0.105, line 0.075. The painted and modeled pocket square becomes a straight pocket. A “Stripe brightness” slider is added, from 0.12 to 0.8.
around 44.1 h
Black fabric, a pointed pocket square
4 min0.1%1msg2iter.Quick
What was wrong
The fabric was too light and the pocket square was rectangular.
What was done
Fabric darkened, stripes subtler and tighter (spacing 0.092), a three-point pocket square painted in the shader.
around 50.8 h
White marks on the lapels
≈ 4 min0.1%2msg1iter.Quick
What was wrong
White marks were left on the lapels, at the bottom of the tie.
What was done
The texture cleanup now recognizes the tie by its islands. 3,403 pixels change, all inside the target area.
around 50.9 h
Fabric that no longer wrinkles
≈ 5 min0.1%2msg1iter.Quick
What was wrong
The mesh had folds carved into it, down to the tie's stripes standing out in relief.
What was done
Normals smoothed at load time, radius 0.08 and 41°. At 60° the sleeve buttons melted away; at 26° the tie wrinkled again.
around 49.1 hTrousers23 min0.4%2msg16iter.Steady
What was wrong
The suit had no trousers. The supplied file has 709,559 vertices and no skeleton.
What was done
Reduced to 20,000 faces, fitted for height and at the belly, stripes redrawn (57 around), tucked under the jacket and attached to the torso bone.
around 50.3 hThe tie, up to the hand-traced area≈ 1.1 h1.2%21msg19iter.Intense
around 50.3 h
A pale rectangle on the tie
≈ 9 min0.2%2msg3iter.Quick
What was wrong
A pale, stripeless rectangle with a hard edge, on the lower part of the tie.
What was done
The box-shaped mask is replaced by detecting the tie's texture islands from their share of midtones (at most 3% for the jacket, at least 11% for the tie).
around 51.1 h
Even bands on the tie
≈ 15 min0.3%4msg4iter.Steady
What was wrong
The white of the bands spilled in ragged strips onto the jacket fronts, and the painted bands wavered.
What was done
Island criteria refined, then the bands computed by the shader: angle, period, edging and three tones. A mask accurate to the texel.
around 51.4 h
The outline of the tie
≈ 10 min0.2%2msg3iter.Quick
What was wrong
The edges followed the paint: sawtooth at the knot, bands stopping short of the lapels.
What was done
The tie's 3D outline traced slice by slice, its width measured on the dark bands. Later the outline is used only for the knot, and the blade follows a parabola.
around 51.9 h
The jacket front over the tie
≈ 10 min0.2%6msg3iter.Intense
What was wrong
At the bottom, the left front of the jacket cuts across the tie in a sawtooth; painted like the tie, it left a gap under the lapels.
What was done
Moving the vertices was tried and then dropped; the jacket front is painted like the tie, and the outline extended under the lapels.
around 52.0 h
A ribbon tie, removed
≈ 6 min0.1%1msg2iter.Quick
What was wrong
The welded tie was still dirty.
What was done
A separate blade, an 86 by 14 grid, placed just in front of the old one. It looked fake and was removed in v64: the model's own tie is back.
around 52.3 h
The hand-traced zone
≈ 13 min0.3%6msg4iter.Intense
What was wrong
The strokes traced on the knot didn't color anything, white spots remained on the left of the tie, and the knot and the collar edges weren't clean.
What was done
The points traced on the bench become real polygons: blade smoothed slice by slice, knot built from three chains, seven stray points discarded. The jacket front is handled over its full height, and the shirt front is brought back to white.
around 53.4 h · v68 → v78The pocket, the lapel and the seam1.4 h1.6%5msg22iter.Intense
around 53.4 h · v68
A rebuilt pocket, a pocket square in relief
26 min0.5%0msg9iter.Steady
What was wrong
Above the pocket, the supplied model had a thin flap sculpted onto the chest, in three stacked layers. Its stripes didn't line up with the jacket's, and the pocket square was nothing more than a painted blot.
What was done
The flap is flattened and pushed behind, and a new piece in the jacket fabric takes its place. Its edge follows the height of the surrounding fabric, its stripes are read exactly from the neighboring triangles, and the inside is interpolated. The pocket square becomes a raised object that follows the jacket's movements: three points, folds, a hem.
around 54.9 h · v76
Keep the lapel, fold a diamond
12 min0.2%4msg3iter.Steady
What was wrong
Flattening the pocket had removed the lapel's edge along with the defect it targeted. The three-point pocket square looked like a sawtooth.
What was done
The lapel edge is traced row by row, and the flattened area stops short of it. The pocket square is refolded into a diamond, with a single point.
around 56.4 h · v78
The seam above the pocket
46 min0.9%1msg10iter.Steady
What was wrong
Above the pocket, a horizontal line read as a fold, and a raised band ran along the lapel.
What was done
The edge of the piece sits flush against the jacket, with no dip: height and orientation are read from the jacket triangle that covers each point, and the lighting transition spreads over 8 cm. The flattened area starts from the actual hollow of the lapel fold, traced line by line.
around 55.1 h · v77Real buttons1.3 h1.4%2msg15iter.Intense
What was wrong
The buttons on the jacket and sleeves weren't objects: flower-shaped bumps modeled into the fabric, ringed with a painted shadow.
What was done
The bumps are flattened while keeping the curve of the chest and sleeves, the paint is covered over, and real buttons take their place: a turned profile with a rim and a dish, four holes with their thread, dark varnished horn. Two on the jacket, two on each sleeve. They follow the fabric's movements, and the stripes run straight around them again.
around 64.1 h · v90c → v95bThe tie in profile and at an angle2.1 h2.4%8msg35iter.Intense
around 64.1 h · v90c
The tie in profile, a first attempt
29 min0.5%2msg4iter.Steady
What was wrong
In profile, the sides of the tie, left and right alike, looked like no fabric at all.
What was done
Four recolorings of the sides were tried: striped, dark, deep, white. Each one also changed the front view, and none was kept. The real cause would only show up later, once viewed from the right camera.
No capture was kept for this step.
around 69.0 h · v94c → v95b
The tie, finally clean at an angle
1.6 h1.8%6msg31iter.Intense
What was wrong
Seen at an angle, the tie showed white traces on its sides and spilled over the jacket fold, and every fix only moved the defect somewhere else.
What was done
A first attempt thinned the tie in the mesh: it lost all its volume, and the attempt was reverted. The diagnosis was then redone from the camera actually used on the live stream, which sees the tie from above. Two causes came up. The tie's thick side faces were painted as jacket on one side and as shirt on the other; they are now painted as tie all the way to the shirt. A shadowless backlight passed through the torso and lit the edges blue-violet; it now casts a shadow.
That left the bottom of the fold. Every rule picked out the tie by its position, but at that spot the model's tie is welded to the inner edge of the lapels, with no ridge between the two. What separates them is orientation: a side face of the tie faces outward, the edge of a lapel faces the tie. The edge gets the striped suit fabric back, and a pixel-by-pixel comparison over thirteen views confirms that nothing else moved.
around 72.2 h · v97d → v97eThe neck against the collar58 min1.1%3msg16iter.Steady
What was wrong
Right at the collar, at the front, you could see through the neck: a few dark pixels where the fur of the head should have touched the shirt.
What was done
Two flaws were stacked on top of each other. With no background image, the page behind the character showed through the fur of the neck, which is never fully opaque: the background gradient is now drawn inside the scene, and a last pass makes the image opaque. The second was a real gap: under the chin the neck narrows while the inside of the collar stays wide, leaving 6 to 13 cm of empty space all along the front. On load, the skin of the neck is now pushed against the inside of the collar, under its edge and at the front only: 618 vertices, 18.7 cm at most. At the back, the fur still rests on the collar.
Even with the head sliders pushed all the way (tilted, turned, raised or lowered), the gap stays closed. In the same pass, the ten custom fur settings were packed into three attributes: that is what gave the character his head back in the broadcast software, as the box about the first on-air test tells.
2 steady 6 intense
Chapter 8
The arms
Where it stands
Arms articulated inside the suit by a separate skeleton and two-bone IK: a pole target places the elbow, and the shoulder follows when the hand goes up. At rest he breathes, shifts his weight from one leg to the other and settles himself; when he talks, his gestures are drawn at random and offset, with a tempo of their own for each sentence.
He crosses his arms, leans on the high table, rests his elbows on his desk and brings a hand to his face. Seated, he changes posture and rests his forearm on an armrest; he tells the time by turning his wrist toward his eyes, puts a finger to his temple when he plays it sly, and waves hello. The sleeves follow the arm without the armpit opening up.
Known limits
- Seated, crossed arms stay out of the posture draw: the pose designed standing up read as if he were checking his watch, and the seated version is still waiting for approval.
How we got there
around 31.5 hArticulating the suit's arms1.0 h1.2%0msg30iter.Intense
What was wrong
The suit was one rigid block of 959,060 vertices, sleeves included. A host who talks a lot with his hands, brings a cigar to his mouth and raises a glass needed two jointed arms.
What was done
A thirteen-bone skeleton for the suit alone, skin weights computed on the welded mesh, and two-bone IK in the page: one target per wrist, the elbow placed by a pole target, the clavicle rising a little when the hand goes up. Speech gestures come from the elbow, arms close to the body; the cigar and the glass get their height by raising the arm forward.
Below a certain height the sleeves are tubes separate from the torso, joining it only at the armhole: the mesh is in one piece, but it can be weighted without cutting it. The armhole gets harmonic weights, and the collar and the neck side of the shoulder line stay still; otherwise the fabric shifted 0.35 units against the throat when the cigar came up.
Three numeric checks, run on every version: maximum triangle stretch, the number of sleeve vertices that end up inside the torso, and the render difference at rest between the test page and the live page. After the fix, the rest pose is pixel-identical, save for one framing button and three stray pixels.
around 42.8 hSix gestures and a count38 min0.7%1msg8iter.Steady
Also covered in the paws.
What was wrong
The paws could only do the speech gestures, the cigar and the glass.
What was done
A two-handed gesture engine, where each gesture carries its own hand shape and face channels. Six gestures: astonishment, shrug, “oh!”, a toast, six-seven, counting. The count goes from 1 to 10, starting with the thumb. Later came fingers curled against the cheeks, then palms turned up in the shrug, which had read as raised hands. It holds 60 frames per second.
around 53.2 h · v67Arms that live, hands that talk14 min0.3%0msg4iter.Quick
Also covered in the paws.
What was wrong
At rest, the arms stayed frozen. “Talking with his hands” came down to a few poses that came back in the same order.
What was done
A layer is added to the arm rotations, never to the wrist target: breathing, weight shifting from one leg to the other every 7 to 16 s, fingers stretching or half-closing every 6 to 14 s. While he talks, seven postures are drawn at random and offset each time, with a varying sway, a tempo and energy specific to each sentence, thinking pauses and named gestures: twirl, weighing, pointing, counting. Over a 150 s probe, no paw came closer than 0.13 to the suit.
around 53.9 h · v69Crossed arms28 min0.5%0msg8iter.Steady
What was wrong
He couldn't cross his arms.
What was done
A held posture, on a single button. The forearm is only 1.99 long, for a belly that sticks out 2.2 in front of the shoulders: the elbows come forward of the flanks, the left forearm behind and low, the right one in front, the right paw draped over the arm. The pose was raised by 0.35 to stay inside the on-air frame.
around 79.3 h · v101“Malin”, and telling the time60 min1.1%6msg4iter.Intense
Also covered in the watch, the glass and the cigar.
What was wrong
For “Malin” (Sly), the elbow went out horizontally: the forearm crossed the face, and the pulled sleeve made a black mass under the armpit. For the time, he raised the watch without looking at it, his head turned the wrong way.
What was done
“Malin”: the elbow stays low and forward, the index finger reaches the temple from below, the paw moves away from the temple before coming down and the finger folds on the way. The watch becomes a gesture of its own, which works from every posture and fires on “quelle heure” (what time) or “en retard” (late). The eyes go to the dial first, the head follows by lowering, the eyelids drop as if reading; the wrist turns to present the dial to his eyes, the paw closes into a relaxed fist, and he holds still for 1.8 s before looking up. The other paw stays put while he reads.
around 86.0 h · v103Waving hello29 min0.5%2msg1iter.Steady
What was wrong
To greet people, he only had the little sign that fires by itself on “bonjour” (hello).
What was done
A real wave: the free paw rises next to the face, pads toward the camera, fingers spread, and the forearm swings from the elbow, three times back and forth in about 4 s. The elbow stays low and forward, the lesson from “Malin”. The agent can write it into a line. Checked from four postures, the paw is up in under half a second, without going through anything. The gesture was used for a short video where he says “Hello World!” while waving.
1 quick 3 steady 2 intense
Chapter 9
The paws
Where it stands
Paws built from simple volumes and measured against a reference: five jointed fingers, a shortened thumb with its fleshy base, short, worn dog claws that blend into the fur, and pads bounded by their groove. The top is russet, the fingertips white, and the fur gets shorter toward the fingers. The wrist comes out of the cuff without touching it.
Each gesture has its own hand shape: the fist, the clasped hands, counting, the open palm, the glass held against the palm, the cigar slipped into the slot between index and middle finger. Resting on the cheeks, the paws stay in the fur without sinking into it.
Known limits
- Coming out of the clasped hands, two claws still sometimes brush each other, at 0.003, roughly once in three passes.
How we got there
around 36.1 hImported paws, a wrist to scale2.5 h2.8%5msg60iter.Intense
around 36.1 h
Paws from a 3D file
51 min1.0%2msg18iter.Steady
What was wrong
No paws at the end of the arms. The supplied 3D file has 979,991 vertices and no texture: a paw with two palms.
What was done
Top pads filled in; palm pads and the five claws picked out (the only thin parts). Decimated to 24,000 faces. A rig of five fingers with two or three phalanges each, harmonic weights, and nine helper bones at the joints so the fold makes an arc. Sliders: fur, forced pose, close, spread.
around 37.0 h
A wrist that stays inside the cuff
33 min0.6%0msg15iter.Steady
Also covered in the arms.
What was wrong
Bending the hand pulled the wrist out of the cuff: 720 vertices outside for 0.55 rad of flexion. The white inside of the cuff showed, and the big pad kept a cream notch.
What was done
A wrist bone where the cuff ends: 83 vertices stay outside at the same flexion. Inner wall darkened, lighting included. Pad mask recomputed by following the groove around it.
around 37.6 h
A wrist, and the right scale
1.1 h1.2%3msg27iter.Intense
What was wrong
The paw pointed at the camera (161 to 174°), the wrist bent back 34 to 43°, and the file ended in a stump, with no wrist. Scaled up to 2.1, the paw brought the cigar right onto the muzzle, and the relief of the heel ran on as streaks down the wrist.
What was done
A built wrist, in rings that flare out. Scale brought back to 1.75, outline smoothed, fur raised to 0.032 and combed toward the fingers. Wrist flexion is capped at 29° while talking. Clasped hands close on the real distance between the claws.
around 38.7 hJointed fingers, a paw rebuilt from volumes2.0 h2.3%7msg36iter.Intense
around 38.7 h
Articulated fingers
29 min0.6%2msg7iter.Steady
What was wrong
The folds were 0.04 to 0.12 wide, for phalanges of 0.09. Fully bent, the fold called for 209° and the finger flattened into a tab.
What was done
Weight margin halved: folds of 0.02 to 0.05. Bending capped smoothly around 127°. Fingers curl in cascade, one slider per finger. Fur shells on the paws went from 12 to 19, and the bench still holds 16.7 ms per frame.
around 39.1 h
Back of the hand filled, fingers separated
20 min0.4%2msg4iter.Quick
What was wrong
The back of the hand was hollow like a second palm, and the fingers formed a mitten, with no separation.
What was done
Back raised over 1,507 vertices, grooves dug between the fingers down to 0.075, stronger occlusion at the bottom. Short fur in the grooves, long on the back. Bending cap raised from 0.64 to 0.9.
around 39.5 h
A paw rebuilt from volumes
47 min0.9%1msg15iter.Steady
What was wrong
The back stayed cream instead of russet, the claws were short, and the fingers were impossible to separate: in the file, they overlap inside the volume.
What was done
Two attempts at cutting with boolean subtraction, then the file was dropped: the paw is built from simple volumes with a distance field (palm, heel, four fingers of three segments, thumb, webbing, pads, separate claws). Four gray mockups, then decimation to 24,000 faces. Clasped hands pushed apart: from 50 frames with crossed fingers to zero.
around 40.3 h
A wrist sized to the cuff
25 min0.5%2msg10iter.Steady
What was wrong
The wrist, 0.215 by 0.24, floated inside the cuff.
What was done
A first attempt flared the bottom of the sleeves: rejected, the sleeves were not to move. So the cuff opening was measured (0.27 to 0.36 depending on the axis, slightly off-center) and the wrist rebuilt ring by ring at 0.29 by 0.33. No vertex goes past the 0.36 threshold.
around 40.7 hProportions and colors≈ 1.6 h1.8%5msg19iter.Intense
around 40.7 h
Proportions redone by eye
≈ 52 min1.0%1msg12iter.Steady
What was wrong
The overall shape was there, the details weren't.
What was done
Middle fingers lengthened, thumb and little finger lowered, big pad bell-shaped. The claws come out of the fingertip rather than the top; too light in the render (median luminance 71, against 46 on the reference), they are darkened, their tint cut to about 40% of its value. Clasped hands raised: from 267 frames with crossed fingers to 3.
No capture was kept for this step.
around 40.7 h
The russet, the white tip, the paw fur
≈ 6 min0.1%3msg1iter.Steady
Also covered in the fur and colors.
What was wrong
The russet had been lightened toward gold, the fur on the paw read as velvet, and the fingertips had no white.
What was done
Back to the russet of the head. A near-white gradient on the end of each finger. Strands twice as thick, color transitions widened and noised.
around 41.6 h
Measured proportions
40 min0.7%1msg6iter.Steady
What was wrong
The reading by eye was wrong. Measured on the reference, only the middle finger sticks out; in v24 it was 35% too long, and its two neighbors 70%. Width 2.71 times the big pad, against 2.17.
What was done
Three small measuring and preview tools that don't need Blender. Middle finger brought from 0.48 down to 0.37, index and ring finger to 0.345, width 1.97. A new junction between fingers, pad edges in a continuous field, cracks removed. With the hands clasped, the claws now clear the other paw by 0.070 instead of 0.002.
around 42.3 hThe claws≈ 47 min0.9%5msg10iter.Intense
around 42.3 h
Dog claws
13 min0.2%1msg2iter.Quick
What was wrong
At 0.15 long and tapered to a needle, the claws had a cat's profile.
What was done
A conical profile ending in a worn dome, 0.22 hook, claw pinched at the sides. Claw vertices: from 915 to 1,405.
around 49.5 h
Thicker claws that come out at the right point
≈ 22 min0.4%3msg5iter.Steady
What was wrong
The claws were too long and too thin. Shortened, they came out of the skin too early, then not far enough.
What was done
Length 0.14, base 0.05, emergence height set by a new parameter, embedding reduced from 0.035 to 0.022. Paw rebuilt: 14,642 vertices, 15 bones.
around 50.3 h
No more speckles behind the claws
≈ 12 min0.2%1msg3iter.Quick
What was wrong
Dark speckles showed between the strands, on top of the fingers.
What was done
Diagnosed by painting the claws red; the part still inside the fur then takes the color of the nearest skin. Four fades tried.
around 42.5 hTighter fingers, a shorter thumb≈ 39 min0.7%6msg15iter.Intense
around 42.5 h
Fingers drawn together
11 min0.2%1msg4iter.Quick
What was wrong
The fingers stayed 0.08 apart at rest and 0.3 apart while talking.
What was done
Spread at rest from 0.08 to 0.03, spread while talking from 0.3 to 0.06, thumb and little finger tucked in by 2°.
around 43.4 h
A thumb that stands out
23 min0.4%1msg6iter.Steady
What was wrong
No thumb stood out the way it does on a hand.
What was done
A fleshy base, the skin between thumb and index, a lowered base and a flexion of its own for the thumb, which folds across the palm.
around 51.0 h
A shorter thumb
≈ 3 min0.1%2msg3iter.Quick
What was wrong
The dewclaw on the paws was 0.36 long.
What was done
Length went from 0.36 to 0.31, then 0.27, with two rebuilds of the paw.
around 51.6 h
Fingers even closer together
≈ 2 min< 0.1%2msg2iter.Quick
What was wrong
At the slider's minimum, the fingers were still slightly apart.
What was done
The “Spread” slider now goes down to −0.8.
around 44.5 h · v94aHolding the glass and the cigar52 min1.0%2msg11iter.Steady
around 44.5 h
Holding the cigar and the glass
26 min0.5%1msg6iter.Steady
Also covered in the watch, the glass and the cigar.
What was wrong
The cigar floated on the back of the fingers, and the fingers made a fist next to the glass.
What was done
Cigar pinched between index and middle finger, reaching the mouth from the side. Glass against the palm, each finger bent until first contact, thumb lying flat against the side.
around 67.4 h · v94a
A cigar between two fingers
26 min0.5%1msg5iter.Steady
Also covered in the watch, the glass and the cigar.
What was wrong
The cigar passed through the skin between the index and middle fingers.
What was done
A slit opens between the two fingers at load time: the webbing, whose vertices were shared equally between both fingers, is split, and each half follows its own finger. The fur parts for the cigar and packs down around it.
around 48.2 hPaws resting on the cheeks≈ 44 min0.8%4msg8iter.Steady
Also covered in the arms.
What was wrong
In the astonishment gesture, the fingertip phalanges sank 0.4 to 0.6 into the cheek. The first fix left 0.15 of air.
What was done
Gap reworked three times, claws measured separately, contact point moved onto the skin, fingers slightly arched. Final state at worst: claws at −0.069, fingertips and palms a few thousandths above the skin.
2 steady 5 intense
Chapter 10
The watch, the glass and the cigar
Where it stands
A complete yellow-gold watch with a navy-blue enamel dial, whose lug runs under the cuff, on a bracelet of rigid, regular links that tapers down to the clasp. A cut-crystal glass of amber whisky, with no refraction, which he puts down and picks up again from the table. A real cigar, with a veined wrapper, a band, layered ash and an ember that glows brighter: he brings it to the corner of his mouth, draws twice and blows the smoke out to the side.
Known limits
- In extreme close-up, the walls of the slot between the fingers stay gray.
- At the desk, in real time, the forearm pokes about a centimeter through the top of the desk when he puts the cigar down.
How we got there
around 43.2 hA cut glass, a watch13 min0.2%1msg5iter.Quick
What was wrong
The glass was a plain tumbler, and the supplied watch hadn't been fitted.
What was done
A cut-glass tumbler, with more opaque edges and glints on the facets painted into textures, a dark wall and amber whisky. The watch is imported, scaled down and fitted on the left wrist.
around 44.9 hThe watch at its real size21 min0.4%5msg3iter.Intense
What was wrong
Fitted at 0.56 of its size with a thinned strap, the watch floated around the wrist, slid down onto the paw and followed the tilt of the hand.
What was done
One link removed on each side, strap wrapped around the actual cross-section of the wrist, fur packed down underneath. Then size 0.95 with no slack, the bottom stopping where the paw widens, and the watch attached to the forearm rather than the carpus.
around 45.7 hThe watch on the forearm's axis8 min0.1%1msg1iter.Quick
What was wrong
The dial followed the rig's palm, 5° off from the real back of the paw.
What was done
Size 1.05, tightening −0.004, two links removed per side. The watch now follows only the forearm's twist: 0° in flexion and extension, 90° for a quarter turn of the paw.
around 46.5 hA cuff that rests on the watch36 min0.7%1msg8iter.Steady
What was wrong
Cut by a plane at the edge of the cuff, the watch showed its flat cross-section from the side.
What was done
A table of 144 angles over 26 positions, in the forearm's frame, lifts the left sleeve only where the case sticks out. The edge is never pulled back, the cavity never widens. Recomputed in 0.27 ms.
around 47.2 hWhisky refraction, dropped4 min0.1%1msgQuick
What was wrong
The whisky didn't refract.
What was done
A copy of the image before the glass, filtered by depth. Cut.
around 47.9 hThe watch one notch tighter≈ 1 min< 0.1%1msgQuick
What was wrong
The strap left a gap between two links on the short side.
What was done
Tightening went from −0.004 to −0.015.
around 51.1 hA whole watch against the cuff≈ 13 min0.2%4msg7iter.Steady
What was wrong
The watch showed up cut in half by the cuff; whole, it slid down onto the paw.
What was done
Scale −10%, strap slack and cross-section reduced, distance measured on the cuff edge, back side, case laid on the slope of the wrist, fur packed down. Final state: 19% of the case under the cuff, dial whole.
around 51.6 hA round strap, a rigid case≈ 12 min0.2%5msg4iter.Intense
What was wrong
The strap made a corner, then rippled, then gapped at the sides.
What was done
An outline as a Fourier series, then the tightest ellipse that contains the wrist plus a rigid case, then no links removed but all of them tightened, and finally a start along the case's axis, joined to the oval over one link.
around 61.5 h · v86 → v90A real cigar, a seated pose that breathes1.2 h1.4%1msg25iter.Intense
What was wrong
The cigar was a plain cylinder, and a frozen seated pose looked dead.
What was done
A cigar built piece by piece: rounded cap, wrapper veined in a helix, band with no lettering, layered ash, a ring of embers that brightens when he draws. The tip rests at the corner of the lips, mouth half open, and the smoke comes out in a thread. Seated, he breathes from the shoulders, taps off his ash, drums the fingers of his free paw and swings his crossed foot.
around 68.1 h · v94bDrawing on the cigar58 min1.1%1msg12iter.Steady
What was wrong
On the way up, the cigar went through the muzzle without the mouth closing on it, and its smoke didn't look like cigar smoke yet.
What was done
The gesture is split into phases: the paw comes in from below, the end slides along its axis to the right corner of the mouth, he draws twice, then blows the puff to the side. The ember reddens and flickers with each draw, with a line of fire; the smoke leaves from the tip, the side and that line. At no point does the paw come within 8 cm of the head.
around 75.1 hGold, not copper3 min0.1%2msgQuick
What was wrong
On air, the watch looked dull, almost bronze.
What was done
The cause was the hue, not the light. Its texture is a flat beige, and the earlier brightening pushed red more than green and blue: the result was copper. The gold parts are now brought back to the reference yellow gold, with a stronger gain on green and blue than on red, leaving the navy-blue dial alone. The gold becomes fully metallic and a little more polished, and the dial goes from a dark mirror to glossy enamel.
around 88.0 h · v105A bracelet of real links34 min0.6%11msg2iter.Intense
What was wrong
After one tweak too many, the watch bracelet had gone lopsided: the links from the file, bent to hug the wrist, folded into facets.
What was done
The bracelet is rebuilt from scratch: no more bent links, but real rigid pieces laid in a chain around the wrist, with a fixed gap between two pins. At each step, a satin bar across the whole width and a polished center link, barely raised, straddling the joint. The bracelet tapers from the lug to the clasp, a curved plate under the wrist that takes up the rest of the loop. The case keeps its shoulders, which taper down to the thickness of the bracelet, and a cover hides the lug. Checked up close, in profile, from the stream camera and while he tells the time: the cuff doesn't flare.
5 quick 3 steady 4 intense
Chapter 11
The keyboard
Where it stands
A retro keyboard with round keys, in dark brushed copper, set at an angle on his right. Cut into 104 keys, it really goes down under the fingers: the text is decoded from the keys pressed, capitals and accents included, and each keystroke plays a recording of a real mechanical key, filtered as if it were far from the mic.
When he writes in the chat, fills in a field or opens a page, he finishes his gesture, reaches for the keyboard with one hand and steadies it with the other, types with eight fingers from the home row, eyes on the chat screen, presses Enter, then keeps it in front of him for a few seconds before putting it back.
Known limits
- A paw covers about six keys: he hits the space bar with his index finger, and can't type a C cedilla, French quotation marks, an em dash or a euro sign.
- Beyond 1.2 times his base speed, letters get skipped: he tops out around 50 words per minute.
- The one-handed grab and the keyboard kept between two messages are ready on the bench, not on air yet.
How we got there
around 79.8 h · v100A keyboard on the desk1.2 h1.4%9msg5iter.Intense
What was wrong
To type, he first needed a keyboard on the desk.
What was done
A retro keyboard with round keys, slimmed down from 207,000 to 45,000 faces, at its real size. Placed too close at first, it had his resting paws going through it; it moves back to 15 cm in front of his fingertips, then goes to sit at an angle on his right, out of his hands: he only uses it now and then. Too bright, it looked caught in a spotlight; its base color, an almost pink copper, is darkened by half. A placement bench lets you slide each object across the set, its base stuck to the desk, and copy its settings.
around 81.9 h · v102Typing on the keyboard, key by key4.1 h4.7%26msg15iter.Intense
Also covered in the paws and the arms.
What was wrong
When he wrote in the chat or opened a page, nothing moved: the text just appeared.
What was done
He takes the keyboard lying at an angle on the desk, slides it in front of him under his paws, types, presses Enter and puts it back exactly where it was. The keyboard is cut into 104 keys; each one goes down under the finger that touches it, and the text shown on the bench is decoded from the keys actually pressed, not copied. The hands are anchored on the home row, each key goes to the nearest finger, little fingers included, and the hand rolls toward the finger that strikes. Shift stays held as long as the same hand types, accents go through dead keys, and he keeps his eyes on the chat screen with a glance at the keyboard every 5 to 9 s. The sound comes from real recordings of mechanical keys, never the same take twice in a row, filtered as if it were far from the mic.
It took ten versions. With two index fingers, he typed fifteen sentences out of fifteen correctly, but hunched over the keyboard like a beginner. With several curled fingers, the posture became odd; with arms stretched out and hands flat, it still didn't look like someone typing. Ergonomics research unlocked the posture: elbows tucked in at a right angle, wrists raised, fingers curved above the home row. The real problem was where the keyboard sat, too far and at an angle: he now picks it up before typing.
Wired to the agent, typing starts when he writes in the chat, fills in a field or opens a page, whose domain name he types. The message only appears after the last key, and in the browser on screen each letter shows at the moment he strikes it. If he is in the middle of a gesture, he finishes it before taking the keyboard.
around 86.6 hTaking the keyboard, and keeping it1.4 h1.6%4msg10iter.Intense
Also covered in the arms.
What was wrong
To take the keyboard, both arms went out together, stiff, paws dangling, and his wide-open eyes stared at a point below. Between two messages, he put the keyboard away only to take it back right after.
What was done
The right paw goes alone to fetch the keyboard and pulls it by one end; it swivels as it comes, and the left one sets off on the way to catch and straighten it. About one time in three, both go, staggered, and on the way back one hand pushes it away, or both, at random. The elbows open out, the fingers relax on the way, and the paw settles on the keyboard and grips before pulling: the keyboard doesn't move until it is held, then it follows the fingertips. The gaze leaves before the head, the eyelid lowers with it, he blinks when his eyes change direction a lot, and while typing his eyes follow the line on the chat screen. After the last key, he keeps the keyboard in front of him for 7 to 11 s: if another message comes in, he carries straight on without taking it again.
3 intense
Chapter 12
Animation and voice
Where it stands
The voice drives the jaw. The lip closures of the labial consonants land on time: they are synced to the timestamps the speech synthesis returns, character by character, with a forced aligner as a fallback that already closed ten out of ten. The lips take the shape of a sound 70 ms before it, the head moves with the sentence, and about fifteen short actions (laugh, cough, sneeze, yawn, shiver…) lock onto the sound itself.
On top of that, pouts and gestures fire on their own on certain words: a wave on “bonjour” (hello), a raised index finger on “attention” (careful), a curious pout on “je me demande” (I wonder).
He also picks his own gestures, through tags slipped into his lines, and no longer sits idle between two sentences: he glances at the chat, nods to the music with a proud look, taps his paw. His mood, on five notches, colors his face in the background, and the control room can give him a mood for a few seconds.
Known limits
- He only follows the music after 18 to 25 s of a rhythmic track, and not at all on an ambient one: on purpose, since a false tempo would show more.
How we got there
shared with a neighboring stepAn expression slider that did nothingshared time1msgQuick
What was wrong
The “furrowed brows” slider had almost no visible effect, and two successive fixes failed to make it readable.
What was done
The action point moved up onto the brow, the mask got shorter, displacement went from 0.06 to 0.09 units and the bulge from 0.035 to 0.05. The creases between the eyes are multiplied by 1.7 in the shader, and the slider now also lowers the inner brows and the upper eyelid slightly.
The cause was measurable. The mask that keeps the eyelid seam continuous is zero within 0.33 units of the eye center, and the brow sits at 0.32: the muscle was cancelled exactly where it was supposed to act. Amplitude before the fix was 0.026 units, under fur 0.04 deep.
around 31.3 hThe voice drives the jaw8 min0.2%0msg5iter.Quick
What was wrong
When he talked, the jaw followed a decorative oscillation with no link to any text or sound. There was no way to hear the avatar say a sentence.
What was done
A “Voice” panel in the bench. The text goes to the live stream's speech synthesis engine, the audio comes back into the page, and the signal envelope (measured in 10 ms windows, normalized to the 95th percentile) drives the jaw opening. Head nods and brows follow the syllable stress. If the synthesis doesn't answer, the browser's own voice takes over.
Measured on a 5.4-second sentence: 32 openings above the threshold, so 6 per second, and 9 clean closures that land on the pauses. The jaw goes from 0.00 with the mouth shut to 0.60 wide open, averages 0.30, and spends 68% of the time open.
around 33.0 hThe mouth driven by the voice's spectrum20 min0.4%1msg6iter.Quick
What was wrong
Jaw opening followed the signal's volume. An “s”, a “ch” or an “f” opened it as wide as an “a”, even though they are said with the mouth almost closed, and every vowel looked the same.
What was done
The opening now comes from the spectrum, every 10 ms over a 32 ms window. Voiced energy between 90 and 1,000 Hz says whether there is a vowel and how strong it is; the first formant says which one, estimated from the log ratio of energy in 550-1,100 Hz to 250-550 Hz, smoothed over 30 ms; sibilants, recognized by their energy above 3.5 kHz, close the mouth almost completely. Two sliders appeared on the bench: opening, and lead in milliseconds.
Sync was measured end to end on the image rather than on the internal variable: a frozen close-up with no breathing, blinking or nodding, captured at 60 frames per second, the opening read from the pixels and then correlated with the sound actually played. First run, with the old envelope: the mouth arrived 22 ms after the sound, correlation 0.83. Second run, after the switch to the spectrum, with the lead raised from 40 to 70 ms and nods turned off: 4 ms, correlation 0.52.
The two figures can't be compared directly, since the way the image was read changed in between. What the second run does give reliably is the breakdown: the computed jaw leads the sound by 29 ms, the image trails the computed jaw by 24 ms, and that second number is the display latency. That is the number that sets the lead.
A last version went onto the bench at 33.3 h of work, with the mouth also closing on nasal consonants.
around 42.7 hA real crease in the forehead7 min0.1%1msg8iter.Quick
What was wrong
The frown drew stripes you could barely see.
What was done
A single dark crease, tapering upward, with a wider shadow and two light ridges on either side.
around 45.3 hA forced aligner to close the mouth23 min0.4%1msg7iter.Steady
What was wrong
With the audio as the only input, the mouth closed on labial consonants 7 times out of 10.
What was done
A forced aligner (a 0.98 GB model) pins every word of the script to the audio, in 0.21 s after the first pass. Rules then go from text to lips: closures, rounding, spreading. Result: 10 closures out of 10. The service runs locally, 0.23 s round trip.
around 47.7 hA laugh that opens the mouth≈ 16 min0.3%1msg5iter.Quick
What was wrong
The laugh opened the jaw to 0.55: a slit over two rows of teeth, a grimace, the tongue at the back.
What was done
Jaw at 1.2, frown almost gone, a channel that pushes the tongue forward and up, bursts of “ha” at 4.6 per second with a small dip of the head.
around 50.3 hAn external voice plugged into the bench≈ 15 min0.3%4msg2iter.Steady
What was wrong
The bench only knew the local voice.
What was done
An nginx relay adds the key on the server side: the page never sees it, only three routes go through, and calls have to come from the bench. The synthesis returns a timestamp per character, and the mouth syncs to those: 5 closures out of 5 on the test sentence. The forced aligner is now just a fallback. A custom voice is the default.
No capture was kept for this step.
around 50.5 hHappy and curious≈ 2 min< 0.1%2msgQuick
What was wrong
There were no “happy” or “curious” presets.
What was done
Two channels: head tilt and asymmetric brows. Happy smiles without laughing; curious tilts the head. During gestures that touch the face, the head straightens so the paws stay in contact.
around 51.7 h · v66Short actions, synced to the sound≈ 40 min0.8%3msg10iter.Steady
What was wrong
The character couldn't laugh, cough or sneeze, and his speech stayed mechanical: the mouth opened and closed at the same rhythm whatever the sound.
What was done
A row of “Actions” lands on the bench: laugh, cough, sneeze, yawn, sigh, clear throat, sniff, wink, yes, no. They play on top of gestures and speech without interrupting them. To cough, he borrows a hand, makes a fist in front of his mouth, then gives the hand back. In the script, a tag in square brackets makes the speech synthesis play the sound, and the action syncs to it: each “ha” of the laugh, each fit of coughing, the “achoo” of the sneeze.
On the speech side, the lips spread on the French i and é sounds, round on ou and o, and lift on f, v and s. Each shape is set 70 ms before the sound. With every sentence the head reorients and the gaze moves; he blinks and glances aside during pauses, and the brows go up on a question.
around 54.3 h · v70 → v75Yawning, giggling, gasping34 min0.6%0msg17iter.Steady
What was wrong
The yawn turned into a grimace. The cough, replayed in real time, put the fist on the nose. And on page load, folding the arms made the wrists pass through the belly.
What was done
The yawn is softer: eyes peacefully closed, tongue, no grimace. Laugh bursts are randomized, two actions are added (gasp, giggle), and “Talk” produces real sentences of 1.8 to 6 s separated by pauses. The ears prick up at the start of sentences and follow the stresses. The pocket gets raised piping.
around 64.6 h · v91Gestures on words, a head that moves≈ 1.1 h1.2%4msg21iter.Intense
What was wrong
While talking, the head stayed almost upright, and the hands moved with no connection to what was being said. In the “happy” mood, the cheeks jumped.
What was done
A person talking nods on stressed syllables and tilts the head from one sentence to the next; research on visual prosody documents this. The per-sentence tilt is stronger now, with nods synced to the voice's energy and a drop at the end of each sentence. Fifteen kinds of gesture fire on words or phrases: index finger raised on “attention” (careful), open hand on “tu vois” (you see), palm on the chest when he talks about himself. When a smile is held, mouth shapes no longer pump the cheeks.
around 70.8 h · v96b → v97cPouts and gestures on words≈ 43 min0.8%3msg15iter.Steady
What was wrong
Expressions changed only through buttons. While he talked, the face didn't react to what the words meant.
What was done
A brief curious pout, 2.6 s long, head tilted and one brow up, plays over the current mood and fires half the time on “je me demande” (I wonder) or “intéressant” (interesting). Then come thirteen silent pouts: proud, wary, embarrassed, disgusted, tender, bored, annoyed, dreamy, alert, chewing, ooh, confiding (he leans toward the camera), looking at chat. The hands follow: shiver, clasped hands, applause, thumbs up, and five face gestures (hand on chin, shush, index finger at the temple, palm on the forehead, adjusting his tie). Each one has its button and also fires by itself on its own words.
around 73.9 hGestures he picks himself8 min0.1%2msg3iter.Quick
What was wrong
His arm gestures only fired on certain spoken words, with a share of chance: a toast on “santé” (cheers), the cigar on “tranquille” (chill). The agent writing his lines couldn't pick them.
What was done
Thirteen gestures become tags he can slip into a line: the cigar, a toast, raising his glass, astonishment, hands on cheeks, a shrug, thinking, shush, sly, a facepalm, adjusting his tie, six seven and counting to ten. The gesture starts just before the word that follows the tag, and the tag shows neither on screen nor in the chat. A gesture in progress is never cut off: the next one waits 3 s at most, otherwise it is dropped.
No capture was kept for this step.
around 74.0 hFilling the silences35 min0.7%11msg2iter.Intense
What was wrong
When nobody was talking, he sat with his hands resting on the desk. He wasn't frozen (he breathed, blinked, his paw drummed now and then), but he had nothing to do, and the 10 to 20 s between a chat message and his answer showed.
What was done
At every chat message, he glances at the chat screen, low on his right: about 18° of head turn, only the eyes if he is talking, no more than one every 8 s. With music on, he looks for the tempo and follows rhythmic tracks after twenty seconds or so, nodding, swaying or barely moving, with a proud look held throughout: chin up, eyes half closed, a small smile. On an upbeat tempo, his right paw sometimes taps along for a few bars. And the facial moods (happy, laughing, surprised, curious, bored, angry, sad, ears back like a plane) can be triggered from the control room, for about 4 s.
around 78.8 hA mood that shifts28 min0.5%4msgSteady
What was wrong
His face only changed with the pouts on words. Alone, without a single message for twenty minutes, he kept the same face.
What was done
A mood on five notches (dejected, glum, neutral, happy, delighted), which the model judges itself at every decision. It sees its mood, how long it has had it, and how long the chat has been quiet. Something that really matters can shift it in one go; a minor event moves it one notch; with no reason, it drifts back to neutral. On the face, it is a background expression that eases in over a few seconds, capped so that he looks like he finds the time long, not like he is about to cry. The pouts on words play over it, and when sad he stops nodding to the music. Every stream starts from neutral.
7 quick 6 steady 2 intense
Chapter 13
The sets and the seated body
Where it stands
Four ways to be on screen: standing, leaning on a high table, sunk into a club armchair, or behind a glass-and-steel desk in streamer mode, in front of a living room that is dark or in daylight depending on the computer's appearance. For each set the character doesn't move: the camera, the lights and the furniture arrange themselves around him. He has legs, a pelvis and a belly that bend, and a drape computed at load time lays his jacket over his thighs.
At his desk, he never stays still: he drifts by a degree or two, changes posture on his own, leans on his elbows, settles back against the backrest, plays with his chair. A shark statue and a retro keyboard sit on the desk.
Known limits
- During the fade-in to the high table, a foot dips below the floor for an instant, out of frame.
- In the club armchair, the bottom of the jacket sinks slightly into the armrest, on the side the camera doesn't see.
- From the stream camera, the forearm resting on the armrest goes behind the desk: you can't see it resting.
- The daylight was set from the image of the living room, never by eye on the bench.
How we got there
around 57.2 h · v80Leaning on a high table1.1 h1.2%4msg21iter.Intense
What was wrong
The character only existed standing, facing the camera, on a plain background.
What was done
A “Set” row appears on the bench. A set groups props, an arm posture, a framing and a body pose. The first is a bistro high table in marble, brass and cast iron, top at 96 cm, between three and eight centimeters below the elbow (any higher and the shoulder hunches). He leans on it, tilted 12°, the glass upright in his paw. The glass waits for him on the table: he picks it up as he arrives, puts it back as he leaves, and takes a sip every 35 to 75 s when he isn't talking.
To enter a set, the character doesn't move. The set, the camera, the lights and the room reflection arrange themselves around him, so his standing pose stays identical down to render noise. The elbow, though, is a constraint: resting on the tabletop, at arm's length from the shoulder.
around 58.3 h · v81 → v82Legs, shoes, two armchairs55 min1.0%0msg19iter.Steady
What was wrong
The suit had no articulated legs: no way to sit him down.
What was done
Bones are added at load time (hip, knee, ankle, and “half” joints for the fold), with computed weights. Oxfords are built in the page, with socks. Two seats follow. A gaming chair, with a studio mic on a boom, where he leans 4.5° toward the mic when he talks. A tufted cognac leather club armchair, scrolled armrests and brass studs, cigar in his right paw, legs crossed knee over knee, the top foot hanging toe down. The smoke rises in a thread from the ember.
around 59.2 h · v83A pelvis that pivots1.4 h1.6%1msg14iter.Intense
What was wrong
In the armchair, the whole body tipped as one block from the shoulders: nothing bent at the pelvis, nothing sank into the cushion, and the torso looked endless.
What was done
A pelvis bone slots in between the torso and the hips, its pivot in the back, below the bottom button. The pelvis tilts, never the torso: arms, head and watch keep their frame. Each set has its own tilt. In the armchair he sits all the way back, the cushion hollowed by 0.3 under him; at the table he takes a contrapposto, the weight-bearing hip jutting out. The armchair gets a taller, wider back, and a lower framing.
Every gesture was then replayed in all three sets. A paw holding a prop puts it down before a gesture that needs that paw (the glass goes on the table, the cigar fades out), then picks it back up 0.35 s later; in the gaming chair, the mic boom lifts during a gesture.
around 60.6 h · v84 → v85Folds that fall over the thighs56 min1.1%5msg5iter.Intense
What was wrong
When he sat, the fabric tore at the pelvis. The jacket and trousers were split between the left and right leg by side of the body: as soon as the thighs did different things, the front split open. On top of that, the bottom of the jacket rotated around two pivots at once.
What was done
The weights now blend smoothly from one leg to the other. The bottom of the jacket is laid over the thighs by a drape computed once at load time for each set: it settles on the smoothed surface of the trousers, falls, then is smoothed. The hem rests on the knees, nothing goes through the trousers any more, and in the gaming chair the drape follows the torso when he leans toward the mic. The per-frame cost doesn't change measurably.
around 62.7 h · v90bA back that bends1.3 h1.5%2msg8iter.Intense
What was wrong
Seated, the torso stayed one block from the shoulders to the bottom button, and never rounded.
What was done
A belly joint, tuned per set, that flexes more when an arm is resting on something. At the table, the jacket stripes follow a curve along the side instead of a tilted block. The cigar smoke becomes a continuous thread.
around 64.5 h · v91A desk to rest the elbows on≈ 45 min0.8%2msg17iter.Steady
What was wrong
In the gaming chair, he couldn't talk with his hands: his arms had nowhere to rest.
What was done
A desk in front of him, with a cut-out edge. Sitting upright, his arms stopped 13 cm short of the edge, so he leans forward, from the belly and torso, to rest his elbows on it. At rest the forearms are horizontal and the paws drum; while talking, the elbow stays put and the wrist moves around it. The mic no longer lifts during gestures; only a paw that runs into it pushes it. Streamer mode's background settles in behind him.
around 66.4 h · v92A luxury desk, and its light38 min0.7%6msg11iter.Intense
What was wrong
The desk was a plain top. The character's lighting didn't match the background, the watch looked dark, and switching from one arm posture to another was jerky.
What was done
A gunmetal brushed-steel frame, an inset black glass slab, a brass inlay line, a fine-grain black leather desk pad. The glass and steel reflect the background room, blurred, and the arms cast their shadow on them. The lighting becomes specific to the set: warm key light, blue rim light on the bay-window side, amber rim light on the sign side. The mic moves to the left, opposite the paw that leads the gestures. A wave fires on “bonjour”, “salut” or “au revoir” (hello, hi, goodbye).
around 67.0 h · v93A leather chair22 min0.4%2msg3iter.Steady
What was wrong
The black and orange gaming chair clashed with the new desk.
What was done
A dark leather executive chair, upholstered in real stitched bolsters with light topstitching: lumbar support, a headrest on an aluminum blade banded with brass, polished aluminum sides in one piece, a star base. The background is replaced by its retouched version, and the rim light leans slightly toward lavender to follow the violet glow of a poster.
around 74.0 hA daytime living room20 min0.4%3msg13iter.Steady
What was wrong
The living room behind him stayed in its after-dark look, whatever time the stream ran.
What was done
A second background, the same living room in broad daylight, aligned pixel for pixel with the first. The set follows the computer's light or dark appearance and switches with a 2.5 s crossfade, images blended and lights interpolated, never a hard cut. The daylight replaces the lavender backlight with golden sun coming through the bay window; the neon sign stays lit but weighs less, and the character is lit more strongly, since the daytime background is 2.3 times brighter. The holding screen switches living rooms at the same time.
around 75.2 h · v98Moving in his chair3.6 h4.1%36msg58iter.Intense
Also covered in the eyes.
What was wrong
After a 24-hour stream, it showed that he never moved a millimeter in his chair. Gestures designed standing up spread his elbows like wings above the desk, one arm jumped near the edge, and his wide-open eyes looked tiny.
What was done
A constant drift of a degree or two, calmer when he talks, and postures held from 25 s to 1 min 40: on his elbows, hands apart, leaning in, one arm on the armrest on either side, leaning back against the backrest. Now and then he plays with his chair, settles back in or stretches. As with the sets, it is the set that moves around him. The arm paths are all of a piece, one arm leaves before the other, the back before the chair, and gestures designed standing up make him push his chair back for the length of the gesture. When he opens his eyes wide, the iris now shrinks by only 12% instead of 40.
The armrests took three versions. Raised high enough to be seen from the stream camera, they forced the elbow to move forward to reach them: it ended at the tip of the leather, the forearm floating in front. His shoulders are too low for an armrest that high. So the armrests went back down to the height where the elbow rests by itself, behind the shoulder, with the forearm stretched along the whole leather. The price: from the stream camera, that arm goes behind the desk, and you can't see it resting.
around 79.7 h · v99A shark statue on the desk9 min0.2%2msg6iter.Quick
What was wrong
The desk was empty.
What was done
A bronze shark statue, under a free license, comes to rest on his right, near his elbow, its head turned toward him. The model is slimmed down to 0.6 MB, then placed out of the arms' way: over a minute of gestures, the elbow never comes closer than 0.36 to the statue.
1 quick 4 steady 6 intense
Chapter 14
The bench and the tooling
Where it stands
The published viewer went through nineteen releases, up to 23.9 h of work. Everything after that lives on a local test bench, a frozen copy of which the stream overlay loads and drives with messages: thirty frames per second, soft shadows, ambient occlusion, motion blur, rendering at 1.5×, settings kept from one load to the next, and a panel of buttons for every expression, action, gesture and set.
Everything is produced by script: Blender without an interface for the geometry, contact sheets rendered from the angle of the images, probes that measure skin-on-skin contact inside the page, and series of captures to judge a gesture over time.
On air, the shot is pinned to the set, and the control room finally reaches the character: gestures, actions, glances and moods start from a button.
Known limits
- The shot that lands in one go on reload, without crossing the room, is ready but not on air yet.
How we got there
around 3.8 hThe viewer, then the U-shaped jaw1.9 h2.2%3msg21iter.Intense
What was wrong
We needed a render that keeps up with a live stream, and a page the overlay could load as is.
What was done
A three.js viewer. The model is exported to glTF, the fur is simulated with layers of transparent shells stacked over the skin, and every bone is driven from the page.
The channel was live during this work, so the GPU stayed with OBS. Tests ran in a headless Chrome with software rendering, driven by script. Measured later on the GPU: 1.6 ms per frame at on-air size with 18 fur shells.
around 23.0 hThe test bench, shown live1.3 h1.5%15msg31iter.Intense
What was wrong
Settings had to be reachable without rebuilding the head, the interface had to look presentable on screen, and the page had to keep up with the work during the live stream.
What was done
Sliders for the shade of the russet coat, the fur, iris and pupil size, the matte and grain of the nose, the whiskers. Expressions pinned at the top, four tabs, a presentation mode and a light mode for CPU rendering. The page is served locally by a small Docker server and reloads with each new version, keeping the current settings.
Values found with the sliders became the defaults: fur length 0.04 in 27 shells at density 120, russet #7d4a11, nose matte at 0.7 with a grain of 1.5, whiskers at 12% opacity, thin and lifted. The eyes got smaller, the old minimum becoming the middle of the slider, and the whites were brightened. The whisker root dots are larger, less black, and irregular.
All this time OBS was broadcasting. No computation went through the GPU: checks ran in software rendering, at low priority, on a separate test page, and the page shown on air was only updated once a test passed. The published version of the viewer dates from this point; everything after it can be seen on the local bench.
shared with a neighboring stepTurning the head from the benchshared time1msgQuick
What was wrong
The bench could adjust the coat and the expressions, but not point the head. A fix seen in profile or with the chin up couldn't be checked without going through a script.
What was done
Three sliders in a “Head” group: turn, raise/lower, tilt. The orientation is smoothed, then split between the neck and the head.
shared with a neighboring stepOne slider for all the whiskersshared time1msgQuick
What was wrong
The whisker slider only lifted the ones on the whisker pads. The brow and chin whiskers didn't move.
What was done
The same offset and droop now apply to all four groups. Probe check: at zero opacity, all four groups disappear; with lift going from −0.3 to 0.6, all four move.
No capture was kept for this step.
around 44.2 hA video of the gestures17 min0.3%0msg4iter.Quick
What was wrong
There was no moving record of the gestures.
What was done
A 37.3 s video captured at 60 frames per second, then a lighter version. The watch metadata was cleaned up. An unknown gesture name no longer blocks the frame loop.
around 45.8 h30 fps, and what we do with it21 min0.4%2msg4iter.Steady
What was wrong
The bench rendered 60 frames per second while OBS broadcasts at 30. The fur had no sheen.
What was done
A “30 fps” box, checked by default. Fur highlights modulated by per-strand noise, translucent ears, springs integrated in substeps. Cost: within measurement noise.
around 46.1 hCast shadows5 min0.1%1msg1iter.Quick
What was wrong
No shadows at all: the paws looked pasted onto the face.
What was done
A soft shadow on a 2,048 map, cast by the skinned meshes only. Cost: 2 to 3 ms.
around 46.3 hRendering at 1.5×7 min0.1%2msgQuick
What was wrong
At OBS resolution, a grid pattern showed up on the fur.
What was done
A “Render 1.5×” box, unchecked at first, then checked by default. Cost measured at OBS's format: from 7.6 to 10.2 ms in a chest shot.
around 47.1 hAmbient occlusion8 min0.2%1msg2iter.Quick
What was wrong
The hollows were too bright: under the chin, at the collar, under the paws.
What was done
Half-resolution ambient occlusion, twelve samples, an edge-preserving blur, applied to the ambient light only. Setting kept at 2.0 / 0.46, for 1 ms.
around 47.3 hMotion blur28 min0.5%1msg9iter.Steady
What was wrong
At 30 frames per second, fingertips jump up to 64 px per frame.
What was done
Tile-based motion blur, 180° shutter, active only during fast gestures, for 0.3 to 0.6 ms. Materials are warmed up at startup, and a safeguard turns off occlusion and blur if they fail.
around 47.8 hFraming that keeps the gestures in≈ 7 min0.1%1msg3iter.Quick
What was wrong
Gestures went out of frame; the “six-seven” played entirely out of shot.
What was done
Camera pulled back and target lowered: the head goes from 87% to 66% of the frame height.
around 49.6 hWider iris sliders≈ 11 min0.2%1msg3iter.Quick
What was wrong
The iris and pupil sliders didn't go low enough.
What was done
Iris minimum from 0.7 down to 0.4, pupil from 0.5 down to 0.3.
No capture was kept for this step.
around 49.9 hAn optional watch, and settings that stick≈ 11 min0.2%1msg9iter.Quick
What was wrong
The watch couldn't be removed, and the bench settings were lost on reload.
What was done
A “Watch” checkbox (the mesh is still created, just hidden). A single local-storage key that only writes what differs from the default, a “Reset everything to default” button, and an address that opens the page fresh.
No capture was kept for this step.
around 51.8 hTracing the edges by hand≈ 4 min0.1%4msg2iter.Steady
What was wrong
There was no way to mark the edges of the tie by hand, or to pan the view.
What was done
A “Trace the tie edges” mode: click to place a point on the left or right, right-click to remove one, copy the outline. View panning turned on.
No capture was kept for this step.
around 57.1 h · v79A settings panel that scrolls5 min0.1%1msg2iter.Quick
What was wrong
The bench's settings panel had stopped scrolling.
What was done
It scrolls as one piece, with its tabs pinned to the top.
No capture was kept for this step.
around 67.8 h · v94aThe chosen settings become the character's16 min0.3%1msg7iter.Quick
What was wrong
Settings tuned on the bench (fur, russet coat, paws, stripes, eyes, nose, whiskers) lived in one browser only. The white hairs in the ears flickered and looked thick.
What was done
Those settings are read back and written in as defaults, and the “Reset” buttons return to them. The ear strands are drawn with a screen-space width and a one-pixel floor: twelve per root instead of five, half as thick, lit ear by ear.
around 72.1 hFrom the bench to the stream55 min1.0%9msg10iter.Intense
What was wrong
The character only lived on his test bench. He had to move into the stream overlay: full screen at the start, as a thumbnail when a page or a video is on screen, and talking over the voice the overlay plays.
What was done
A bridge links the two. The overlay loads a frozen copy of the bench in a frame and drives it with messages: prepare a sentence, play it, give the clock, change the set or the layout, start a move. The frame plays no sound; it follows the clock of the overlay's player, so the mouth, the actions and the gestures stay in sync with the actual playback. The frozen copy never reloads mid-stream, even when the bench changes. As a thumbnail, he keeps the full-screen shot, scaled down into a corner.
The first tests turned up three flaws. The page kept the 8-pixel margin a browser adds by default, hence a white border. The bench started with simulated speech switched on, so his mouth never stopped moving. And with a display running at 40 frames per second, the 30 fps cap only rendered 20; the first fix counted the carried-over time twice, which would have made springs and gestures run faster than real time. A second accumulator, for elapsed time, fixes both.
That left the control room. None of its buttons had ever reached the character: the overlay wrapped each message in the bench's name, then the type of move overwrote that name, and the bench silently dropped the message while the control room displayed “Envoyé” (Sent). The type now travels in another field, and the wrapper is written last.
around 73.8 hA shot pinned to the set25 min0.5%11msg4iter.Intense
What was wrong
On air, the shot came from the bench: too close, head-on, the mic in front of his mouth. Then, once the seat postures were in, the shot changed from one reload to the next, with the desk at an angle.
What was done
The shot was first tuned live, smoothly: 8% further back, 8° to the side, the camera higher, the character slightly right of center and the mic stand almost out of frame. It was then defined in the frame of reference of the set (desk, chair, mic) instead of the character's. It is set again at every layout change from the pose of the set at that moment: leaning back in his chair or on his elbows, the desk and the mic stay where they are, and only the character moves.
One last flaw: at every reload, the camera crossed the room before settling. The bridge could only glide it, over 0.7 s, and the layout arrived before the set, so the first glide started from the standing view with no desk. The shot now lands in one go on first display and after a set change, and the glide is only used between full screen and thumbnail.
11 quick 3 steady 4 intense
Behind the scenes · the first test on air
The first time on air, he left his head at home
On the test bench, everything looked fine. First run in OBS, on air: an immaculate suit, a striped tie, a gold watch, paws… and where the head should have been, two floating eyeballs, a row of teeth and a few ear hairs planted in thin air.
The whole story fits in one number: 16. In Chrome, WebGL on the Mac goes through Metal; the browser built into OBS still goes through Apple's old OpenGL. Every vertex of the head carried 15 attributes: its position, its normal, its color, its bones, and ten home-made fur settings (hair, wetness, flews, nose, ruff…). A GPU accepts 16 at most per object.
On top of that, the face deformations read an internal counter, gl_VertexID. Metal doesn't count it as an attribute; Apple's OpenGL does. Fifteen plus one is sixteen: the compiler rejects the head's shader, and the head disappears along with all its fur shells. The eyes, the teeth and the paws carry fewer attributes, so they get through without a hitch.
The number of shaders had nothing to do with it. The fur had gained a setting with every version, and the last few made the suitcase overflow. The fix was a matter of packing: the ten settings, grouped in fours, fit into three attributes. The head drops from 15 attributes to 8, and the render doesn't change by a single hair.
By the numbers
API equivalent: each call is priced at the public rate of the model used ($4 per million input tokens, $20 per million output tokens, $0.20 for cache reads, $8 for one-hour cache writes). That is what these calls would have cost at the API's public rates.
The table of all 101 steps
| Step | Chapter | Start | Time | Share | Msg | Iter. | Intensity |
|---|---|---|---|---|---|---|---|
| Fitting a volume to silhouettes | Head | 0.0 h | 53 min | 1.0% | 3 | 9 | Steady |
| A head that can be animated | Head | 1.3 h | 1.0 h | 1.2% | 2 | 18 | Intense |
| A six-hour pass over the whole face | Head | 11.2 h | 6.7 h | 7.5% | 1 | 98 | Intense |
| Switching to the supplied sculpt as a base | Head | 20.2 h | 2.8 h | 3.1% | 3 | 51 | Intense |
| The ridge around the eyes | Eyes | 28.6 h | 43 min | 0.8% | 4 | 7 | Steady |
| The whites of the eyes in surprise | Eyes | 43.9 h | 5 min | 0.1% | 1 | 2 | Quick |
| A smaller iris, a crisp highlight | Eyes | 48.7 h | ≈ 8 min | 0.2% | 2 | 3 | Quick |
| A mark at the outer corner of the eye | Eyes | 49.5 h | 4 min | 0.1% | 1 | 3 | Quick |
| Ears that drooped toward the sky | Ears | 0.9 h | 27 min | 0.5% | 2 | 2 | Steady |
| Almond eyes, shell ears | Ears | 9.3 h | 1.9 h | 2.1% | 5 | 28 | Intense |
| Ear tufts, whiskers, eye corners | Ears | 26.8 h | 1.8 h | 2.0% | 12 | 36 | Intense |
| Less pink ears | Ears | 47.9 h | ≈ 5 min | 0.1% | 1 | 2 | Quick |
| Down inside the ears | Ears | 70.7 h | ≈ 43 min | 0.8% | 13 | 15 | Intense |
| Muzzle, nose and first eyes | Muzzle | 2.4 h | 1.4 h | 1.6% | 5 | 17 | Intense |
| A notched nose edge, two wings | Muzzle | 29.5 h | 1.6 h | 1.8% | 7 | 25 | Intense |
| 36 teeth and a tongue | Mouth | 24.3 h | 2.5 h | 2.8% | 20 | 41 | Intense |
| The lower lip: too thin, then with a hole | Mouth | 29.3 h | 9 min | 0.2% | 5 | 1 | Intense |
| A less brightly lit mouth | Mouth | 34.4 h | 30 min | 0.6% | 1 | 19 | Steady |
| What made it look crude | Fur | 5.7 h | 3.6 h | 4.1% | 2 | 49 | Intense |
| Dense fur, gradual collar, muscles | Fur | 17.8 h | 2.4 h | 2.7% | 10 | 39 | Intense |
| Guard hairs | Fur | 46.2 h | 6 min | 0.1% | 1 | 1 | Quick |
| Fitting the suit, adjusting the collar | Suit | 31.1 h | 2.2 h | 2.5% | 11 | 51 | Intense |
| The stripes and the fabric | Suit | 35.3 h | ≈ 1.0 h | 1.2% | 7 | 20 | Intense |
| Trousers | Suit | 49.1 h | 23 min | 0.4% | 2 | 16 | Steady |
| The tie, up to the hand-traced area | Suit | 50.3 h | ≈ 1.1 h | 1.2% | 21 | 19 | Intense |
| The pocket, the lapel and the seam | Suit | 53.4 h | 1.4 h | 1.6% | 5 | 22 | Intense |
| Real buttons | Suit | 55.1 h | 1.3 h | 1.4% | 2 | 15 | Intense |
| The tie in profile and at an angle | Suit | 64.1 h | 2.1 h | 2.4% | 8 | 35 | Intense |
| The neck against the collar | Suit | 72.2 h | 58 min | 1.1% | 3 | 16 | Steady |
| Articulating the suit's arms | Arms | 31.5 h | 1.0 h | 1.2% | 0 | 30 | Intense |
| Six gestures and a count | Arms | 42.8 h | 38 min | 0.7% | 1 | 8 | Steady |
| Arms that live, hands that talk | Arms | 53.2 h | 14 min | 0.3% | 0 | 4 | Quick |
| Crossed arms | Arms | 53.9 h | 28 min | 0.5% | 0 | 8 | Steady |
| “Malin”, and telling the time | Arms | 79.3 h | 60 min | 1.1% | 6 | 4 | Intense |
| Waving hello | Arms | 86.0 h | 29 min | 0.5% | 2 | 1 | Steady |
| Imported paws, a wrist to scale | Paws | 36.1 h | 2.5 h | 2.8% | 5 | 60 | Intense |
| Jointed fingers, a paw rebuilt from volumes | Paws | 38.7 h | 2.0 h | 2.3% | 7 | 36 | Intense |
| Proportions and colors | Paws | 40.7 h | ≈ 1.6 h | 1.8% | 5 | 19 | Intense |
| The claws | Paws | 42.3 h | ≈ 47 min | 0.9% | 5 | 10 | Intense |
| Tighter fingers, a shorter thumb | Paws | 42.5 h | ≈ 39 min | 0.7% | 6 | 15 | Intense |
| Holding the glass and the cigar | Paws | 44.5 h | 52 min | 1.0% | 2 | 11 | Steady |
| Paws resting on the cheeks | Paws | 48.2 h | ≈ 44 min | 0.8% | 4 | 8 | Steady |
| A cut glass, a watch | Accessories | 43.2 h | 13 min | 0.2% | 1 | 5 | Quick |
| The watch at its real size | Accessories | 44.9 h | 21 min | 0.4% | 5 | 3 | Intense |
| The watch on the forearm's axis | Accessories | 45.7 h | 8 min | 0.1% | 1 | 1 | Quick |
| A cuff that rests on the watch | Accessories | 46.5 h | 36 min | 0.7% | 1 | 8 | Steady |
| Whisky refraction, dropped | Accessories | 47.2 h | 4 min | 0.1% | 1 | 0 | Quick |
| The watch one notch tighter | Accessories | 47.9 h | ≈ 1 min | < 0.1% | 1 | 0 | Quick |
| A whole watch against the cuff | Accessories | 51.1 h | ≈ 13 min | 0.2% | 4 | 7 | Steady |
| A round strap, a rigid case | Accessories | 51.6 h | ≈ 12 min | 0.2% | 5 | 4 | Intense |
| A real cigar, a seated pose that breathes | Accessories | 61.5 h | 1.2 h | 1.4% | 1 | 25 | Intense |
| Drawing on the cigar | Accessories | 68.1 h | 58 min | 1.1% | 1 | 12 | Steady |
| Gold, not copper | Accessories | 75.1 h | 3 min | 0.1% | 2 | 0 | Quick |
| A bracelet of real links | Accessories | 88.0 h | 34 min | 0.6% | 11 | 2 | Intense |
| A keyboard on the desk | Keyboard | 79.8 h | 1.2 h | 1.4% | 9 | 5 | Intense |
| Typing on the keyboard, key by key | Keyboard | 81.9 h | 4.1 h | 4.7% | 26 | 15 | Intense |
| Taking the keyboard, and keeping it | Keyboard | 86.6 h | 1.4 h | 1.6% | 4 | 10 | Intense |
| An expression slider that did nothing | Voice | — | shared | — | 1 | 0 | Quick |
| The voice drives the jaw | Voice | 31.3 h | 8 min | 0.2% | 0 | 5 | Quick |
| The mouth driven by the voice's spectrum | Voice | 33.0 h | 20 min | 0.4% | 1 | 6 | Quick |
| A real crease in the forehead | Voice | 42.7 h | 7 min | 0.1% | 1 | 8 | Quick |
| A forced aligner to close the mouth | Voice | 45.3 h | 23 min | 0.4% | 1 | 7 | Steady |
| A laugh that opens the mouth | Voice | 47.7 h | ≈ 16 min | 0.3% | 1 | 5 | Quick |
| An external voice plugged into the bench | Voice | 50.3 h | ≈ 15 min | 0.3% | 4 | 2 | Steady |
| Happy and curious | Voice | 50.5 h | ≈ 2 min | < 0.1% | 2 | 0 | Quick |
| Short actions, synced to the sound | Voice | 51.7 h | ≈ 40 min | 0.8% | 3 | 10 | Steady |
| Yawning, giggling, gasping | Voice | 54.3 h | 34 min | 0.6% | 0 | 17 | Steady |
| Gestures on words, a head that moves | Voice | 64.6 h | ≈ 1.1 h | 1.2% | 4 | 21 | Intense |
| Pouts and gestures on words | Voice | 70.8 h | ≈ 43 min | 0.8% | 3 | 15 | Steady |
| Gestures he picks himself | Voice | 73.9 h | 8 min | 0.1% | 2 | 3 | Quick |
| Filling the silences | Voice | 74.0 h | 35 min | 0.7% | 11 | 2 | Intense |
| A mood that shifts | Voice | 78.8 h | 28 min | 0.5% | 4 | 0 | Steady |
| Leaning on a high table | Sets | 57.2 h | 1.1 h | 1.2% | 4 | 21 | Intense |
| Legs, shoes, two armchairs | Sets | 58.3 h | 55 min | 1.0% | 0 | 19 | Steady |
| A pelvis that pivots | Sets | 59.2 h | 1.4 h | 1.6% | 1 | 14 | Intense |
| Folds that fall over the thighs | Sets | 60.6 h | 56 min | 1.1% | 5 | 5 | Intense |
| A back that bends | Sets | 62.7 h | 1.3 h | 1.5% | 2 | 8 | Intense |
| A desk to rest the elbows on | Sets | 64.5 h | ≈ 45 min | 0.8% | 2 | 17 | Steady |
| A luxury desk, and its light | Sets | 66.4 h | 38 min | 0.7% | 6 | 11 | Intense |
| A leather chair | Sets | 67.0 h | 22 min | 0.4% | 2 | 3 | Steady |
| A daytime living room | Sets | 74.0 h | 20 min | 0.4% | 3 | 13 | Steady |
| Moving in his chair | Sets | 75.2 h | 3.6 h | 4.1% | 36 | 58 | Intense |
| A shark statue on the desk | Sets | 79.7 h | 9 min | 0.2% | 2 | 6 | Quick |
| The viewer, then the U-shaped jaw | Bench | 3.8 h | 1.9 h | 2.2% | 3 | 21 | Intense |
| The test bench, shown live | Bench | 23.0 h | 1.3 h | 1.5% | 15 | 31 | Intense |
| Turning the head from the bench | Bench | — | shared | — | 1 | 0 | Quick |
| One slider for all the whiskers | Bench | — | shared | — | 1 | 0 | Quick |
| A video of the gestures | Bench | 44.2 h | 17 min | 0.3% | 0 | 4 | Quick |
| 30 fps, and what we do with it | Bench | 45.8 h | 21 min | 0.4% | 2 | 4 | Steady |
| Cast shadows | Bench | 46.1 h | 5 min | 0.1% | 1 | 1 | Quick |
| Rendering at 1.5× | Bench | 46.3 h | 7 min | 0.1% | 2 | 0 | Quick |
| Ambient occlusion | Bench | 47.1 h | 8 min | 0.2% | 1 | 2 | Quick |
| Motion blur | Bench | 47.3 h | 28 min | 0.5% | 1 | 9 | Steady |
| Framing that keeps the gestures in | Bench | 47.8 h | ≈ 7 min | 0.1% | 1 | 3 | Quick |
| Wider iris sliders | Bench | 49.6 h | ≈ 11 min | 0.2% | 1 | 3 | Quick |
| An optional watch, and settings that stick | Bench | 49.9 h | ≈ 11 min | 0.2% | 1 | 9 | Quick |
| Tracing the edges by hand | Bench | 51.8 h | ≈ 4 min | 0.1% | 4 | 2 | Steady |
| A settings panel that scrolls | Bench | 57.1 h | 5 min | 0.1% | 1 | 2 | Quick |
| The chosen settings become the character's | Bench | 67.8 h | 16 min | 0.3% | 1 | 7 | Quick |
| From the bench to the stream | Bench | 72.1 h | 55 min | 1.0% | 9 | 10 | Intense |
| A shot pinned to the set | Bench | 73.8 h | 25 min | 0.5% | 11 | 4 | Intense |
| Total, 101 steps | 88.5 h | 100% | 416 distinct | 1359 |
A message that touches several steps counts in each of them, so the column adds up to more than the 416 distinct messages. The same goes for messages per chapter.
Method
Work time. The workshop conversation is read back in full, with entries deduplicated and sorted in order. Once on air, the character kept moving forward in other conversations, held during the first streams: only the passages about the character count there, laid end to end on the axis without ever overlapping. Each interval between two entries is classified by what ends it: a reply from the AI (Claude, Anthropic's model) is generation time; a tool result is tool time; a sent message or a connection error is waiting, which isn't counted, and neither is the time spent retrying after a dropped connection. That gives 43.7 h of generation and 44.8 h of tools.
Messages. Only messages actually written and sent are counted, including those sent while work was in progress; automatic notifications, context resumptions and duplicates are left out. There are 416 of them, spread over fifteen days. Each one is tied to the step it is about, even when it arrived during other work.
Steps. A step covers one or more ranges of the axis and never shares one. When two topics were moving forward at once, each interval goes to the topic named by the commands and text just before it; those times carry a “≈”. Iterations count the rebuilds launched during the step.
Images. They are the contact sheets produced during the work, cropped to keep only the character. The first image of each chapter comes from the final capture. The moods had left no image behind: their captures were rendered afterwards, on the bench.