I'd like to work on this one.
I think I found the cause. When a PR is watched for the first time, Orchestrator.ts creates the watch with headSha: null, passed: false, passedChecks: []. The only time it seeds real state is from a previous watch's endedWatch. On the first poll, evaluatePullRequestWatch in pullRequestWatch.ts then sees headSha !== watch.headSha and !passed, so it reports checks-passed for checks that had already passed. Comments are already handled correctly, because remarksThrough: startedAt serves as their baseline.
Plan: treat the first evaluation of a fresh watch (one that has no recorded head yet) as the baseline. It records the head, the check results and whether the PR is conflicting, and wakes no one. Only later changes wake the thread. I'll add a test in the pullRequestWatch tests: start a watch on a PR whose checks already passed, then check that the first poll produces no wake and that a later push or failure still does.
One question first: should checks that are already failing when the watch starts still wake the thread once? You could argue the agent wants to know about those. Or should the baseline cover failures too, as this issue proposes?