Name the eval fixture's fields for what they mean - #187
Conversation
Pull request dashboard statusWaiting on reviewers · refreshed 2026-07-30 15:25 UTC Review the latest changes. Status above doesn't look right?
|
There was a problem hiding this comment.
Pull request overview
Renames reviewer-feedback evaluation fields and metrics to reflect their semantics without relabelling cases.
Changes:
- Renames fixture labels, roles, run fields, and adjudication fields.
- Renames scorer exclusion and inconsistency metrics.
- Updates fixture and scoring tests for the new schema.
Reviewed changes
Copilot reviewed 3 out of 4 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
eval/reviewer_feedback_cases.json |
Migrates evaluation data to the renamed schema. |
eval/score_reviewer_feedback.py |
Updates scoring and reporting terminology. |
test_eval_fixture.py |
Validates the migrated fixture schema. |
test_eval_scoring.py |
Updates scorer tests for renamed fields and metrics. |
Comments suppressed due to low confidence (1)
.github/scripts/pull-request-dashboard/eval/score_reviewer_feedback.py:254
- When drift is non-empty, this report branch still reads
d['baseline']below, but drift entries now carryrecorded_label. Every detected regression therefore raisesKeyErrorinstead of printing its details. Update that lookup to the renamed field.
"Moving a case to author_action keeps the pull request with its author, which "
"one /dashboard route:reviewers comment corrects. The reverse does not.\n"
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 3 out of 4 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (2)
.github/scripts/pull-request-dashboard/test_eval_fixture.py:58
- The fixture's top-level note still tells future adjudicators to set
adjudicated, while this migration makesadjudicated_labelthe field the validator and scorer read. Following that documented instruction would add an ignored field and leave the case out of accuracy scoring; update the fixture note to nameadjudicated_label.
for field in ("recorded_label", "adjudicated_label"):
.github/scripts/pull-request-dashboard/test_eval_scoring.py:54
- This assertion uses the renamed
inconsistentmetric, but the test method still calls candidate disagreement “flaky.” That retains the exact adjacent terminology ambiguity this migration is intended to remove; rename the test to use “inconsistent.”
self.assertEqual(1, len(summary["inconsistent"]))
This comment was marked as low quality.
This comment was marked as low quality.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 3 out of 4 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
.github/scripts/pull-request-dashboard/test_eval_fixture.py:81
- This still uses
roleto determinestability, so the new fields remain coupled despite the PR defining them as independent dimensions. A fully observed context case or a partially observed scored case would be rejected even thoughrolecontrols metric inclusion and run coverage should controlstability; branch onrun_labelscoverage instead.
if case["role"] == "context":
self.assertIsNone(case["stability"])
self.assertIsNone(case["recorded_label"])
self.assertIn(None, case["run_actions"])
continue
This comment was marked as low quality.
This comment was marked as low quality.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 3 out of 4 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
.github/scripts/pull-request-dashboard/test_eval_fixture.py:80
- This still couples coverage to stability by forcing every
contextcase to have null stability. The PR description says these dimensions are independent and that a partial case can still have agreed runs; for example,reviewer_feedback_cases.json:16050-16061has four identicalauthor_actionlabels and only one missing action, yet this assertion requires null. Derivestable/flakyfrom the availablerun_labelswhen there are enough to judge, reserving null only for insufficient observations, whilerolealone controls scoring.
self.assertIsNone(case["stability"])
This comment was marked as low quality.
This comment was marked as low quality.
…erminology # Conflicts: # .github/scripts/pull-request-dashboard/eval/score_reviewer_feedback.py
Rename fields in the reviewer-feedback evaluation set and its scorer. No case is relabelled and no classification is re-run; the migration is a field rename over the existing data.
substantiveandnoisedescribed the comment rather than the decision, andnoisewas unfair to an approval or an automation command, neither of which is noise so much as something the author owes nothing on. They becomeauthor_actionandno_author_action. The mapping from the shipped classifier's answers survives, but only one of its entries now carries meaning:authorandnonemap to the same concept under a clearer name, leavingunclear->author_actionas the single rule a reader has to learn, which is the fail-safe direction an unclassifiable item takes.stabilitypreviously carriedunobservedalongsidestableandflaky, which conflated two things: whether a case counts toward the metrics, and whether its runs agreed. Coverage now lives inrole, which isscoredorcontext, so the two can be read separately.stabilitystays null for every context case, because an unanswered run is not an observation and this migration does not relabel data. Recording agreement from a partial run set would give 14 of the 17 context cases a stability, some on as few as two observations; that is a data change and a judgement about how much evidence is enough, so it is left as follow-up rather than folded into a rename.flakynamed both the baseline's inconsistency and the candidate's, on adjacent lines of the same report. The scorer's metric is nowinconsistent, leavingflakyto mean only the recorded property.observed_runsandobserved_actionsread as though they hold runs rather than answers, so they becomerun_labelsandrun_actions.baselineandadjudicatedhold the same kind of value and are nowrecorded_labelandadjudicated_label. The scorer's three exclusion buckets were near synonyms and are nowno_answer,partial_answer, andtied.