Skip to main content

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_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.1.tar.gz (17.1 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.1-py3-none-any.whl (20.2 kB view details)

Uploaded Python 3

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

Hashes for cursebench-0.1.1.tar.gz
Algorithm Hash digest
SHA256 f1406e87771e93f8cdb4665da1e1a29f4905e3ce38ced48f94fc593edab77ae2
MD5 1df915f68bb7b8048b6d41f9174ccf73
BLAKE2b-256 442d8e321e46c1648c7165531a49bf8c28d3dc07641a979af4ee80235b86528c

See more details on using hashes here.

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

Hashes for cursebench-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 97bc1b891dfe87a92814afece9ea4796bb870e2286668cf626f26db221652ee4
MD5 cec18f8e27444273086995bb2b38663f
BLAKE2b-256 20cf8286fd7ae20189b9e7be02f9b0a3d826ea26fef118490c1093df4b83f664

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