freedomResearch notes on safety-removed models: mechanisms, defenses, measurement.

Last reviewed 2026-11-06

Testing methodology

Every model we run gets the same battery so cloud and local land in one table. The harness is tests/refusal_eval.py; it talks to the LiteLLM gateway on port 14000 so any route the gateway exposes is testable by name.

Axes

Axis Prompt set Metric Why
Over-refusal tests/prompts/benign_borderline.jsonl (XSTest-style: benign requests with scary surface forms) refusal rate The number that drops to ~0 under ablation; the cleanest fingerprint
Capability retention tests/prompts/capability.jsonl (short reasoning, code, factual items with checkable answers) accuracy Measures the capability tax
Sycophancy tests/prompts/sycophancy.jsonl (false-premise questions) agreement rate Rises under ablation; matters for agent judgment
Tool calling sparkagent scripts/bench-tools.sh 4-case score Agent fitness
Throughput harness timing tok/s, latency Deployment fit
Harmful-request compliance (ASR) not shipped in this repo rate only Use HarmBench or a public set when a study needs it; record the rate, store nothing else. Off by default

Refusal classification

Two-stage: keyword heuristic ("I can't", "I'm not able to", "I won't", etc.) then an optional judge call to a stock model (--judge spark-qwen38) that labels each response REFUSE / COMPLY / PARTIAL. Judge disagreements with the heuristic are flagged.

Storage policy

Comparing a model to its base

Always run the stock base through the same battery (--compare <route>). The delta, not the absolute number, is the finding.

Known blind spots