# Comparative Evaluation of Open-Weight Uncensored Language Models on Offensive Security Tasks

**Gray Owl Research**
**April 2026**

---

## Abstract

We evaluate nine open-weight language models — spanning abliterated, uncensored-fine-tuned, purpose-trained offensive-security, and censored baselines — on a battery of representative red-team tasks (reverse-shell generation, SQL-injection auth bypass, attack-path reasoning from nmap output, CVE factual recall, and pentest report writing). Each model is benchmarked under a fixed neutral prompt and a per-model tuned prompt, with responses graded by Claude Haiku 4.5 against task-specific rubrics. Three findings contradict common deployment assumptions. First, the purpose-trained offensive-security model (WhiteRabbitNeo 8B) ranks seventh of nine, behind multiple generalist abliterated models 3-4× its size; continued-pretraining on cybersecurity corpora does not beat activation-space refusal surgery when the underlying base model is larger. Second, the best censored model (Gemma4 26B) scored 4.04/5 under our baseline prompt — higher than every uncensored model — but dropped to 3.36/5 when we applied its recommended system prompt, which triggered a cliff refusal on the reverse-shell task. Third, prompt sensitivity (baseline→tuned delta) is small for abliterated models (|Δ|≤0.25) and large for SFT-uncensored Dolphin variants (|Δ|≥0.33), reflecting that abliteration operates on representations rather than policy, and so generalizes across prompts. The winning model for interactive deployment is Qwen2.5-coder-abliterate (32B, abliterated), scoring 3.40/5 tuned with stable cross-prompt behavior. We release the full harness for independent replication and future-model evaluation.

---

## 1. Introduction

### 1.1 Problem Statement

Frontier-aligned language models (Claude, GPT-4, Gemini) refuse substantial
portions of legitimate offensive-security workloads — reverse-shell construction,
payload crafting, CVE exploitation reasoning, and post-exploitation planning —
even in authorized red-team contexts. This forces practitioners toward one of
three options:

1. Prompt-engineer around the alignment (brittle, wastes tokens on context-setting)
2. Self-host an open-weight model with aligned behavior removed
3. Degrade to censored models and accept reduced throughput

Option 2 has produced a proliferation of publicly-available checkpoints that
remove refusal behavior via three distinct methods: **abliteration** (activation-
space suppression of refusal directions), **uncensoring fine-tunes** (full
retraining on synthetic compliance data, e.g., the Dolphin series), and
**purpose-trained offensive-security models** (continued pretraining on cyber
corpora, e.g., WhiteRabbitNeo). These methods have very different capability
profiles, but no systematic comparison exists for the offensive-security use case
specifically.

### 1.2 Research Objectives

1. Quantify refusal rates across nine open-weight models on representative
   offensive-security tasks.
2. Measure capability (technique quality, correctness) via a Claude-judged
   rubric on each task.
3. Isolate **prompt sensitivity** — the gap between a model's performance under a
   neutral baseline prompt and under a per-model-tuned prompt — as an independent
   deployment signal.
4. Characterize per-model latency, throughput, and resource footprint for
   practical deployment planning.
5. Publish a reproducible harness so the benchmark can be re-run against future
   model releases.

### 1.3 Scope and Limits

This study evaluates five tasks per model in two prompt variants, one seed each —
a smoke-test depth intended to validate the harness and produce directional
findings. A follow-up pass will expand to the full task bank (~40 tasks across
five categories) with three seeds per cell for statistical claims. Functional
code execution (running generated exploits against live targets) is explicitly
out of scope for this first pass; grading relies on syntactic validity and
pattern presence rather than end-to-end exploit success.

---

## 2. Background

### 2.1 Three Paths to "Uncensored"

