eval
Capture task quality signals and log them to agent memory to build a feedback loop. Use at the end of each implemented task or merged PR.
SKILL.md.claude/skills/eval/SKILL.md
GitHub/eval — Feedback-loop capture
Eval design — building feedback loops with verifiable signals — is a core agentic skill. Run this at the end of each implemented task or merged PR so that what worked (and what didn't) becomes durable, queryable agent memory instead of being lost between sessions.
When to use
- Immediately after
/implementfinishes and tests are green. - Right after a PR merges.
- After abandoning or re-scoping a task (capture the why).
Step 1 — Record the three signals
Collect these verifiable signals for the task you just finished:
| Signal | Values | How to measure |
|---|---|---|
test_pass_rate |
yes / partial / no |
Did the test suite (or the task's failing stubs) end fully green? partial = some still red/skipped. |
first_try_success |
yes / no |
Did the implementation pass its tests on the first run, with no rework cycle? |
iteration_count |
integer (≥ 1) | Number of implement→test→fix cycles before done. |
Step 2 — Map the outcome to a memory candidate
Use the signals to decide what to remember and how confident to be:
| Outcome | Memory candidate type | Confidence |
|---|---|---|
| First-try success, all tests green | successful_pattern |
high |
| More than 2 iterations to finish | recurring_issue |
medium |
| Tests were missing (no stubs existed before implementation) | working_rule |
high |
Write the candidate as a concise, factual statement (active voice), e.g.:
successful_pattern: "IPC handlers inelectron/main.tsare fastest to land when the failing stub is written inelectron/__tests__first."recurring_issue: "database.engine: apichanges repeatedly break because the SQL shape isn't validated against the backend contract before coding."working_rule: "Always author a failing test stub for newdb.tsquery helpers before implementing — tasks that skipped this needed 3+ iterations."
Step 3 — Log the candidate to agent memory
Persist the candidate so future sessions can retrieve it. Example logging call:
/log-session --candidate \
--type successful_pattern \
--confidence high \
--signals "test_pass_rate=yes,first_try_success=yes,iteration_count=1" \
--note "IPC handler tasks land first-try when the failing stub is written first."
In this repo the durable store is the Memory MCP knowledge graph (see the
memory-mcp skill). If /log-session is not wired up, equivalently call the Memory
MCP directly: search_nodes first to avoid duplicates, then add_observations
(existing entity) or create_entities (new), tagging the candidate type and
confidence and including the three signals as observations.
Done when
- The three signals are recorded for the task.
- A memory candidate (type + confidence) has been written to agent memory, or you explicitly noted that no candidate was warranted.
See also
memory-mcpskill — the durable agent-memory store this feedback loop writes to./log-session— session/candidate logging entry point (when configured)./implement— tests-first execution that produces the signals captured here.