fix(review): read the AI-USAGE opt-in at render time, not at review start
The previous two commits put the label re-read in the webhook, at review start. That is too early to help: the review claims on the AI-REVIEW event and the re-read runs milliseconds later, while the reviewer's second click (AI-USAGE) is still a second or two away. It would have kept 404ing quietly if the path fix hadn't landed, and even fixed it caught nothing. Move the check to where the decision is actually used — just before the usage block is rendered, after the model has run. That is a minute or more after the trigger, by which time the label is there. Attribution is computed in the same branch, so a late opt-in still gets its per-comment token lines. `pr_has_label` goes through the existing gitea_get helper, which owns the /api/v1 prefix, so the path can't drift again. Any failure returns False and the payload's verdict stands: a review is never lost over a usage section. Reverts the webhook-side re-read from4ef62f2andaedea97. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B11e8TZZxJyzHW7jj7KWUN
This commit is contained in:
@@ -39,7 +39,6 @@ import hmac
|
||||
import json
|
||||
import os
|
||||
import threading
|
||||
import urllib.request
|
||||
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
||||
|
||||
from ai_review import review_pr
|
||||
@@ -177,48 +176,10 @@ def _release(key: tuple[str, str, str]) -> None:
|
||||
_inflight.discard(key)
|
||||
|
||||
|
||||
def _fetch_current_labels(repo: str, index: str) -> list:
|
||||
"""Re-read the PR's labels from the API. [] on any failure.
|
||||
|
||||
The webhook payload is a snapshot from the instant the event fired. When a
|
||||
PR is labelled AI-REVIEW first and AI-USAGE a moment later, the review is
|
||||
already claimed and running, so the second event is deduped and the usage
|
||||
opt-in is lost — the review posts without its usage block. Reading the
|
||||
labels again at review start closes that window.
|
||||
"""
|
||||
# GITEA_API is the bare host (no /api/v1) — every caller appends the
|
||||
# version prefix itself; see ai_review._get / _post.
|
||||
url = f"{GITEA_API}/api/v1/repos/{repo}/issues/{index}/labels"
|
||||
req = urllib.request.Request(url, headers={
|
||||
"Authorization": f"token {BOT_TOKEN}",
|
||||
"Accept": "application/json",
|
||||
})
|
||||
try:
|
||||
with urllib.request.urlopen(req, timeout=15) as resp:
|
||||
return json.loads(resp.read().decode() or "[]")
|
||||
except Exception as e:
|
||||
print(f"pragent-webhook: could not re-read labels for {repo}#{index}: {e}", flush=True)
|
||||
return []
|
||||
|
||||
|
||||
def _run_review(
|
||||
key: tuple[str, str, str], title: str, body: str, report_usage: bool, base_ref: str
|
||||
) -> None:
|
||||
repo, index, sha = key
|
||||
# The AI-USAGE opt-in may have been applied *after* the label event that
|
||||
# triggered this review (labelling is two events, the review claims on the
|
||||
# first). Re-read the labels now so the later opt-in still counts.
|
||||
if not report_usage:
|
||||
report_usage = _labels_have(
|
||||
_fetch_current_labels(repo, index), AI_USAGE_LABEL
|
||||
)
|
||||
if report_usage:
|
||||
print(
|
||||
f"pragent-webhook: {repo}#{index} AI-USAGE found on re-read "
|
||||
f"(added after the trigger event)",
|
||||
flush=True,
|
||||
)
|
||||
|
||||
try:
|
||||
with _review_slots:
|
||||
ok = review_pr(
|
||||
|
||||
Reference in New Issue
Block a user