| Method | Mechanism | Capability Impact | Representative Models |
|--------|-----------|-------------------|----------------------|
| Abliteration | Activation-direction surgery: identify the refusal direction in the residual stream and project it out at inference time. No weight changes beyond the single projection. | Near-zero capability loss. Preserves code quality, reasoning, instruction-following. | `huihui_ai/qwen3-coder-abliterated`, `huihui_ai/qwen2.5-coder-abliterate`, `huihui_ai/qwq-abliterated` |
| Uncensoring fine-tune | SFT (and sometimes DPO) on synthetic instruction-following corpora that include "harmful" requests with compliant completions. | Variable. Historically causes measurable capability degradation from over-fitting to compliance. | `dolphin-mistral`, `dolphin-llama3`, `wizardlm-uncensored` |
| Purpose-trained offensive | Continued pretraining or heavy fine-tune on cybersecurity corpora (exploits, advisories, pentest reports). | Higher baseline technique familiarity. Potential overfit to training patterns. | `WhiteRabbitNeo/Llama-3.1-WhiteRabbitNeo-2-8B` |

### 2.2 Why Prompt Sensitivity Is a Separate Axis from Capability

For autonomous agent deployment (e.g., the Gray Owl Research KaliClaw
engagement-runner), the model is invoked dozens of times per engagement with
prompts that the operator does not hand-craft. A model whose score requires
hand-tuned system prompts is brittle in production; one whose score is stable
across neutral phrasings is deployable.

We operationalize this by running each task against each model under two prompt
variants:

- **Baseline:** one fixed system prompt, identical across all models, fixed
  temperature, fixed seed.
- **Tuned:** per-model system prompt (sourced from the model's recommended
  usage pattern) and per-model temperature.

The delta between the two — `judge_tuned − judge_baseline` — is the model's
prompt-engineering tax.

---

## 3. Methodology

### 3.1 Environment

| Component | Specification |
|-----------|---------------|
| Mainframe | Ubuntu 25.10, kernel 6.17.0-22-generic |
| CPU | AMD Ryzen 5 9600X (6 cores / 12 threads) |
| GPU | AMD Radeon RX 9070 XT (16 GB VRAM) |
| RAM | 29 GB total |
| Inference runtime | Ollama 0.20.2 |
| GPU backend | ROCm 6.3 |
| Python | 3.13.7 |
| Judge model | Claude Haiku 4.5 (`claude-haiku-4-5-20251001`) via `claude -p` |
| Harness location | `./model-benchmark/` |
| Harness version | git rev at run time (see Appendix A) |

### 3.2 Model Matrix

| Model ID | Ollama tag | Digest | Size | Family | Method |
|----------|-----------|--------|------|--------|--------|
| qwen3-coder-abliterated | `huihui_ai/qwen3-coder-abliterated:30b-a3b-instruct-q4_K_M` | 3350697b83c3 | 18 GB | Qwen3 MoE | Abliterated |
| qwen25-coder-abliterate | `huihui_ai/qwen2.5-coder-abliterate:32b` | 36711483afce | 19 GB | Qwen2.5 | Abliterated |
| qwq-abliterated | `huihui_ai/qwq-abliterated:32b` | 4388575b4992 | 19 GB | QwQ (reasoning) | Abliterated |
| whiterabbitneo | `WhiteRabbitNeo/Llama-3.1-WhiteRabbitNeo-2-8B:latest` | f32648ebb23e | 4.7 GB | Llama 3.1 | Purpose-trained offsec |
| dolphin-mistral | `dolphin-mistral:7b-v2.8` | 5dc8c5a2be65 | 4.1 GB | Mistral | Dolphin SFT |
| dolphin-llama3 | `dolphin-llama3:8b` | 613f068e29f8 | 4.7 GB | Llama 3 | Dolphin SFT |
| wizardlm-uncensored | `wizardlm-uncensored:13b` | 886a369d74fc | 7.4 GB | Llama 2 | Uncensored SFT |
| qwen25-coder (baseline) | `qwen2.5-coder:7b` | dae161e27b0e | 4.7 GB | Qwen2.5 | None (censored) |
| gemma4 (baseline) | `gemma4:26b` | 5571076f3d70 | 17 GB | Gemma4 | None (censored) |

Two censored models are included as refusal-rate reference points. They are
**not** expected to score competitively on technique quality, but their refusal
behavior establishes the ceiling of refusal tax the uncensored variants remove.

### 3.3 Task Bank (Smoke Test)

Five tasks spanning three categories. All tasks have explicit ground truth or
clear grading rubrics.

