Skip to content

fix(annotate): replay a checker-decided reading with its answer - #5

Merged
that-guy-wade merged 2 commits into
mainfrom
fix/annotate-tiebreak-replay
Oct 13, 2026
Merged

that-guy-wade merged 2 commits into
mainfrom
fix/annotate-tiebreak-replay

Conversation

@that-guy-wade

@that-guy-wade that-guy-wade commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Since 0.8.9 a CHECKER can uphold the simulated user's reading against a sure reader or judge. Recorded questions leave out user_answer, which steers that tie-break, so that saved causality answers keep their keys. annotate._stale replays the readings in the causal question's context to check the answers have not changed since the verdict. It rebuilt each question without user_answer, so a tie-break reading replayed as the reader's own answer and always looked stale. annotate then printed "answers changed; regrade before causal adjudication" forever. Found in review of the DonnaBench pin of 0.8.9.

The causal question's context records the simulated user's decisions, and a reading's id names its decision. _user_answer derives the answer that decision implies, as _read_checks sets it, and each reading replays with it. Question keys and verdicts do not change.

Changes

  • annotate._user_answer(question_id, decisions), and _stale(..., user_answer) for the causal question's readings.

Testing

  • test_a_checker_decided_reading_replays_with_the_users_answer:
    • a tie-break is not stale (this case fails on main);
    • a re-check decided against the user is not stale when its answers are unchanged;
    • that re-check is stale once its reader answer has changed. This case fails if every checker decision is assumed to match the user (review finding).
  • test_a_readings_user_answer_is_the_one_the_grader_sets: _user_answer equals _read_checks' answer for approve, refuse, reveal with a yes or a no, "i don't know", decline, finished and stopped-waiting decisions.
  • uv run pytest -q: 679 passed. ruff format --check is clean.

Size

+106 / −2.

Risks

None to grading: only the annotation tool's staleness check changes.

🤖 Generated with Claude Code

RetriggerConfidence Score: 5/5

The PR appears safe to merge; the replay now preserves the user's original answer.

Summary

annotate now rebuilds each reading's user_answer from the saved simulated-user decisions before checking whether its answer changed.

  • Causal annotation replays readings with the simulated user's answer.

Reviews (2) · Last reviewed commit: "fix(annotate): replay readings with the ..." · Reviewed by Greptile

A recorded question has no user_answer, so a reading the checker upheld
for the simulated user replayed as the reader's answer and looked stale:
annotation asked for a regrade before the causal question forever. A
reading the checker decided now replays with its recorded value as the
user's answer, which decides it the same way from unchanged answers.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@that-guy-wade that-guy-wade self-assigned this Oct 13, 2026
Comment thread assistanteval/grader/annotate.py Outdated
Assuming a checker-decided reading matched the simulated user missed a
re-check the checker decided against the user: a reader answer that
later became sure replayed as a tie-break and looked unchanged. The
causal question's context records the simulated user's decisions, so
each reading now replays with the answer its decision implies, as
_read_checks sets it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@that-guy-wade
that-guy-wade merged commit 9c47ebf into main Oct 13, 2026
3 checks passed
@that-guy-wade
that-guy-wade deleted the fix/annotate-tiebreak-replay branch October 13, 2026 07:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant