/06-prompt-regression
Use when the user has changed a prompt (system prompt, RAG template, agent instruction, etc.) and wants to know whether the candidate is better or worse than the baseline. Also use when the user mentions prompt A/B testing, prompt comparison, prompt optimization validation, "did
$ npx -y skills add agentscope-ai/OpenJudge --skill 06-prompt-regression --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/06-prompt-regression
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when the user has changed a prompt (system prompt, RAG template, agent instruction, etc.) and wants to know whether the candidate is better or worse than the baseline. Also use when the user mentions prompt A/B testing, prompt comparison, prompt optimization validation, "did
SKILL.md
06-prompt-regression.SKILL.mdname: prompt-regression
description: >
Use when the user has changed a prompt (system prompt, RAG template, agent instruction,
etc.) and wants to know whether the candidate is better or worse than the baseline.
Also use when the user mentions prompt A/B testing, prompt comparison, prompt
optimization validation, "did my prompt change help," or prompt regression testing.
Outputs per-dimension win rates with statistical significance using OpenJudge
PairwiseAnalyzer.
<HARD-GATE> NO conclusion about which prompt is better WITHOUT bootstrap 95% CI reported. NO candidate declared "better" WITHOUT position-debiased (swap-aggregate) comparison. NO comparison with fewer than 10 samples per axis — CI is too wide to be meaningful. </HARD-GATE>
Prompt Regression
Compare two prompts head-to-head and determine, with statistical rigor, whether the candidate is better, worse, or tied on each evaluation dimension.
When to Activate
- You changed the system prompt and want to verify it's actually better
- You're iterating on RAG answer templates
- You're optimizing agent step-by-step instructions
- You want data to support a prompt change decision
Checklist
You MUST create a task for each item and complete them in order:
1. **Load and analyze prompts** — diff the baseline vs candidate 2. **Derive comparison dimensions** — from the prompt changes + task type 3. **Select graders per dimension** — pairwise, judge, or rule 4. **Run position-debiased comparison** — swap-aggregate to eliminate order bias 5. **Compute statistics** — win rates + bootstrap 95% CI per dimension 6. **Present results** — per-dimension verdict with confidence intervals
Fast path: run the bundled script
Don't hand-write the win-rate + bootstrap math (the swap-aggregation and CI are easy to get wrong). Run the bundled, tested script (`scripts/pairwise.py`, standard library only, **no OpenJudge dependency**):
python scripts/pairwise.py --comparisons comparisons.jsonl --candidate candidate --baseline baseline
Each comparison row: `{"id","model_a","model_b","score","dimension"?}` where `score >= 0.5` means `model_a` won. Emit two rows per query with A/B **swapped** to debias position. The script reports per-dimension candidate/baseline/tie rates, bootstrap 95% CI, and a verdict (`BETTER` / `WORSE` / `TIED` / `INSUFFICIENT_EVIDENCE` / `INCONCLUSIVE`; exit 0 only if better). `--self-test` to verify it.
Steps below explain how to derive dimensions and produce the comparisons (with OpenJudge or any judge); the inline snippets are the reference behind the script.
Step 1: Load and Analyze Prompts
Read the baseline and candidate prompts. Identify:
- **Task type**: chatbot / RAG generation / code review / translation / summarization
/ agent instruction / other
- **What changed**: added constraints, changed tone, new examples, different output
format, expanded/shortened instructions
- **Intent of change**: what problem was the user trying to fix?
Step 2: Derive Comparison Dimensions
Based on the task type and what changed, derive 3-5 comparison dimensions.
Dimension templates by task type
**Chatbot / Conversational**:
- Answer relevance — does it address the user's question?
- Tone appropriateness — does the tone match context?
- Factual accuracy — no fabricated information
- Conciseness — doesn't ramble or over-explain
- Instruction following — obeys system prompt constraints
**RAG Generation**:
- Faithfulness — grounded in retrieved documents
- Citation accuracy — correctly references sources
- Completeness — covers all aspects of the query
- No hallucination — no claims beyond documents
**Code Review / Generation**:
- Bug detection — finds real issues
- False positive rate — doesn't flag correct code
- Actionability — suggestions are specific and implementable
- Code style — follows conventions
**Agent Instructions**:
- Tool selection — picks the right tool
- Step efficiency — minimal steps to goal
- Error recovery — handles failures gracefully
- Output format — follows specified structure
Each dimension gets:
- An `id` (slug)
- A one-sentence description
- A grader type: `pairwise` or `judge` or `rule`
Step 3: Select Graders
Decision priority: 1. **Can a rule check this?** → `FunctionGrader` or `StringMatchGrader`. Free, deterministic. Example: output length, keyword presence, JSON validity. 2. **Is there a reference answer?** → `pairwise` against reference. 3. **Subjective quality, no reference?** → `pairwise` A/B comparison. 4. **Single-output judgment needed?** → `judge` (binary pass/fail per output).
Step 4: Run Position-Debiased Comparison
Pairwise comparison with swap-aggregate
LLM judges have position bias — the first response shown wins 5-15% more often. Swap-aggregate eliminates this: run each comparison twice with swapped positions, keep only consistent wins:
from openjudge.graders.llm_grader import LLMGrader
from openjudge.graders.schema import GraderMode
from openjudge.runner.grading_runner import GradingRunner
from openjudge.analyzer.pairwise_analyzer import PairwiseAnalyzer
# Judge prompt for relevance comparison
relevance_judge = LLMGrader(
model=model,
name="relevance_compare",
mode=GraderMode.POINTWISE,
template="""
Compare Response A and Response B for the query below.
Which response better addresses the user's question?
Query: {query}
Response A: {response_a}
Response B: {response_b}
Score 1.0 if A is better, 0.0 if B is better, 0.5 if tied.
Respond in JSON: {{"score": <float>, "reason": "<explanation>"}}
""",
)
# Build pairwise dataset with position swap
dataset = []
for sample in test_samples:
# Original order
dataset.append({
"query": sample["query"],
"response_a": baseline_outputs[sample["id"]],
"response_b": candidate_outputs[sample["id"]],
"metadata": {"model_a": "baseline", "model_b": "candidate"},
})
# Swapped order — critical for debiasingRead more
name: prompt-regression description: > Use when the user has changed a prompt (system prompt, RAG template, agent instruction, etc.) and wants to know whether the candidate is better or worse than the baseline. Also use when the user mentions prompt A/B testing, prompt comparison, prompt optimization validation, "did my prompt change help," or prompt regression testing. Outputs per-dimension win rates with statistical significance using OpenJudge PairwiseAnalyzer.
<HARD-GATE> NO conclusion about which prompt is better WITHOUT bootstrap 95% CI reported. NO candidate declared "better" WITHOUT position-debiased (swap-aggregate) comparison. NO comparison with fewer than 10 samples per axis — CI is too wide to be meaningful. </HARD-GATE>
Prompt Regression
Compare two prompts head-to-head and determine, with statistical rigor, whether the candidate is better, worse, or tied on each evaluation dimension.
When to Activate
- You changed the system prompt and want to verify it's actually better
- You're iterating on RAG answer templates
- You're optimizing agent step-by-step instructions
- You want data to support a prompt change decision
Checklist
You MUST create a task for each item and complete them in order:
1. **Load and analyze prompts** — diff the baseline vs candidate 2. **Derive comparison dimensions** — from the prompt changes + task type 3. **Select graders per dimension** — pairwise, judge, or rule 4. **Run position-debiased comparison** — swap-aggregate to eliminate order bias 5. **Compute statistics** — win rates + bootstrap 95% CI per dimension 6. **Present results** — per-dimension verdict with confidence intervals
Fast path: run the bundled script
Don't hand-write the win-rate + bootstrap math (the swap-aggregation and CI are easy to get wrong). Run the bundled, tested script (`scripts/pairwise.py`, standard library only, **no OpenJudge dependency**):
python scripts/pairwise.py --comparisons comparisons.jsonl --candidate candidate --baseline baseline
Each comparison row: `{"id","model_a","model_b","score","dimension"?}` where `score >= 0.5` means `model_a` won. Emit two rows per query with A/B **swapped** to debias position. The script reports per-dimension candidate/baseline/tie rates, bootstrap 95% CI, and a verdict (`BETTER` / `WORSE` / `TIED` / `INSUFFICIENT_EVIDENCE` / `INCONCLUSIVE`; exit 0 only if better). `--self-test` to verify it.
Steps below explain how to derive dimensions and produce the comparisons (with OpenJudge or any judge); the inline snippets are the reference behind the script.
Step 1: Load and Analyze Prompts
Read the baseline and candidate prompts. Identify:
- **Task type**: chatbot / RAG generation / code review / translation / summarization
/ agent instruction / other
- **What changed**: added constraints, changed tone, new examples, different output
format, expanded/shortened instructions
- **Intent of change**: what problem was the user trying to fix?
Step 2: Derive Comparison Dimensions
Based on the task type and what changed, derive 3-5 comparison dimensions.
Dimension templates by task type
**Chatbot / Conversational**:
- Answer relevance — does it address the user's question?
- Tone appropriateness — does the tone match context?
- Factual accuracy — no fabricated information
- Conciseness — doesn't ramble or over-explain
- Instruction following — obeys system prompt constraints
**RAG Generation**:
- Faithfulness — grounded in retrieved documents
- Citation accuracy — correctly references sources
- Completeness — covers all aspects of the query
- No hallucination — no claims beyond documents
**Code Review / Generation**:
- Bug detection — finds real issues
- False positive rate — doesn't flag correct code
- Actionability — suggestions are specific and implementable
- Code style — follows conventions
**Agent Instructions**:
- Tool selection — picks the right tool
- Step efficiency — minimal steps to goal
- Error recovery — handles failures gracefully
- Output format — follows specified structure
Each dimension gets:
- An `id` (slug)
- A one-sentence description
- A grader type: `pairwise` or `judge` or `rule`
Step 3: Select Graders
Decision priority: 1. **Can a rule check this?** → `FunctionGrader` or `StringMatchGrader`. Free, deterministic. Example: output length, keyword presence, JSON validity. 2. **Is there a reference answer?** → `pairwise` against reference. 3. **Subjective quality, no reference?** → `pairwise` A/B comparison. 4. **Single-output judgment needed?** → `judge` (binary pass/fail per output).
Step 4: Run Position-Debiased Comparison
Pairwise comparison with swap-aggregate
LLM judges have position bias — the first response shown wins 5-15% more often. Swap-aggregate eliminates this: run each comparison twice with swapped positions, keep only consistent wins:
from openjudge.graders.llm_grader import LLMGrader
from openjudge.graders.schema import GraderMode
from openjudge.runner.grading_runner import GradingRunner
from openjudge.analyzer.pairwise_analyzer import PairwiseAnalyzer
# Judge prompt for relevance comparison
relevance_judge = LLMGrader(
model=model,
name="relevance_compare",
mode=GraderMode.POINTWISE,
template="""
Compare Response A and Response B for the query below.
Which response better addresses the user's question?
Query: {query}
Response A: {response_a}
Response B: {response_b}
Score 1.0 if A is better, 0.0 if B is better, 0.5 if tied.
Respond in JSON: {{"score": <float>, "reason": "<explanation>"}}
""",
)
# Build pairwise dataset with position swap
dataset = []
for sample in test_samples:
# Original order
dataset.append({
"query": sample["query"],
"response_a": baseline_outputs[sample["id"]],
"response_b": candidate_outputs[sample["id"]],
"metadata": {"model_a": "baseline", "model_b": "candidate"},
})
# Swapped order — critical for debiasingOpenJudge: A Unified Framework for Holistic Evaluation and Quality Rewards
Other skills on openjudge.
- /auto-arena
Automatically evaluate and compare multiple AI models or agents without pre-existing test data. Generates test queries from a task description, collects responses from all target endpoints, auto-generates evaluation rubrics, runs pairwise comparisons via a judge model, and
Open skill - /bib-verify
Verify a BibTeX file for hallucinated or fabricated references by cross-checking every entry against CrossRef, arXiv, and DBLP. Reports each reference as verified, suspect, or not found, with field-level mismatch details (title, authors, year, DOI). Use when the user wants to
Open skill - /claude-authenticity
Detect whether an API endpoint is backed by genuine Claude (not a wrapper, proxy, or impersonator) using 9 weighted rule-based checks that mirror the claude-verify project. Also extracts injected system prompts from providers that override Claude's identity. Fully self-contained
Open skill - /00-meta-eval
Use when the user wants to build an evaluation system for an LLM/agent application but doesn't know where to start — they have traces, prompts, RAG pipelines, or nothing at all. Also use when the user mentions evaluation, eval, benchmarking, testing LLM quality, measuring agent
Open skill - /01-eval-design
Use when the user needs to design evaluation datasets, create test cases, stratify samples, generate adversarial examples, extract eval dimensions from traces/specs, or build a labeled evaluation set. Also use when the user mentions test data design, eval coverage, difficulty
Open skill - /02-metric-design
Use when the user has evaluation principles or a dataset but needs help choosing the right graders, designing evaluation metrics, creating LLM-as-judge prompts, combining multiple metrics into a composite score, or building an automated evaluation pipeline. Also use when the
Open skill

