Skip to content

fix(webhook): remove dismissed reviews from mirror scoring counts#205

Open
jony376 wants to merge 15 commits into
entrius:testfrom
jony376:fix/review-dismissed-scoring-count
Open

fix(webhook): remove dismissed reviews from mirror scoring counts#205
jony376 wants to merge 15 commits into
entrius:testfrom
jony376:fix/review-dismissed-scoring-count

Conversation

@jony376

@jony376 jony376 commented Jul 4, 2026

Copy link
Copy Markdown

Summary

ReviewHandler ignored pull_request_review.dismissed events, leaving dismissed CHANGES_REQUESTED rows in reviews. That kept stale counts in pr_review_summary / miners API review_summary, which Gittensor uses for review-quality scoring.

This handles dismissed by deleting the matching review row (same natural key as upsert on submit), mirroring how CommentHandler removes rows on deleted.

Related Issues

Fixes #204

Type of Change

  • Bug fix
  • New feature
  • Refactor
  • Documentation
  • Other (describe below)

Testing

Change is limited to the dismissed branch in review.handler.ts. Verified TypeScript compiles against existing entity types; full npm run build, npm run lint, and npm run format:check should be run in CI (packages/das).

Manual scenario: after a maintainer dismisses a previously stored CHANGES_REQUESTED review, the row is removed and pr_review_summary no longer counts it.

Checklist

  • I have read the Contributing Guide
  • Code builds without errors
  • New and existing tests pass (if applicable)
  • Documentation updated (if applicable)
  • No unnecessary dependencies added

DragunovX16 and others added 15 commits May 20, 2026 10:57
Move issue backfill ahead of PR metadata and file job enqueueing so metadata jobs can resolve solved_by_pr links during backfill.

Fixes entrius#28
Clear solved_by_pr links that still point to a refreshed PR when its closing references change or it is no longer merged, then reapply current merged links.

Fixes entrius#59
A `fetch-pr-metadata` job uses a stable custom jobId per PR
(`meta-<repo>-<pr>`). BullMQ ignores `add()` when a job with that id
already exists in any state, including the failed-retention set. With
`removeOnFail: 50`, a metadata job that exhausts its 3 retries during a
transient GitHub outage sat in the failed set and blocked every later
`edited`/`closed`/`reopened`/`synchronize` webhook for the same PR until
the global 50-slot cap evicted it — leaving `body`,
`last_edited_at`, `closing_issue_numbers`, and downstream
`issues.solved_by_pr` stale.

Drop retention for these enqueues to `true` so failed jobs evict
immediately and the next webhook gets a fresh fetch. Failure detail
remains in service logs. Fixes entrius#75.

Co-authored-by: anderdc <me@alexanderdc.com>
Co-authored-by: anderdc <me@alexanderdc.com>
Solver attribution previously rode the cross-reference reconcile path:
on every PR metadata fetch, the mirror wrote issue.solved_by_pr from
the PR's closingIssueNumbers array. That's a record of "PR text
declared it would close #N," not "GitHub determined PR-N caused the
issue's current closure," so reopen-then-reclose cycles, late body
edits, and stray "Closes #N" mentions could attribute to the wrong PR.

Switches the source of truth to ClosedEvent.closer anchored to the
issue's current closedAt:

- Add fetchIssueClosingPr / selectClosingPrFromTimeline on the
  GitHub fetcher. Returns the closer PR number when the close event
  matches the current closedAt and the closer is a merged same-repo PR;
  null for manual closes, non-PR closers, or NOT_PLANNED closures.
- Add an ISSUE_CLOSURE BullMQ job. Webhook handler enqueues on the
  closed action; the processor writes solved_by_pr from the fetcher.
- Extend backfillIssues to query the closure timeline alongside the
  label timeline so each issue's solver is resolved in the same pass.
- Drop reconcileSolvedIssueLinks. PR metadata still refreshes the
  PR-side closing_issue_numbers column; it no longer writes to
  issues.solved_by_pr.

The downstream effect: gittensor's issue discovery (reads
MirrorIssue.solved_by_pr) and the issue-bounty solver lookup
(entrius/gittensor#1305, also moved to ClosedEvent.closer) now share
one primitive and stay 1:1.

Schema unchanged. After deploy, re-running BACKFILL_REPO with a
long window reconciles existing solved_by_pr values.

Co-authored-by: anderdc <me@alexanderdc.com>
…ntrius#87)

* fix: allowing unknown solvers through mirror solved-issue pipeline

* fix: code change after review
…ntrius#62) (entrius#115)

* fix(webhook): refresh PR files on pull_request.edited base retarget (entrius#62)

The handler enqueues PR_FILES on opened / synchronize / merged-closed but
not on pull_request.edited with a base-ref change. The PR row updates
its baseSha, but the stored pr_files and scoringDataStored stay pinned
to the old base — leaving scoring inputs stale.

Detect a base retarget via payload.changes.base, clear scoringDataStored,
and enqueue PR_FILES with the new base/head SHAs through the existing
prFilesJobId path.

Closes entrius#62

* chore: prettier --write on pull-request.handler.ts (entrius#62)

The lint CI run failed Prettier formatting on f830e3d. Prettier wanted
the isBaseRetarget assignment on a single line. Single-line fit, no
behaviour change.

---------

Co-authored-by: jeffrey701 <jeffrey701@users.noreply.github.com>
Handle pull_request_review.dismissed by deleting the stored review row so pr_review_summary no longer counts dismissed CHANGES_REQUESTED reviews.

Fixes entrius#204
@xiao-xiao-mao xiao-xiao-mao Bot added the bug Something isn't working label Jul 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Dismissed PR reviews remain in review_summary scoring counts

8 participants