Releases: kaxil/boring-cyborg
2026.04.22
Bug fix: first-contributor welcome comments firing on established contributors
The greetings bot was congratulating long-time members (ashb, shahar1, sryza, and others) on their "first merged pull request" in large repos. Root cause: lib/greetings.js counted prior PRs/issues via GitHub's Issues Search API, which returns severely truncated results for very large repos (apache/airflow has 35,912 merged PRs — the search index returned total_count: 0 for queries like is:pr is:merged author:ashb repo:apache/airflow). Latent since the June 2025 switch from paginated search to single-call total_count.
What changed
- Dropped the search API entirely in
lib/greetings.js. - Fast-path via
author_association:MEMBER,OWNER,COLLABORATORskip in every handler.CONTRIBUTORskips for first-PR and first-issue, but not first-merge (GitHub may reflect post-merge state onpull_request.closed, so a genuine first merger can appear asCONTRIBUTORthere — falls through to the commit-history check). - Commit-history check via
repos.listCommits: reads directly from the DB, not from search. The merge handler queries the repo's default branch (matching prior repo-wide semantics) and excludes the current PR's commits viapulls.listCommits+merge_commit_sha.per_pageclamped to GitHub's documented max of 100. - Issue/PR history check via
issues.listForRepo: catches users whose prior history is PRs that never merged (or issues for the issue handler). Filters client-side bypull_request != nullso PR-only users still get their first-issue welcome and vice versa. Paginates up to 3 × 100 items to find a stale prior item buried after opposite-kind items. - Short-circuits for bot accounts (
user.type === 'Bot') and theghostdeleted-user login.
Test coverage
Greetings test count grew from 18 to 37 (total suite: 110 tests, all passing).
Known edge cases (documented in code)
- Rebase-merge strategy with multi-commit PRs: rebased SHAs don't match original PR commit SHAs, so the exclude-set may miss them.
- User whose only prior merges were to non-default branches, now opening a default-branch PR.
- User with >300 items of one kind before a stale opposite-kind item.
All narrower than the MEMBER false-positive this fixes.
Commits: 34d4862
Full Changelog: 2026.04.16...2026.04.22
2026.04.16
Changes since the previous deploy (12eac15).
What's Changed
- Allow per-rule
targetBranchFilterin labeler, reviewer, and issuelink by @potiuk in #112 - Fix bugs and improve reviewer test coverage (55 → 84 tests)
- Fix
err.codevserr.statusin reviewer, add pagination, filter existing reviewers - Add GitHub Actions workflow to deploy to Heroku on release
- Add release and deployment docs to
CONTRIBUTING.md
Full Changelog: 12eac15...2026.04.16