-
Notifications
You must be signed in to change notification settings - Fork 371
Add evaluation troubleshooting guide for AI agents #440
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,264 @@ | ||||||||||||||||||||||||||||||||||
| # Investigating Evaluation Results | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| This guide is intended primarily for AI agents investigating skill evaluation failures, though humans will find it useful too. It documents the `results.json` schema, common failure patterns, and recommended fixes. | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## Using this guide with an AI agent | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| This document is designed to be read by AI coding agents. When a skill evaluation has failures, the PR comment includes a ready-to-use prompt — just copy and paste it to your AI agent. The agent will download the artifacts, read this guide, analyze the results, and suggest fixes. | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| If you need to run the investigation manually, follow the [Quick start](#quick-start) below. | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## Quick start | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| 1. **Download the results artifact:** `gh run download <run-id> --repo dotnet/skills --dir <path>` | ||||||||||||||||||||||||||||||||||
| 2. **Read `summary.md` first** for a quick overview of which scenarios passed/failed | ||||||||||||||||||||||||||||||||||
| 3. **Read `results.json`** for the full metrics, agent output, assertions, and judge reasoning | ||||||||||||||||||||||||||||||||||
| 4. **Identify the failure pattern** using the categories below — most failures match multiple patterns; fix them in priority order (timeouts first, then activation, then quality/rubric issues) | ||||||||||||||||||||||||||||||||||
| 5. **Apply the fix** and re-run with `/evaluate` | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## Finding the artifacts | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ### Via CLI (recommended for AI agents) | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| Extract the workflow run ID from the **Full results** link in the PR eval comment (e.g., `https://github.com/dotnet/skills/actions/runs/23520818616` → `23520818616`), then: | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||
| gh run download <run-id> --repo dotnet/skills --dir /tmp/eval-results | ||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| This downloads all artifacts into subdirectories, each containing `results.json` and `summary.md`. | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ### Via browser | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| From the PR comment, click the **Full results** link to open the GitHub Actions workflow run. Then: | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| 1. Click on any job (e.g., `evaluate (mcp-csharp-debug)`) | ||||||||||||||||||||||||||||||||||
| 2. Expand the **Upload results** step | ||||||||||||||||||||||||||||||||||
| 3. Find the `Artifact download URL` in the log output | ||||||||||||||||||||||||||||||||||
| 4. Download and extract | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| Alternatively, scroll to the bottom of the workflow run summary page and download from the **Artifacts** section. | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## Understanding `results.json` | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| Each file contains a top-level object with: | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| | Field | Description | | ||||||||||||||||||||||||||||||||||
| |-------|-------------| | ||||||||||||||||||||||||||||||||||
| | `model` | Model used for agent runs | | ||||||||||||||||||||||||||||||||||
| | `judgeModel` | Model used for judging | | ||||||||||||||||||||||||||||||||||
| | `timestamp` | When the run started | | ||||||||||||||||||||||||||||||||||
| | `verdicts[]` | Array of per-skill results | | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
|
Comment on lines
+46
to
+52
|
||||||||||||||||||||||||||||||||||
| ### Verdict structure | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| Each verdict contains: | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| | Field | Description | | ||||||||||||||||||||||||||||||||||
| |-------|-------------| | ||||||||||||||||||||||||||||||||||
| | `skillName` | Name of the skill being evaluated | | ||||||||||||||||||||||||||||||||||
| | `passed` | Overall pass/fail | | ||||||||||||||||||||||||||||||||||
| | `scenarios[]` | Array of per-scenario comparisons | | ||||||||||||||||||||||||||||||||||
| | `overfittingResult` | Overfitting analysis (if enabled) | | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ### Scenario structure | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| Each scenario contains three runs and their comparison: | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| | Field | Description | | ||||||||||||||||||||||||||||||||||
| |-------|-------------| | ||||||||||||||||||||||||||||||||||
| | `scenarioName` | Human-readable scenario name | | ||||||||||||||||||||||||||||||||||
| | `baseline` | Run without the skill | | ||||||||||||||||||||||||||||||||||
| | `skilledIsolated` | Run with only this skill loaded | | ||||||||||||||||||||||||||||||||||
| | `skilledPlugin` | Run with the full plugin loaded | | ||||||||||||||||||||||||||||||||||
|
Comment on lines
+66
to
+73
|
||||||||||||||||||||||||||||||||||
| Each scenario contains three runs and their comparison: | |
| | Field | Description | | |
| |-------|-------------| | |
| | `scenarioName` | Human-readable scenario name | | |
| | `baseline` | Run without the skill | | |
| | `skilledIsolated` | Run with only this skill loaded | | |
| | `skilledPlugin` | Run with the full plugin loaded | | |
| Each scenario includes two runs (baseline + isolated) plus an optional plugin run, and their comparison: | |
| | Field | Description | | |
| |-------|-------------| | |
| | `scenarioName` | Human-readable scenario name | | |
| | `baseline` | Run without the skill | | |
| | `skilledIsolated` | Run with only this skill loaded | | |
| | `skilledPlugin` | Run with the full plugin loaded (present only when plugin runs are enabled) | |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -609,6 +609,10 @@ public static string GenerateMarkdownSummary( | |||||
|
|
||||||
| sb.AppendLine($"\nModel: {model ?? "unknown"} | Judge: {judgeModel ?? "unknown"}"); | ||||||
|
|
||||||
| bool anyFailure = verdicts.Any(v => !v.Passed); | ||||||
| if (anyFailure) | ||||||
| sb.AppendLine("\n> 📖 See [InvestigatingResults.md](https://github.com/dotnet/skills/blob/main/eng/skill-validator/InvestigatingResults.md) for how to diagnose failures — or use the copy-paste prompt below."); | ||||||
|
||||||
| sb.AppendLine("\n> 📖 See [InvestigatingResults.md](https://github.com/dotnet/skills/blob/main/eng/skill-validator/InvestigatingResults.md) for how to diagnose failures — or use the copy-paste prompt below."); | |
| sb.AppendLine("\n> 📖 See [InvestigatingResults.md](/eng/skill-validator/InvestigatingResults.md) for how to diagnose failures. Additional debugging guidance may be provided by your workflow."); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The troubleshooting prompt fetches the guide from a hard-coded
.../main/...URL. Using the repository’s default branch (or a specific ref/sha associated with the run) would make this more robust and avoid breaking if the default branch name changes.