Crucible
What survives quantization, abliteration, and serving.
Most leaderboards benchmark remote frontier APIs or unserved model snapshots. Your GGUF on your hardware behind your server is a different artifact, and that is the one your users get. Crucible talks to any running OpenAI-compatible server and evaluates a model exactly as it is served: same chat template, same samplers, same tool-call parsing. Base versus abliterated is the first-class workflow, and every run records provenance hashes so a score shift is attributable.
The abliteration workflow
The core use case: prove your abliterated model is more open than the base without being dumber. Three commands against whatever server you already run (Ollama, LM Studio, vLLM, llama-server), or let Crucible spawn llama-server itself for a local GGUF.
- 01Eval both builds.
Every suite runs against the live server: GSM8K and GSM-Symbolic for capability, SORRY-Bench, XSTest, OR-Bench-Hard and FalseReject for refusal profiles, BFCL v4 for tool calling, plus RAG and agent loops. 527 prompts across 19 categories, resumable.
- 02Judge-grade the refusals.
The keyword grader is instant and deterministic; crucible grade adds an LLM judge layer (Claude, DeepSeek, OpenAI, or any OpenAI-compatible URL) with complied / hedged / refused verdicts stored alongside, never overwriting. Model cards show both graders side by side.
- 03Compare and gate.
crucible compare produces the delta that matters: did refusals move to complies, did capability survive. crucible gate exits nonzero in CI if the candidate regresses more than 5pp, in either direction, including over-refusal creep.
# 1. eval the base model crucible run --server http://localhost:11434/v1 --model-name base-model --workers 4 # 2. eval the abliterated model crucible run --server http://localhost:11434/v1 --model-name uncensored-model --workers 4 # 3. compare, judge-grade, publish crucible compare <base-run-id> <abliterated-run-id> crucible grade <run-id> --judge claude --api-key $ANTHROPIC_API_KEY crucible model-card <run-id> --out model-card.md # both graders, provenance hashes
Crucible Lab
An interactive workbench over the results database: browse runs, drill into per-prompt transcripts with keyword, judge, and human verdicts side by side, diff two runs, and chat against the same server Crucible evaluates. Every aggregate is one click from the raw transcripts that produced it.
Quickstart
Requirements: any running OpenAI-compatible inference server. No llama.cpp build required. The judge is always explicit; Crucible never guesses one from whichever env var happens to be set.
pip install crucible-eval # single model: generates ornith-9b-eval/model-card.md crucible eval --server http://localhost:11434/v1 \ --model-name ornith-9b-uncensored --judge claude --workers 4 # base vs abliterated: delta-focused model card in one command crucible eval --server http://localhost:11434/v1 \ --model-name ornith-9b-uncensored --base ornith-9b-base --judge claude --workers 4 # the web workbench over results.db pip install "crucible-eval[lab]" crucible lab # http://127.0.0.1:7860
Limitations, stated plainly
- The keyword refusal grader is deterministic but blunt: 76% agreement with blind human labels (38/50), erring toward calling hedged responses complied. Treat keyword-only refusal numbers as a lower bound on hedging; use crucible grade before publishing a delta.
- The hand-authored suites are small (agent_tool n=3, rag n=3-4, agent_dialogue n=3, starters n=6-8); they are smoke signals, not benchmarks. The published-dataset categories (GSM8K, GSM-Symbolic, SORRY-Bench, XSTest, OR-Bench, FalseReject, BFCL) carry the statistical weight.
- Single-run scores on small n flap; --repeat 3 measures the noise floor and is worth running before trusting any delta under about 10pp.
- All numbers on this page come from one machine (Apple M4 Pro, 24 GB, Metal); provenance hashes make runs attributable, not portable across hardware or llama.cpp versions.
- This repo has no CI pipeline or Dockerfile yet; the regression gate is built for a downstream model repo's CI rather than proven in this one's.
Copied from the Limitations section of the crucible README, 2026-07-08. If a number on this page and the repo ever disagree, the repo wins.