The version-bump hook classified every app update that was not a major
as a chart patch, so an app minor arrived as a patch - the mechanism
behind the sonarr incident, where a security default was switched off
inside a bump the conventions told the reviewer not to read (Gitea #128).
ci/renovate-bump-chart.sh now takes the level from Renovate's update
type, passed in as a second argument: major -> major, minor -> MINOR,
patch/digest/pin -> patch. The level comes from Renovate rather than
from comparing appVersion because an appVersion comparison is blind to
the case that prompted the rule - freesailarr keeps a hand-maintained
appVersion for ten upstreams, and prowlarr's 2.5.2 -> 2.6.5 moved an
image tag in values.yaml while appVersion stood still.
Three properties come with it:
- Maximum, not replacement. The chart jump is the greater of the
chart's own classification and the app jump, so a value that becomes
required stays a major under an app patch. Mechanically it is also
what makes a grouped branch deterministic: the hook runs once per
update from the same base commit, so without it the last call would
win.
- Non-semver app versions stay at patch for a minor (seven charts). In
CalVer and date tags the second position is a month; in a four-part
or suffixed version the positions are not semver positions. An app
major is not subject to it.
- A missing or unknown update type falls back to the pre-#128
behaviour. postUpgradeTasks only runs where the command is
allow-listed on the shared instance, which is not visible from here
and fails silently, so the worst case is the old classification
rather than every chart PR red on the version check.
ci/run-bump-level-test.sh holds 49 cases against the version string the
script writes, wired up as the bump-level job: a wrong level is a valid
version string, so the PR would go green and the only symptom would be
a number that understates what it publishes.
The convention texts follow in CLAUDE.md and README, including the
limit the decision deliberately keeps: the reading duty was rejected,
so the incident stays repeatable and the honest number is the whole of
the remedy.
Fixes#128