Subtle bug: the substitution code modified html_str (logo placeholder,
IG protocol-relative rewrites) but the response was sent from
html_bytes, which was only re-encoded INSIDE the print-CSS-splice
branch. New decks contain 'doc-view' from the skeleton update, so
that branch was skipped — and the response sent the unmodified
original bytes from the artefact, including the literal
{{LOGO_DATA_URI}} placeholder.
Fix: pull the html_bytes = html_str.encode() out of the conditional
so every modification (logo substitution, IG https rewrite, optional
print-CSS splice) is always reflected in the response.