website: the shell keeps the footer - it is the only route to the legal pages
gates / gates (push) Failing after 11m54s

Caught BEFORE the switch, not after. Stripping the website's chrome also stripped
<footer>, and the shell has none of its own. Every one of the 19 pages had lost:
the link to the Adatkezelesi tajekoztato and the Feltetelek, the operator's name,
info@felhom.eu, and the copyright line. The legal pages are in no menu, so they
would have become unreachable from navigation entirely.

The footer is now carried VERBATIM from each live page into the bottom of the
content column. Verified on all 19: footer present, legal link present, e-mail
present, and the footer sits INSIDE <main class=content> rather than becoming a
flex sibling of the sidebar.

Gate 3b now checks the footer as well as the sidebar across the shell set, so the
guarantee gate 3 used to give is not lost in the move. Red-proofed: removing one
page's footer convicts.
This commit is contained in:
2026-10-11 15:53:49 +02:00
parent d5199ca634
commit 58e308352f
20 changed files with 122 additions and 1 deletions
+8 -1
View File
@@ -287,7 +287,14 @@ for p in sorted(SHELL):
if not m:
fail("%s: no <nav class=\"sidebar\"> block — a shell page carries the shell" % p)
continue
_shell_by_lang.setdefault(lang_of(p), []).append((p, norm_block(m.group(0))))
# The footer stays part of the identity check. The shell has no footer of its own, so the
# website's is carried INSIDE the content column - it is the only route to the legal pages and
# the only place the operator's name and e-mail appear. A shell page without one is a defect.
f = re.search(r"<footer>.*?</footer>", s, re.DOTALL)
if not f:
fail("%s: no <footer> — the legal pages and the operator's e-mail are reachable only from it" % p)
continue
_shell_by_lang.setdefault(lang_of(p), []).append((p, norm_block(m.group(0)) + norm_block(f.group(0))))
for _lang, _members in sorted(_shell_by_lang.items()):
_ref_p, _ref = _members[0]
_bad = 0