Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
915ac84
refactor: move legacy analyses/ to attic/
cmungall May 8, 2026
0bbad28
feat: add 15 mondo case studies
cmungall May 8, 2026
6920752
feat: add 20 cell-ontology case studies
cmungall May 8, 2026
bc32214
feat: add 20 uberon case studies
cmungall May 8, 2026
431cb2b
feat: add 4 more mondo case studies
cmungall May 8, 2026
fe3f570
feat: add 15 more go-ontology case studies
cmungall May 8, 2026
37fd930
feat: add 20 more cell-ontology case studies
cmungall May 8, 2026
d7b7587
feat: add 20 more uberon case studies
cmungall May 8, 2026
b0c4470
refactor: move case studies to analysis/{ont}/cases/ for co-located r…
cmungall May 8, 2026
e7f00e9
feat: add eval configs for all 4 ontologies
cmungall May 9, 2026
758c7cc
docs: add METHODS.md for evaluation paper
cmungall May 9, 2026
5ec11a3
feat: add reasoning_effort input for codex runs
cmungall May 9, 2026
c84cab5
docs: add initial results from Series 1 evaluation runs
cmungall May 9, 2026
79b9032
docs: update results with Series 2 ablation study and extended model …
cmungall May 9, 2026
d3b7c22
docs: correct ablation interpretation - Codex reads skills but doesn'…
cmungall May 9, 2026
03497f0
docs: add detailed notes on skill discovery differences between Claud…
cmungall May 9, 2026
5a43d27
docs: update METHODS with skill discovery details, config versions, a…
cmungall May 9, 2026
a3f1b6d
docs: add Series 3 results - canonical .agents/skills/ enables native…
cmungall May 9, 2026
97d93b4
feat: add structured results - scores.tsv, cached diffs, versioned co…
cmungall May 9, 2026
8d5b3a1
feat: add 5 new codex results (CL, Uberon, Mondo) - 28 total scored runs
cmungall May 9, 2026
3152303
feat: add --effort flag for Claude Code reasoning level (low/medium/h…
cmungall May 9, 2026
253e78e
feat: add review schema, LLM judge, analysis tooling, and starter not…
cmungall May 9, 2026
47c2631
docs: add 5 structured reviews (GO obsoletion x3, Mondo NTR x2)
cmungall May 9, 2026
e8f4932
feat: generate HTML scores overview report
cmungall May 9, 2026
cad2e0b
feat: add Jupyter notebook with charts for evaluation paper
cmungall May 9, 2026
a33bdd7
feat: add agent coding and balanced_comparison() for fair paired anal…
cmungall May 9, 2026
b7bee02
feat: add opencode as third agent runtime
cmungall May 9, 2026
4512110
fix: opencode uses codex auth.json for OpenAI models, ANTHROPIC_API_K…
cmungall May 9, 2026
e2173a2
fix: pass OPENAI_API_KEY env var to opencode runtime step
cmungall May 9, 2026
c5a8bbf
feat: add pi (badlogic) as fourth agent runtime
cmungall May 9, 2026
9b1c96c
feat: add opencode result (F1=0.800, identical to Codex) - harness is…
cmungall May 9, 2026
1023718
fix: install Node 22 via nvm for pi runtime (requires >=20.6.0)
cmungall May 9, 2026
6d88966
feat: add paired_test() and significance_summary() with bootstrap CIs…
cmungall May 10, 2026
d6919fe
feat: add full benchmark submission script (240 jobs: 3 runtimes × 20…
cmungall May 10, 2026
c48f823
fix: handle race conditions in eval-base branch and PR creation
cmungall May 10, 2026
9bdeacf
results: 250 scored runs with statistical significance
cmungall May 10, 2026
62bd76f
results: definitive analysis with n=250 runs, statistical significanc…
cmungall May 10, 2026
dfa3912
docs: add explanatory markdown cells throughout notebook for paper re…
cmungall May 10, 2026
16a9916
fix: correct model parsing from PR titles (was capturing issue text i…
cmungall May 10, 2026
11d3da8
fix: agent_code() now handles openai/ prefix and short model names fr…
cmungall May 10, 2026
648081e
regenerate notebook with fixed agent codes and 275 runs
cmungall May 10, 2026
12547ab
refactor: clean notebook with proper structure, normalized model names
cmungall May 10, 2026
9d6e1df
feat: add 20 more go-ontology case studies (total 40)
cmungall May 10, 2026
037f9b2
feat: add 20 more mondo case studies (total 40)
cmungall May 10, 2026
12449ce
results: 328 scored runs, harness effect confirmed (p=0.018, n=87 pai…
cmungall May 10, 2026
95bf5bd
refactor: proper scoring module with caching, normalized vocabs, CLI …
cmungall May 10, 2026
412fa75
fix: merge cached scores with API results to handle flaky gh responses
cmungall May 10, 2026
1469232
refactor: score command takes analysis_dir as argument, writes per-on…
cmungall May 10, 2026
4ea7b40
feat: agents.yaml per ontology + handle resolution in scoring
cmungall May 10, 2026
7c3be0d
refactor: rename eval.yaml -> experiment.yaml, document full harness …
cmungall May 10, 2026
53f04b3
refactor: logical agent names in agents.yaml, notebook loads from TSV
cmungall May 10, 2026
a82217c
notebook: add full results table, task type/difficulty slices, precis…
cmungall May 10, 2026
bb30a90
notebook: add side-by-side agent comparison table (f1/pr/rc sub-colum…
cmungall May 10, 2026
b42f863
fix: applymap -> map for pandas 3.x compat
cmungall May 10, 2026
3e5b7dd
notebook: fix decimal precision, add pairwise comparisons (model tier…
cmungall May 10, 2026
90064b5
feat: cache agent diffs and traces locally for permanence
cmungall May 10, 2026
19ff122
feat: add 'owl' metadiff config for OWL functional syntax (CL etc.)
cmungall May 10, 2026
a70aba9
results: 405 scored runs, CL rescored with owl config
cmungall May 10, 2026
e89e971
feat: pass TOGETHER_API_KEY and DEEPSEEK_API_KEY to opencode/pi runtimes
cmungall May 11, 2026
32fa326
fix: handle multi-line gh pr create output (strips 'Warning: uncommit…
cmungall May 11, 2026
9bf8c27
results: 458 scored runs after recovering haiku PRs (63 haiku, up fro…
cmungall May 11, 2026
5ead816
results: 700 scored runs across 7 models, 5 harnesses, 4 ontologies
cmungall May 12, 2026
d9769dd
results: 828 scored runs — Opus on all 4 ontologies, Copilot on GO/Mo…
cmungall May 14, 2026
d81a3eb
feat: add test fixtures for gallery data collection
cmungall May 14, 2026
4c065f9
feat: implement collect_gallery_data() with tests (Task 2)
cmungall May 14, 2026
01945d1
feat: add GALLERY_HTML_TEMPLATE and generate_gallery() for HTML galle…
cmungall May 14, 2026
c6783df
feat: add gallery CLI command for static HTML case browser
cmungall May 14, 2026
679e123
results: 885 runs — CC vs Copilot head-to-head, Opus agent handles fixed
cmungall May 14, 2026
b0845b6
fix: truncate diffs to 200 lines to keep gallery HTML under 6MB
cmungall May 14, 2026
bab06ce
fix: escape JS string literals in gallery HTML template
cmungall May 14, 2026
aa145fa
results: 993 runs — Sonnet 4.5 full coverage across all ontologies
cmungall May 14, 2026
180f002
feat: enhance gallery HTML with GitHub links, eval PR links, keyboard…
cmungall May 15, 2026
c6da984
feat: gallery enhancements - links, keyboard nav, structured reviews
cmungall May 15, 2026
787e235
feat: add eval_suitability field to case study schema
cmungall May 15, 2026
66a7d6d
chore: add just gallery target for regenerating the HTML gallery
cmungall May 15, 2026
b76a153
feat: add diff_noise field to case study schema
cmungall May 15, 2026
87c88ff
results: 1045 runs — Copilot full coverage, column ordering fixed
cmungall May 15, 2026
bf730cf
feat: embed agent PR comments, trace links, and workflow runs in gallery
cmungall May 15, 2026
6c183a8
data: cache eval PR data for all 1045 agent attempts
cmungall May 15, 2026
48c746f
feat: fetch PR_COMMENTS.md and ISSUE_COMMENTS.md from trace directories
cmungall May 15, 2026
3f1389c
fix: show agent PR/issue comments before diff in gallery attempts
cmungall May 15, 2026
83bf87f
data: re-fetch all 1053 eval PRs with trace PR_COMMENTS.md/ISSUE_COMM…
cmungall May 15, 2026
70571de
results: 1055 runs — Gemma GO complete, Haiku gapfill
cmungall May 15, 2026
9146b15
fix: add Gemma agent entries to CL/Uberon/Mondo agents.yaml
cmungall May 15, 2026
aeeefa0
refactor: consolidate agents.yaml to single global file
cmungall May 15, 2026
fafcac7
results: 1100 runs — Copilot Mondo, Opus/Sonnet gapfill, Gemma GO
cmungall May 15, 2026
821dced
feat: add CASE_BRIEF.md generation for all cases
cmungall May 16, 2026
fadb255
feat: add YAML frontmatter to CASE_BRIEF.md files
cmungall May 16, 2026
a360543
results: 1117 runs — Codex GPT-5.5 GO+Mondo complete, Copilot Mondo +18
cmungall May 16, 2026
2094a01
refactor: hybrid case briefs — compact summary + per-attempt detail f…
cmungall May 16, 2026
0af5585
feat: add blob hash column and quality banners to case briefs
cmungall May 16, 2026
ba557e8
results: 1174 runs — Codex GPT-5.4 gapfill across all ontologies
cmungall May 16, 2026
2ac3dc9
Add Codex GO attempt reviews
cmungall May 16, 2026
f5dad48
reviews: complete claude review pass over all 40 GO cases
cmungall May 16, 2026
f66da5e
results: 1234 runs — major gapfill across all agents and ontologies
cmungall May 16, 2026
bf9436f
schema: add quality-flagging fields to CaseStudy; add std_opencode_g54
cmungall May 16, 2026
cc07238
fix(scoring): raise gh pr list ceiling 500->5000, fail loud on trunca…
cmungall May 16, 2026
a80d578
opencode: run OpenAI gpt-5.x via Codex-OAuth local proxy (no API key)
cmungall May 16, 2026
45d9754
analysis: join case_quality flags onto scores (exclude poor cases)
cmungall May 17, 2026
295f97b
results+analysis: opencode Codex-OAuth fill; quality-aware aggregation
cmungall May 17, 2026
d0d7efb
results: final gapfill — opencode_g54 mondo 18->23/23 (1660 runs)
cmungall May 17, 2026
93ae072
analysis: lead with case-suitability; add reviewer-outcome score
cmungall May 17, 2026
bfbb59f
reviews: repair hallucinated agent field; surface reviewer scores in …
cmungall May 17, 2026
1335545
feat: surface case_quality, scoring_caveat, and eval_suitability in g…
cmungall May 17, 2026
b39a414
notebook: add 02_reviewer_eval — reviewer scores as primary basis
cmungall May 18, 2026
55b5382
results: close all fillable gaps (1662 runs); finalize coverage
cmungall May 18, 2026
c3a14de
notebook: document the 4 accepted structural no-coverage slots
cmungall May 18, 2026
219143b
notebook: expand 02_reviewer_eval into the paper's exploratory analysis
cmungall May 19, 2026
46c53ac
notebook: render 02_reviewer_eval tables as styled HTML, not plaintext
cmungall May 19, 2026
fb1401b
fix(ci): resolve mypy and ruff failures in just test
cmungall May 31, 2026
eedac89
fix(ci): fix typed-numpy reassignment in bootstrap CI (analysis.py:800)
cmungall May 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
332 changes: 332 additions & 0 deletions .claude/skills/review-agent-pr/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,332 @@
---
name: review-agent-pr
description: Review a shadow PR created by an AI agent against the human gold standard
---

# Review Guidelines: Agent Evaluation Runs

You are reviewing the PR that was created in response to GitHub issue
on a biomedical ontology. Your job is to assess the quality of the
agent's work by comparing it to a gold-standard solution. However,
note that in some cases the gold standard may have imperfections, and
the proposed PR may actually improve on it.

## Case briefs

This repo works by making "attempt" PRs in a shadow repo that
are blinded replications of "source" PRs in the original repo.

Let's take GO as an example. You should work from the case brief that is already prepared for you; for example:

* analysis/go-ontology/cases/pr31676/CASE_BRIEF.md

This describes the source PR (31676 in the source repo), an overview, how the human
handled it, and how all the agents handled it.

the front matter might have:

```yaml
ontology: go-ontology
repo: geneontology/go-ontology
issue_number: 31670
pr_number: 31676
issue_title: 'Taxon constraint: please add for GO:0070478 and similar terms'
pr_author: pgaudet
pr_merged_at: '2026-04-20'
task_type: new_term
difficulty: hard
scoping: mostly_scoped
scope: multi_term
review_outcome: multiple_rounds
num_agent_attempts: 10
generated_at: '2026-05-15'
scoping_notes: Primary goal was adding taxon constraints for specific terms. Also
fixed a formatting error in the migrasome entry (extra NCBITaxon column) which was
incidental cleanup.
domain_area: biological_process
best_f1: 0.571
best_model: kimi-k2.6
```

You are encouraged to read the full source issue and the original PR in the source repo, as
well as the summary in the brief.

Note you are also free to suggest changes to some parts of the metadata (task_type, difficuly, scope, ...)

Your job is to evaluate the agent attempts. Each attempt has a metadata section at the start:

E.g. ` grep -A5 '^### Attempt' analysis/go-ontology/cases/pr31676/CASE_BRIEF.md`"


```markdown
### Attempt 1: kimi-k2.6 / opencode

- **Eval PR**: [#263](https://github.com/ai4curation/eval-ont-agent-go/pull/263)
- **F1**: 0.571 **Precision**: 0.400 **Recall**: 1.000 **Jaccard**: 0.400
- **Trace**: [25646686906](https://github.com/ai4curation/eval-ont-agent-go/tree/master/traces/25646686906)
- **Workflow run**: [25646686906](https://github.com/ai4curation/eval-ont-agent-go/actions/runs/25646686906)
```

The review for this attempt would go in `analysis/go-ontology/results/reviews/pr263-{YOU}-complete.md

Where YOU is whatever agent type you are (codex, claude)

## Step 1: Understand the task

Read the source issue to understand what the agent was asked to do:

```bash
gh issue view {issue_number} --repo {source_repo} --json title,body,comments
```

Where `source_repo` comes from the ontology:

| ontology | source_repo |
|----------|-------------|
| go-ontology | geneontology/go-ontology |
| cell-ontology | obophenotype/cell-ontology |
| uberon | obophenotype/uberon |
| mondo | monarch-initiative/mondo |

Read the full issue body and comments. The issue may contain discussion,
clarifications, or constraints that affect what a correct solution looks like.
Some issues are straightforward ("obsolete term X"), others require judgment
("reparent these 49 terms").

## Step 2: Understand the agent's instructions

The agent was given a prompt (see `__agent_prompt__.md` in the eval workflow)
plus agent-specific configuration from a config repo. The config repo contains:

- `CLAUDE.md` / `AGENTS.md` — project-level instructions
- `.agents/skills/` — domain-specific skill files (e.g., term-obsoletion,
research, design-pattern)

The config repos are:

| ontology | config_repo |
|----------|-------------|
| go-ontology | ai4curation/go-ontology-agent-config |
| cell-ontology | ai4curation/cl-agent-config |
| uberon | ai4curation/uberon-agent-config |
| mondo | ai4curation/mondo-agent-config |

You can browse the config to understand what the agent was told to do:

```bash
gh api repos/{config_repo}/contents/template/CLAUDE.md --jq '.content' | base64 -d
gh api repos/{config_repo}/contents/template/.agents/skills --jq '.[].name'
```

This matters because an agent that ignores its instructions is a different
failure mode from one that follows them but gets the wrong answer.

## Step 3: Read the human PR (ground truth)

```bash
gh pr view {pr_number} --repo {source_repo}
gh pr diff {pr_number} --repo {source_repo}
```

Note what the human changed, how they changed it, and any reviewer feedback.
The human solution is the reference but not necessarily perfect — sometimes
the agent's approach is equally valid or even better.

### Step 3a: Check whether the gold PR is the *whole* human resolution

A single issue is often resolved by the human across **multiple PRs** (e.g.,
a taxon-constraint cleanup in one PR, the actual obsoletion in another). The
case brief and metadiff score compare the agent against **only one** of those
PRs — the one selected as `pr_number`. If that PR is just a sub-step, the
metadiff F1 will be near zero for *every* attempt even when agents fully and
correctly resolve the issue.

Always sanity-check this:

```bash
gh search prs --repo {source_repo} "{issue_number}" --json number,title,state,url --limit 20
gh search prs --repo {source_repo} "{key term from issue title}" --json number,title,url --limit 10
```

If the issue was resolved by several PRs, reconstruct the **union** of the
human changes and judge the agent against that union and against the issue's
explicit asks — not against the single selected gold PR. When this happens,
the case is a **poor evaluation case** and must be flagged (see Step 7a).

### Step 3b: Other poor-case signatures

A near-zero or compressed F1 across *all* attempts can also mean (observed
across the GO set, 2026-05-15):

- **Eval base-state contamination** — a foreign, unrelated edit block appears
byte-identical in all (or most) attempts because it leaked into the eval
base branch. Whole-file metadiff then craters recall and masks correct work.
Tell: the same large hunk touching terms unrelated to the issue in every
attempt, including no-op runs. Judge only the issue-relevant hunk.
- **Gold edits only a metadiff-ignored field** — e.g. gold changes only
`created_by`, which OBO metadiff normalizes away, so every attempt scores
F1=0 by construction even when byte-identical to gold.
- **Gold curator-repudiated** — the merged gold was reverted or objected to by
curators shortly after; reproducing it faithfully is not the quality target.
- **Gold has an out-of-scope extra edit** the issue never asked for, capping
well-scoped agents below 1.0.

All of these are `case_quality: poor` and flagged in `METADATA.md` (Step 7a)
with an appropriate `case_quality_reason`. Conversely, do **not** flag a case
poor merely because F1 is uniformly < 1.0 due to `term_tracker_item`,
provenance, or free-text comment-wording convention differences — that is
normal metadiff under-representation; judge substance and say so in the review.

## Step 4: Read the agent's PR

```bash
gh pr diff {eval_repo_pr} --repo ai4curation/{eval_repo}
```

Where `eval_repo` maps from the ontology name:

| ontology | eval_repo |
|----------|-----------|
| go-ontology | eval-ont-agent-go |
| cell-ontology | eval-ont-agent-cl |
| uberon | eval-ont-agent-uberon |
| mondo | eval-ont-agent-mondo |

If traces are available, check them for insight into the agent's reasoning:

```bash
gh api repos/ai4curation/{eval_repo}/contents/traces --jq '.[].name' | head -20
```

## 4b: gain further context

To gain further context or to help adjudicate, you should explore both
documentation and existing terms on the source repo. Don't guess about
best practice.

## Step 5: Compare and assess

Consider these dimensions:

### Correctness
Did the agent make the right changes? Are the ontological edits valid?
Compare the substance of the diff, not just the line-by-line match.

### Completeness
Did the agent address all parts of the issue? Missing steps (e.g., forgot to
update cross-references, didn't add a replaced_by) count against completeness.

### Scope discipline
Did the agent stick to what was asked, or did it make additional changes?
Extra changes aren't necessarily wrong — fixing a pre-existing bug while
you're in the neighborhood is often good practice. But gratuitous edits that
don't serve the issue reduce precision and risk introducing errors.

Evaluate whether extra edits were:
- **Justified**: fixing a genuine problem discovered during the work
- **Defensible**: reasonable but not strictly necessary
- **Over-editing**: changes unrelated to the issue

### Methodology
Did the agent follow a reasonable process? Evidence of research, term search,
validation, and design pattern consultation indicates good methodology even if
the final result isn't perfect. Look at PR_COMMENTS.md and ISSUE_COMMENTS.md
if present in the agent's PR.

### Metadiff score interpretation
The F1/precision/recall scores compare the agent's diff to the human's
line-by-line (after normalization). These are useful but imperfect:

- **F1 < 1.0 with high precision**: agent did less than the human (missed some changes)
- **F1 < 1.0 with high recall**: agent did more than the human (extra changes)
- **F1 = 0**: agent either made no changes or completely different changes
- **F1 = 1.0**: agent's diff matches the human's exactly (after normalization)

A score of 0.8 with precision=0.889 and recall=0.727 means the agent made
mostly the same changes as the human but included some extras (lowering recall
from the human's perspective). This can still be a good outcome.

## Step 6: Write the review

Fill in the three sections in the stub file:

### Summary
Two to three sentences: what the agent did, whether it succeeded, and the
headline finding. Mention the metadiff score and whether it over- or
under-represents the actual quality.

### Strengths
Bullet points. What the agent got right. Be specific — cite term IDs,
patterns followed, skills used.

### Issues
Bullet points. What went wrong or could be better. Distinguish between:
- Errors (wrong edits, broken syntax)
- Omissions (missed part of the issue)
- Scope issues (extra edits beyond the issue)
- Style (valid but different from the human's approach)

If there are no issues, say so.

## Step 7: Fill in frontmatter fields

Update these fields in the YAML frontmatter:

- **outcome**: One of `success`, `partial_success`, `failure`, `no_output`
- `success`: agent addressed the issue correctly with no significant problems
- `partial_success`: core task done but with notable issues (scope, omissions)
- `failure`: agent did not solve the issue or made significant errors
- `no_output`: agent produced no changes (empty diff)
- **failure_modes**: List from: `over_editing`, `under_editing`, `wrong_term`,
`syntax_error`, `missed_requirement`, `wrong_pattern`, `scope_creep`,
`no_changes`, `instruction_violation`
- **reviewed_by**: Your model identifier (e.g., `gpt-5.5`, `claude-opus-4.7`)
- **reviewed_at**: Today's date in YYYY-MM-DD format

## Step 7a: Flag poor evaluation cases (curated metadata only)

If you determined in Step 3a that the gold PR is only a sub-step of a
multi-PR human resolution (or the case is otherwise a poor reference — e.g.
the gold PR is wrong, or the issue was substantively renegotiated in
comments), record this in the case's **`METADATA.md`**, NOT the
`CASE_BRIEF.md`.

- `CASE_BRIEF.md` is **auto-generated and derived** — never edit it; any
change will be overwritten on regeneration.
- `METADATA.md` (same directory) is **hand-curated** and is the correct place
for durable curator findings.

In `METADATA.md`, add to the frontmatter:

```yaml
case_quality: poor # poor | ok | good
case_quality_reason: gold_pr_is_partial # short slug
companion_prs: [32023, 32069] # other human PRs that resolved the issue
scoring_caveat: "metadiff vs #32021 only covers the taxon-constraint sub-step; judge attempts against the issue and the union of #32021+#32023+#32069"
```

and add a `## Curation Note (data quality)` section to the body explaining
the finding so downstream scoring/aggregation can exclude or down-weight the
case. Then review the attempts **in light of the issue's actual instructions**
rather than the misleading metadiff.

## Step 8: Rename the file

Rename the file from `-stub.md` to `-complete.md` to mark it as reviewed.

## Notes

- Be honest. A high metadiff score with real problems is still a problem.
A low score with defensible extra work deserves credit.
- Don't fill in rubric scores (instruction_following, correctness, etc.)
unless specifically asked. The narrative review is more valuable.
- If the issue is ambiguous and the agent made a reasonable interpretation,
note this. Ambiguous issues are harder and agents deserve credit for
reasonable judgment calls.
- If you cannot access the issue or PR (404, permissions), note this in the
review rather than guessing.
- `CASE_BRIEF.md` is derived/auto-generated — **never edit it**. Durable
curator findings (poor-case flags, metadata corrections) go in the
hand-curated `METADATA.md` in the same case directory.
- A case where every attempt scores ~0 F1 is a strong signal to apply
Step 3a before concluding the agents failed — the gold PR may be partial.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ tests/integration/

# derived app output
analyses/app/
analysis/gallery.html

# Byte-compiled / optimized / DLL files
__pycache__/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<h2>What should the detail pane show?</h2>
<p class="subtitle">Each case has metadata, narrative, and (eventually) agent results</p>

<div class="options">
<div class="option" data-choice="a" onclick="toggleSelect(this)">
<div class="letter">A</div>
<div class="content">
<h3>Everything scrollable</h3>
<p>Metadata badges at the top, then full markdown narrative, then a collapsible "Agent Attempts" section at the bottom with sub-entries per agent run (diff viewer, review scores).</p>
<p style="color: var(--text-secondary); font-size: 0.85rem;">Simple, linear. You scroll to see more. Agent attempts are collapsible so they don't dominate.</p>
</div>
</div>

<div class="option" data-choice="b" onclick="toggleSelect(this)">
<div class="letter">B</div>
<div class="content">
<h3>Tabbed sections</h3>
<p>Top area always shows metadata badges. Below that, tabs: <strong>Overview</strong> (narrative), <strong>Human Diff</strong>, <strong>Agent Attempts</strong> (sub-tabs per model/run). Each tab fills the remaining space.</p>
<p style="color: var(--text-secondary); font-size: 0.85rem;">Organized, but more clicks to see everything. Good if diffs are long.</p>
</div>
</div>

<div class="option" data-choice="c" onclick="toggleSelect(this)">
<div class="letter">C</div>
<div class="content">
<h3>Split: metadata+narrative top, results bottom</h3>
<p>Top half: metadata badges + compact narrative. Bottom half: tabbed agent results (diff viewer, scores, reviews). Both halves scroll independently.</p>
<p style="color: var(--text-secondary); font-size: 0.85rem;">See the "gold standard" case and agent attempts simultaneously. Good for comparison.</p>
</div>
</div>
</div>
Loading
Loading