-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdefault.json
More file actions
251 lines (251 loc) · 11.3 KB
/
Copy pathdefault.json
File metadata and controls
251 lines (251 loc) · 11.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended",
"mergeConfidence:all-badges",
":semanticCommits",
"helpers:pinGitHubActionDigests"
],
"dependencyDashboard": false,
"rebaseWhen": "behind-base-branch",
"recreateWhen": "always",
"minimumReleaseAge": "1 day",
"prConcurrentLimit": 0,
"prHourlyLimit": 0,
"lockFileMaintenance": {
"description": "Refresh lockfiles weekly. This is the one path that bypasses the npm quarantine below: lock file maintenance resolves every transitive dep to whatever the registry serves at that moment, and minimumReleaseAge is not reliably applied to this update type — so a package republished with a malicious version (keyv/cacheable, 2026-08-04) could land here hours after publication. Two gates: the release age is declared explicitly in case the manager does honour it, and automerge is off so the refreshed lockfile is always reviewed by a human before it reaches main.",
"enabled": true,
"schedule": ["before 6am on monday"],
"minimumReleaseAge": "3 days",
"automerge": false
},
"labels": [
"dependencies"
],
"platformAutomerge": true,
"onboardingConfig": {
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"github>FerrLabs/.github"
]
},
"onboardingConfigFileName": "renovate.json",
"onboardingPrTitle": "chore: configure Renovate (extend FerrLabs preset)",
"vulnerabilityAlerts": {
"enabled": true,
"labels": [
"security"
],
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash",
"minimumReleaseAge": "0"
},
"osvVulnerabilityAlerts": true,
"packageRules": [
{
"description": "FerrLabs npm packages — trust them, scan often, merge without delay. Override registry to GHCR (npm.pkg.github.com) since these packages aren't on npmjs.org. Auth comes from RENOVATE_HOST_RULES env in the runner workflow. internalChecksFilter:none skips the stability-days gate inherited from the global default. In practice this rule is belt-and-braces for the registry: each consuming repo's `.npmrc` already carries `@ferrlabs:registry=https://npm.pkg.github.com`, so the lookup resolves without it — the rule is what supplies the automerge/schedule policy.",
"matchPackageNames": [
"/^@ferrlabs\\//"
],
"registryUrls": [
"https://npm.pkg.github.com"
],
"schedule": [
"* * * * *"
],
"minimumReleaseAge": "0",
"internalChecksFilter": "none",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash",
"groupName": "FerrLabs npm packages"
},
{
"description": "FerrFlow npm packages — same trust as the @ferrlabs rule above, minus the registry override. The npm publishes were consolidated under @ferrflow (the `ferrflow` wrapper, `@ferrflow/*`, `@ferrflow/wasm`) and those live on npmjs.org, not GHCR, so pointing them at npm.pkg.github.com would break the lookup. Without this rule the scope falls through to the third-party rule below and its three-day quarantine, which held FerrFlow-Cloud's `@ferrflow/doc` pin four versions behind and kept merged documentation off ferrflow.com.",
"matchManagers": [
"npm"
],
"matchPackageNames": [
"/^@ferrflow\\//",
"ferrflow"
],
"schedule": [
"* * * * *"
],
"minimumReleaseAge": "0",
"internalChecksFilter": "none",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash",
"groupName": "FerrFlow npm packages"
},
{
"description": "FerrLabs Kit crates pinned via git rev — scan often, merge without delay. Targets the depName the customManager below stamps (`FerrLabs/Kit`); `matchPackageNames` would compare against the packageName field (the full URL), so use matchDepNames here. internalChecksFilter:none skips stability-days.",
"matchManagers": [
"custom.regex"
],
"matchDepNames": [
"FerrLabs/Kit"
],
"schedule": [
"* * * * *"
],
"minimumReleaseAge": "0",
"internalChecksFilter": "none",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash",
"groupName": "FerrLabs Kit"
},
{
"description": "FerrLabs Cargo crates published from Kit (`ferrlabs-*`) — same trust as @ferrlabs/ npm packages. No wait, automerge. registryUrls is a fallback: these deps declare `registry = \"kellnr\"`, which the cargo manager resolves from `.cargo/config.toml` relative to the repo root — but that file lives in each repo's `api/` subdirectory and is not discovered, so the dep would be skipped as `unknown-registry`. In practice the runner supplies CARGO_REGISTRIES_KELLNR_INDEX via RENOVATE_CUSTOM_ENV_VARIABLES, which the extractor reads first (getCargoIndexEnv); registryUrls here covers the case where that env is missing. Note that neither is sufficient on its own: the crate datasource refuses every non-crates.io registry unless allowCustomCrateRegistries=true, which is a global-only option set as RENOVATE_ALLOW_CUSTOM_CRATE_REGISTRIES in renovate.yml. Auth comes from the crates.ferrlabs.com hostRule there, which must use hostType `crate` (the datasource id) — `cargo` is the manager id and matches no hostRule.",
"matchManagers": [
"cargo"
],
"matchDepNames": [
"/^ferrlabs-/"
],
"registryUrls": [
"sparse+https://crates.ferrlabs.com/api/v1/crates/"
],
"schedule": [
"* * * * *"
],
"minimumReleaseAge": "0",
"internalChecksFilter": "none",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash",
"groupName": "FerrLabs Cargo crates"
},
{
"description": "Third-party npm — quarantine for 3 days after release before opening PR, then auto-merge patch/minor. Release age is the only gate: this rule used to carry `matchMergeConfidence`, which is not a real Renovate option (the real one is `matchConfidence`) and therefore matched nothing, so the confidence gate never applied. Rather than adopt `matchConfidence` — which needs a Mend API key and reports `neutral` without one, silently disabling npm automerge everywhere — the quarantine is raised from 1 to 3 days, which is where most malicious publishes are detected and yanked. npm is deliberately stricter than the Cargo rule below: it is the ecosystem where these attacks actually land.",
"matchManagers": [
"npm"
],
"matchPackageNames": [
"!/^@ferrlabs\\//",
"!/^@ferrflow\\//",
"!ferrflow"
],
"matchUpdateTypes": [
"patch",
"minor"
],
"minimumReleaseAge": "3 days",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash"
},
{
"description": "Third-party Cargo — wait 1 day after release before opening PR (no merge confidence on crates.io, so this is the main safety gate)",
"matchManagers": [
"cargo"
],
"matchDepNames": [
"!/^ferrlabs-/"
],
"matchUpdateTypes": [
"patch",
"minor"
],
"minimumReleaseAge": "1 day",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash"
},
{
"description": "GitHub Actions — wait 3 days after release (action authors often re-tag), grouped + auto-merge weekly",
"matchManagers": [
"github-actions"
],
"schedule": [
"before 6am on monday"
],
"minimumReleaseAge": "3 days",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash",
"groupName": "GitHub Actions"
},
{
"description": "FerrLabs/.github reusable workflows: no delay, no waiting for Monday. The previous rule waits 3 days because third-party authors re-tag after publishing; that risk does not exist on our own repositories, where we control both the content and the SHA. Without this exception a change in FerrLabs/.github takes up to four days to reach consumers (Monday schedule plus 3 days of age), which blocks any coordinated switchover. `FerrLabs/.github` is named explicitly because a minimatch glob does not match a segment starting with a dot.",
"matchManagers": ["github-actions"],
"matchPackageNames": ["FerrLabs/.github"],
"schedule": ["at any time"],
"minimumReleaseAge": "0",
"internalChecksFilter": "none",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash",
"groupName": "FerrLabs actions"
},
{
"description": "Every other FerrLabs action, the ferrflow action above all: grouped and taken weekly. These do not need to arrive within the hour, and taking each release the moment it landed was the main source of digest churn. Every commit here changes this repository's digest, 26 repositories pin that digest, so one release fanned out into as many pull requests. In the week before this rule, 12 of the 16 commits here were ferrflow action bumps. Consumers of FerrLabs/.github itself keep the immediate cadence above, which is what that exception exists for.",
"matchManagers": ["github-actions"],
"matchPackageNames": ["FerrLabs/**", "!FerrLabs/.github"],
"schedule": ["before 6am on monday"],
"minimumReleaseAge": "0",
"internalChecksFilter": "none",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash",
"groupName": "FerrLabs actions (weekly)"
},
{
"description": "Dockerfile base images — wait 3 days, grouped + auto-merge weekly",
"matchManagers": [
"dockerfile"
],
"schedule": [
"before 6am on monday"
],
"minimumReleaseAge": "3 days",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash",
"groupName": "Docker images"
},
{
"description": "Kubernetes infra (Flux HelmReleases, Helm charts, manifest image tags) — auto-merge patch+minor after the 1-day quarantine. Majors stay manual (rule below).",
"matchManagers": [
"flux",
"helmv3",
"helm-values",
"kubernetes"
],
"matchUpdateTypes": [
"patch",
"minor"
],
"minimumReleaseAge": "1 day",
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash"
},
{
"description": "Major updates — always manual",
"matchUpdateTypes": [
"major"
],
"automerge": false
}
],
"customManagers": [
{
"customType": "regex",
"description": "FerrLabs Kit crates pinned via git rev = ... in Cargo.toml. Tracks the HEAD of `main` via the git-refs datasource — Kit publishes per-crate tags (ferrlabs-types-v0.4.0 etc.), not a single repo-wide semver tag, so github-tags doesn't fit. git-refs returns the SHA of refs/heads/main and Renovate bumps the rev= to it.",
"managerFilePatterns": [
"/(^|/)Cargo\\.toml$/"
],
"matchStrings": [
"ferrlabs-[a-z\\-]+\\s*=\\s*\\{\\s*git\\s*=\\s*\"https://github.com/FerrLabs/Kit\\.git\"\\s*,\\s*rev\\s*=\\s*\"(?<currentDigest>[a-f0-9]+)\"\\s*\\}"
],
"currentValueTemplate": "main",
"depNameTemplate": "FerrLabs/Kit",
"packageNameTemplate": "https://github.com/FerrLabs/Kit",
"datasourceTemplate": "git-refs"
}
]
}