ci(release): gate every core bump — auto and manual — on config validation - #105
Merged
Conversation
loss-and-quick
force-pushed
the
test/rust-more-coverage
branch
from
June 22, 2026 16:47
412bd3e to
9ec1d0d
Compare
… cores The weekly release auto-bumps pinned core versions when upstream advances. If a new core version's config schema drifted from our generators, that shipped a broken build. Now the bump is gated: - scripts/check-core-compat.sh stages the cores and runs the config-validation harness against them (reused by both entry points below). - release.yml prepare runs it against the NEW versions before the bump/tag; a rejected config fails the job, so no release is cut until the generators are fixed. - core-compat.yml runs it weekly against the LATEST upstream cores for early warning, opening a single deduped tracking issue on drift (and closing it when compatibility is restored) — no issue spam. Verified locally against the staged cores: the harness fails (4 configs) on the pre-fix generators and passes (49/49) with the generator fixes, exactly the signal the gate relies on.
The release gate only covers the auto-bump. A PR that hand-edits core-versions.sh (or the generators) could otherwise merge a pin the cores reject. Run the same config-validation harness on PRs touching core-versions.sh / fetch-cores-desktop.sh / crates/kasumi-core, against the versions the PR pins — so neither path can ship a core our generators don't match. Issue bookkeeping stays schedule-only (on a PR the red check is the signal).
loss-and-quick
force-pushed
the
ci/core-compat-gate
branch
from
June 22, 2026 17:01
d6226fa to
dc03586
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Gates the weekly release's core auto-bump on the config-validation harness, so a new xray/sing-box version whose config schema drifted from our generators can't ship a broken build — and warns about the drift days earlier.
The release pipeline already auto-bumps the pinned core versions when upstream advances. Until now nothing checked that the new core still accepts the configs we generate; a schema change (a field a core starts rejecting, or a newly-required one) would sail straight into a release. This wires the validation harness in as a gate.
scripts/check-core-compat.sh— stages the cores (honouringXRAY_VERSION/SINGBOX_VERSIONoverrides) and runscargo test -p kasumi-core --test core_validationagainst them. A rejected config fails the script. Shared by both entry points below.release.yml(hard gate) — inprepare, when a core bump is detected (bins_changed), it stages the new versions and runs the check before the bump/tag. A rejected config fails the job → no bump, no tag, no release, until the generators are fixed. Exactly "no release-bump if the new version needs generator changes".core-compat.yml(early warning, no spam) — runs weekly (Sunday, a day before the Monday release cron) against the latest upstream cores. On drift it opens one tracking issue, deduped by a fixed title (a persistent drift never opens a second); when compatibility is restored it auto-closes that issue. So at most one open issue, ever.Verified locally (against the staged real cores)
actionlint(both workflows) +shellcheck(the script) clean.Affected layer
frontend/— React Web UIcrates/·src-tauri/— Rust core / backend / Tauri desktopmodule/scripts/— build / release helpers.github/Verification
actionlint .github/workflows/core-compat.yml .github/workflows/release.ymlshellcheck scripts/check-core-compat.shcore_validationtest skips without staged cores, as before)Checklist
Notes for reviewers
in:title "Core compatibility: …") rather than a label, so no label needs provisioning.prepareonly whenbins_changed— it's a no-op on ordinary releases.Update: also covers manual bumps (not just the auto-bump)
The release gate only runs in
release.yml, i.e. for the auto-bump. A collaborator hand-editingcore-versions.sh(or the generators) in a normal PR would have bypassed it.core-compat.ymlnow also triggers onpull_requesttouchingscripts/core-versions.sh,scripts/fetch-cores-desktop.sh, orcrates/kasumi-core/**, validating the versions the PR pins against the real cores. So no path — automated or manual — can land a core our generators don't match.Note on access: triggering a release (
workflow_dispatch) needs repo write access, and pushing tomainis blocked by the branch ruleset (release.yml uses a dedicatedRELEASE_TOKENPAT precisely to bypass it), so an outsider can't cut a release or push a bump to begin with — this closes the remaining gap for collaborators who can.