Skip to content

fix(source-control): reviewer evidence requires a Bot-typed author, excluding configured User-typed review accountsΒ #1642

Description

@kyle-sexton

πŸ€– Agent-authored β€” found by an independent review of #1634 and filed under that PR's deferral discipline: valid, pre-existing in a shared module, and out of scope for the PR that surfaced it.

Problem

fetch_review_evidence / has_current_head_review (plugins/source-control/skills/babysit-prs/scripts/babysit_review_trigger.py) admit a review as reviewer evidence only when is_review_bot_item passes, which requires GitHub to type the author as a Bot (__typename/type == "Bot", or is_bot). A matching login is not sufficient.

That excludes an account class this plugin explicitly supports elsewhere. reference/safety.md documents --extra-bot-logins as existing precisely for "automation accounts that post as ordinary users" β€” no [bot] suffix, API __typename of User β€” and babysit_merge.py's autopilot tier carries its own comment about tolerating exactly that misreporting. So two consumers in the same plugin apply different bot tests to the same operator-configured account.

fetch_review_evidence's ReviewTriggerConfig never consults extra_bot_logins at all.

Impact

Two consumers, both degraded for a User-typed configured reviewer:

Fail-closed in direction β€” it holds longer, never merges sooner β€” but permanently slower, and silently so.

Verified by probe: the same review on the live head, with only the API-reported author type differing.

  • type: "Bot" β†’ reviewSettle.state: reviewed, ready: true
  • type: "User" β†’ reviewSettle.state: settling, ready: false

Why this was not fixed in #1634

It is not a defect that PR introduced β€” the constraint is pre-existing in the shared module, and the reviewer that motivated #1629 (chatgpt-codex-connector) is genuinely Bot-typed, so the shipped feature works for it. Fixing it means changing a predicate shared with the review-trigger flow, which is a wider blast radius than that PR's scope. #1634 documents the limitation at the hold's safety.md section rather than leaving it implicit, and points here.

Suggested direction (not prescriptive)

Login-only matching is defensible for this specific purpose: the reviewer login set is operator configuration, a GitHub login is unique, and a PR author cannot author a review as someone else. So the authoritative-Bot test buys little here that the configured allowlist does not already provide.

Options, for whoever takes it:

  1. Thread an explicit allowance (e.g. require_bot_type: bool = True) through is_review_bot_item and fetch_review_evidence, and have the settle hold pass it as False. Narrow; leaves the trigger flow's behavior untouched unless it opts in too.
  2. Have ReviewTriggerConfig consult extra_bot_logins the way the rest of the plugin does, so a registered non-structural bot account is classified consistently across every consumer. Wider, and arguably the real fix β€” the inconsistency, not the strictness, is the defect.
  3. Leave the strictness and document it as intended. Cheapest, but it means the --extra-bot-logins seam does not reach two consumers that look like it should.

Whoever takes this should decide whether the review-trigger flow wants the same widening; changing it for one consumer and not the other reintroduces the inconsistency at a different seam.

Acceptance criteria

  • A configured reviewer that GitHub types as User is recognized as having reviewed the live head, in whichever consumers the chosen option covers.
  • Regression tests with "type": "User" for each covered consumer.
  • If the review-trigger flow is deliberately left strict, that asymmetry is recorded at both sites with the reason.
  • reference/safety.md's Review-Settle Hold section drops its limitation note and its pointer here.

Related

#1634 (the PR that surfaced it), #1629 (the hold), #1614 (the adjudication that produced both).

Metadata

Metadata

Assignees

Labels

agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions