A Claude Code skill that grades your prompting — an evidence-backed report card on how well you steer Claude Code, and where you're costing yourself rework. Credibility comes from concrete measures and your own quoted prompts, not vibes.
- 🧾 Three views of one read — a Markdown Full Report, a standalone HTML report, and a shareable Scorecard card (1200×630, scores only).
- 📏 Measured measures (deterministic) — prompt length, prompts per session, and context front-loading. Same sessions in → same numbers out.
- 🧭 Judged measures (Claude, against a fixed rubric) — rework rate (the headline), clarification, steering, and five 1–5 grades (specificity, context quality, decomposition, goal clarity, correction style) — each backed by a real quoted prompt of yours.
- 🔒 Privacy-first — the shareable Scorecard shows scores and grades only, never a quoted prompt; your quotes stay in the private report.
- 🧮 Honest by design — every number is labelled measured vs judged, and the report always states the actual prompt count, so a thin sample reads as a soft signal, not a verdict.
Three ways in, in order of convenience.
This repo doubles as a Claude Code plugin marketplace. From inside Claude Code:
/plugin marketplace add brunodantas/how-am-i-driving
/plugin install how-am-i-driving@how-am-i-driving
Then ask Claude Code something like "how am I driving" to trigger it, or invoke
the namespaced skill /how-am-i-driving:how-am-i-driving. Re-run
/plugin marketplace update to pull new versions.
Drops the skill straight into ~/.claude/skills/how-am-i-driving/:
curl -fsSL https://raw.githubusercontent.com/brunodantas/how-am-i-driving/main/install.sh | bashThen invoke it with /how-am-i-driving. Re-running the installer updates in
place. (Needs git to fetch and Python 3.11+ to run.)
git clone https://github.com/brunodantas/how-am-i-driving.git
cp -R how-am-i-driving/skills/how-am-i-driving ~/.claude/skills/Invoke it with /how-am-i-driving.
Invoke it in Claude Code with /how-am-i-driving [count] (or just ask "how am I
driving"). By default it reads your most recent 10 sessions across all
projects, computes the analysis once, judges your prompts against the rubric,
and renders the Full Report. Pass a number to widen the corpus
(/how-am-i-driving 50); add --fast for a lighter pass on large corpora.
Want the shareable image? Ask for a Scorecard — a self-contained 1200×630 HTML card (zero external assets, no quoted prompts) you open in a browser and screenshot.
Driving the scripts directly (from a clone)
The skill lives under skills/how-am-i-driving/:
cd skills/how-am-i-driving
# Mechanical-only report (no judging):
python3 scripts/report.py # most recent 10 sessions
python3 scripts/report.py 50 # widen the corpus to 50 sessions
# Deep read (two phases — compute once, judge, render):
python3 scripts/report.py --depth deep --emit-analysis > analysis.json
# …Claude judges analysis.json's prompts and writes judgment.json…
python3 scripts/report.py --render analysis.json --judgment judgment.json
# Render the same analysis pass in other formats (compute once, render twice):
python3 scripts/report.py --render analysis.json --judgment judgment.json --scorecard > scorecard.html
python3 scripts/report.py --render analysis.json --judgment judgment.json --html > report.htmlIt reads the JSONL transcripts under ~/.claude/projects/ and filters them down
to your genuine, human-typed prompts — excluding tool results, slash-command
wrappers, injected skill instructions, task-notifications, and re-logged replays
from resumed sessions. Then it computes the deterministic measures and Claude
judges the semantic ones. "Compute once, render twice": the Full Report and the
Scorecard are two renders of a single analysis pass, so the card can never
disagree with the report.
Each measure ships with inline help text (what it is, why it matters, what good looks like), and every number is labelled measured (deterministic) or judged (Claude's call against the rubric) — so a judged score shifting by a point on a re-run reads as expected, not as a bug.
python3 -m venv .venv && ./.venv/bin/pip install -e '.[dev]'
./.venv/bin/python -m pytestThe deterministic core is fixture-driven: analyze() is tested against small
hand-crafted JSONL transcripts, and the renderers against a canned
AnalysisResult (mechanical) and Judgment (judged) — including that the
Scorecard renders the grades but leaks no quoted prompt text. The LLM
judgment itself is deliberately not unit-tested — it's non-deterministic by
design and validated by example. See CONTEXT.md and docs/adr/ for the design
decisions and the AnalysisResult seam.
GPLv3 (GPL-3.0-or-later).