Skip to content
Agentmart
Submit a tool

eval-loop

Conduct a local Publisher evaluation loop in five steps: scrape/run, eval, diagnose, improve, checkpoint.

Skill by malloydata

IndexedMIT★ 118
Write a review

Chalk Labs

Need help deploying eval-loop?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/malloydata-eval-loop

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Conduct a local Publisher evaluation loop in five steps: scrape/run, eval, diagnose, improve, checkpoint. You are the conductor: import cases into the file ledger, spawn a blind answerer, then run eval-answer, eval-diagnose, and eval-improve. Persistence is plain files: the set in the model package's evals/ directory, runs in the set's workdir; checkpoints are git commits of the model repo. `eval.py` runs each step from the set's eval.toml. Use to score a model, diagnose failures, improve behind an acceptance check, or roll back a bad direction.

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found
Runs as
Python package

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/eval-loop

What's inside

Skill name
eval-loop
Description
Conduct a local Publisher evaluation loop in five steps: scrape/run, eval, diagnose, improve, checkpoint. You are the conductor: import cases into the file ledger, spawn a blind answerer, then run eval-answer, eval-diagnose, and eval-improve. Persistence is plain files: the set in the model package's evals/ directory, runs in the set's workdir; checkpoints are git commits of the model repo. `eval.py` runs each step from the set's eval.toml. Use to score a model, diagnose failures, improve behind an acceptance check, or roll back a bad direction.
License
MIT
Instructions
554 lines in SKILL.md · view on GitHub

Before installing

  • Ships executable scripts

Agent Skills spec issues

  • body: 554 lines (spec recommends under 500)

Files (32)

  • SKILL.md
  • acceptance-check.md · reference/
  • auditing-an-answer-key.md · reference/
  • checking-the-judge.md · reference/
  • golden-side-door.md · reference/
  • measurement.md · reference/
  • running-a-run.md · reference/
  • setting-up-a-set.md · reference/
  • agent_harness.py · scripts/
  • agent_harness_test.py · scripts/
  • build_run_package.py · scripts/
  • build_run_package_test.py · scripts/
  • check_judge.py · scripts/
  • check_judge_test.py · scripts/
  • check_set.py · scripts/
  • check_set_test.py · scripts/
  • eval.py · scripts/
  • eval_test.py · scripts/
  • flip_table.py · scripts/
  • flip_table_test.py · scripts/
  • package_skills_test.py · scripts/
  • platform_target_test.py · scripts/
  • run_baseline.py · scripts/
  • run_baseline_test.py · scripts/
  • serve.py · scripts/
  • serve_test.py · scripts/
  • README.md · templates/eval-run-package/
  • eval_run.malloy · templates/eval-run-package/
  • eval_run.malloy · templates/eval-run-package/notebooks/
  • app.js · templates/eval-run-package/public/
  • index.html · templates/eval-run-package/public/
  • publisher.json · templates/eval-run-package/

SKILL.md (first lines)

# The Evaluation Loop

You conduct this loop. There is no batch orchestrator to start, no eval API,
and no eval MCP tools. The ledger is plain files: the set in the model
package's git repository, and each run in the set's workdir
(`reference/ledger-schema.md` in `skill:eval-answer` defines every file and
event). `scripts/eval.py` runs each step from the set's `eval.toml`;
`reference/running-a-run.md` has the commands. Scoring is an LLM judge you spawn per case. There is no
scripted scorer, and there will not be one: a script that can pass a wrong
answer is worse than none. The scripts under `scripts/` run the loop -- they
answer, re-execute, spawn the judge, compare runs, and write the ledger -- but
none of them decides whether an answer was right.

```
scrape/run  ->  eval  ->  diagnose  ->  improve  ->  checkpoint
```

**This skill conducts; it does not restate.** Scoring lives in
`skill:eval-answer`. Components and owners live in `skill:eval-diagnose`.
Edit rules live in `skill:eval-improve`.

Do not merge **eval** into **diagnose**. A conductor who scores while
explaining writes the explanation into the score. Do not skip the **acceptance
check** inside improve. The acceptance check decides whether *this* edit
stays. **Checkpoint** decides whether a *sequence* of accepted edits can be
undone.

## Where the rest of this lives

This file is the procedure. The things it used to carry inline are files beside
it now, because each is needed at one moment rather than every run, and loading
all of them for every run is how a skill stops being read.

