HTTPutf8Feed builds its header slice from the same pointer twice — {http->headers[0], *http->headers} where headers is u8cssp, and a[0] == *a in C — so the header loop is dead code and every serialized message loses all headers (no Host, no Content-Length). Verified empirically by the 2026-07-07 reviewer: a parsed 2-header request re-serialized as "GET / HTTP/1.1rnrn". No test covers the Feed direction.
HTTP.c:76-77 — u8css hdrs = {http->headers[0], *http->headers};
yields {p, p}, $len == 0, loop never entered. Intended: {http->headers[0], http->headers[1]}.
HTTP.lex:41 — ReasonPhrase = text requires ≥1 char; RFC 7230 allowsan empty reason-phrase ("HTTP/1.1 200 rn", common from proxies) → HTTPBAD on legal responses.
HTTP.c:93 HTTPfind(u8cs *value, u8cs key, ...) — immutable needle
typed as consumable u8cs, should be u8csc (abc.mkd: consumption is signalled by type).
HTTP.c:86 — hdrs[0] += 2; raw slice-pointer arithmetic; use the
typed movers. HTTPutf8Drain (HTTP.c:39) is named Drain but never advances the caller's slice — naming/contract drift.
an empty-reason response parse.
mind the LEX template drift, ABC-017), tighten the signatures.
template emits fbreak where the committed generated file has goto _out (ABC-017); regen must not silently change semantics.