test: eval judges e2e #14
Reference in New Issue
Block a user
Delete Branch "test/eval-judges-trigger"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🤖 AI Review · pragent pilot · headroom/MiniMax-M2.7 ·
d746b1fd· Merge confidence: 5/5 🟢Summary of Changes
Key Risks & Concerns
None identified.
🔋 AI Usage & Run Details
Model / Engine:
headroom/MiniMax-M2.7· opencode · 3 steps · 45.1sTotal Tokens: 3,260 (3.3K) in / 914 out (0 reasoning, cache 23,532 (23.5K) read / 14,906 (14.9K) write, 42,612 (42.6K) total)
Actual: $0.00 (headroom/MiniMax-M2.7 — free tier)
Scope: Whole-repo checkout at head sha (agent can read any file + run linters, not just the diff) — input tokens include files read beyond the diff. Per-comment output is attributed (one model pass produces all findings; output split by each finding's body weight).
Equivalent cost on paid providers (this run's tokens):
The standard /api/public/ingestion path feeds only the trace-upsert queue; evalService.createEvalJobs only dispatches targetObject in {TRACE, DATASET}. Observation rules fire exclusively from the OTel pipeline, which this pilot does not use. The trace body already carries review input/output via langfuse_trace, so a trace rule sees the same material an observation rule would.🤖 AI Review · pragent pilot · headroom/MiniMax-M2.7 ·
5b8be61e· Merge confidence: 5/5 🟢Summary of Changes
Key Risks & Concerns
🔋 AI Usage & Run Details
headroom/MiniMax-M2.7· opencode · 7 steps · 70.2s🤖 AI Review · pragent pilot · headroom/MiniMax-M2.7 ·
3109bd7c· Merge confidence: 3/5 🟡Summary of Changes
Key Risks & Concerns
Findings Overview
1 inline comment(s); 1 total.
pilot/eval_judges.py:275🔋 AI Usage & Run Details
headroom/MiniMax-M2.7· opencode · 10 steps · 110.3s@@ -0,0 +272,4 @@st, body = eb._call("GET", "/api/public/unstable/evaluation-rules?limit=100")if st == 200 and isinstance(body, dict):for r in body.get("data") or []:if r.get("target") == "observation":🔴 [HIGH] existing_rule_names() filters rules by target='observation' but rule_body() creates rules with target='trace'. On re-run, ensure_rules() will never find the rules it created and will POST them again, getting a 409 Conflict and adding them to the failed list. This violates the stated idempotency: 're-running this script would pile up versions'.
Fix: Change r.get('target') == 'observation' to r.get('target') == 'trace' so the function finds the rules it itself creates.
🪙 ~4,881 (4.9K) tok (100% · attributed output)
🤖 AI Review · pragent pilot · headroom/MiniMax-M2.7 ·
3f30bdd4· Merge confidence: 4/5 🟢Summary of Changes
Key Risks & Concerns
Findings Overview
1 finding(s).
pilot/eval_judges.py:275Unanchored Notes
pilot/eval_judges.py:275— existing_rule_names() filters rules where target=='observation', but rule_body() now creates rules with target=='trace'. On a re-run of ensure_rules(), the newly created trace rules will not be found by this function, so the idempotency check at line 254 will not suppress the second POST — resulting in a 409 conflict instead of a clean skip. This breaks the stated idempotency guarantee in ensure_rules().🔋 AI Usage & Run Details
headroom/MiniMax-M2.7· opencode · 6 steps · 61.5s