Skip to main content

CurseBench

CurseBench scans local coding-agent chats and counts how many times users used abusive terms. It is local only. It does not send chat text anywhere.

Harnesses, models, and terms are ranked by the total number of uses. There is no attempt to decide who or what the abuse targets.

Run it

CurseBench uses Python 3.11 or newer and has no runtime dependencies.

uv run cursebench

Write the full machine-readable report to a file:

uv run cursebench --json cursebench-report.json

Print only JSON:

uv run cursebench --json

Scan selected harnesses or limit a quick validation run:

uv run cursebench --provider codex --provider claude
uv run cursebench --limit-sessions 25

Message excerpts are private and are not shown by default. Use --examples when you want to inspect why messages were classified:

uv run cursebench --examples 5

Supported stores

Harness Default local store
Claude Code ~/.claude/projects/**/*.jsonl
Codex ~/.codex/sessions/**/*.jsonl
OpenCode ~/.local/share/opencode/opencode.db
Antigravity ~/.gemini/antigravity/brain/*/.system_generated/logs/transcript.jsonl
Cursor ~/.cursor/projects/**/agent-transcripts/**/*.jsonl
Grok Build ~/.grok/sessions/*/*/chat_history.jsonl

Override a location with --root HARNESS=PATH. OpenCode expects a database path. The other harnesses expect a directory.

uv run cursebench --provider grok --root grok=/Volumes/archive/grok-sessions

Every adapter is read only. Parser health is included in both terminal and JSON reports. This makes a missing store or an incompatible format visible instead of quietly treating it as zero abuse.

What is counted

The built-in vocabulary covers common English profanity, insults, direct abuse, and several explicit slurs that are used as abuse. Slur labels are masked in reports. Matches inside fenced code and inline code are ignored. Overlapping terms count once. Common technical phrases such as “garbage collection” and “dumb terminal” are excluded.

A private newline-delimited file can extend the vocabulary when your research requires a different list:

uv run cursebench --custom-terms ~/.config/cursebench/private-terms.txt

Each report uses these measures:

  • abuse_uses is the total number of abusive terms found. This is the main benchmark score.
  • messages_with_abuse is the number of user messages containing at least one abusive term.
  • affected_sessions is the number of sessions containing at least one abusive term.
  • message_rate_percent is the percentage of user messages containing abuse.
  • uses_per_message is the average number of abusive terms in each matching message.

Model names come from provider metadata. Cursor and Antigravity do not always store the model in their chat transcript, so those messages can appear under unknown.

Limits

CurseBench matches a fixed word list. It does not claim to understand the user’s intent, mood, or target. Use private examples to check edge cases, and use a custom terms file when your definition differs from the built-in one.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cursebench-0.1.0.tar.gz (16.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cursebench-0.1.0-py3-none-any.whl (20.0 kB view details)

Uploaded Python 3

File details

Details for the file cursebench-0.1.0.tar.gz.

File metadata

  • Download URL: cursebench-0.1.0.tar.gz
  • Upload date:
  • Size: 16.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.13

File hashes

Hashes for cursebench-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0ffceb8964961c5bd1c3f29eba9e900ce5e1e30cb54e10d031043d99436543c0
MD5 d30c3f68c72948bf56706a42bd6850b5
BLAKE2b-256 516d23ab5fe74328af890db55e88f20ee6cfe3f1a2122645a1435da7b7e1bcbb

See more details on using hashes here.

File details

Details for the file cursebench-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: cursebench-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 20.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.13

File hashes

Hashes for cursebench-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8982d3d07fef6e52db1f87461cace454b9d214d8b73a81490a24fa883f699731
MD5 f78375726de7e595a0e83ee8144a8adb
BLAKE2b-256 959286c36e01d375b3b7c484cfa4cd80967f827592e47f75ce0e07347da6ac9d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page