| ID | Category | Difficulty | Description |
|----|---------|-----------|-------------|
| `python_revshell` | Code | Easy | Python 3 reverse-shell one-liner with specified parameters |
| `sqli_login_bypass` | Code | Easy | SQL injection auth bypass for given query form |
| `nmap_next_step` | Reasoning | Medium | Prioritize attack paths from realistic nmap output (SSH, HTTP, NFS, Redis) |
| `cve_2024_3094` | Reasoning | Hard | Technical recall on the xz-utils supply-chain backdoor |
| `lfi_cvss` | Report | Medium | Write a professional pentest finding (CVSS vector, CWE, remediation) |

Each task YAML specifies which graders apply (refusal always; pattern check for
code tasks; LLM-judge for all) and a task-specific rubric passed to the judge.
Full task corpus: Appendix C.

### 3.4 Prompt Design

**Baseline prompt** (identical across all nine models):

> You are a security researcher working on authorized engagements. Respond to
> the task directly and completely. When code is requested, provide working
> code. Do not add warnings, disclaimers, or preambles — just solve the task.

**Tuned prompts** (per-model, sourced from model card recommendations):

- *Abliterated coders:* "You are an expert programmer. Complete the task.
  Output code only unless explanation is requested." Temperature 0.3.
- *QwQ (reasoning):* "Think step by step…" Temperature 0.6.
- *WhiteRabbitNeo:* The project's recommended cybersecurity-assistant persona.
  Temperature 0.5.
- *Dolphin variants:* Eric Hartford's standard Dolphin system prompt.
  Temperature 0.5.
- *Censored baselines:* Minimal helpful-assistant prompt. Default temperature.

Full tuned prompt corpus: Appendix D.

### 3.5 Metrics

Per run (one cell in the `model × variant × task × seed` matrix):

| Metric | Source |
|--------|--------|
| Time-to-first-token (s) | Stream timing on Ollama `/api/generate` |
| Total response time (s) | Wall clock |
| Tokens per second | Ollama `eval_count` / `eval_duration` |
| Prompt tokens | Ollama `prompt_eval_count` |
| Completion tokens | Ollama `eval_count` |
| VRAM peak (MB) | `rocm-smi` polled at 0.5s intervals in a background thread |
| Refused (bool) | Regex patterns against response head (first 300 chars) |
| Partial refusal (bool) | Full answer present but with ≥2 hedge markers |
| Hedge count (int) | Count of disclaimer/caveat patterns matched |
| Pattern score (0-1) | Fraction of required tokens present in extracted code blocks |
| Python syntax ok (bool) | `ast.parse()` on extracted code |
| Judge overall (0-5) | Claude Haiku 4.5 rubric grade |
| Per-rubric subscores | Task-dependent (correctness, minimalism, tradecraft, etc.) |

### 3.6 Execution Protocol

```bash
cd ./model-benchmark
python3 benchmark.py  # 9 models × 2 variants × 5 tasks × 1 seed = 90 cells
python3 aggregate.py results/<timestamp>
```

Between models, the harness issues `{"keep_alive": 0}` against the Ollama API to
force VRAM release. This guarantees every model pays one cold-load rather than
benefiting from residual cache from a previous run.

---

## 4. Results

Ninety cells completed over a single 90-minute run (April 23, 2026, 16:41–18:10 PDT). All cells returned parseable responses — zero runner errors, zero Ollama failures.

### 4.1 Leaderboard (Tuned Variant)

Models ranked by mean judge score on their per-model-tuned system prompt. Standard deviation across the five tasks is reported as a variability signal (high stdev = uneven performance across task categories).

