Menu
BKZ lab log

Asset pipeline · Session log

Eleven merges, and the hero never moved

A round on mob detail in Brooklyn Dead. Three mobs turned out to have a chest one tenth of a millimetre deep, two of my own rulings were falsified by the gates I asked for, and the most useful output of the day was three separate refusals.

· brooklyn-dead @ af708d5 · detail gate 207/221

A night street in the mob lab, a group of zombies lit by a wall lamp
What the work is for. The detail tier at playing distance, in the mob lab at night. Everything below is measured on a bench in Blender; this is the only place any of it is judged.

What moved

detail gate
207 / 221
115 / 128
chest depth, 3 mobs
86 – 152 mm
0.20 mm
neck escape
1.2 – 17.0 mm
83 – 110 mm
body contact pairs
13
86
tops on BasicZ1
8 of 8
0 of 8
SK_Hero
byte-identical

Eleven passes, each on its own branch, merged and re-gated on trunk. Artefacts regenerated after every merge, never resolved by hand.

The round, in order

01landed

The mobs stop walking like the player

Four bodies with distinct silhouettes, corrupt mass and asymmetric heads all played Walk_Loop — the hero’s own clip. A gait is now a row in the profile table, three mechanisms deep.

The brief was half wrong and the gate said so. A layer of pure constant offsets is decoration: the mob stands differently and moves identically.

Offsets alone score 0.0215° dynamic against a measured instrument floor of 0.0269° — literally zero. Arm-into-body contact 37 → 0 on the Breaker.

The Breaker walking on the hero’s clip, arms buried in the torsohero’s walk
The Breaker walking on its own gait, arms swinging clear of the torsoown gait
The Breaker, before and after. In the front view the arms were buried in the torso; afterwards they swing clear. The closest pair of gaits separates at 124× the instrument floor.
02falsified

The neck anchor was innocent

I ruled that build_neck anchored to nothing and ordered the fix, bounded at 6 mm with a per-region falsifier. The falsifier earned its keep.

Over budget and ineffective. The mobs’ neck bases were already on the torso axis — there was nothing to re-anchor.

The anchored neck moves the hero +7.180 mm — over its own 6 mm budget — and closes 0.038 mm of BasicZ1’s 83.21 mm escape.

03landed

Every hair shell was fitted to the hero’s skull

The mobs were bald against a 352 KB hair system. Hair is a row now, costing 2.8–4.9% of the tri budget and displacing zero growth triangles — the corruption cap was never binding.

Underneath was one default: _head_bvhs lofted from FRAME_PRESETS unconditionally, so every clamp, cull, lift and sink query answered about the wrong head.

Median error −35.1 mm on the Crier — hair floating off the head — to +52.2 mm on the Fused: skull straight through the hair.

04landed

The suit bay was touching the van

Both complaints were real and both of my diagnoses were wrong. The 3.76 m I kept quoting is an interact anchor, and RIG-01’s anchor is its side door.

And SUBJECT_FRAME_FRAC cancels for a standing subject — standing_span multiplies by it and frame_width divides. Tuning it would have moved nothing while looking like a fix.

Measured against bodywork the rack sat 0.03 m off the van. Framing 59–62% → 65–71%, with the printer, vat and gunsmith bit-identical.

The suit bay with the van filling the frame behind the rack0.03 m
The suit bay with the van reduced to a sliver at the frame edge1.34 m
The bay, before and after. The van is a sliver at the frame edge now, with real space between it and the rack. Against the mirror — the station that reads correctly — the bay went from ×1.663 of body height to ×1.470.
05landed

Four clips refuse the phase lag, on their own evidence

All 53 clips ship the gait on all four mobs. Roll, Jump, Jump_Land and Vault take the offsets and swing scale without the lag — measured at bake time, not branched.

The lag breaks on one-shots, not on violent clips, which is not what I predicted when I flagged Roll as the risk.

Loop seams run 0.00–0.649° on 208 of 212 clip-instances, then 29.3 / 50.6 / 53.4 / 85.5. A lag on Vault produced 99.2° of arm travel in one frame.

06landed

Three mobs had a ribbon where a ribcage should be

_no_undercut measures overhang in world Y. On a leaning frame the spine carries the chest front forward faster than any depth can, so the clamp is unsatisfiable and returns its own floor — reporting success.

The priced fix would have taken the hero’s chest down 17.64 mm. Scoping it structurally — the datum is the running maximum of the spine curve — made it a no-op on the hero by construction.

