fix(renovate): size the scan timeout for a cold run

What happened

The first scan after !84 (merged) enrolled the group could not finish inside the 1h 30m timeout that MR introduced. Measured on the live run: 41 of 56 projects in 72 minutes.

The cost is not autodiscovery — it is the work a cold run has to do. Every branch it finds gets opened, and every JS project's lockfile gets regenerated. Steady-state daily runs will be a fraction of this because most projects have nothing to do; the timeout has to be sized for the cold case regardless, or a re-enrollment can never complete.

Raised to 3h, with the measurement recorded in the preset so the next operator doesn't tune it down to a value that fits a warm run and silently breaks a cold one.

On not retrying a timeout

Left the retry block alone, and added a comment saying why. job_execution_timeout is a distinct failure reason from the three infrastructure classes listed (runner_system_failure, stuck_or_timeout_failure, scheduler_failure), so a timeout is not caught by them today — and it should stay that way. Retrying a scan that legitimately needs more wall-clock than it was given cannot succeed; it just spends the budget a second time. The correct response to this job timing out is to raise the timeout, which is what this MR does.

The same run surfaced a systemic push-rule problem that blocks Renovate on a large slice of the group: 21 of the 31 projects that set a commit_message_regex have a double-escaped one

^(feat|fix|chore|docs|refactor|test|ci|build|perf|style|revert)(\\(.+\\))?:.+

\\( matches a literal backslash, so the optional scope group can never match and every scoped conventional commit is rejected. Bare chore: passes; chore(deps): update x does not. Renovate always writes a scope, so it cannot push a branch to any of those 21 projects — the scan log shows [remote rejected] (pre-receive hook declined) for each.

That is a project-settings fix across 21 projects rather than a change to this catalog, so it is not in this MR.

Validation

glab ci lint valid; the preset YAML parses.

🤖 Generated with Claude Code

Merge request reports

Loading