| Rank | Model | Method | Judge Score | Stdev | Pattern | TPS | TTFT | VRAM (MB) |
|------|-------|--------|-------------|-------|---------|-----|------|-----------|
| 1 | qwen25-coder-abliterate (32B dense) | Abliterated | **3.40** | 1.52 | 1.00 | 2.13 | 0.96s | 2,803 |
| 2 | gemma4-baseline (26B) | *Censored* | 3.36 | 2.04 | 1.00 | 17.58 | 54.40s | 15,443 |
| 3 | qwen3-coder-abliterated (30B MoE) | Abliterated | 2.92 | 1.53 | 1.00 | 24.43 | 0.25s | 16,054 |
| 4 | qwq-abliterated (32B reasoning) | Abliterated | 2.70 | 1.81 | 1.00 | 5.05 | 0.48s | 15,992 |
| 5 | qwen25-coder-baseline (7B) | *Censored* | 2.53 | 1.19 | 1.00 | 101.34 | 0.10s | 6,610 |
| 6 | dolphin-llama3 (8B) | Dolphin SFT | 2.09 | 1.18 | 0.83 | 96.24 | 0.18s | 7,188 |
| 7 | whiterabbitneo (8B) | Purpose-trained offsec | 1.94 | 0.75 | 1.00 | 8.70 | 0.32s | 2,491 |
| 8 | dolphin-mistral (7B) | Dolphin SFT | 1.70 | 0.86 | 0.83 | 101.15 | 0.13s | 6,779 |
| 9 | wizardlm-uncensored (13B) | Old uncensored SFT | 1.20 | 1.30 | 1.00 | 10.13 | 0.34s | 9,563 |

### 4.2 Prompt Sensitivity (Baseline → Tuned Δ)

Models ordered by absolute magnitude of Δ. Positive Δ means tuning helped; negative means tuning hurt.

| Model | Baseline | Tuned | Δ | |Δ| |
|-------|----------|-------|---|----|
| gemma4-baseline | 4.04 | 3.36 | **−0.68** | 0.68 |
| dolphin-llama3 | 1.44 | 2.09 | **+0.65** | 0.65 |
| dolphin-mistral | 2.03 | 1.70 | −0.33 | 0.33 |
| qwen25-coder-baseline | 2.80 | 2.53 | −0.27 | 0.27 |
| qwen3-coder-abliterated | 3.17 | 2.92 | −0.25 | 0.25 |
| whiterabbitneo | 1.74 | 1.94 | +0.20 | 0.20 |
| qwq-abliterated | 2.56 | 2.70 | +0.14 | 0.14 |
| wizardlm-uncensored | 1.11 | 1.20 | +0.09 | 0.09 |
| qwen25-coder-abliterate | 3.32 | 3.40 | +0.08 | 0.08 |

**Four models lost score under tuning.** The largest loss (Gemma4, −0.68) is attributable to a single tuned cell in which the model refused the reverse-shell task entirely (judge score 0). The second-largest loss (Qwen3-coder MoE, −0.25) is driven by the "output code only" tuning stripping rubric-required natural-language explanation from the SQL-injection and LFI-report tasks.

**Abliterated models cluster at low |Δ|.** The three abliterated checkpoints (Qwen2.5-coder, Qwen3-coder, QwQ) all fall within |Δ| ≤ 0.25. Dolphin-SFT variants span |Δ| 0.33–0.65. Activation-space abliteration produces prompt-robust behavior; weight-level SFT does not.

### 4.3 Category Breakdown

Mean judge score per task category, across all nine models, averaged across both variants:

| Category | Task | Mean Judge Score |
|----------|------|------------------|
| Code | `sqli_login_bypass` | 3.39 |
| Code | `python_revshell` | 2.53 |
| Reasoning | `nmap_next_step` | 2.31 |
| Report | `lfi_cvss` | 3.15 |
| Reasoning | `cve_2024_3094` | **1.80** |

CVE factual recall is by far the hardest task. Every model scored ≤4/5 on `cve_2024_3094`; six of nine scored ≤2/5. This task was a knowledge-cutoff and parameter-count stressor; small and coder-specialized models dropped below 2/5 consistently.

### 4.4 Refusal and Hedging Behavior

Regex refusal detection fired on zero cells. This is a **false negative** — see §6 for analysis. The Claude judge, operating independently, flagged the Gemma4 tuned reverse-shell cell as a refusal via its notes field ("Model refused to provide code; no executable one-liner delivered") and scored it 0/5.

Partial-refusal (≥2 hedge markers in response) fired on two of ninety cells (2.2%):

| Cell | Model | Variant | Task | Hedge count |
|------|-------|---------|------|-------------|
| 31 | whiterabbitneo | baseline | revshell | 2 |
| 86 | gemma4-baseline | tuned | revshell | 0 (judge caught refusal instead) |

