{"slug": "show-hn-amidumb-scores-how-you-direct-claude-code-and-codex-from-local-logs", "title": "Show HN: Amidumb – scores how you direct Claude Code and Codex, from local logs", "summary": "A new command-line tool called amidumb reads local Claude Code and Codex transcripts and scores how well a user directs the coding agent on a 0-100 scale, with five sub-scores covering specification, steering, verification, discipline and leverage. The tool runs via `npx amidumb`, computes the score locally from a fixed rubric on data in `~/.claude/projects` and `~/.codex/sessions`, and makes no network calls of its own; an optional roast sends a sample of about 150 prompts, each cut to 500 characters alongside the agent's prior message cut to 300, to the user's own `claude` or `codex` CLI at a cost of about 20-30k tokens per run. Scores map to 20 titles from Hostage (0-4) to Agent's Worst Nightmare (95-100), and the tool saves a 1080×1350 card as `amidumb-YYYY-MM-DD.png` while redacting private keys, AWS, GitHub, Anthropic, OpenAI, Stripe, Slack, Google and npm keys, JWTs and `password=`-style assignments before anything is sent.", "body_md": "**Your AI coding transcripts, judged.**\n\n  Do you direct your coding agent like an engineer, or do you just vibecode?\n\n```\nnpx amidumb\n```\n\namidumb reads your Claude Code and Codex history on your machine, scores how well you direct the agent from 0 to 100, gives you a title for it, gets your own `claude` to roast you, and saves a card you can post. One command, no sign-up, no API key, and the score never leaves your machine.\n\n- **A direction score** from 0 to 100, with five sub-scores: specification, steering, verification, discipline and leverage.\n- **A title** for every 5 points of your score, from Hostage to Agent's Worst Nightmare. All twenty of them are roasts.\n- **The roast** : a one-line verdict and three reasons for your score, written by your own`claude` (or`codex` ). Every reason has to cite prompts that were actually sent; a reason that cites a prompt that doesn't exist is thrown out.\n- **A card** :`amidumb-YYYY-MM-DD.png` (1080×1350), saved where you ran it and opened for you.\n- **A rage meter** : prompts with swearing, CAPS LOCK or`!!!` .\n- **A secret leak count** : API keys, tokens and passwords you've pasted into prompts.\n- **Three habits to fix** , written as rules you can paste into`CLAUDE.md` or`AGENTS.md` .\n\nThe title comes from your score alone, one for every 5 points. It's a ladder of who's in charge: at the bottom the agent runs you, at the top you run it too hard. None of them is a compliment, the top one included.\n\n| score | title | score | title | \n|---|---|---|---|\n| 95–100 | Agent's Worst Nightmare | 45–49 | Cc'd on Everything | \n| 90–94 | Trust Issues | 40–44 | Mid Vibes | \n| 85–89 | Control Freak | 35–39 | Along for the Ride | \n| 80–84 | Micromanager | 30–34 | Vibe Tourist | \n| 75–79 | Backseat Driver | 25–29 | Spectator | \n| 70–74 | Hall Monitor | 20–24 | Passenger | \n| 65–69 | Professional Delegator | 15–19 | Agent's Assistant | \n| 60–64 | Middle Manager | 10–14 | Intern's Intern | \n| 55–59 | Reluctant Manager | 5–9 | Human Clipboard | \n| 50–54 | Part-Time Boss | 0–4 | Hostage | \n\n- **The score is computed on your machine.** amidumb reads`~/.claude/projects` and`~/.codex/sessions` . It has no servers, no telemetry and makes no network calls of its own.\n- **The roast runs on your own CLI, on your own plan.** It sends a sample of about 150 prompts to your`claude` CLI (or`codex` ), and prints one line saying exactly what it's sending before it does. If that CLI isn't logged in, it says so and skips the roast.\n- **Only what you typed and what the agent said.** Each prompt is cut to 500 characters and goes with the agent's message before it, cut to 300. Tool output and the files the agent read or wrote are never sent.\n- **Secrets are redacted before anything is sent** : private keys, AWS, GitHub, Anthropic, OpenAI, Stripe, Slack, Google and npm keys, JWTs, and`password=` -style assignments.\n- **`--dry-run`** prints exactly what would be sent, and sends nothing.**`--no-roast`** gives you the score and the card with nothing sent anywhere.\n- **The judge leaves no trace.** It runs ephemeral (`claude --no-session-persistence` with no tools,`codex exec --ephemeral` in a read-only sandbox) from an empty folder, so it never ends up in the transcripts it judges.\n- **The card never quotes your prompts.** It shows scores and what the judge wrote. The judge is told to leave out paths, code and names, and its text is masked again before rendering.\n\n**Does it send my code?**\nNot your files. If you pasted code into a prompt, the first 500 characters of that prompt can be sent, after secrets are redacted. Run `--dry-run` to see every character that would go.\n\n**What does it cost?**\nAbout 20–30k tokens from your own Claude or Codex plan, once per run. Nothing else.\n\n**Can I rerun it until I get a better score?**\nRerun all you like: the same transcripts always get the same score. The score comes from a fixed rubric computed locally, never from the LLM. Only the roast's wording changes.\n\n**I use Codex, not Claude Code.**\namidumb reads Codex sessions too. The roast uses `claude` by default; pass `--codex` to use Codex instead. If Claude Code isn't installed, it uses Codex on its own. Sub-scores built on signals Codex doesn't record are left out, not counted against you.\n\n**My history looks short.**\nClaude Code deletes transcripts after 30 days unless you raise `cleanupPeriodDays` in its settings. amidumb reads everything still on disk; `--days 30` scores just the last month.\n\n**My score is wrong.**\nOpen an issue with your `npx amidumb --json` output. It's numbers only: no prompt text, titles or paths. If the numbers themselves look off, `npx amidumb survey` prints the record types and keys in your transcripts, with no content.\n\n**The score never comes from the LLM.** An LLM score would change on every run and go easy on whoever is paying for it. The score is a fixed, versioned rubric over signals computed locally. The LLM only writes the words.\n\nEvery prompt is classified in the context of the agent message right before it, because a short prompt isn't a dumb prompt: \"yes, go\" after a good plan is good direction, and \"fix it\" on repeat is vibecoding. Those classes feed five sub-scores, weighted into the overall score.\n\n## **The full rubric**\n\n| class | what it is | \n|---|---|\n| specify | names a file or symbol, sets a constraint, or says what done looks like | \n| instruct | asks for work without any of those | \n| question | asks for information | \n| approve | \"yes\", \"go\", \"continue\" right after the agent proposed a plan or asked a question | \n| nudge | the same words when nothing was proposed | \n| correct | pushes back with new information: \"no, use the cache instead\", \"you missed the mobile layout\" | \n| verify | asks for tests, a review or the diff | \n| retry | \"fix it\", \"still broken\", \"try again\", with nothing new | \n| error_paste | a pasted error or log, with barely a word of your own | \n\nEach sub-score is computed per session, then averaged with every session weighted by its prompt count, capped at 10. Short sessions count for less, and no single marathon session decides your score.\n\n| sub-score | weight | per session | \n|---|---|---|\n| Specification | 30% | 60% from the share of your instructions that are `specify` (10% scores 0, 60% or more scores 100), 40% from your opening prompt (a full spec with two or more of where, constraints and done-criteria scores 100, one of them 70, a plain instruction 40, a pasted error 0) | \n| Steering | 20% | good steering (approvals after a proposal, corrections, interrupts) against bad (bare retries, runs of more than two nudges). A 30% good share scores 0 and 85% or more scores 100. Skipped when there was nothing to steer | \n| Verification | 20% | 100 if you asked for tests, a review or the diff, or reported what you saw when you ran it; 60 if only the agent ran tests, lint or a typecheck; 0 if nobody checked. Skipped when no code changed (plans, docs and agent memory don't count) | \n| Discipline | 20% | starts at 100 and loses points for bare retries and error pastes (150 × their share), runs of more than two nudges, prompts in bypass-permissions mode, and rage | \n| Leverage | 10% | for you as a whole, across Claude Code and Codex: global instructions (35), projects with a `CLAUDE.md` or`AGENTS.md` (up to 35), three or more skills, commands or custom prompts (15), hooks (15) | \n\nA sub-score that doesn't apply is left out and the other weights are rescaled. You need at least 5 sessions with two or more prompts, and 30 prompts in total.\n\nThe honest answer is \"better at the extremes than in the middle\".\n\n- **Reference personas** are synthetic users at the extremes everyone agrees on, and they're tests. Someone who mostly pastes errors must score under 30, a retry-looper under 35, a careful spec-writer over 75, and a spec-writer who also verifies and steers over 80. Any rubric change has to keep them in their bands.\n- **Calibration:** the sub-scores were checked against an independent rater that never saw the rubric, on 68 sessions from one heavy user, split into a tuning set and a held-out set.\n  - On the held-out set, the opening score ranked sessions the way the rater did 70% of the time; 50% is a coin flip.\n  - Verification was about 55%. Most checking (running the app, reading the diff) never shows up in a transcript.\n  - Steering couldn't be tested, because that user never got stuck in a retry loop.\n- **Scores probably skew high** for anyone who doesn't retry-loop or paste errors.\n\nAny change to the rubric bumps its version.\n\n```\namidumb [options]            your direction score, from Claude Code and Codex sessions\namidumb label [options]      label your own sessions (blind) to sanity-check the rubric\namidumb calibrate            how well the rubric ranks your labelled sessions\namidumb survey [options]     record kinds and keys in your transcripts (no content)\n\n--days <n|all>     window to read (default: all history on disk)\n--raw              the full table of raw signals instead of the score\n--sessions         one row per session, with titles (stays local)\n--sample <n>       print n random detected prompts to check detection (stays local)\n--json             numbers only, no text, titles or paths: safe to share\n--no-roast         score and card only, nothing is sent anywhere\n--dry-run          print exactly what the roast would send, and send nothing\n--codex            roast with your codex CLI instead of claude\n--no-open          save the card image without opening it\n--claude-dir <p>   Claude Code transcripts (default ~/.claude/projects)\n--codex-dir <p>    Codex transcripts (default ~/.codex/sessions)\n```\n\n- **Claude Code** in the terminal, VS Code and the desktop app, and**Codex** in the CLI, VS Code and the desktop app. Cursor comes later.\n- **Node 18.3 or newer** on macOS, Linux and Windows. CI runs the built CLI end to end on all three, with Node 18, 20 and 22, against a fake judge.\n- **Transcript formats** aren't documented and change between versions, so amidumb parses defensively and skips what it doesn't recognise.\n\n```\npnpm install\npnpm typecheck && pnpm lint && pnpm test\npnpm build && pnpm smoke   # end to end with a fake judge, no tokens\nnode dist/cli.js --dry-run\n```\n\nMIT. The package bundles third-party code, including satori (MPL-2.0) and zod (MIT); `dist/THIRD_PARTY_LICENSES.txt` lists every bundled package with its license and source. The Inter font is under the SIL Open Font License (`assets/fonts/OFL.txt`).", "url": "https://wpnews.pro/news/show-hn-amidumb-scores-how-you-direct-claude-code-and-codex-from-local-logs", "canonical_source": "https://github.com/jjinendra3/amidumb", "published_at": "2026-11-01 15:15:03+00:00", "updated_at": "2026-11-01 15:19:43.394423+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "ai-products"], "entities": ["amidumb", "Claude Code", "Codex", "Anthropic", "OpenAI"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-amidumb-scores-how-you-direct-claude-code-and-codex-from-local-logs", "markdown": "https://wpnews.pro/news/show-hn-amidumb-scores-how-you-direct-claude-code-and-codex-from-local-logs.md", "text": "https://wpnews.pro/news/show-hn-amidumb-scores-how-you-direct-claude-code-and-codex-from-local-logs.txt", "jsonld": "https://wpnews.pro/news/show-hn-amidumb-scores-how-you-direct-claude-code-and-codex-from-local-logs.jsonld"}}