website refresh: true numbers (56 apps), claims checked against the capability map, ten missing apps, an English twin of every public page (public, choice B), 404 page; site gates 13-18 + 11 decoys; R-902 opened
gates / gates (push) Failing after 13m1s
gates / gates (push) Failing after 13m1s
Part A: claim table documentation/audits/website-refresh-2026-10-08/claims.md; "100% open source" corrected from the licence read; unbacked claims cut (firewall, RAID, snapshots, new-machine restore, self-managed mode, household VPN, "never lost"). Part B: dawarich, docmost, grimmory, homebox, karakeep, mealie, metube, radicale, recipe-importer, sparkyfitness cards; plant-it and wger cut (not offered). Part C: /en/ twins, nav language switch, hreflang both ways, sitemap with xhtml:link, og-image-en.png. Part D: site_gates.py twins/lang/same-apps/no-Hungarian/FAQ-JSON-LD/tail. Operator ruling 9 + choice B in 10-localisation.md §11, §10.7. Register: R-902 (contact mailer source in no repo); R-813, R-784, R-559 annotated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
This commit is contained in:
@@ -69,7 +69,12 @@ COVERS = {
|
||||
"stands": ("R-819: a stand citing a register id that exists in NEITHER register, and a stand "
|
||||
"marked 'walked' whose only source is a register row (a green dot from a label); "
|
||||
"plus the genuine article — a stand citing only a CLOSED row, which must PASS"),
|
||||
"site": "R-423: a NEW page under website/ that PAGES does not list (the gate used to scan 7 of 9)",
|
||||
"site": ("R-423: a NEW page under website/ that PAGES does not list (the gate used to scan 7 of 9); and "
|
||||
"(2026-10-08, the English twin) an English nav drifting from en/index, a wrong hreflang, a "
|
||||
"switch at the wrong twin, lang=\"hu\" on an English page, an app missing from one apps page, "
|
||||
"ASCII-only Hungarian in English text and in a script message, a 'please', an English "
|
||||
"retrieval promise the Hungarian does not make, a FAQ JSON-LD drifting from the visible "
|
||||
"answer, and text after </html> — each must convict WITH its own failure line"),
|
||||
"script-tests": ("R-885: FIVE cases in scripts/test_script_tests_gate.py, run from here: a suite that PRINTS "
|
||||
"OK and exits 1 (label without fact), a failing suite three levels deep (scope is a walk), "
|
||||
"an empty scripts/ tree (checked nothing), the genuine article (must pass), the nested mark"),
|
||||
@@ -102,8 +107,9 @@ def gate(script, args=()):
|
||||
return p.returncode, p.stdout + p.stderr
|
||||
|
||||
|
||||
def decoy(name, script, plant, args=(), expect="convict"):
|
||||
"""plant() is a callable returning a cleanup callable."""
|
||||
def decoy(name, script, plant, args=(), expect="convict", must=None):
|
||||
"""plant() is a callable returning a cleanup callable. `must`: a text the gate's output has to carry — a decoy
|
||||
convicted by some OTHER check proves nothing about the check it was built for."""
|
||||
global ran
|
||||
ran += 1
|
||||
cleanup = plant()
|
||||
@@ -112,7 +118,10 @@ def decoy(name, script, plant, args=(), expect="convict"):
|
||||
finally:
|
||||
cleanup()
|
||||
want_nonzero = (expect == "convict")
|
||||
if (rc != 0) != want_nonzero:
|
||||
if must and want_nonzero and rc != 0 and must not in out:
|
||||
fails.append("%s: the gate failed, but NOT with %r — the decoy convicted for another reason\n%s"
|
||||
% (name, must, out[-700:]))
|
||||
elif (rc != 0) != want_nonzero:
|
||||
fails.append("%s: decoy %s (rc=%d)\n%s" %
|
||||
(name, "PASSED - LIVE HOLE" if want_nonzero else "was wrongly convicted",
|
||||
rc, out[-700:]))
|
||||
@@ -492,6 +501,51 @@ def replace_in(path, old, new):
|
||||
return _plant
|
||||
|
||||
|
||||
|
||||
# ── site: the English twin (2026-10-08) ─────────────────────────────────────────────────────────────
|
||||
# Each decoy is a shape a real session produces: a nav edited on one page, an hreflang copied from the wrong
|
||||
# page, a translator leaving a Hungarian word without accents, a status message left in a script.
|
||||
_WEB = os.path.join(ROOT, "website")
|
||||
_EN = lambda f: os.path.join(_WEB, "en", f)
|
||||
decoy("site/en-nav-drift", "site_gates.py",
|
||||
replace_in(_EN("technology.html"), '<li><a href="/en/apps">Apps</a></li>', '<li><a href="/en/apps">Applications</a></li>'),
|
||||
must="en/technology.html: <nav> differs from en/index.html")
|
||||
decoy("site/hreflang-wrong", "site_gates.py",
|
||||
replace_in(_EN("faq.html"), '<link rel="alternate" hreflang="en" href="https://felhom.eu/en/faq">',
|
||||
'<link rel="alternate" hreflang="en" href="https://felhom.eu/en/apps">'),
|
||||
must="en/faq.html: hreflang alternates")
|
||||
decoy("site/switch-wrong-twin", "site_gates.py",
|
||||
replace_in(_EN("apps.html"), '<a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-switch">',
|
||||
'<a href="/" lang="hu" hreflang="hu" class="lang-switch">'),
|
||||
must="en/apps.html: the language switch points at")
|
||||
decoy("site/lang-attr", "site_gates.py",
|
||||
replace_in(_EN("backups.html"), '<html lang="en">', '<html lang="hu">'),
|
||||
must="the English set needs lang='en'")
|
||||
decoy("site/app-missing-one-side", "site_gates.py",
|
||||
replace_in(_EN("apps.html"), '<img src="/assets/radicale-logo.svg" alt="Radicale" class="app-logo">', ""),
|
||||
must="the apps pages show DIFFERENT apps")
|
||||
decoy("site/ascii-hungarian-text", "site_gates.py",
|
||||
replace_in(_EN("index.html"), "Contact form</a>", "Kapcsolatfelveteli urlap</a>"),
|
||||
must="en/index.html: Hungarian on an English page (the Hungarian stem 'kapcsolat')")
|
||||
decoy("site/hungarian-in-script", "site_gates.py",
|
||||
replace_in(_EN("contact.html"), "showStatus('Fill in every required field.', 'error-state');",
|
||||
"showStatus('Kerlek, toltsd ki az osszes mezot.', 'error-state');"),
|
||||
must="en/contact.html: Hungarian on an English page (the Hungarian stem 'kerlek')")
|
||||
decoy("site/please", "site_gates.py",
|
||||
replace_in(_EN("contact.html"), '<div class="error-message" id="subjectError">Choose a topic.</div>',
|
||||
'<div class="error-message" id="subjectError">Please choose a topic.</div>'),
|
||||
must="en/contact.html: the site does not beg")
|
||||
decoy("site/retrieval-promise", "site_gates.py",
|
||||
replace_in(_EN("technology.html"), "<li>Reproducible anywhere</li>",
|
||||
"<li>Reproducible anywhere</li>\n <li>Every file can still be restored, whatever happens</li>"),
|
||||
must="en/technology.html: 2 English retrieval promise(s)")
|
||||
decoy("site/faq-ld-drift", "site_gates.py",
|
||||
replace_in(_EN("faq.html"), "<p>Just e-mail <strong>support@felhom.eu</strong>.", "<p>Just e-mail <strong>help@felhom.eu</strong>."),
|
||||
must="en/faq.html: the FAQPage JSON-LD")
|
||||
decoy("site/text-after-html", "site_gates.py",
|
||||
replace_in(_EN("apps.html"), "</body>\n</html>", "</body>\n</html>\n=====\nSummary: 13 files included\n"),
|
||||
must="en/apps.html: text after </html>")
|
||||
|
||||
# ── hostinstall (R-426, 2026-10-06) ──────────────────────────────────────────────────────────────
|
||||
#
|
||||
# Each decoy is a one-line edit a real session would make to felhom-host-install.sh, leaving the LABEL
|
||||
|
||||
Reference in New Issue
Block a user