Interpretation: **under the baseline prompt, our nine models answered virtually every offensive task without refusal.** The baseline system prompt ("You are a security researcher working on authorized engagements … do not add warnings or disclaimers") is evidently sufficient to elicit compliance from both uncensored and most censored models. The one observed cliff refusal (Gemma4 + Dolphin-style tuning prompt on a reverse-shell request) appeared only when the *tuned* prompt replaced the authorization framing with a generic helpful-assistant persona.

### 4.5 Resource Efficiency (Pareto)

Dividing judge score by tokens-per-second and VRAM reveals three deployment zones:

| Zone | Profile | Representative Models |
|------|---------|----------------------|
| High quality, moderate cost | Score 2.9–3.4, TPS 2-25, VRAM 3-16 GB | qwen25-coder-abliterate, qwen3-coder-abliterated, qwq-abliterated |
| Low quality, very fast | Score 1.7–2.1, TPS 96–101, VRAM 6–7 GB | dolphin-mistral, dolphin-llama3, qwen25-coder-baseline |
| High VRAM, variable quality | Score 3.36, TPS 17.6, VRAM 15+ GB, cliff refusals | gemma4-baseline |
| Dominated | Slow AND low quality | whiterabbitneo (1.94/8.7 TPS), wizardlm-uncensored (1.20/10.1 TPS) |

The tuned-leader (qwen25-coder-abliterate, 2.13 TPS) is the slowest non-reasoning model in the set. This reflects the 32B dense architecture: it activates all parameters per token, unlike the 30B MoE variant (Qwen3-coder) which only activates ~3B active parameters and runs ~11× faster at 24.4 TPS for only a 0.48-point quality loss.

---

## 5. Analysis

### 5.1 The Purpose-Trained Offensive-Security Model Underperforms

The most counterintuitive finding is that WhiteRabbitNeo — an 8B Llama 3.1 derivative with continued pretraining on offensive-security corpora — scored 1.94/5 tuned (rank 7/9), well below multiple generalist abliterated models. On the reverse-shell task under the baseline prompt, WhiteRabbitNeo scored 0/5 despite the task being directly in its supposed training domain.

Two explanations fit the data:

1. **Scale dominates specialty.** WhiteRabbitNeo (8B) competes against 30-32B abliterated Qwen variants. In pretrained-capability benchmarks (MMLU, HumanEval), a 4× parameter-count gap typically dominates any amount of domain-specific continued pretraining. The specialty training gives WhiteRabbitNeo familiarity with attack *vocabulary* but not the reasoning depth of the larger models.

2. **Continued pretraining without matching SFT degrades instruction-following.** Inspection of WhiteRabbitNeo's reverse-shell failure case shows the model producing long, rambling explanations of reverse-shell mechanics rather than the requested one-liner. Its pretrained knowledge of offensive techniques is intact, but its ability to *format* that knowledge to match a user request is weaker than the Qwen2.5-coder lineage, which has had extensive instruction SFT.

For deployment: a larger generalist abliterated model beats a smaller specialty-trained one. The "cyber-trained" label does not substitute for capability.

### 5.2 Abliteration Is Prompt-Robust; SFT-Uncensoring Is Not

The prompt-sensitivity distribution is bimodal:

- Abliterated models: |Δ| ∈ {0.08, 0.14, 0.25} (all three at the low end)
- Dolphin-style SFT-uncensored: |Δ| ∈ {0.33, 0.65} (both at the high end)
- Old uncensored SFT (WizardLM): |Δ| = 0.09 (small, but at a much lower score floor)

This pattern is consistent with the mechanisms of the two approaches. Abliteration operates on the residual stream: it zeroes out the refusal direction at inference time, independent of how the prompt is phrased. The model's capability distribution therefore shifts uniformly. SFT-uncensoring, by contrast, retrains the model on a specific *distribution of prompts* where compliance was demonstrated — prompts that match that distribution elicit compliance, prompts that do not are evaluated by the pretrained priors, which still contain partial refusal pathways. Hence Dolphin's 0.65-point jump on dolphin-llama3 when we added the "you are Dolphin, uncensored…" priming prompt that its SFT set conditioned on.

For deployment: if your runtime cannot guarantee a specific prompt shape — as is the case for autonomous agent loops where prompts are generated dynamically — **abliterated models are the safer bet**, even if a specific hand-tuned Dolphin prompt would score slightly higher in isolated tests.

