| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #!/bin/bash
- # Score iterate/SKILL.md on structural quality metrics.
- # Output: a single integer score (higher = better, max ~100).
- #
- # This scorer is deliberately hard to max out.
- # It rewards clarity, completeness, and economy of expression.
- FILE="${1:-skills/iterate/SKILL.md}"
- SCORE=0
- if [ ! -f "$FILE" ]; then
- echo "0"
- exit 0
- fi
- CONTENT=$(cat "$FILE")
- LINES=$(wc -l < "$FILE" | tr -d ' ')
- WORDS=$(wc -w < "$FILE" | tr -d ' ')
- # --- STRUCTURE (25 pts) ---
- # Frontmatter fields (10 pts)
- echo "$CONTENT" | head -1 | grep -q "^---" && {
- echo "$CONTENT" | grep -q "^name:" && SCORE=$((SCORE + 2))
- echo "$CONTENT" | grep -q "^description:" && SCORE=$((SCORE + 3))
- echo "$CONTENT" | grep -qi "triggers\? on:" && SCORE=$((SCORE + 2))
- echo "$CONTENT" | grep -q "^allowed-tools:" && SCORE=$((SCORE + 3))
- }
- # Required sections present (15 pts, 2.5 each - using 2+3 alternating)
- for section in "## Setup" "## The Loop" "## Rules" "## Results" "## Adapt" "## Guard"; do
- echo "$CONTENT" | grep -qi "$section" && SCORE=$((SCORE + 2))
- done
- # Bonus for usage examples section
- echo "$CONTENT" | grep -qi "## Usage\|## Example" && SCORE=$((SCORE + 3))
- # --- LOOP COMPLETENESS (20 pts) ---
- # All 8 steps of the loop referenced
- for step in "REVIEW\|Review\|review" "IDEATE\|Ideate\|ideate" "MODIFY\|Modify\|modify" \
- "COMMIT\|Commit\|commit" "VERIFY\|Verify\|verify" "DECIDE\|Decide\|decide" \
- "LOG\|Log\|log" "REPEAT\|Repeat\|repeat"; do
- echo "$CONTENT" | grep -q "$step" && SCORE=$((SCORE + 2))
- done
- # Rollback strategy mentioned (4 pts)
- echo "$CONTENT" | grep -q "git revert" && SCORE=$((SCORE + 2))
- echo "$CONTENT" | grep -q "git reset\|fallback\|fall back" && SCORE=$((SCORE + 2))
- # --- CLARITY (20 pts) ---
- # Results.tsv example with actual data rows (5 pts)
- tsv_rows=$(echo "$CONTENT" | grep -c "^[0-9].* .* .*keep\|^[0-9].* .* .*discard\|^[0-9].* .* .*baseline\|^[0-9].* .* .*crash")
- if [ "$tsv_rows" -ge 3 ]; then
- SCORE=$((SCORE + 5))
- elif [ "$tsv_rows" -ge 1 ]; then
- SCORE=$((SCORE + 2))
- fi
- # Domain adaptation table with 5+ examples (5 pts)
- domain_rows=$(echo "$CONTENT" | grep -c "^|.*|.*|.*higher\|^|.*|.*|.*lower")
- if [ "$domain_rows" -ge 5 ]; then
- SCORE=$((SCORE + 5))
- elif [ "$domain_rows" -ge 3 ]; then
- SCORE=$((SCORE + 3))
- fi
- # Progress output format shown (5 pts)
- echo "$CONTENT" | grep -q "Iteration [0-9]" && SCORE=$((SCORE + 3))
- echo "$CONTENT" | grep -q "=== Iterate Complete\|summary" && SCORE=$((SCORE + 2))
- # Inline config example with all 5 fields (5 pts)
- example_fields=0
- echo "$CONTENT" | grep -q "^Goal:" && example_fields=$((example_fields + 1))
- echo "$CONTENT" | grep -q "^Scope:" && example_fields=$((example_fields + 1))
- echo "$CONTENT" | grep -q "^Verify:" && example_fields=$((example_fields + 1))
- echo "$CONTENT" | grep -q "^Direction:" && example_fields=$((example_fields + 1))
- echo "$CONTENT" | grep -q "^Guard:" && example_fields=$((example_fields + 1))
- if [ "$example_fields" -ge 5 ]; then
- SCORE=$((SCORE + 5))
- elif [ "$example_fields" -ge 3 ]; then
- SCORE=$((SCORE + 2))
- fi
- # --- ECONOMY (20 pts) ---
- # Line count: sweet spot 150-250 (10 pts)
- if [ "$LINES" -ge 150 ] && [ "$LINES" -le 250 ]; then
- SCORE=$((SCORE + 10))
- elif [ "$LINES" -ge 120 ] && [ "$LINES" -le 300 ]; then
- SCORE=$((SCORE + 6))
- elif [ "$LINES" -ge 80 ] && [ "$LINES" -le 400 ]; then
- SCORE=$((SCORE + 3))
- fi
- # Word economy: under 2500 words (5 pts)
- if [ "$WORDS" -le 1800 ]; then
- SCORE=$((SCORE + 5))
- elif [ "$WORDS" -le 2500 ]; then
- SCORE=$((SCORE + 3))
- elif [ "$WORDS" -le 3500 ]; then
- SCORE=$((SCORE + 1))
- fi
- # No TODO/FIXME/HACK/XXX markers (5 pts)
- todo_count=$(echo "$CONTENT" | grep -ci "TODO\|FIXME\|HACK\|XXX")
- if [ "$todo_count" -eq 0 ]; then
- SCORE=$((SCORE + 5))
- fi
- # --- HYGIENE (15 pts) ---
- # Attribution to Karpathy (3 pts)
- echo "$CONTENT" | grep -qi "karpathy" && SCORE=$((SCORE + 3))
- # AskUserQuestion mentioned for missing config (3 pts)
- echo "$CONTENT" | grep -q "AskUserQuestion" && SCORE=$((SCORE + 3))
- # Bounded mode (Iterations: N) documented (3 pts)
- echo "$CONTENT" | grep -q "Iterations:" && SCORE=$((SCORE + 3))
- # "Never stop" / "never ask" principle (3 pts)
- echo "$CONTENT" | grep -qi "never stop\|never ask" && SCORE=$((SCORE + 3))
- # git add specific files warning (no -A) (3 pts)
- echo "$CONTENT" | grep -q "git add -A\|never.*git add" && SCORE=$((SCORE + 3))
- echo "$SCORE"
|