Skip to content

Commit f55cbf7

Browse files
committed
Implement Rule 11: automated Claude clarity review on every PR
Replaces the auto-pass stub in ob1-review.yml with a real Claude API call (Haiku) that reviews contribution READMEs for clarity, missing steps, and correctness. Gracefully skips if ANTHROPIC_API_KEY secret is not configured. Also updates CLAUDE.md and CONTRIBUTING.md to reflect that Rule 11 is now live. Requires: Add ANTHROPIC_API_KEY as a repository secret in GitHub Settings → Secrets → Actions. https://claude.ai/code/session_01XYNmBjSUAeV6VuvWyp1Y79
1 parent 96658c8 commit f55cbf7

3 files changed

Lines changed: 105 additions & 8 deletions

File tree

.github/workflows/ob1-review.yml

Lines changed: 103 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ jobs:
4343
4444
- name: Run review checks
4545
id: review
46+
env:
47+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
4648
run: |
4749
CHANGED_FILES="${{ steps.changed.outputs.files }}"
4850
CONTRIB_DIRS="${{ steps.changed.outputs.contrib_dirs }}"
@@ -421,11 +423,100 @@ jobs:
421423
fail_check "Primitive dependencies" "Primitive dependency issues:\n${rule10_detail}"
422424
fi
423425
424-
# ─── Rule 11: LLM clarity review (stub) ───
425-
# TODO: LLM clarity review — planned for v2. Requires API key secret.
426-
# Will send contribution READMEs to an LLM API to check if instructions
427-
# are clear and complete. For now, always passes.
428-
pass_check "LLM clarity review" "*(Planned for v2)* Auto-pass"
426+
# ─── Rule 11: LLM clarity review ───
427+
# Sends contribution READMEs to Claude for clarity and completeness review.
428+
# Requires ANTHROPIC_API_KEY secret. Gracefully skips if not configured.
429+
if [ -z "$ANTHROPIC_API_KEY" ]; then
430+
pass_check "LLM clarity review" "*(Skipped — ANTHROPIC_API_KEY not configured)*"
431+
elif [ "$is_docs_pr" = true ]; then
432+
pass_check "LLM clarity review" "Docs PR — skipped"
433+
else
434+
rule11_pass=true
435+
rule11_detail=""
436+
llm_notes=""
437+
438+
# Collect all contribution READMEs
439+
readmes=""
440+
while IFS= read -r dir; do
441+
[ -z "$dir" ] && continue
442+
[ ! -f "$dir/README.md" ] && continue
443+
readmes="${readmes}--- ${dir}/README.md ---\n$(cat "$dir/README.md")\n\n"
444+
done <<< "$CONTRIB_DIRS"
445+
446+
if [ -n "$readmes" ]; then
447+
# Build the prompt with repo context from CLAUDE.md Rule 11 criteria
448+
review_prompt="You are reviewing Open Brain (OB1) community contributions. Evaluate each README below and report issues.
449+
450+
Check for:
451+
1. Are instructions clear enough for someone with only the stated prerequisites?
452+
2. Are there missing steps, ambiguous references, or assumed knowledge?
453+
3. Do code snippets look correct and copy-paste ready?
454+
4. Is the expected outcome specific enough to verify success?
455+
5. For SQL: do statements look syntactically correct? Do they reference the right tables?
456+
457+
Respond with ONLY a JSON object (no markdown fences):
458+
{
459+
\"pass\": true/false,
460+
\"issues\": [\"issue 1\", \"issue 2\"],
461+
\"notes\": \"Brief summary of clarity feedback\"
462+
}
463+
464+
Set pass=true if instructions are generally clear and usable, even with minor suggestions.
465+
Set pass=false only if there are significant clarity problems that would block a user.
466+
467+
READMEs to review:
468+
$(echo -e "$readmes")"
469+
470+
# Call Claude API
471+
llm_response=$(curl -s --max-time 30 \
472+
-H "x-api-key: $ANTHROPIC_API_KEY" \
473+
-H "anthropic-version: 2023-06-01" \
474+
-H "content-type: application/json" \
475+
"https://api.anthropic.com/v1/messages" \
476+
-d "$(jq -n --arg prompt "$review_prompt" '{
477+
"model": "claude-haiku-4-5-20251001",
478+
"max_tokens": 1024,
479+
"messages": [{"role": "user", "content": $prompt}]
480+
}')" 2>/dev/null || echo "")
481+
482+
if [ -z "$llm_response" ]; then
483+
pass_check "LLM clarity review" "*(Skipped — API call failed)*"
484+
else
485+
# Extract the text content from Claude's response
486+
llm_text=$(echo "$llm_response" | jq -r '.content[0].text // empty' 2>/dev/null)
487+
488+
if [ -z "$llm_text" ]; then
489+
# Check for API error
490+
api_error=$(echo "$llm_response" | jq -r '.error.message // empty' 2>/dev/null)
491+
if [ -n "$api_error" ]; then
492+
pass_check "LLM clarity review" "*(Skipped — API error: ${api_error})*"
493+
else
494+
pass_check "LLM clarity review" "*(Skipped — could not parse response)*"
495+
fi
496+
else
497+
llm_pass=$(echo "$llm_text" | jq -r '.pass // empty' 2>/dev/null)
498+
llm_issues=$(echo "$llm_text" | jq -r '.issues // [] | .[]' 2>/dev/null)
499+
llm_notes=$(echo "$llm_text" | jq -r '.notes // empty' 2>/dev/null)
500+
501+
if [ "$llm_pass" = "true" ]; then
502+
pass_check "LLM clarity review" "Instructions are clear and complete"
503+
elif [ "$llm_pass" = "false" ]; then
504+
issues_formatted=""
505+
while IFS= read -r issue; do
506+
[ -z "$issue" ] && continue
507+
issues_formatted="${issues_formatted} - ${issue}\n"
508+
done <<< "$llm_issues"
509+
fail_check "LLM clarity review" "Clarity issues found:\n${issues_formatted}"
510+
rule11_pass=false
511+
else
512+
pass_check "LLM clarity review" "*(Skipped — unexpected response format)*"
513+
fi
514+
fi
515+
fi
516+
else
517+
pass_check "LLM clarity review" "No contribution READMEs to review"
518+
fi
519+
fi
429520

