Documentation 33
Answer-key eval pack · 53 items · 5 services
An answer key for a data set that never changes under your tests.
An eval needs two things: questions worth asking, and an answer you can compare against. The hard half has always been the second one, because the tools an agent reads are live accounts whose contents move while you are measuring. This is a downloadable file of 53 known facts about the olympus-labs data set, each with the request that answers it and the value it must come back with, plus a harness small enough to read in a sitting.
01 / What it is
Questions, requests, and the answers.
Every item names a question somebody would actually ask an agent, the tool calls that answer it, and the value the answer has to be. Nothing in it is invented: each one was read off a pinned host and each one cites the test in our repository that would fail if it moved. An item nobody can cite does not go in the pack, however true it is today.
{
"id": "gh-pull-number",
"service": "github",
"question": "Which pull request number in olympus-labs/parthenon carried the fix for the dropped-events incident?",
"tool_calls": [
{
"method": "GET",
"host": "gh-2026-03-g12.snap.sandboxapis.dev",
"path": "/repos/olympus-labs/parthenon/pulls/53"
}
],
"expected": {
"path": "number",
"equals": 53
},
"difficulty": "read",
"guarded_by": "packages/conformance/src/parity/pinned-cross-category.test.ts#closed_by_pull resolves to the closing PR on the GITHUB host, via the tracker's branchName"
}The 53 items carry one of three difficulties. 40 are read: one field off one response. 7 are join, where two responses have to agree and the second call is only reachable once the first has been read. 6 are reason, where the answer is computed from what came back rather than copied out of it.
02 / Why pinned hosts
The same answer every run.
A measurement taken against a moving target measures the target. Point an eval at a real GitHub organization and a merged pull request, a new reviewer or a renamed branch changes the score without anything about the agent changing, and the run you did this morning is not the run CI does tonight. So every host in this pack is a pinned snapshot: one compiled data set, addressed by a content hash, served under its own hostname.
03 / Running it
Three commands.
curl -O https://sandboxapis.dev/evals/olympus-labs-g12.json
curl -O https://sandboxapis.dev/evals/run.py
pip install requests && python3 run.pyIt prints a line per item and a score. There is a Node 22 harness beside it that needs no dependencies at all (node run.mjs), and both cache by request, so a full run costs 12 requests rather than one per item. Anonymous access is enough to finish it; a free key raises the limit and rides your own budget instead. Keys and rate limits has the numbers.
53/53 all correct (olympus-labs-g12-2026-09, 12 requests)04 / Your agent
One function to replace.
Out of the box both harnesses read the answer straight out of the response, which scores the data set and proves the pack is right. There is exactly one function to change, it already receives the question, the fetched responses and an agent flag, and the model call you need is written in a comment inside it. Put yours there, run with --agent, and the same expectations now score your agent instead.
def answer(item, responses, agent):
"""THE AGENT HOOK. With no flag this reads the answer out of the response, which
scores the DATA SET. Put your model call under "if agent:" and the same
expectations score the MODEL instead, which is what makes this an eval:
if agent:
reply = anthropic.Anthropic().messages.create(model="claude-sonnet-4-5",
max_tokens=256, messages=[{"role": "user", "content": item["question"] + json.dumps(responses)}])
return json.loads(reply.content[0].text)["answer"]
"""
return at(responses[-1], item["expected"]["path"])That is the whole difference between a smoke test and an eval: the fetch and the assertion stay where they are, and the middle beat becomes a model call. The agent tutorials teach the same shape one service at a time.
05 / The items
Every question in the pack.
Grouped by the service that answers it. The guarded_by field in the JSON names the test behind each row.
GitHub 12
| Item | Question | Difficulty |
|---|---|---|
gh-pull-number | Which pull request number in olympus-labs/parthenon carried the fix for the dropped-events incident? | read |
gh-pull-title | What is the title of pull request 53 in olympus-labs/parthenon? | read |
gh-pull-merged | Did pull request 53 in olympus-labs/parthenon merge, or was it closed without merging? | read |
gh-pull-author | Who opened pull request 53 in olympus-labs/parthenon? | read |
gh-pull-head-ref | Which branch did pull request 53 in olympus-labs/parthenon merge from? | read |
gh-pull-head-sha | What is the head commit SHA of pull request 53 in olympus-labs/parthenon? | read |
gh-review-state | What verdict did the review on pull request 53 in olympus-labs/parthenon leave? | read |
gh-review-count | How many reviews were submitted on pull request 53 in olympus-labs/parthenon? | reason |
gh-independent-approval | Pull request 53 in olympus-labs/parthenon was approved. Who signed it off, and was that somebody other than its author? | join |
gh-merged-inside-window | FATE-51 was resolved at 2026-06-19T16:21:17Z. When did the pull request that fixed it merge, and was that before the tracker closed the issue? | reason |
gh-branch-exists | Is hotfix/backfill-job-ooming a real branch in olympus-labs/parthenon, or only a string on the pull request? | read |
gh-branch-sha-matches-pull | Does the branch named on pull request 53 point at the same commit the pull request calls its head? | join |
Jira 11
| Item | Question | Difficulty |
|---|---|---|
jira-issue-key | Which Jira issue key tracks the incident where events were dropped during a rebalance? | read |
jira-summary | What summary does the Jira host give FATE-51? | read |
jira-status | What status does the Jira host report for FATE-51? | read |
jira-issue-type | What issue type is FATE-51 filed as? | read |
jira-assignee | Who is FATE-51 assigned to? | read |
jira-estimate | What story point estimate does FATE-51 carry? | read |
jira-created | When was the incident issue FATE-51 filed? | read |
jira-resolved | When was the incident issue FATE-51 resolved? | read |
jira-beat-the-target | FATE-51 was filed at 2026-06-17T19:51:17Z and the team's target is to close an incident within 72 hours. When did it resolve, and did it beat the target? | reason |
jira-project-key | Which Jira project does FATE-51 belong to? | read |
jira-project-name | What is the name of the Jira project whose key is FATE? | read |
Slack 14
| Item | Question | Difficulty |
|---|---|---|
slack-incident-channel-name | Which channel in the olympus-labs workspace is the incident bridge? | read |
slack-incident-channel-id | What is the channel id of #incident-bridge? | read |
slack-opener-text | What did the message that opened the incident thread in #incident-bridge say? | read |
slack-opener-ts | What is the Slack timestamp of the message that opened the incident thread? | read |
slack-reply-count | How many replies does the incident thread in #incident-bridge carry? | read |
slack-opener-user-id | Which user id posted the message that opened the incident thread? | read |
slack-distinct-speakers | How many different people spoke in the incident thread in #incident-bridge? | reason |
slack-thread-length | Counting the message that opened it, how many messages are in the incident thread? | reason |
slack-parent-leads | When the incident thread is fetched, which message comes first? | read |
slack-thread-runs-forward | The incident thread must run forward in time, with nobody replying before it was opened. What is the timestamp of its last message? | reason |
slack-all-clear-text | How was the incident thread in #incident-bridge closed out? | read |
slack-all-clear-user-id | Which user id posted the last message in the incident thread? | read |
slack-opener-name | Resolving the user id on the first message, who opened the incident thread in #incident-bridge? | join |
slack-all-clear-name | Resolving the user id on the last message, who called the all clear on the incident? | join |
GitLab 6
| Item | Question | Difficulty |
|---|---|---|
gl-merge-request-iid | The fix merged from hotfix/backfill-job-ooming. Which merge request iid carries that branch in olympus-labs/parthenon on the GitLab host? | read |
gl-merge-request-source-branch | What source branch does merge request 13 in olympus-labs/parthenon carry? | read |
gl-merge-request-sha | What head SHA does the GitLab host report for merge request 13 in olympus-labs/parthenon? | read |
gl-branch-exists | Does the GitLab host serve hotfix/backfill-job-ooming as a real branch of olympus-labs/parthenon? | read |
gl-branch-sha | Which commit does hotfix/backfill-job-ooming point at on the GitLab host? | read |
gl-sha-matches-github | Two git hosts serve this repository. Do the GitHub pull request and the GitLab merge request for the same branch agree on the head SHA? | join |
Linear 10
| Item | Question | Difficulty |
|---|---|---|
linear-identifier | What identifier does the Linear host give the incident issue FATE-51? | read |
linear-title | What title does the Linear host give FATE-51? | read |
linear-estimate | What estimate does the Linear host report for FATE-51? | read |
linear-state | What workflow state is FATE-51 in on the Linear host? | read |
linear-created | When was FATE-51 created, according to the Linear host? | read |
linear-completed | When was FATE-51 completed, according to the Linear host? | read |
linear-branch-name | Which git branch does the Linear host say belongs to FATE-51? | read |
linear-team-key | Which team owns FATE-51 on the Linear host? | read |
linear-title-matches-jira | Two trackers hold this incident. Does the title the Linear host serves for FATE-51 match the summary the Jira host serves? | join |
linear-close-matches-jira | Jira resolved FATE-51 at 2026-06-19T16:21:17Z. Does the Linear host report the same close, to the second, in its own date dialect? | join |
06 / Downloads
Four files.
Version olympus-labs-g12-2026-09. The version string changes whenever the generation or the item set does, so a customer pins it the way they pin a host.
Next
Ask for more items.
This pack reads one incident told by 5 services. If the corner of the data set your agent works in is missing, or you want harder questions, say so and we will add them: tell us what you need. Items are added, never renumbered, so a score stays comparable across versions.
Agent tutorials · SandboxAPIs for agents · MCP setup · Versioning and pinning