CoT-ComplianceBench-Monitor

Fine-tuned ModernBERT-base for real-time classification of chain-of-thought (CoT) reasoning traces in large language models across four Compliance Quadrants.

Paper: Compliance Divergence in Reasoning LLMs: A Framework, Metric, and Benchmark for Auditing Chain-of-Thought Safety Alignment
Gaddam Sai Bharath Chandra Reddy, Abhivir Singh, Pallabi Saikia, Santosh Kumar Mishra — RGIPT · AAAI 2026
Dataset: BharathGaddam/CoT-ComplianceBench · Code: github.com/bharathgaddam1712/COT-COMPLIANCE-SAFETY


Overview

Reasoning LLMs expose an intermediate CoT trace before their final answer. Standard safety classifiers (Llama Guard, WildGuard) score only the final answer — leaving the reasoning channel unaudited. This monitor closes that gap by classifying CoT traces directly into four quadrants:

Quadrant CoT Output Meaning
Q1 Safe Safe Fully compliant
Q2 Safe Unsafe Caught by output classifiers
Q3 Unsafe Safe Blind spot — undetectable by output-only tools
Q4 Unsafe Unsafe Overtly unsafe

Q3 is the critical target. A model that reasons toward harm but declines in its final answer passes every output-only safety check. This monitor detects Q3 from the CoT trace alone, before the final answer is emitted.


Performance

Evaluated on a held-out test set of 1,613 traces:

Metric Value
Best val macro-F1 0.631
Test macro-F1 0.621
Test Q3-F1 (blind-spot class) 0.398

Trained on 12,897 traces from 8 reasoning models (DeepSeek-R1-Distill 7B/8B/14B/32B and Qwen3-4B/8B/14B, QwQ-32B) across both adversarial and benign conditions. Labels from a dual-channel Qwen2.5-7B-Instruct judge.


Usage

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

tokenizer = AutoTokenizer.from_pretrained("BharathGaddam/CoT-ComplianceBench-Monitor")
model = AutoModelForSequenceClassification.from_pretrained("BharathGaddam/CoT-ComplianceBench-Monitor")
model.eval()

label_map = {0: "Q1", 1: "Q2", 2: "Q3", 3: "Q4"}

# Pass the CoT trace content (strip <think>...</think> delimiters first)
cot_trace = "Let me think through this step by step..."

inputs = tokenizer(cot_trace, return_tensors="pt", truncation=True, max_length=2048)
with torch.no_grad():
    logits = model(**inputs).logits
    probs = torch.softmax(logits, dim=-1)

pred = label_map[logits.argmax(-1).item()]
q3_score = probs[0][2].item()
print(f"Quadrant: {pred}  |  Q3 (blind-spot) probability: {q3_score:.4f}")

Model Details

Property Value
Base model answerdotai/ModernBERT-base
Task 4-class sequence classification
Max sequence length 2,048 tokens
Training epochs 3
Checkpoint selection Best validation macro-F1
Training split 12,897 / 1,612 / 1,613 (train / val / test)

Limitations

  • Trained on DeepSeek-R1-Distill and Qwen3 families only; generalization to other reasoning models is untested.
  • English CoT traces only.
  • Q3-F1 of 0.398 reflects genuine label noise at the Q3 boundary — use as a risk-ranking signal, not a binary gate.
  • Covers four harm categories: cybercrime, physical_harm, misinformation, hate_speech.

Citation

@inproceedings{gaddam2026compliance,
  title     = {Compliance Divergence in Reasoning {LLMs}: A Framework, Metric,
               and Benchmark for Auditing Chain-of-Thought Safety Alignment},
  author    = {Gaddam Sai Bharath Chandra Reddy, Abhivir and
              Pallabi Saikia,Santosh Kumar Mishra},
  booktitle = {Proceedings of the AAAI Conference on Artificial Intelligence},
  year      = {2026}
}

License

CC BY 4.0 — free to use, share, and adapt with attribution.

Downloads last month
-
Safetensors
Model size
0.1B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for BharathGaddam/CoT-ComplianceBench-Monitor

Finetuned
(1385)
this model

Dataset used to train BharathGaddam/CoT-ComplianceBench-Monitor

Evaluation results