| When | Read |
|---|---|
| the set does not exist yet, or has never run | `reference/setting-up-a-set.md` |
| about to run one | `reference/running-a-run.md` |
| a golden is wrong, doubted, or out of step with the model | `reference/golden-side-door.md` |
| auditing a key you doubt, or a set you did not author | `reference/auditing-an-answer-key.md` |
| deciding whether an edit stays | `reference/acceptance-check.md` |
| about to quote a number, set the band, or read a set's flips | `reference/measurement.md` |
| the run finished and someone has to read it | `skill:eval-report` |
| you changed judge doctrine or its inputs | `reference/checking-the-judge.md` |

Read the file, do not work from the summary here. The acceptance-check rules and
the golden side door are both places where acting on a half-memory of the rule
produces a confident wrong answer rather than an error.

## The five steps

| Step | Job | Writes |
|---|---|---|
| **a. scrape / run** | Put cases in the ledger; spawn a blind answerer | cases; `attempt`, `tool_call` |
| **b. eval** | Judge the answer; score which required entities retrieval delivered | `score` |
| **c. diagnose** | Why it failed, who owns it | `issue` / `issue_status`. Stop. Do not edit. |
| **d. improve** | One smallest model edit, then the acceptance check | improve writes `candidate`; you write `acceptance_check`. Revert on reject. |
| **e. checkpoint** | Git commit after an accepted acceptance check | `checkpoint` event, then the commit |

Every run then **reports** (below). A run whose result exists only as JSONL and
a scrolled-away console summary has not been delivered.

**scrape** and **run** share a letter but are not the same job. Scrape writes
cases. Run writes attempts. Do not invent questions and score
them in one breath.

**Step d is `skill:eval-improve`, not a hand edit plus another arm.** The
failure mode is specific and it has happened: the edits were made by hand,
published, and validated by re-running the whole arm -- with the answer key
repaired in the same window. No `candidate`, `acceptance_check` or `checkpoint`
event exists in that run's ledger, and the resulting move cannot be attributed
to the model, the key, or the answerer. Re-running a whole arm after changing
two things is the one thing the acceptance check exists to replace: it scores
the edit against dev AND holdout, and it is cheaper than the arm.

### Scrape, minimally

Importing an existing corpus IS the scrape step: copy the set from its home
(for example a benchmarks checkout) into `evals/<set>/` and convert to the
ledger shapes. **`skill:eval-import` is that job in full** -- how to classify
what arrived with each question, why nothing imports as a verified value, and
the seal that makes a later edit to a question detectable. Read it whenever the
questions came from outside, which is most of the time. While importing:

- Freeze each case's `split`: `dev` or `holdout`. Diagnose and improve read
  dev cases only; the acceptance check runs both. A set that is all dev cannot defend an
  accept.
- Later, each diagnosed-and-fixed failure becomes a new frozen dev case, so a
  fixed bug cannot silently return.

Scraping from production logs (chat transcripts, retrieval traces) is the
other supported source, and usually the better one: real traffic asks what
people actually ask. Where your logs physically live is a host concern; look
for a host-specific log-fetching skill. `skill:eval-import` takes over once
you have the text, and its `reference/case-format.md` covers what a log pull
needs that a question list does not.

Prefer variety over volume when you sample, from either source. Cases that
differ in grain, source, filter shape, and phrasing are what move a
measurement; a second sample of the same case is nearly free of new
information.

### Mode aliases

Older mode names still work as aliases for how far one run walks:

| Alias | Steps |
|---|---|
| `measure` | scrape/run + eval (`eval.py package` then needs `--without-diagnosis`) |
| `triage` | plus diagnose |
| `improve` | plus improve + acceptance check + checkpoint on accept |

Say which alias (or which steps) you are running before the first question.
Record it in `run.json`. Do not mix steps in a way that lets the answerer see
gold, issues, or the model file.

Most runs should stop after eval. Diagnose when you need a histogram of
components and owners. Improve only for diagnosed *model* gaps, one batch at
a time. Checkpoint only after the acceptance check **accepts**.

From malloydata/publisher, MIT.

More from malloydata/publisher

Signals

Stars
118
Forks
31
Open issues
106
Last commit (this folder)
Oct 16, 2026 (14 days ago)
Last release
Oct 18, 2026 (12 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from malloydata

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get eval-loop running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying eval-loop?

CallGet help
Cite this page

eval-loop skill. Agent Mart. https://agentmart.dev/skills/malloydata-eval-loop (last updated 2026-10-24)