Line boxes over atomic inlines as a generated function master
CSS 2.1's inline formatting context becomes the twelfth generated function, for the one kind of inline content that needs no font: a block container whose in-flow children are all display: inline-block with explicit width and height. The container's content width, its strut line-height and text-align go in, together with each atomic inline's margin-box size, its own baseline and its vertical-align; where every box lands, the line boxes they sit on, the stack's total height and the last line's baseline come out. Before this, boxtree.rs gave every computed display other than none one block-level box, so an inline-block stacked in normal flow like a block and vertical-align, line-height and text-align reached nothing at all. Now a box records whether it is inline-level, a container whose children are all inline-level establishes an inline formatting context, and fragment.rs lays those children out as block formatting context roots at their explicit sizes before handing the measurements to the function. CSS 2.1 10.8.1's inline-block baseline -- its last in-flow line box's, or its bottom margin edge when it has none or its overflow is not visible -- stays hand-written, since only fragment.rs can see inside the box. Its answer is a set of positions rather than one value, which makes it the first function here that can be wrong about one box and right about its neighbour on the same call, and the first that can panic on a well-typed input by indexing its own output. Two candidates did exactly that and were caught and dropped. The corpus is 111 cases over fifteen categories with none dropped for engine disagreement. Every container sets font-size: 0 beside an explicit line-height in px, so the strut's ascent and descent are zero and its baseline sits at the middle of a known height; whether the three engines agree on that was the open question, and they do, AlignMiddle and StrutTallerThanContent included. cases.rs already writes no whitespace between tags, and both the case file and the cache binary assert no text node reaches the markup. The two seeded-wrong fixtures are wrong about disjoint halves of the function -- one ignores vertical-align, the other never breaks a line -- and between them pass all 111 cases, so the regression set covers the corpus and a candidate must pass every case to be admitted. Both are rejected: 61/111 losing 50 and 86/111 losing 25. One batch over four gateway models compiled 18 of 82 candidates and produced four at 111/111, one from each model; model_0 from qwen3.8-flash-next is committed. That complete seed cost one change to the batch loop. Every other *_real_model_run samples its prompt from the cases outside the regression set, which elsewhere is the same set the committed candidate fails; here the seed is complete from the first batch while the committed candidate passes none of it, so the first run sampled an empty difference and drew nothing. It now samples the whole corpus when the difference is empty -- the same dead end height_real_model_run.rs reached from the opposite direction. Gates: cargo test --workspace passes; fragment_check --random stays 227/227 with every category unchanged; the floats, stacking, relative-positioning and block-height floors all hold exactly. A floor for this function in bench/seam-floor.sh is a hand change after landing, since the landing script refuses a diff under bench/.