Skip to content

chore(renovate): tune for "Automated PRs" - security bypass, burst caps, lockfile hold - #59

Merged
wormeyman merged 2 commits into
mainfrom
chore/renovate-tuning
Jul 30, 2026
Merged

chore(renovate): tune for "Automated PRs" - security bypass, burst caps, lockfile hold#59
wormeyman merged 2 commits into
mainfrom
chore/renovate-tuning

Conversation

@wormeyman

Copy link
Copy Markdown
Collaborator

The Renovate GitHub App is live as of 2026-07-30, enabled with Automated PRs, Require config file and Create onboarding PRs. The config landed in #56 was written for an app that was not yet on, so it now has to hold up unattended rather than describe an intent.

Note "Require config file" means merging #56 first was load-bearing: with that setting and no config on the default branch, Renovate would have done nothing at all, silently.

Changes

setting why
timezone: America/Los_Angeles the schedule was UTC, so "before 6am on monday" fired ~midnight Sunday local
prConcurrentLimit: 3, prHourlyLimit: 2 the first run sees every pending update at once, and each PR now costs a ~4 min CI run
vulnerabilityAlerts a CVE fix could otherwise sit ~10 days: up to 3 for the age floor, then up to 7 for the Monday window
osvVulnerabilityAlerts: true GitHub advisories miss ecosystem-only reports
lockFileMaintenance: { enabled: false } it is automated pnpm up for the lockfile
dependencyDashboardApproval deliberately NOT set

The two non-obvious ones

vulnerabilityAlerts.minimumReleaseAge is "25 hours", not 0. The obvious move is to drop the age floor entirely for security fixes. That would be wrong here: pnpm 11 refuses anything younger than 24h without writing a minimumReleaseAgeExclude: bypass into pnpm-workspace.yaml, so a same-day security PR would reintroduce precisely the hazard the top-of-file comment exists to prevent - the way vue-tsc@3.3.8 once waived the guard silently. 25 hours clears pnpm with an hour to spare and still cuts the wait from 3 days to ~1.

lockFileMaintenance is pinned off rather than left off. It is off by default, but it is also automated pnpm up for the lockfile, and that is the one dependency operation this repo has measured as harmful: re-resolving the ~22 surrounding transitive packages triggered TS2321: Excessive stack depth comparing types ... 'UserConfig' in vite.config.ts, while installing the same target versions directly did not. Explicit so it cannot get switched on as tidying.

dependencyDashboardApproval is deliberately unset. It would require ticking a box per update before a PR appears, which re-imposes scan-only behaviour at the config layer and would quietly defeat the app's "Automated PRs" setting. PRs are wanted; what is not wanted is anything merging unread, which is automerge: false's job.

Verification

renovate-config-validator exit 0. CI verify runs on this PR.

CLAUDE.md's "Renovate is inert until the GitHub App is enabled on the repo" is now false and is corrected in the same commit.

Not done here

🤖 Generated with Claude Code

https://claude.ai/code/session_01F3a2HLJ4beKARi7SPmaM54

wormeyman and others added 2 commits July 29, 2026 22:43
…ps, lockfile hold

The Renovate GitHub App went live with "Automated PRs", "Require config file"
and "Create onboarding PRs", so the config now has to hold up unattended rather
than describe an intent.

- `timezone: America/Los_Angeles`. The schedule was UTC, so "before 6am on
  monday" actually fired around midnight Sunday local.
- `prConcurrentLimit` / `prHourlyLimit`. The first run after enabling sees every
  pending update at once, and each PR now costs a ~4 minute CI run.
- `vulnerabilityAlerts` bypasses the weekly window - a CVE fix could otherwise
  sit ~10 days (up to 3 for the age floor, then up to 7 for Monday). Its
  `minimumReleaseAge` is **25 hours, not 0**: pnpm 11 refuses anything younger
  than 24h without writing a `minimumReleaseAgeExclude:` bypass into
  pnpm-workspace.yaml, so a same-day security PR would reintroduce exactly the
  hazard this config exists to prevent.
- `osvVulnerabilityAlerts` - GitHub's advisories miss ecosystem-only reports.
- `lockFileMaintenance` pinned off. It is automated `pnpm up` for the lockfile,
  and transitive re-resolution is what triggered the `TS2321: Excessive stack
  depth ... UserConfig` pathology in vite.config.ts while installing the same
  target versions directly did not. Off by default; pinned so it cannot get
  switched on as tidying.
- `dependencyDashboardApproval` deliberately NOT set - it would re-impose
  scan-only behaviour at the config layer and defeat the app's own setting.

CLAUDE.md's "Renovate is inert until the GitHub App is enabled" is now false and
is corrected, along with the two settings whose reasoning is not guessable from
the outside.

Validated with `renovate-config-validator` (exit 0).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3a2HLJ4beKARi7SPmaM54
Caught by the CI workflow from #56 on its first real use - `vp check` (no --fix)
failed in 27s on two formatting issues. Worth noting the gate earned its keep
immediately on a comment-only change.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3a2HLJ4beKARi7SPmaM54
@wormeyman
wormeyman merged commit be5f592 into main Jul 30, 2026
1 check passed
@wormeyman
wormeyman deleted the chore/renovate-tuning branch July 30, 2026 05:57
wormeyman added a commit that referenced this pull request Jul 30, 2026
…RULE, not the fields (#57)

Verified locally and in CI, and the anti-vacuity control was tested by breaking it.

## The `+3` control is genuinely load-bearing - proven, not assumed
This repo has a documented history of confirmations that turned out vacuous, so I sabotaged the substitution rather than trusting the assertion. Replacing the game-field lookup with one that never matches - i.e. simulating every lookup silently falling through to our own field:

| test | with substitution dead |
| --- | --- |
| "substituting the game's own elevation and cliffiness does not move a single cell" | **still passes** |
| "and the substitution really is live - a `+3` elevation bias does move cells" | **FAILS**: `AssertionError: expected 0 to be greater than 5` |

So the headline assertion *would* have passed vacuously, and the `+3` control is exactly what catches it. Restored and re-confirmed 9/9 green. `expect(game.size).toBeGreaterThan(500)` is a second, independent guard against an empty placement set making the equality trivial.

## Provenance
`test/fixtureProvenance.spec.ts` passes (4/4). Both new fixtures carry entries with `factorioVersion: "2.1.12"` and concrete `evidence` naming the capture script and recording that `refs:sync --check` reported in-sync at capture time - so neither lands as `unknown`, and the spec's `unknown` cap is not touched.

## Gate
- Local `pnpm run verify` exit **0** in 60s on the exact tree that lands (`5399b6f`): format 316, lint+type 301, `check:vue` clean, app **1255 passed / 3 skipped**, worker 12.
- CI `verify`: **pass** (4m41s). The branch was updated **twice** so the run tests the real target - it now contains #51, #52, #55 and #59, not the older `main` the first run saw.
- No `src/` change, so nothing shipped to users; the new spec needs no Factorio at runtime because the fixtures are committed, which is why CI can run it.

## Two notes, neither blocking
- The description reads as though `test/vulcanusOreCliffSeparation.spec.ts` is new. It is not - it already existed on `main` at 222 lines and this extends it to 597 (3 -> 7 `it` blocks at the top level, 9 tests total), which is why the file count stays 143 and the suite moves +4 rather than +9.
- Re-deriving the binary reading and the statistics was explicitly out of scope for this pass, so the `0x1016229b4` / `0x101625038` disassembly claims and the Poisson figures are **recorded as the author's measurements, not independently reproduced here**. What was checked is that the code is gated, the fixtures have provenance, and the assertions can fail.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant