Skip to content

Commit 35cc081

Browse files
committed
feat(reports): improve bot detection and add automation percentage
Enhanced bot detection patterns: - Add 'renovate' and 'dependabot' without [bot] suffix (GraphQL format) - Add app/* pattern for GitHub Apps (REST API format) - Ensure renovate PRs are properly classified as bot activity Added automation percentage metrics to Bot Activity section: - Show overall automation percentage (bot PRs / total PRs) - Add '% of Total' column to repository breakdown table - Display total counts: human PRs + bot PRs = total PRs Example output: Automation Percentage: 64.8% (302 bot PRs out of 466 total PRs) | Repository | Bot PRs | % of Total | | bluefin | 88 | 18.9% | | aurora | 72 | 15.5% | Impact: - Opportunistic work: 139 → 128 (11 renovate PRs moved to bot activity) - Bot activity: 291 → 302 (11 added + homebrew already separated) - Contributors: 24 → 23 (renovate removed from human count) - Automation section now shows only human-authored CI/CD work
1 parent 5366866 commit 35cc081

File tree

3 files changed

+53
-38
lines changed

3 files changed

+53
-38
lines changed

reports/2026-01-31-report.mdx

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import GitHubProfileCard from '@site/src/components/GitHubProfileCard';
1111
# Summary
1212

1313
- **Month:** January 2026
14-
- **Total items:** 175
14+
- **Total items:** 164
1515
- **Planned work:** 36
16-
- **Opportunistic work:** 139
17-
- **Contributors:** 24
16+
- **Opportunistic work:** 128
17+
- **Contributors:** 23
1818
- **New contributors:** 10
1919

2020

@@ -65,19 +65,19 @@ import GitHubProfileCard from '@site/src/components/GitHubProfileCard';
6565

6666
#### Homebrew Package Updates
6767

68-
![Production Tap](https://img.shields.io/badge/production--tap-23%20updates-blue?style=flat-square) ![Experimental Tap](https://img.shields.io/badge/experimental--tap-28%20updates-orange?style=flat-square)
68+
![Production Tap](https://img.shields.io/badge/production--tap-26%20updates-blue?style=flat-square) ![Experimental Tap](https://img.shields.io/badge/experimental--tap-36%20updates-orange?style=flat-square)
6969

70-
**51 automated updates** this month via GitHub Actions. Homebrew tap version bumps ensure Bluefin users always have access to the latest stable releases.
70+
**62 automated updates** this month via GitHub Actions. Homebrew tap version bumps ensure Bluefin users always have access to the latest stable releases.
7171

7272
##### Quick Summary
7373

7474
| Tap | Updates |
7575
|-----|---------|
76-
| production-tap | 23 |
77-
| experimental-tap | 28 |
76+
| production-tap | 26 |
77+
| experimental-tap | 36 |
7878

7979
<details>
80-
<summary>View all production-tap updates (23)</summary>
80+
<summary>View all production-tap updates (26)</summary>
8181

8282
| Package | Versions | PR |
8383
|---------|----------|-----|
@@ -94,7 +94,7 @@ import GitHubProfileCard from '@site/src/components/GitHubProfileCard';
9494
</details>
9595

9696
<details>
97-
<summary>View all experimental-tap updates (28)</summary>
97+
<summary>View all experimental-tap updates (36)</summary>
9898

9999
| Package | Versions | PR |
100100
|---------|----------|-----|
@@ -257,19 +257,9 @@ import GitHubProfileCard from '@site/src/components/GitHubProfileCard';
257257
- fix(ci): make `10(image)` have suffixes so they dont all fight over the (10) tag by [@​tulilirockz](https://github.com/tulilirockz) in [#1021](https://github.com/ublue-os/bluefin-lts/pull/1021)
258258
- fix(ci): HWE naming on daily builds by [@​tulilirockz](https://github.com/tulilirockz) in [#1020](https://github.com/ublue-os/bluefin-lts/pull/1020)
259259
- Fix homebrew bump action by [@​lambdaclan](https://github.com/lambdaclan) in [#196](https://github.com/ublue-os/homebrew-tap/pull/196)
260-
- chore(deps): pin actions/checkout action to 8e8c483 by [@​renovate](https://github.com/renovate) in [#198](https://github.com/ublue-os/homebrew-tap/pull/198)
261-
- chore(deps): update actions/cache digest to 8b402f5 by [@​renovate](https://github.com/renovate) in [#205](https://github.com/ublue-os/homebrew-tap/pull/205)
262-
- chore(deps): update actions/setup-python digest to a309ff8 by [@​renovate](https://github.com/renovate) in [#213](https://github.com/ublue-os/homebrew-tap/pull/213)
263260
- hotfix: use host env and update dependencies by [@​ahmedadan](https://github.com/ahmedadan) in [#108](https://github.com/ublue-os/homebrew-experimental-tap/pull/108)
264261
- fix(ci): use --no-rebuild flag to prevent bottle filename mismatch by [@​ahmedadan](https://github.com/ahmedadan) in [#120](https://github.com/ublue-os/homebrew-experimental-tap/pull/120)
265-
- chore(deps): pin dependencies by [@​renovate](https://github.com/renovate) in [#121](https://github.com/ublue-os/homebrew-experimental-tap/pull/121)
266-
- chore(deps): update actions/checkout action to v6 by [@​renovate](https://github.com/renovate) in [#122](https://github.com/ublue-os/homebrew-experimental-tap/pull/122)
267-
- chore(deps): update github artifact actions (major) by [@​renovate](https://github.com/renovate) in [#123](https://github.com/ublue-os/homebrew-experimental-tap/pull/123)
268-
- chore(deps): update actions/github-script action to v8 by [@​renovate](https://github.com/renovate) in [#132](https://github.com/ublue-os/homebrew-experimental-tap/pull/132)
269262
- fix: fix brew style errors in workflows by [@​inffy](https://github.com/inffy) in [#139](https://github.com/ublue-os/homebrew-experimental-tap/pull/139)
270-
- chore(deps): update actions/cache digest to 8b402f5 by [@​renovate](https://github.com/renovate) in [#144](https://github.com/ublue-os/homebrew-experimental-tap/pull/144)
271-
- chore(deps): update peter-evans/create-pull-request digest to c0f553f by [@​renovate](https://github.com/renovate) in [#150](https://github.com/ublue-os/homebrew-experimental-tap/pull/150)
272-
- chore(deps): update actions/setup-python digest to a309ff8 by [@​renovate](https://github.com/renovate) in [#152](https://github.com/ublue-os/homebrew-experimental-tap/pull/152)
273263

274264
---
275265

@@ -319,7 +309,6 @@ import GitHubProfileCard from '@site/src/components/GitHubProfileCard';
319309
- chore: delete ublue-fix-hostname by [@​renner0e](https://github.com/renner0e) in [#1570](https://github.com/ublue-os/aurora/pull/1570)
320310
- fix: remove custom block-goose-cli-linux formula by [@​ahmedadan](https://github.com/ahmedadan) in [#127](https://github.com/ublue-os/homebrew-experimental-tap/pull/127)
321311
- fix: add deps for opencode-desktop-linux (1.1.20) by [@​KiKaraage](https://github.com/KiKaraage) in [#138](https://github.com/ublue-os/homebrew-experimental-tap/pull/138)
322-
- chore(deps): pin actions/github-script action to d7906e4 - abandoned by [@​renovate](https://github.com/renovate) in [#131](https://github.com/ublue-os/homebrew-experimental-tap/pull/131)
323312
- feat(agents): convert blog-poster skill to GitHub Copilot agent by [@​castrojo](https://github.com/castrojo) in [#556](https://github.com/projectbluefin/documentation/pull/556)
324313
- docs(administration): add ujust powerwash command documentation by [@​castrojo](https://github.com/castrojo) in [#554](https://github.com/projectbluefin/documentation/pull/554)
325314
- docs(agents): remove non-existent communication.md reference by [@​castrojo](https://github.com/castrojo) in [#567](https://github.com/projectbluefin/documentation/pull/567)
@@ -362,14 +351,16 @@ import GitHubProfileCard from '@site/src/components/GitHubProfileCard';
362351

363352
## 🤖 Bot Activity
364353

365-
| Repository | Bot PRs |
366-
|------------|---------|
367-
| bluefin | 88 |
368-
| aurora | 72 |
369-
| bluefin-lts | 64 |
370-
| documentation | 8 |
371-
| iso | 7 |
372-
| common | 1 |
354+
**Automation Percentage:** 64.8% (302 bot PRs out of 466 total PRs)
355+
356+
| Repository | Bot PRs | % of Total |
357+
|------------|---------|------------|
358+
| bluefin | 88 | 18.9% |
359+
| aurora | 72 | 15.5% |
360+
| bluefin-lts | 64 | 13.7% |
361+
| documentation | 8 | 1.7% |
362+
| iso | 7 | 1.5% |
363+
| common | 1 | 0.2% |
373364

374365
<details>
375366
<summary>View bot activity details</summary>
@@ -683,8 +674,6 @@ Thank you to our continuing contributors!
683674

684675
<GitHubProfileCard username="lambdaclan" />
685676

686-
<GitHubProfileCard username="renovate" />
687-
688677
<GitHubProfileCard username="leafyoung" />
689678

690679
<GitHubProfileCard username="AlexanderVanhee" />

scripts/lib/contributor-tracker.mjs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,18 @@ import { MONITORED_REPOS } from "./monitored-repos.mjs";
1313
*/
1414
const BOT_PATTERNS = [
1515
/^dependabot\[bot\]$/,
16+
/^dependabot$/i, // Dependabot without [bot] suffix
1617
/^renovate\[bot\]$/,
18+
/^renovate$/i, // Renovate without [bot] suffix (GraphQL returns this)
19+
/^app\/renovate$/, // Renovate GitHub App format (REST API format)
1720
/^github-actions\[bot\]$/,
1821
/^github-actions$/, // GitHub Actions bot without [bot] suffix
1922
/^copilot-swe-agent$/,
2023
/^ubot-\d+$/,
2124
/^pull$/,
2225
/^testpullapp$/,
23-
/bot$/i, // Catches most bot usernames
26+
/^app\//i, // GitHub Apps (app/renovate, app/dependabot, etc.)
27+
/bot$/i, // Catches most bot usernames (must be last)
2428
];
2529

