module write.html; /+ ↓ the scroll html writer: one file, self-contained, valid html5. . Not a reproduction of spine's html. The text writer is spine's output byte for byte because the format is plain and there was nothing to improve; html is different, and reproducing it exactly would mean carrying forward things that are wrong rather than merely unusual. So this writer is held to a different standard, and a stricter one in the places that matter: . - the D and the Gleam writer produce the *same bytes*, which is the agreement that says the model is enough; - the visible text equals spine's, normalised the same way on both sides, so nothing is dropped, added or reordered; - every internal link resolves to an id in the same file; - it parses. . What is deliberately different from spine, each with the reason: . 1. *headings are h1..h6*. Spine writes for a level A heading, which is not an html element: the level is its markup depth and 0 is passed through. A document title is h1. 2. *one charset declaration*. Spine writes Content-Type: text/plain for an html document and then a second Content-Type saying text/html. 3. *no empty or placeholder metadata*. Spine writes dc.publisher="Publisher" and dc.date.issued="year" literally where it has no value, and generator="" when asked not to name itself. A meta with nothing in it is left out. 4. *span, not label, for the object number*.