Skip to content

feat(review): read-only conversational /ask for non-write users #331

Description

@devops-thiago

Problem Statement

Today all commands except /help require write access (CommentCommandService.HELP_TEXT, ManualReviewAuthorizer). Conversational @mention replies on PRs and review threads use the same authorizer (MaintainerReplyServiceManualReviewAuthorizer.isAuthorized), so read-only collaborators cannot ask questions without triggering spend-heavy review commands.

This is an intentional simplicity tradeoff (prevent drive-by AI spend) documented in PLAN.md → Simplicity tradeoffs, but teams with many read-only reviewers (docs, QA, security readers) want a question-only path that does not post findings, suggestions, check runs, or merge-blocking verdicts.

Proposed Solution

Add a read-only ask mode for conversational mentions (not slash commands):

  • Eligible users: any collaborator with read access (or higher) on the repo — confirmed via GitHub collaborator permission API (same pattern as write check in ManualReviewAuthorizer, but accept read/triage/write/admin).
  • Trigger: bare @bot … mention on a PR comment or review thread (WebhookController.maybeDispatchConversationalMention / review-thread path) where the body is a question (no command verb like review, describe, etc. — reuse TriggerDetector command detection to reject command-shaped mentions).
  • Behavior: single conversational reply (MaintainerReplyService) — no check run, no inline findings, no REQUEST_CHANGES, no label mutations. Optional disclosure footer: "Read-only ask — for a full review, a maintainer with write access can run /review."
  • Spend controls: honor #42 caps and /pause; consider a separate lower token budget config for ask-only replies.
  • 👀 ack: if #315 lands first, read-only asks should not get 👀 (per feat(webhook): 👀 reaction on slash/mention commands (not conversational asks) #315 scope: commands only) — document clearly.

Config knob, e.g. thrillhousebot.review.read-only-ask-enabled (default: false to preserve current fail-closed behavior).

Related issues

  • #315 — 👀 on commands only (explicitly excludes conversational asks)
  • #322#323 — other simplicity-tradeoff knobs (same milestone theme)
  • #42 — spend cap
  • #50 — model config / budgets

Acceptance criteria

  • Read-only collaborator can get a conversational answer when read-only-ask-enabled=true
  • Read-only user still cannot run /review, /describe, or other write-gated slash commands
  • Ask path never creates or updates check runs, PR reviews, or inline finding comments
  • Write users unchanged — existing authorized conversational + command behavior
  • Config + README documented; tests for auth gate and command-vs-ask routing

Alternatives considered

  • Allow /ask slash command — clearer UX but expands command surface; mention-only keeps parity with "ask the bot a question" flow.
  • Open conversational replies to everyone — rejected; still need collaborator check to limit spam.

Priority

Important — simplicity tradeoff evolution; target v0.5.0 with other configurability work (#322, #324).

Code of Conduct

  • I have searched for existing issues and this is not a duplicate.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestjavaPull requests that update java code

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions