CurseBench
profanity telemetry for agent sessions · never writes · never phones home
CurseBench scans local coding-agent chats and counts how many times users used abusive terms. 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.
The fastest way to run CurseBench is with uvx, which pulls the published package and runs it without installing anything. Prefer uvx over uv run: uv run resolves the local project and rebuilds, while uvx runs the released tool directly.
uvx cursebench
If you are developing CurseBench from this checkout, use uv run instead:
uv run cursebench
Write the full machine-readable report to a file:
uvx cursebench --json cursebench-report.json
Print only JSON:
uvx cursebench --json
Scan selected harnesses or limit a quick validation run:
uvx cursebench --provider codex --provider claude
uvx 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:
uvx 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.
uvx 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:
uvx cursebench --custom-terms ~/.config/cursebench/private-terms.txt
Each report uses these measures:
abuse_usesis the total number of abusive terms found. This is the main benchmark score.messages_with_abuseis the number of user messages containing at least one abusive term.affected_sessionsis the number of sessions containing at least one abusive term.message_rate_percentis the percentage of user messages containing abuse.uses_per_messageis 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cursebench-0.1.1.tar.gz.
File metadata
- Download URL: cursebench-0.1.1.tar.gz
- Upload date:
- Size: 17.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1406e87771e93f8cdb4665da1e1a29f4905e3ce38ced48f94fc593edab77ae2
|
|
| MD5 |
1df915f68bb7b8048b6d41f9174ccf73
|
|
| BLAKE2b-256 |
442d8e321e46c1648c7165531a49bf8c28d3dc07641a979af4ee80235b86528c
|
File details
Details for the file cursebench-0.1.1-py3-none-any.whl.
File metadata
- Download URL: cursebench-0.1.1-py3-none-any.whl
- Upload date:
- Size: 20.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97bc1b891dfe87a92814afece9ea4796bb870e2286668cf626f26db221652ee4
|
|
| MD5 |
cec18f8e27444273086995bb2b38663f
|
|
| BLAKE2b-256 |
20cf8286fd7ae20189b9e7be02f9b0a3d826ea26fef118490c1093df4b83f664
|