eval-loop
Conduct a local Publisher evaluation loop in five steps: scrape/run, eval, diagnose, improve, checkpoint.
Skill by malloydata
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.
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.
About
Reviews
Write a reviewNo 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
- 0.784score
eval-import
malloydata
Turn a list of questions into an eval set, whatever shape it arrived in: a JSONL a customer sent, a CSV, a spreadsheet export, a markdown doc, an email…
SkillAFreshness: A★ 118Claude Code +9 - 0.784score
malloy-powerbi-review
malloydata
Move a Power BI semantic model (TMDL, PBIP, or .pbix) onto Malloy - read their model, transpile its DAX, and prove the numbers match.
SkillAFreshness: A★ 118Claude Code +9 - 0.784score
eval-improve
malloydata
Make the smallest safe edit that closes a diagnosed gap the model repo owns: a Malloy model edit, or a package skill under skills/.
SkillAFreshness: A★ 118Claude Code +9 - 0.784score
fix-scan-finding
malloydata
Fix a CRITICAL Trivy finding that is failing CI in this repo (a vulnerability, misconfiguration, or secret from security-scan.yml or image-scan.yml), or add…
SkillAFreshness: A★ 118Claude Code +9 - 0.784score
eval-diagnose
malloydata
Diagnose why a scored answer failed and who owns the fix, then cluster the failures by shared root cause.
SkillAFreshness: A★ 118Claude Code +9 - 0.784score
eval-answer
malloydata
Score one analytical answer against a verified golden, and score which of the entities the golden depends on retrieval delivered to the answerer.
SkillAFreshness: A★ 118Claude Code +9 - 0.779score
malloy-document
malloydata
Add documentation with #(doc) tags to Malloy models so fields and sources are described in plain language.
SkillAFreshness: A★ 118Claude Code +9 - 0.779score
eval-judge
malloydata
Decide whether ONE answer matches its golden, and say whether you believe the golden.
SkillAFreshness: A★ 118Claude Code +9 - 0.779score
malloy-getting-started
malloydata
First steps for using a Malloy Publisher deployment through its MCP tools.
SkillAFreshness: A★ 118Claude Code +9 - 0.779score
malloy-review
malloydata
Malloy semantic-model code review.
SkillAFreshness: A★ 118Claude Code +9 - 0.779score
eval-report
malloydata
Write the summary a person reads after an evaluation run: what ran, what it scored, which failures were the MODEL and which were the EVAL itself (out of…
SkillAFreshness: A★ 118Claude Code +9 - 0.779score
malloy-analysis-report
malloydata
Combine validated Malloy queries into a report (a linear report, read top to bottom).
SkillAFreshness: A★ 118Claude Code +9
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
- Repository
- github.com/malloydata/publisher
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from malloydata
- 0.784score
eval-import
malloydata
Turn a list of questions into an eval set, whatever shape it arrived in: a JSONL a customer sent, a CSV, a spreadsheet export, a markdown doc, an email…
SkillAFreshness: A★ 118Claude Code +9 - 0.784score
eval-answer
malloydata
Score one analytical answer against a verified golden, and score which of the entities the golden depends on retrieval delivered to the answerer.
SkillAFreshness: A★ 118Claude Code +9 - 0.784score
eval-diagnose
malloydata
Diagnose why a scored answer failed and who owns the fix, then cluster the failures by shared root cause.
SkillAFreshness: A★ 118Claude Code +9 - 0.784score
fix-scan-finding
malloydata
Fix a CRITICAL Trivy finding that is failing CI in this repo (a vulnerability, misconfiguration, or secret from security-scan.yml or image-scan.yml), or add…
SkillAFreshness: A★ 118Claude Code +9 - 0.784score
eval-improve
malloydata
Make the smallest safe edit that closes a diagnosed gap the model repo owns: a Malloy model edit, or a package skill under skills/.
SkillAFreshness: A★ 118Claude Code +9 - 0.784score
malloy-powerbi-review
malloydata
Move a Power BI semantic model (TMDL, PBIP, or .pbix) onto Malloy - read their model, transpile its DAX, and prove the numbers match.
SkillAFreshness: A★ 118Claude Code +9
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.
Cite this page
eval-loop skill. Agent Mart. https://agentmart.dev/skills/malloydata-eval-loop (last updated 2026-10-24)