2630
/**

scripts/lib/markdown-generator.mjs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,19 @@ ${kindSections}`;
205205
const uncategorizedSection = generateUncategorizedSection(allItems);
206206

207207
// Generate bot activity section (non-homebrew only, since homebrew is now under Development)
208-
const botSection = generateBotActivitySection(otherBotActivity);
208+
// Calculate total PRs (human + all bots including homebrew)
209+
const totalBotPRs = botActivity.reduce(
210+
(sum, activity) => sum + activity.count,
211+
0,
212+
);
213+
const totalHumanPRs = plannedItems.length + opportunisticItems.length;
214+
const totalPRs = totalHumanPRs + totalBotPRs;
215+
216+
const botSection = generateBotActivitySection(
217+
otherBotActivity,
218+
totalPRs,
219+
totalBotPRs,
220+
);
209221

210222
// Generate contributors section
211223
const contributorsSection = generateContributorsSection(
@@ -610,20 +622,26 @@ function generatePackageTable(packages, tapName) {
610622
* Generate bot activity section with aggregate table and details
611623
*
612624
* @param {Array} botActivity - Bot activity grouped by repo and bot
625+
* @param {number} totalPRs - Total PRs (human + bot) in the period
626+
* @param {number} totalBotPRs - Total bot PRs (all bots) in the period
613627
* @returns {string} Markdown section with table and collapsible details
614628
*/
615-
function generateBotActivitySection(botActivity) {
629+
function generateBotActivitySection(botActivity, totalPRs, totalBotPRs) {
616630
if (!botActivity || botActivity.length === 0) {
617631
return ""; // No bot activity this period
618632
}
619633

620-
const table = generateBotActivityTable(botActivity);
634+
const automationPercentage = ((totalBotPRs / totalPRs) * 100).toFixed(1);
635+
636+
const table = generateBotActivityTable(botActivity, totalPRs);
621637
const details = generateBotDetailsList(botActivity);
622638

623639
return `---
624640
625641
## 🤖 Bot Activity
626642
643+
**Automation Percentage:** ${automationPercentage}% (${totalBotPRs} bot PRs out of ${totalPRs} total PRs)
644+
627645
${table}
628646
629647
${details}`;
@@ -633,9 +651,10 @@ ${details}`;
633651
* Generate bot activity summary table (aggregated by repository)
634652
*
635653
* @param {Array} botActivity - Array of {repo, bot, count, items}
654+
* @param {number} totalPRs - Total PRs in the period (for percentage calculation)
636655
* @returns {string} Markdown table
637656
*/
638-
export function generateBotActivityTable(botActivity) {
657+
export function generateBotActivityTable(botActivity, totalPRs) {
639658
// Aggregate by repository (sum all bot activity per repo)
640659
const repoAggregates = {};
641660

@@ -651,12 +670,15 @@ export function generateBotActivityTable(botActivity) {
651670
repoAggregates[repo] += activity.count;
652671
});
653672

654-
const header = `| Repository | Bot PRs |
655-
|------------|---------|`;
673+
const header = `| Repository | Bot PRs | % of Total |
674+
|------------|---------|------------|`;
656675

657676
const rows = Object.entries(repoAggregates)
658677
.sort((a, b) => b[1] - a[1]) // Sort by count descending
659-
.map(([repo, count]) => `| ${repo} | ${count} |`);
678+
.map(([repo, count]) => {
679+
const percentage = ((count / totalPRs) * 100).toFixed(1);
680+
return `| ${repo} | ${count} | ${percentage}% |`;
681+
});
660682

661683
return [header, ...rows].join("\n");
662684
}

0 commit comments

Comments
 (0)