|
| 1 | +#!/usr/bin/env bash |
| 2 | +# A/B usability test for the skills. |
| 3 | +# |
| 4 | +# The same prompt (prompt.txt) is given to two headless Claude Code agents: |
| 5 | +# A. "bare" — empty workspace, NO skills installed |
| 6 | +# B. "skilled" — identical workspace WITH skills/ installed as project skills |
| 7 | +# |
| 8 | +# What is being tested is NOT the Openapi APIs, but whether the skills let an |
| 9 | +# agent attack the problem and drive it straight to the solution: compare the |
| 10 | +# two transcripts (number of calls, wrong turns, time, correctness). |
| 11 | +# |
| 12 | +# Requirements: claude CLI, OPENAPI_EMAIL + OPENAPI_KEY in the environment. |
| 13 | +set -u |
| 14 | + |
| 15 | +TEST_DIR="$(cd "$(dirname "$0")" && pwd)" |
| 16 | +REPO_DIR="$(dirname "$TEST_DIR")" |
| 17 | +RUN_DIR="$TEST_DIR/results/$(date +%Y%m%d-%H%M%S)" |
| 18 | +PROMPT="$(cat "$TEST_DIR/prompt.txt")" |
| 19 | + |
| 20 | +command -v claude >/dev/null || { echo "ERROR: claude CLI not found"; exit 1; } |
| 21 | +[ -n "${OPENAPI_EMAIL:-}" ] && [ -n "${OPENAPI_KEY:-${OPENAPI_API_KEY:-}}" ] \ |
| 22 | + || { echo "ERROR: OPENAPI_EMAIL and OPENAPI_KEY must be set"; exit 1; } |
| 23 | + |
| 24 | +mkdir -p "$RUN_DIR/bare" "$RUN_DIR/skilled/.claude" |
| 25 | +cp -r "$REPO_DIR/skills" "$RUN_DIR/skilled/.claude/skills" |
| 26 | + |
| 27 | +run_agent() { # $1 = variant dir name |
| 28 | + local variant="$1" |
| 29 | + echo "=== Running '$variant' agent (this may take a few minutes)..." |
| 30 | + ( cd "$RUN_DIR/$variant" && \ |
| 31 | + /usr/bin/time -o ../"$variant".time -f '%e' \ |
| 32 | + claude -p "$PROMPT" \ |
| 33 | + --allowedTools "Bash,Read,Glob,Grep" \ |
| 34 | + --output-format json \ |
| 35 | + > ../"$variant".json 2> ../"$variant".err ) |
| 36 | + jq -r '.result // "NO RESULT"' "$RUN_DIR/$variant.json" > "$RUN_DIR/$variant.answer.md" |
| 37 | +} |
| 38 | + |
| 39 | +run_agent bare |
| 40 | +run_agent skilled |
| 41 | + |
| 42 | +# ------------------------------------------------------------------ report |
| 43 | +report() { # $1 = variant |
| 44 | + local v="$1" j="$RUN_DIR/$1.json" |
| 45 | + printf '%-10s | %8ss | %5s turns | $%-7s | solution: %s\n' \ |
| 46 | + "$v" \ |
| 47 | + "$(cat "$RUN_DIR/$v.time" 2>/dev/null || echo '?')" \ |
| 48 | + "$(jq -r '.num_turns // "?"' "$j")" \ |
| 49 | + "$(jq -r '.total_cost_usd // "?" | if type=="number" then (.*10000|round)/10000 else . end' "$j")" \ |
| 50 | + "$(grep -q 'SOLUTION' "$RUN_DIR/$v.answer.md" && echo yes || echo NO)" |
| 51 | +} |
| 52 | + |
| 53 | +echo |
| 54 | +echo "==================== COMPARISON ====================" |
| 55 | +report bare |
| 56 | +report skilled |
| 57 | +echo "=====================================================" |
| 58 | +echo |
| 59 | +echo "Full answers:" |
| 60 | +echo " $RUN_DIR/bare.answer.md" |
| 61 | +echo " $RUN_DIR/skilled.answer.md" |
| 62 | +echo |
| 63 | +echo "Compare them side by side, e.g.:" |
| 64 | +echo " diff -y --width 160 $RUN_DIR/bare.answer.md $RUN_DIR/skilled.answer.md" |
0 commit comments