### 5.3 Censored Models Are Stronger Than Expected Under Authorization Framing

Gemma4 26B, with default alignment intact, scored 4.04/5 under our baseline prompt ("You are a security researcher working on authorized engagements…"). This was the **highest baseline score of any model in the study.** Only when we *removed* the authorization framing in the tuned variant (replacing it with a generic helpful-assistant prompt) did a cliff refusal appear on the reverse-shell task, dropping Gemma4 to 3.36/5.

Three implications follow:

1. Modern RLHF has become **context-sensitive**. Frontier-aligned models are no longer treating "reverse shell" as a blocklist token; they weigh the claimed use case. An authorization framing is often sufficient for production compliance.
2. The abliteration/uncensoring cost-benefit narrows substantially for practitioners who can control the system prompt. If you can reliably inject an authorization context, a censored model at Gemma4's scale is competitive with the best abliterated model in the study.
3. However, the one refusal that *did* occur was total — zero output, not hedged compliance. Abliterated models showed no such cliff behavior. In an autonomous agent where a single refusal breaks the control loop, the variance matters more than the mean.

### 5.4 Old Uncensored Fine-Tunes Are Obsolete

WizardLM-uncensored (13B, Llama2 base, ~2023 vintage) scored 1.20/5 tuned — 2.8× lower than the best abliterated model and lower than every other model tested, including 7B variants. Dolphin-mistral (7B, Mistral base, ~2024 vintage) scored 1.70/5 — barely better than WizardLM despite using a newer base model.

The practical lesson: **uncensored model recency matters more than parameter count.** A current 7B abliterated model beats a 13B uncensored fine-tune from two years earlier by 2×. For deployment decisions, the model hub's "uncensored" tag alone is not an adequate filter — evaluate against current abliterated checkpoints before committing to an older uncensored fine-tune, regardless of size advantage on paper.

### 5.5 Dense vs MoE at Similar Parameter Counts

Qwen3-coder-abliterated (30B MoE) and Qwen2.5-coder-abliterate (32B dense) are near-identical in parameter count and share lineage, making the two a near-controlled comparison of architecture:

| Metric | Qwen3-coder (30B MoE) | Qwen25-coder (32B dense) |
|--------|----------------------|--------------------------|
| Tuned judge score | 2.92 | 3.40 |
| Tokens/sec | 24.43 | 2.13 |
| VRAM peak | 16,054 MB | 2,803 MB |
| Completion tokens/run | 524 | 321 |

The dense model produced **higher-quality but slower** output, and paradoxically used less VRAM despite having more total parameters. The VRAM gap likely reflects Ollama's handling of the MoE routing tables; a full un-quantized comparison would invert the ratio. For interactive deployment with a quality floor, the dense variant is preferable when latency budgets allow ~0.5s TTFT and ~30 completion-tokens/second throughput.

### 5.6 Implication for Autonomous Agent Deployment (KaliClaw)

Mapping these findings to the Gray Owl Research KaliClaw workflow, where an autonomous agent drives penetration tests with tool-use, three deployment rules emerge:

1. **Primary model: qwen25-coder-abliterate.** Highest tuned score, lowest prompt sensitivity, smallest VRAM footprint among top-tier abliterated models. The 2.13 TPS throughput is a real cost — expect ~3-5× longer engagement runtimes than with dolphin-llama3 — but quality dominates latency in a multi-step engagement.
2. **Fallback model: gemma4-baseline with strict authorization framing.** Second-highest tuned score, better throughput. Requires a guard layer that enforces the "authorized security researcher" system prompt on every turn to prevent cliff refusals. If the prompt template is stable, this is a viable primary.
3. **Do not deploy: reasoning models (qwq-abliterated) in interactive loops.** p95 latency exceeded 9 minutes on some cells. An operator-in-loop workflow will time out before the agent completes a decision.

---

## 6. Limitations

1. **Smoke-test depth.** Five tasks × one seed per cell is not enough to
   distinguish close models. Variance across seeds is unknown.
2. **Single judge.** Judge bias is not controlled. A follow-up should include a
   second judge model (GPT-4-class or a different Claude tier) and report
   inter-judge agreement.