Minimum chest-ring depth 0.100 mm on three of four mobs. Hero displacement after the fix: 0.0000 mm in every region of both frames.

The Breaker’s torso with the arms removed, shoulder block joined to the pelvis by a one-pixel line0.20 mm
The Breaker’s torso with the arms removed, a full ribcage between shoulder and pelvis151.62 mm
The Breaker’s torso, arm chunks removed. The shoulder block floats above the pelvis joined by a one-pixel line. Six passes of side renders never caught it because the hanging arm covers it.
07landed

The motion gate graded a clip that does not ship

The gait was baked into all four GLBs and proved from the bytes. t9_motion went on grading the unlayered source, so six of thirteen failures were measured on geometry the game does not contain.

It reported the Breaker’s pelvis × elbow_L at 66.1 mm where the gait pass measured 17.1. Body-only contact 86 pairs → 13.

08corrected

A ladder brackets a crossing; it does not measure one

S_ARM_OUT_DEG exists so the constants cannot quietly stop being what their comments say. It caught exactly that — the arm clearance had been derived against mobs whose chests were 0.1 mm deep.

I read the coarse ladder’s next rung as the answer and reported a 25% widening. Swept properly in degrees, the real move is 0.45%.

Zero arm pairs first at 22.1°, not the 27.5° the six-point ladder implied. The residue at 22.0 was one pair at 0.239 mm.

09refused

The material rename was measured, then declined

Mob hair wearing M_Hero_Hair would put every zombie in the player’s runtime tint table. The concern was well-formed — the table is name-keyed on resource_name.

Nothing leaks. The tint walks the player’s own subtree, no mob source references the appearance layer, the write is on a duplicate under two regression tests, and the two GLBs are separate imports so equal names are unequal resources.

A rename would move MobRigCache’s merged-surface count, which tests assert. It would cost something and buy nothing.

10landed

The gash was two bugs

Facial hair rode SKULL/FACE from FRAME_MASC unscaled — the same defect as the hair one, in the half nobody had wired. Fixed first, wired second.

Then patch dropped whole columns. Making the unit a cell exposed the second half: the hole radius was derived from a width and applied in two dimensions.

21.7 mm against a 20 mm row pitch takes a column top to bottom — the same gash by another route, with every number green.

Four mob heads in three-quarter view, each with different hair and facial hair
Four faces that read differently. Matted full beard, cheek mange, clotted jaw, moustache. cheek_mange earned a style rather than a dial value: its footprint is one no dial reaches — 25 legal combinations and not one empties the philtrum while both cheeks carry hair.
11landed red

The extents gate could not see head, hair or beard

It was written when a mob was a body, and three subsystems landed on top of it. For hair the envelope is not inside the head — hair extends past the skull. It is a bounded allowance around the surface it grows from, anchored on the same float that brakes _lift_clear.

It went red on its first run, and reported rather than fixed: Mob_Fused_Head reaches 2.5 mm above the bind-pose crown. Not the hair — the skull.

Positive control caught at 5.2×: with the brake removed the crown reads 203.8 mm against a 39.2 mm allowance.

What is still open

The brute’s shoulders

The Fused and Breaker fail the axilla gate, and closing it costs shoulder_width 0.336 → 0.265 — 23.5% off the shoulder band, which inverts a slab into a pear. I refused it. The ribcage work changed the stakes: the Breaker now has a garment on the other side of that trade.

The Fused’s crown

2.5 mm above SK_Girl’s bind envelope — the engine contract. Small, and a fused frame decision rather than a bug.

Two corrections

I quoted check_gait.py as 60/60 for three merges when it had been 57/60 — verified once, then repeated as current while the ground moved. One of the three failures was my own stale-baseline defect, the same pinned-commit pattern I had fixed in the neighbouring file an hour earlier.

And the arm anchor above. A ladder’s next rung is not a measurement, and reading it as one nearly bought a 25% wider arm swing on every mob to close a quarter of a millimetre.

The most useful output of the day was three separate refusals: a fix that was over budget and ineffective, a widening that was a misread ladder, and a rename that would have cost something and bought nothing.

Gates at close — build_detail_mobs 207/221 · check_gait 61/61 PASS · check_gait_export 47/48

Frozen — SK_Hero.glb 4833793441261a55… · Wardrobe 0839880763b9aa78… · manifest d9e793d810418ed0…

Deliberately failing — E6_Crier at 1.94×, an export-path decision left at the measurement rather than closed by widening a bound.

Back to the pipeline