From 2699b018712833aafe500d5d3a27de9e28cf711e Mon Sep 17 00:00:00 2001 From: JacobPEvans <20714140+JacobPEvans@users.noreply.github.com> Date: Fri, 24 Apr 2026 22:47:51 -0400 Subject: [PATCH 1/4] fix(renovate): auto-merge pip_requirements + document org-preset onboarding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two related gaps surfaced while auditing why mlx-benchmarks's lockfile and space/requirements.txt fell years behind on dependency updates: 1. The org renovate-presets had an auto-merge rule for `pep621` (pyproject .toml) but no equivalent for `pip_requirements` (requirements.txt). Repos like mlx-benchmarks that ship a HuggingFace Spaces requirements.txt would accumulate manual-review minor/patch PRs even when the package source is already trusted via the org-wide allow-list. Merge the two managers into a single rule — they have identical update semantics. 2. There was no documentation telling repo maintainers that Mend's auto- generated "Configure Renovate" PR (which scaffolds only `config:recommended`) must be edited to extend `local>JacobPEvans/.github:renovate-presets`. The audit found 31 of 32 public repos compliant; mlx-benchmarks slipped through because the on-board PR was merged without that edit. Result: `lockFileMaintenance`, `vulnerabilityAlerts` automerge, the trusted-org 1-day stabilization, and the 3-day default were all silently disabled for that repo. Add a "New repository onboarding" section to CLAUDE.md plus the audit one-liner so the same drift is detectable going forward. The 3-day default / 1-day trusted-org / 0-day vulnerability stabilization policy itself is unchanged — already correct in renovate-presets.json. (claude) --- CLAUDE.md | 47 ++++++++++++++++++++++++++++++++++++++++++- renovate-presets.json | 4 ++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index b8db495..adf09e4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,7 +2,10 @@ ## Repo Purpose -This is the `.github` community health repository for JacobPEvans. It provides default community files (issue templates, PR templates, CONTRIBUTING.md, etc.) that are automatically inherited by all public repos that don't define their own versions. +This is the `.github` community health repository for JacobPEvans. It +provides default community files (issue templates, PR templates, +CONTRIBUTING.md, etc.) that are automatically inherited by all public repos +that don't define their own versions. ## Key Files @@ -13,6 +16,48 @@ This is the `.github` community health repository for JacobPEvans. It provides d - `.github/PULL_REQUEST_TEMPLATE/` — PR templates per change type; all require Conventional Commits format - `docs/CONTRIBUTING.md` — Inherited contributing guidelines +## New repository onboarding + +When Renovate (Mend) is enabled on a new public repo it auto-opens a "Configure +Renovate" PR that scaffolds a minimal `renovate.json` with only +`{"extends": ["config:recommended"]}`. **That on-board PR must not be merged +as-is.** Edit the renovate config to also extend the org preset: + +```json +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended", + "local>JacobPEvans/.github:renovate-presets" + ] +} +``` + +Without `local>JacobPEvans/.github:renovate-presets`, the repo loses +`lockFileMaintenance`, the trusted-org auto-merge allow-list, the 3-day +default stabilization, the 0-day `vulnerabilityAlerts` automerge, and every +custom manager defined in `renovate-presets.json`. + +This is verifiable with the audit one-liner: + +```sh +for repo in $(gh repo list JacobPEvans --visibility public --limit 50 --json name --jq '.[].name'); do + for f in renovate.json renovate.json5 .github/renovate.json; do + body=$(gh api "repos/JacobPEvans/$repo/contents/$f" 2>/dev/null | jq -r '.content // empty' | base64 -d 2>/dev/null) || continue + [ -z "$body" ] && continue + if echo "$body" | grep -q "JacobPEvans/.github:renovate-presets"; then + echo "OK $repo ($f)" + else + echo "MISS $repo ($f)" + fi + break + done +done | sort +``` + +Any `MISS` line is a repo that will silently fall behind on dependency +updates and security patches. + ## Common Tasks ### Adding or modifying labels diff --git a/renovate-presets.json b/renovate-presets.json index 64f9172..182c423 100644 --- a/renovate-presets.json +++ b/renovate-presets.json @@ -237,8 +237,8 @@ "schedule": ["after 7am on Monday", "after 7am on Thursday"] }, { - "description": "Auto-merge pep621 Python packages (minor/patch)", - "matchManagers": ["pep621"], + "description": "Auto-merge Python packages (minor/patch) across pep621 (pyproject.toml) and pip_requirements (requirements.txt). Subject to the global 3-day stabilization (1-day for trusted-org packages); security fixes still go through the 0-day vulnerabilityAlerts path.", + "matchManagers": ["pep621", "pip_requirements"], "matchUpdateTypes": ["minor", "patch"], "automerge": true, "schedule": ["after 7am on Monday", "after 7am on Thursday"] From 2aad604d6f2b8995bfede04ccedaccbc7ce9765e Mon Sep 17 00:00:00 2001 From: JacobPEvans <20714140+JacobPEvans@users.noreply.github.com> Date: Fri, 24 Apr 2026 23:35:27 -0400 Subject: [PATCH 2/4] fix: raise audit one-liner repo limit from 50 to 1000 --limit 50 silently truncates; --limit 1000 covers the full public repo set. (claude) --- CLAUDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index adf09e4..da1b59c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -41,7 +41,7 @@ custom manager defined in `renovate-presets.json`. This is verifiable with the audit one-liner: ```sh -for repo in $(gh repo list JacobPEvans --visibility public --limit 50 --json name --jq '.[].name'); do +for repo in $(gh repo list JacobPEvans --visibility public --limit 1000 --json name --jq '.[].name'); do for f in renovate.json renovate.json5 .github/renovate.json; do body=$(gh api "repos/JacobPEvans/$repo/contents/$f" 2>/dev/null | jq -r '.content // empty' | base64 -d 2>/dev/null) || continue [ -z "$body" ] && continue From de0cdf7383a6c9c3558d91dc168162ed5c52d800 Mon Sep 17 00:00:00 2001 From: JacobPEvans <20714140+JacobPEvans@users.noreply.github.com> Date: Fri, 24 Apr 2026 23:41:33 -0400 Subject: [PATCH 3/4] fix: shorten renovate-presets description to match terse style Adjacent entries average ~50 chars; new description was 239 chars. (claude) --- renovate-presets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate-presets.json b/renovate-presets.json index 182c423..6a7b1a1 100644 --- a/renovate-presets.json +++ b/renovate-presets.json @@ -237,7 +237,7 @@ "schedule": ["after 7am on Monday", "after 7am on Thursday"] }, { - "description": "Auto-merge Python packages (minor/patch) across pep621 (pyproject.toml) and pip_requirements (requirements.txt). Subject to the global 3-day stabilization (1-day for trusted-org packages); security fixes still go through the 0-day vulnerabilityAlerts path.", + "description": "Auto-merge Python packages (minor/patch) — pep621 and pip_requirements", "matchManagers": ["pep621", "pip_requirements"], "matchUpdateTypes": ["minor", "patch"], "automerge": true, From 4598b9f1b25f3a4a2139ad444c9070bb7c6606a5 Mon Sep 17 00:00:00 2001 From: JacobPEvans <20714140+JacobPEvans@users.noreply.github.com> Date: Fri, 24 Apr 2026 23:53:33 -0400 Subject: [PATCH 4/4] refactor: move Renovate onboarding docs out of CLAUDE.md CLAUDE.md should stay brief. Moved the onboarding guide and audit one-liner to docs/RENOVATE.md; left a one-line pointer in CLAUDE.md. (claude) --- CLAUDE.md | 43 +------------------------------------------ 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index da1b59c..31096ec 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,48 +15,7 @@ that don't define their own versions. - `.github/ISSUE_TEMPLATE/` — Issue forms (bug, feature, docs, chore); all require `priority` + `size` labels - `.github/PULL_REQUEST_TEMPLATE/` — PR templates per change type; all require Conventional Commits format - `docs/CONTRIBUTING.md` — Inherited contributing guidelines - -## New repository onboarding - -When Renovate (Mend) is enabled on a new public repo it auto-opens a "Configure -Renovate" PR that scaffolds a minimal `renovate.json` with only -`{"extends": ["config:recommended"]}`. **That on-board PR must not be merged -as-is.** Edit the renovate config to also extend the org preset: - -```json -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:recommended", - "local>JacobPEvans/.github:renovate-presets" - ] -} -``` - -Without `local>JacobPEvans/.github:renovate-presets`, the repo loses -`lockFileMaintenance`, the trusted-org auto-merge allow-list, the 3-day -default stabilization, the 0-day `vulnerabilityAlerts` automerge, and every -custom manager defined in `renovate-presets.json`. - -This is verifiable with the audit one-liner: - -```sh -for repo in $(gh repo list JacobPEvans --visibility public --limit 1000 --json name --jq '.[].name'); do - for f in renovate.json renovate.json5 .github/renovate.json; do - body=$(gh api "repos/JacobPEvans/$repo/contents/$f" 2>/dev/null | jq -r '.content // empty' | base64 -d 2>/dev/null) || continue - [ -z "$body" ] && continue - if echo "$body" | grep -q "JacobPEvans/.github:renovate-presets"; then - echo "OK $repo ($f)" - else - echo "MISS $repo ($f)" - fi - break - done -done | sort -``` - -Any `MISS` line is a repo that will silently fall behind on dependency -updates and security patches. +- `docs/RENOVATE.md` — Renovate onboarding guide (always extend the org preset) ## Common Tasks