feat(eval): add measurement manifests for online scoring - #722
Conversation
PR Summary by QodoAdd per-agent measurement manifests for online scoring (trace_fitness em-001)
AI Description
Diagram
High-Level Assessment
Files changed (8)
|
|
🤖 Review · Commit: |
Code Review by Qodo
1.
|
|
🤖 Review · Commit: |
|
🤖 Finished Review · ✅ Success · Started 11:55 AM UTC · Completed 12:08 PM UTC Commit: |
ReviewFindingsLow
Previous runReviewFindingsLow
Labels: PR adds YAML policy files and documentation for eval measurement manifests Previous run (2)ReviewFindingsLow
|
c1dbd68 to
74b8959
Compare
|
🤖 Review · Commit: |
|
🤖 Finished Review · ✅ Success · Started 1:34 PM UTC · Completed 1:48 PM UTC Commit: |
waynesun09
left a comment
There was a problem hiding this comment.
MEDIUM: No CI/pre-commit validation for eval/measurements/*.yaml — bad scorer/agent values silently no-op forever
(Referencing .pre-commit-config.yaml line 49, which isn't part of this PR's diff, so noting it here in the review body instead of inline.)
Confirmed on head 93d3db9f: the repo has a pre-commit hook lint-agent-docs (./hack/lint-agent-docs) scoped via files: ^(harness/|docs/|hack/lint-agent-docs) that validates every harness/*.yaml has a valid doc: field, and a separate eval/lint-cases.sh that validates eval/<agent>/cases and eval.yaml judges — but neither covers the new eval/measurements/*.yaml files added in this PR, and no .github/workflows/*.yml step does either. Only the generic check-yaml pre-commit hook (syntax-only) applies.
On the consumer side, in the companion PR fullsend-ai/fullsend#6036, internal/evalmeasure/registry.go's ScoreTrace has:
switch m.Scorer {
case ScorerFitness: ...
default: // Unknown scorers are skipped (forward-compatible)
}i.e. a typo'd scorer: value (e.g. trace-fitness with a hyphen) or a misspelled agent: value that never matches a trace's agent name would pass this repo's CI cleanly, merge, and then silently produce zero measurements for that agent in production with no error/log/CI failure.
The six current manifests all correctly use the literal trace_fitness matching const ScorerFitness = "trace_fitness" in fitness.go, so nothing is broken today, but there's no guardrail against this on the next manifest edit or new-agent addition.
Suggestion: Add a small lint script (sibling to hack/lint-agent-docs, or extend eval/lint-cases.sh) that validates eval/measurements/*.yaml: agent: matches an existing agents/<name>.md, measurements[].id is unique per file, and .scorer/.version are present/well-formed (and, once the fullsend-side registry is stable, checked against a known-scorer allow-list). Wire it into .pre-commit-config.yaml (files: ^eval/measurements/) so a typo fails CI instead of silently no-op'ing at runtime.
Introduce per-agent measurement manifest YAML files that select which eval measurement scorers run after managed agent jobs. Every agent except scribe gets trace_fitness (EM-001) at initial ship. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Lowercase EM-001 to em-001 in README to match manifest YAML files. Add --- document start markers to all measurement manifests for consistency with harness/*.yaml convention. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Replace ambiguous "every listed agent" phrasing with an explicit list of the six agents that enable trace_fitness at initial ship. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Spell out agents@v0 defaults vs local overrides, engine-vs-policy split with fullsend#6036, and when a change needs fullsend vs agents. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
Match eval/measurements/README.md link style for ADR 0087 so the measurement manifest section uses consistent markdown hyperlinks. Signed-off-by: Adam Scerra <ascerra@redhat.com> Co-authored-by: Cursor <cursoragent@cursor.com> Signed-off-by: Adam Scerra <ascerra@redhat.com>
93d3db9 to
228c7b5
Compare
|
🤖 Review · Commit: |
|
🤖 Review · ❌ Terminated · Started 11:51 AM UTC · Ended 12:04 PM UTC Commit: |
|
Code review by qodo was updated up to the latest commit 228c7b5 |
| @@ -0,0 +1,6 @@ | |||
| --- | |||
There was a problem hiding this comment.
[low] yaml-document-marker-consistency
The six new measurement manifests use the YAML document start marker (---) on line 1, while all existing YAML files under eval/ (e.g. eval/code/eval.yaml, eval/triage/cases/001-bug-url-encoding/input.yaml) omit it. This introduces a minor style inconsistency within the eval/ tree. Since these files live in their own subdirectory and serve a distinct purpose, this is cosmetic rather than harmful, but dropping the --- would align with the established convention.
|
🤖 Finished Review · ✅ Success · Started 11:51 AM UTC · Completed 12:04 PM UTC Commit: |
waynesun09
left a comment
There was a problem hiding this comment.
Automated review sweep — 3 findings (0 duplicates skipped after checking existing inline comments/reviews on this PR).
| @@ -0,0 +1,6 @@ | |||
| --- | |||
There was a problem hiding this comment.
MEDIUM: review.yaml enables em-001 even though its work_item sub-check can never pass for review traces
Verified against the companion PR's actual code (fullsend-ai/fullsend#6036, internal/evalmeasure/fitness.go @ 615dd691c2): ScoreFitnessNamed requires 8/8 sub-checks to pass for label="pass". One sub-check, workItemOK(run), requires fullsend.work_item_id to be set and not the literal "unknown". The code's own comment states: '"unknown" is the CLI sentinel when no ISSUE_*/GITHUB_ISSUE_URL is set (common for review, which wires PR_NUMBER / GITHUB_PR_URL instead).' This is confirmed by the companion PR's own test fixture testdata/review-unknown-workitem.jsonl (fullsend.work_item_id="unknown") and score_test.go's TestScoreFitness_ReviewUnknownWorkItemFails, which asserts Explanation contains work_item=fail and missing: work_item for an agent:review trace. Since this agents-repo PR enables em-001 for review, review's fitness score is structurally capped at 7/8=0.875 and will always report label=fail by design — nothing in this PR or the companion PR's manifest/README documents that cap specifically for review, and it is presented as uniform across all six enabled agents.
Suggestion: Add a note next to review.yaml (or in the README's per-agent table) that review's em-001 label will always read 'fail' until the scorer gains a PR-based identity check or review starts populating fullsend.work_item_id, so downstream trend consumers don't mistake the permanent fail for a regression.
|
|
||
| Executable logic stays in fullsend because `fullsend eval-measure` is the | ||
| released binary that reads `run-telemetry.jsonl` (produced by fullsend). This | ||
| repo is content/policy, not that binary. Platform checks like EM-001 |
There was a problem hiding this comment.
MEDIUM: EM-001/em-001 casing inconsistency reintroduced after prior fix
A prior review thread on this PR (resolved) flagged the manifests using 'em-001' while the README used 'EM-001', and commit e8b75c0 ('fix(eval): normalize ID casing and add YAML document markers') fixed that original occurrence, correctly using lowercase in the 'First ship' section and the id: field. However, a later commit, 4d5728a ('docs(eval): clarify measurement manifest ownership'), rewrote/expanded the README and introduced a brand-new sentence at this line — 'Platform checks like EM-001 (trace_fitness) still get enabled here for each stock agent' — using uppercase again, while lines 47/54 in the same file (added by the same rewrite) correctly use lowercase 'em-001' matching the manifests' literal id: fields. This is a new, unresolved instance of the exact ambiguity the earlier fix addressed, at a different location than the already-resolved thread, so it was never caught by the earlier fix.
Suggestion: Change 'Platform checks like EM-001' to 'Platform checks like em-001' so the file consistently uses the manifest's literal id: em-001 casing everywhere.
| | Custom policy for one org or a BYOA agent | Local override in the consumer repo | | ||
|
|
||
| Companion platform PR: [fullsend-ai/fullsend#6036](https://github.com/fullsend-ai/fullsend/pull/6036) | ||
| ([ADR 0087](https://github.com/fullsend-ai/fullsend/blob/main/docs/ADRs/0087-eval-measurements-online-trace-scoring.md) |
There was a problem hiding this comment.
MEDIUM: ADR 0087 hyperlink 404s (target doesn't exist on fullsend main)
Both this line and eval/README.md:151 render a live markdown hyperlink to https://github.com/fullsend-ai/fullsend/blob/main/docs/ADRs/0087-eval-measurements-online-trace-scoring.md. Verified with curl (https://raw.githubusercontent.com/fullsend-ai/fullsend/main/docs/ADRs/0087-eval-measurements-online-trace-scoring.md -> HTTP 404) and via gh pr view 6036 --repo fullsend-ai/fullsend (state OPEN, mergedAt null) that ADR 0087 only exists on the still-unmerged companion PR fullsend-ai/fullsend#6036. This is distinct from the two already-posted review comments on this PR (one asked to add a direct URL 'when the ADR is published', the other flagged plain-text-vs-hyperlink inconsistency) — commit 228c7b5 ('docs(eval): hyperlink ADR 0087 in eval README', current head) added the real hyperlink before the ADR was published, so the link now renders and 404s for anyone who clicks it prior to #6036 merging.
Suggestion: Hold merging this PR until fullsend-ai/fullsend#6036 lands, or temporarily point both links at the PR itself (https://github.com/fullsend-ai/fullsend/pull/6036) and swap to the permanent docs/ADRs/0087 URL once #6036 merges.
Summary
Add default measurement manifests for stock fullsend agents under
eval/measurements/. These are the online-scoring policy that ships with the agents (“here iscode, and here is what we measure on wildcoderuns”).Companion engine PR: fullsend-ai/fullsend#6036 (ADR 0087,
fullsend eval-measure, EM-001trace_fitness).Ownership (please read)
eval/measurements/<agent>.yamlFULLSEND_DIR${FULLSEND_DIR}/eval/measurements/${AGENT}.yamlif present, else fetchagents@v0from this path. Stock-agent users do not copy these files into every repo.run-telemetry.jsonlproduced by fullsend.assert:→ fullsend; new id / enable / disable / thresholds for a stock agent on an existing scorer → this repo; org-specific policy → consumer override.Changes
eval/measurements/{code,fix,prioritize,retro,review,triage}.yaml— each enablestrace_fitness(em-001) @ version 1eval/measurements/README.md— ownership, resolution, when to PR whereeval/README.md— short section + links to fullsend#6036 / ADR 0087Test plan
agent+measurements[].{id,scorer,version})v0(or the pin fullsend uses) includes these paths so wild runs stop skipping measureNotes for reviewers
eval/<agent>/are unchanged and separate.v0), measure steps skip fail-open — that is expected.