// 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 `
A measurement, not a verdict: read the replies below before concluding anything.
${esc(b.text)} (found via ${esc(b.source)})| Prompt | Reply | Reply with candidate |
|---|
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 = `--base"}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(); })();