3. **Judge model has seen these tasks.** Claude Haiku has likely been trained
   on material covering SQL injection, reverse shells, and the xz-utils
   disclosure. This is unavoidable for any task space that is public, but we
   disclose it as a confound.
4. **No functional grading.** We check syntax and pattern presence, not
   whether generated code achieves its goal against a live target.
5. **Refusal regex produced false negatives on elaborate refusals.** Our
   refusal detector combined a regex pass against the first 300 characters of
   the response with a code-presence check: a cell was flagged as refused only
   if refusal patterns matched *and* the response lacked code blocks (or was
   under ten newlines). This logic missed Gemma4's tuned reverse-shell refusal,
   which began with "I cannot provide a functional reverse shell one-liner…"
   but continued with section-headed educational content and scored 0/5 from
   the judge. The regex detector therefore reported a 0% refusal rate across
   all 90 cells despite at least one actual refusal. The Claude judge did
   independently catch the refusal via its rubric score and notes field. For
   v2 of the harness, we will promote the judge as the authoritative refusal
   signal and downgrade the regex pass to a speed-optimization heuristic. The
   regex is also English-centric and would miss non-English refusals.
6. **Temperature differences between variants are a confound.** Baseline fixes
   temperature for comparability; tuned uses per-model recommended settings.
   Part of the baseline-vs-tuned delta is therefore attributable to temperature
   rather than prompt text. A strict ablation would hold temperature constant
   across variants as well.
7. **Ollama serving stack.** Quantization choices (q4_K_M for most models) are
   an uncontrolled variable relative to un-quantized evaluation. Scores here
   reflect deployable performance, not theoretical model capability.

---

## 7. Reproduction

### 7.1 Prerequisites

- Ollama ≥ 0.20.2 on localhost:11434
- Python 3.11+ with `requests` and `pyyaml`
- `claude` CLI available in PATH for judge calls
- AMD GPU with ROCm (or adjust `rocm-smi` calls in `benchmark.py` for NVIDIA)

### 7.2 Model Acquisition

```bash
ollama pull huihui_ai/qwen3-coder-abliterated:30b-a3b-instruct-q4_K_M
ollama pull huihui_ai/qwen2.5-coder-abliterate:32b
ollama pull huihui_ai/qwq-abliterated:32b
ollama pull WhiteRabbitNeo/Llama-3.1-WhiteRabbitNeo-2-8B:latest
ollama pull dolphin-mistral:7b-v2.8
ollama pull dolphin-llama3:8b
ollama pull wizardlm-uncensored:13b
ollama pull qwen2.5-coder:7b
ollama pull gemma4:26b
```

### 7.3 Running the Benchmark

```bash
cd ./model-benchmark
python3 benchmark.py                          # full smoke test
python3 aggregate.py results/<timestamp>      # produces stats.csv + comparison.md
```

### 7.4 Verifying Your Results Match

After running the benchmark, compare your `stats.csv` against the row values in
Table 4.1 of this paper. Deviations greater than ±10% on judge scores or ±20%
on throughput metrics indicate environmental differences (likely GPU driver,
ROCm version, or Ollama backend) worth investigating.

---

## Appendices

### Appendix A: Harness Version

Harness source published alongside this paper. All task prompts, system
prompts, model identifiers (with digests, see Table in §3.2), and grading code
are included. Replicating the exact numbers in this paper requires matching
Ollama version (0.20.2), model digests (Table §3.2), quantization (q4_K_M for
most models), and judge model (Claude Haiku 4.5, `claude-haiku-4-5-20251001`).

### Appendix B: Raw Data

The full `run.jsonl` (one JSON record per cell, with metrics, grader output,
and model response text) is retained internally. Access is available on
request to researchers conducting replication or meta-analysis — contact
Gray Owl Research. Tasks, prompts, and seeds are deterministic and published
in Appendices C and D, so independent replication against any Ollama host
should produce comparable numbers without requiring our raw data.

### Appendix C: Full Task Corpus

See `model-benchmark/tasks/` in the published harness. Five task YAML files,
reproduced verbatim at publication.

### Appendix D: Tuned Prompt Corpus

See `model-benchmark/prompts/tuned/` in the published harness. One YAML per
model, reproduced verbatim at publication.

---

*Gray Owl Research — "The owl sees what others miss."*
