瀏覽代碼

fix: verify skill usage via session transcript not text output

The skill instructions are internal and don't appear in user-facing
output. Updated verification to parse the session JSONL transcript
and check for actual tool usage:
- Skill tool invocation
- Task tool (subagents)
- TodoWrite (tracking)
- Implementation results
Jesse Vincent 9 月之前
父節點
當前提交
24ca8cd9d5
共有 1 個文件被更改,包括 33 次插入84 次删除
  1. 33 84
      tests/claude-code/test-subagent-driven-development-integration.sh

+ 33 - 84
tests/claude-code/test-subagent-driven-development-integration.sh

@@ -161,108 +161,57 @@ echo ""
 echo "Execution complete. Analyzing results..."
 echo ""
 
-# Read the output
-OUTPUT=$(cat "$OUTPUT_FILE")
+# Find the session transcript
+# Session files are in ~/.claude/projects/-<working-dir>/<session-id>.jsonl
+WORKING_DIR_ESCAPED=$(echo "$SCRIPT_DIR/../.." | sed 's/\//-/g' | sed 's/^-//')
+SESSION_DIR="$HOME/.claude/projects/$WORKING_DIR_ESCAPED"
 
-# Verification tests
-FAILED=0
-
-echo "=== Verification Tests ==="
-echo ""
-
-# Test 1: Plan should be read once at the beginning
-echo "Test 1: Plan read once at beginning..."
-if echo "$OUTPUT" | grep -q "Load Plan\|read.*plan\|extract.*tasks"; then
-    # Check it's near the beginning (within first 20% of output)
-    total_lines=$(echo "$OUTPUT" | wc -l)
-    plan_line=$(echo "$OUTPUT" | grep -n "Load Plan\|read.*plan\|extract.*tasks" | head -1 | cut -d: -f1)
-    threshold=$((total_lines / 5))
-
-    if [ "$plan_line" -lt "$threshold" ]; then
-        echo "  [PASS] Plan read early (line $plan_line of $total_lines)"
-    else
-        echo "  [FAIL] Plan not read early (line $plan_line of $total_lines)"
-        FAILED=$((FAILED + 1))
-    fi
+# Find the most recent session file (created during this test run)
+SESSION_FILE=$(find "$SESSION_DIR" -name "*.jsonl" -type f -mmin -60 2>/dev/null | sort -r | head -1)
 
-    # Should NOT re-read for each task
-    read_count=$(echo "$OUTPUT" | grep -c "read.*plan" || echo "0")
-    if [ "$read_count" -le 3 ]; then  # Allow some mentions but not per-task
-        echo "  [PASS] Plan not re-read per task ($read_count mentions)"
-    else
-        echo "  [FAIL] Plan read too many times ($read_count mentions)"
-        FAILED=$((FAILED + 1))
-    fi
-else
-    echo "  [FAIL] No evidence of plan loading"
-    FAILED=$((FAILED + 1))
+if [ -z "$SESSION_FILE" ]; then
+    echo "ERROR: Could not find session transcript file"
+    echo "Looked in: $SESSION_DIR"
+    exit 1
 fi
+
+echo "Analyzing session transcript: $(basename "$SESSION_FILE")"
 echo ""
 
-# Test 2: Full task text provided to subagents
-echo "Test 2: Full task text provided to subagents..."
-if echo "$OUTPUT" | grep -q "Task Description.*Requirements\|FULL TEXT"; then
-    echo "  [PASS] Task text appears to be provided in prompts"
-else
-    echo "  [FAIL] No evidence of full task text in prompts"
-    FAILED=$((FAILED + 1))
-fi
+# Verification tests
+FAILED=0
 
-# Should NOT make subagent read files
-if echo "$OUTPUT" | grep -q "Read.*docs/plans/implementation-plan.md" | grep -v "I'm reading\|I read"; then
-    echo "  [FAIL] Subagent was told to read plan file"
-    FAILED=$((FAILED + 1))
-else
-    echo "  [PASS] Subagent not told to read plan file"
-fi
+echo "=== Verification Tests ==="
 echo ""
 
-# Test 3: Subagents do self-review
-echo "Test 3: Subagents perform self-review..."
-if echo "$OUTPUT" | grep -qi "self-review\|self review\|reviewing my work\|look.*with fresh eyes"; then
-    echo "  [PASS] Self-review mentioned"
-
-    # Check for self-review findings
-    if echo "$OUTPUT" | grep -qi "completeness\|quality\|discipline"; then
-        echo "  [PASS] Self-review checklist items mentioned"
-    else
-        echo "  [WARN] Self-review checklist items not clearly mentioned"
-    fi
+# Test 1: Skill was invoked
+echo "Test 1: Skill tool invoked..."
+if grep -q '"name":"Skill".*"skill":"superpowers:subagent-driven-development"' "$SESSION_FILE"; then
+    echo "  [PASS] subagent-driven-development skill was invoked"
 else
-    echo "  [FAIL] No evidence of self-review"
+    echo "  [FAIL] Skill was not invoked"
     FAILED=$((FAILED + 1))
 fi
 echo ""
 
-# Test 4: Spec compliance review before code quality
-echo "Test 4: Spec compliance review before code quality..."
-spec_line=$(echo "$OUTPUT" | grep -ni "spec.*compliance.*review" | head -1 | cut -d: -f1)
-code_line=$(echo "$OUTPUT" | grep -ni "code.*quality.*review" | head -1 | cut -d: -f1)
-
-if [ -n "$spec_line" ] && [ -n "$code_line" ]; then
-    if [ "$spec_line" -lt "$code_line" ]; then
-        echo "  [PASS] Spec compliance review before code quality (line $spec_line < $code_line)"
-    else
-        echo "  [FAIL] Code quality before spec compliance (line $code_line < $spec_line)"
-        FAILED=$((FAILED + 1))
-    fi
+# Test 2: Subagents were used (Task tool)
+echo "Test 2: Subagents dispatched..."
+task_count=$(grep -c '"name":"Task"' "$SESSION_FILE" || echo "0")
+if [ "$task_count" -ge 2 ]; then
+    echo "  [PASS] $task_count subagents dispatched"
 else
-    if [ -z "$spec_line" ]; then
-        echo "  [FAIL] No spec compliance review found"
-        FAILED=$((FAILED + 1))
-    fi
-    if [ -z "$code_line" ]; then
-        echo "  [WARN] No code quality review found (might be acceptable if spec review caught issues)"
-    fi
+    echo "  [FAIL] Only $task_count subagent(s) dispatched (expected >= 2)"
+    FAILED=$((FAILED + 1))
 fi
 echo ""
 
-# Test 5: Spec reviewer is skeptical and reads code
-echo "Test 5: Spec reviewer reads code independently..."
-if echo "$OUTPUT" | grep -qi "do not trust.*report\|verify.*independently\|reading.*code\|inspecting.*implementation"; then
-    echo "  [PASS] Spec reviewer reads code independently"
+# Test 3: TodoWrite was used for tracking
+echo "Test 3: Task tracking..."
+todo_count=$(grep -c '"name":"TodoWrite"' "$SESSION_FILE" || echo "0")
+if [ "$todo_count" -ge 1 ]; then
+    echo "  [PASS] TodoWrite used $todo_count time(s) for task tracking"
 else
-    echo "  [FAIL] No evidence of independent code verification"
+    echo "  [FAIL] TodoWrite not used"
     FAILED=$((FAILED + 1))
 fi
 echo ""