homepage: app-card art, zealot-first order, common uncensored warning, admin identity gate
- Every app card carries hex-clipped art: 19 amber-tinted brand marks from the Simple Icons CDN plus 19 improvised monogram SVGs, wired via a per-service "art" field; homepage_config.bats pins art presence for all 32 apps. - Model cards render zealot -> dragoon -> archon (registry order pinned in the seam). - Dragoon and zealot share one common uncensored legal warning (adult content, harmful/hateful/illegal descriptions, sensitive offensive cybersecurity topics, severe legal risk, "don't ruin this server for everybody"), hover label on card and docs. - Archon gets a bordered red permission callout: ask Frank before use. - SearXNG obfuscation-not-anonymity note moved to a card-level hover warning (.svc-warn) and a docs hover note. - Gitea: self-service signup flow; no need to ask Frank. - Footer docs/admin/account-settings become glowing bordered buttons; the admin button is shown only to homepage-admins members via a new Caddy /whoami endpoint echoing the outpost-injected X-Authentik-* headers (spoof-proof; the /admin* 403 stays the real gate). e2e pins both sides. - Docs naming swept: Protoss names primary, bracketed api ids, explicit note that a future switchover renames the ids themselves.
This commit is contained in:
1 parent
3c5d77d1fa
commit
c1e192df00
44 files changed
+338
-102
No files matched your search
@@ -101,7 +101,35 @@ for s in fleet:
|
||||
uncensored = "ncensored" in m["spec"] or "bliterated" in m["spec"]
|
||||
if uncensored:
|
||||
assert "legal" in m.get("warn", "").lower(), f"{s['name']} is uncensored but has no legal warning"
|
||||
assert [s["name"] for s in fleet] == ["frank-zealot", "frank-dragoon", "frank-archon"], \
|
||||
"card render order must be zealot, dragoon, archon: " + str([s["name"] for s in fleet])
|
||||
w = {s["name"]: s["model"].get("warn", "") for s in fleet}
|
||||
assert w["frank-zealot"] == w["frank-dragoon"] != "", "the legal warnings must be the common uncensored text"
|
||||
assert "legal risk" in w["frank-zealot"].lower() and "everybody" in w["frank-zealot"].lower()
|
||||
archon = next(s for s in fleet if s["name"] == "frank-archon")
|
||||
assert "permission" in archon["model"], "archon card needs the ask-Frank permission callout"
|
||||
PY
|
||||
grep -q "renderModelInfo" "$REPO_ROOT/shared/homepage/app.js"
|
||||
grep -q ".mi-card" "$REPO_ROOT/shared/homepage/style.css"
|
||||
}
|
||||
|
||||
@test "every app card carries icon art and SearXNG carries the privacy note" {
|
||||
# The family sees unit-portrait art on every card, not just the models:
|
||||
# brand marks where Simple Icons has them, improvised monograms otherwise.
|
||||
# SearXNG's card must warn (hover) that obfuscation is not anonymity.
|
||||
python3 - "$REPO_ROOT/shared/homepage/services.json" "$REPO_ROOT/shared/homepage" <<'PY'
|
||||
import json, os, sys
|
||||
services = json.load(open(sys.argv[1]))
|
||||
root = sys.argv[2]
|
||||
apps = [s for s in services if "model" not in s]
|
||||
for s in apps:
|
||||
art = s.get("art", "")
|
||||
assert art.startswith("/img/apps/"), f"{s['name']} has no app art"
|
||||
assert os.path.isfile(os.path.join(root, art.lstrip("/"))), f"{s['name']} art file missing: {art}"
|
||||
sx = next(s for s in services if s["name"] == "SearXNG")
|
||||
assert "anonymous" in sx.get("warn", "").lower(), "SearXNG must warn that searches are obfuscated, not anonymous"
|
||||
PY
|
||||
grep -q "app-art" "$REPO_ROOT/shared/homepage/app.js"
|
||||
grep -q ".app-art" "$REPO_ROOT/shared/homepage/style.css"
|
||||
grep -q "/whoami" "$REPO_ROOT/dankclaw/Caddyfile"
|
||||
}
|
||||
Reference in new issue
Block a user