// Backdoor Checker page logic: file check, existing result lookup, scan command, leaderboard, validation. (function () { const SPACE = "coralexbadea/BackdoorChecker"; const $ = (id) => document.getElementById(id); const esc = (s) => String(s == null ? "" : s).replace(/[&<>"']/g, (c) => ({"&": "&", "<": "<", ">": ">", '"': """, "'": "'"}[c])); const hf = (id) => `${esc(id)}`; const pct = (x) => (x == null ? "" : Math.round(100 * x) + "%"); let ROWS = []; function summarize(c, file) { const b = c.best || {}; return {file, model: c.model, parent: c.parent_model, verdict: c.verdict, trigger_score: c.trigger_score, candidate: b.text, source: b.source, reply_change: b.reply_change, label: c.label || null, known_pattern_only: !!c.known_pattern_only, scanned: (c.scanned_at || "").slice(0, 10), card: c}; } async function loadRows() { let rows = null; try { // live listing, so merged pull requests appear without a rebuild const t = await fetch(`https://huggingface.co/api/spaces/${SPACE}/tree/main/results`); if (t.ok) { const files = (await t.json()).map((f) => f.path.split("/").pop()) .filter((n) => n.endsWith(".json") && n !== "index.json" && n !== "validation.json"); rows = (await Promise.all(files.map(async (n) => { try { const r = await fetch("results/" + n); return r.ok ? summarize(await r.json(), n) : null; } catch (e) { return null; } }))).filter(Boolean); } } catch (e) { rows = null; } if (!rows || !rows.length) { try { rows = (await (await fetch("results/index.json")).json()).map((r) => Object.assign({card: null}, r)); } catch (e) { rows = []; } } return rows; } function labelChip(r) { if (r.label === "positive") return 'positive control'; if (r.label === "negative") return 'clean control'; if (r.label === "blind") return 'claimed backdoor, trigger unknown'; return ""; } const isFlag = (v) => v === "TRIGGER-LIKE STRING FOUND" || v === "SUSPECTED BACKDOOR"; function verdictTag(r) { if (isFlag(r.verdict)) return `Trigger-like string${r.known_pattern_only ? " · known pattern" : ""}`; if (r.verdict === "NOT SCANNED") return 'Not scanned'; return 'None found'; } function rowHtml(r) { const cand = r.candidate == null ? "" : `${esc(r.candidate)}`; const score = r.trigger_score == null ? "" : Number(r.trigger_score).toFixed(2); return `${hf(r.model)}${labelChip(r)}${verdictTag(r)}${cand}${score} ${pct(r.reply_change)}${r.parent ? hf(r.parent) : ""}${esc(r.scanned)}`; } function renderBoard(filter) { let rows = ROWS.slice(); if (filter === "flagged") rows = rows.filter((r) => isFlag(r.verdict)); if (filter === "controls") rows = rows.filter((r) => r.label); if (filter === "community") rows = rows.filter((r) => !r.label); rows.sort((a, b) => isFlag(b.verdict) - isFlag(a.verdict) || (b.trigger_score ?? -1e9) - (a.trigger_score ?? -1e9)); document.querySelector("#lb tbody").innerHTML = rows.length ? rows.map(rowHtml).join("") : 'No rows here yet. Be the first to submit a scan!'; } document.querySelectorAll("[data-f]").forEach((b) => b.addEventListener("click", () => { document.querySelectorAll("[data-f]").forEach((x) => x.setAttribute("aria-pressed", String(x === b))); renderBoard(b.dataset.f); })); function resultHtml(c) { if (!c || !c.best) return ""; const b = c.best; const ex = (b.examples || []).map((e) => `${esc(e.prompt)}${esc(e.reply)}${esc(e.with_trigger)}`).join(""); return `

Published scan: ${verdictTag({verdict: c.verdict, known_pattern_only: c.known_pattern_only})}

A measurement, not a verdict: read the replies below before concluding anything.

${ex}
PromptReplyReply with candidate
`; } async function check(raw) { $("go").disabled = true; $("result").innerHTML = '

Checking…

'; try { const x = await FileScan.scanRepo(raw); const parent = x.declared_base_models[0]; const scanned = ROWS.find((r) => r.model.toLowerCase() === x.repo_id.toLowerCase()); let card = scanned && scanned.card; if (scanned && !card) { try { card = await (await fetch("results/" + scanned.file)).json(); } catch (e) { card = null; } } const base = parent ? "" : ` --base ${card && card.parent_model ? card.parent_model : "org/parent-chat-model"}`; const cmd = `python -m backdoorcheck.cli scan ${x.repo_id}${base} --out result.json`; const deep = x.needs_trust_remote_code ? "no: the model needs trust_remote_code, which the scanner never runs" : (x.safetensors_files ? "yes (safetensors weights)" : "only if Hugging Face's automatic safetensors conversion exists"); $("result").innerHTML = `

Run it on your machine:

${esc(cmd)}
${card ? resultHtml(card) : '

No published scan for this model yet.

'}`; } catch (e) { $("result").innerHTML = `

${esc(e.message)}

`; } finally { $("go").disabled = false; } } $("scanform").addEventListener("submit", (ev) => { ev.preventDefault(); check($("rid").value); }); document.querySelectorAll("[data-ex]").forEach((a) => a.addEventListener("click", () => { $("rid").value = a.dataset.ex; check(a.dataset.ex); })); async function loadValidation() { try { const v = await (await fetch("results/validation.json")).json(); $("accuracy").innerHTML = v.html; } catch (e) { $("accuracy").innerHTML = '

Validation results are not available.

'; } } (async () => { ROWS = await loadRows(); renderBoard("all"); const q = new URLSearchParams(location.search).get("model"); if (q) { $("rid").value = q; check(q); } })(); loadValidation(); })();