430521
# ─── Build summary ───
431522
total=$((pass_count + fail_count))
@@ -437,7 +528,13 @@ jobs:
437528
echo "failed=false" >> $GITHUB_OUTPUT
438529
fi
439530

440-
comment="## OB1 Automated Review\n\n${results}\n${summary}"
531+
# Append LLM clarity notes if available
532+
llm_section=""
533+
if [ -n "${llm_notes:-}" ]; then
534+
llm_section="\n### Clarity Notes (AI Review)\n${llm_notes}\n"
535+
fi
536+
537+
comment="## OB1 Automated Review\n\n${results}\n${summary}${llm_section}"
441538
echo "comment<<EOF" >> $GITHUB_OUTPUT
442539
echo -e "$comment" >> $GITHUB_OUTPUT
443540
echo "EOF" >> $GITHUB_OUTPUT

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ If a contribution's `metadata.json` declares `requires_primitives`, then:
9191
- The contribution's README must link to each required primitive
9292

9393
### Rule 11: LLM clarity review
94-
As the LLM reviewer, **this is your unique value**. Read the contribution's README and evaluate:
94+
This check runs automatically in CI via the Anthropic API (Claude Haiku). When you are invoked via `@claude` on a PR, provide a deeper version of this same review. Read the contribution's README and evaluate:
9595
- Are the instructions clear enough for someone with only the stated prerequisites?
9696
- Are there missing steps, ambiguous references, or assumed knowledge?
9797
- Do code snippets look correct and copy-paste ready?

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,4 @@ Every PR is checked against these rules. All must pass before human review.
187187
8. **No binary blobs** — No files over 1MB, no `.exe`, `.dmg`, `.zip`, `.tar.gz`
188188
9. **README completeness** — Contribution README includes Prerequisites, step-by-step instructions, and expected outcome sections
189189
10. **Primitive dependencies** — If a contribution declares `requires_primitives`, the primitives must exist in the repo and be linked in the README
190-
11. **LLM clarity review***(Planned for v2)* Automated check that instructions are clear and complete
190+
11. **LLM clarity review**Claude reviews contribution READMEs for clarity, completeness, and correctness. Flags missing steps, ambiguous instructions, or SQL issues

0 commit comments

Comments
 (0)