Proposal: make `main` the nightly-vetted branch, and gate promotion on a full physics run
メンテナーはふだん 3 日以内に返信
@matt-pharr がすでに取り組んでいます。
2026年8月12日 から。
評価
この issue はまだ評価されていません。
説明
Summary
Right now develop is the GitHub default branch, so anyone who clones GPEC gets the
integration branch. Since the package is not registered and the docs install it by
git clone + Pkg.instantiate (docs/src/set_up.md:66), the default branch is our
distribution channel — we are shipping unvetted code to new users by default.
This proposes a three-tier verification model and a redefinition of main:
develop— integration branch. Everything merges here, as today.main— blessed: fast-forward only, and only todevelopcommits that passed the
full front-to-back regression suite. Becomes the GitHub default branch — what users clone
and install.- Version tags on
main— cut intermittently, when maintainers are happy, for citation
and reproducibility.
The verification suite behind it is the golden-value regression overhaul now underway (converged
physics pins on δW, Δ′, perturbed-equilibrium quantities, tearing γ, NTV torque, across
equilibrium scans), which also fixes the harness confounds in #338.
The three tiers
| Tier | Trigger | Where | Contents |
|---|---|---|---|
| 1 — fast | every PR push | GitHub Actions | unit tests + fast analytic golden cases |
| 2 — selective | maintainer label, when ready to merge into develop |
feynman cluster | golden cases selected by what the diff touches |
| 3 — full | every push to develop, nightly as backstop |
feynman cluster | every golden case; a green result is what makes a commit promotable |
Tier 2 exists so that contributors are not made to run the whole suite for a change confined to
one module: a change to the Δ′ calculation need not re-run the kinetic or perturbed-equilibrium
cases, while a change to spline gridding re-runs everything. The selection map fails open
(anything unmapped selects the full tier), and because tier 3 runs on every develop push, the
map validates itself: any case that fails at tier 3 but would have been skipped at tier 2 is a
map bug we can detect and fix automatically.
Tier 3 runs per-push rather than only nightly because attribution is otherwise expensive — if
five PRs land in a day and a nightly goes red, someone owes a bisect at full-suite cost. The
cluster has 50 SLURM CPUs and harness cases are independent processes, so per-push is minutes
of wall time.
Why main should be verification, not releases
Three concerns are usually conflated in one branch:
- Integration — where work lands. Continuous. Needs a branch (
develop). - Verification — "this commit passed the full physics suite." Continuous, mechanical,
automatic. Needs a branch (main). - Release — "maintainers judge this fit to cite and depend on." Discrete, human, semver.
Needs a tag, not a branch.
For a scientific code whose users clone the repo, verification is the property they need
continuously; releases are for papers and reproducibility. So: main moves whenever the full
suite is green, and tags mark the points humans bless.
Alternatives considered
A separate stable branch (vetted) plus main (versioned releases). stable and main
would differ only by whether a version had been cut at that commit — which is exactly what a tag
encodes. The extra long-lived branch adds a second merge path, a drift risk between two branches
that must stay related, and ambiguity about which branch a hotfix targets, in exchange for a
convenience that git checkout v0.3.1 already provides.
Versioning every merge into main. This collides with fast-forward-only promotion: if main
only fast-forwards, no commit can originate there, so a version bump must land on develop and
flow through. Versioning every merge would put a Project.toml bump in every PR. Version bumps
should be deliberate and occasional; verification is the thing that should be continuous.
Backporting (fixing an old release while develop moves on) is the one case that would
justify more branches. It is served by release/0.2.x branches cut on demand, which is
orthogonal to this proposal and can be added later. Do we foresee needing it?
What this requires
- Fast-forward-only promotion to
main.mainadvances to the exact SHA that tier 3
tested — never todevelop's tip at promotion time, and never via a merge commit, which
would publish a tree nothing tested. Requires enablingrequired_linear_historyonmain. - Promotion opens a PR; a human merges it. Keeps
main's existing 2-approval rule and our
human-review policy intact. (Tradeoff: a bot-opened fast-forward PR still needing two
approvals may bottleneck promotion. The alternative — letting automation push to the
public-install branch — seems worse. Opinions welcome.) - Change the default branch to
mainonce it exists in blessed form, and update the clone
instructions indocs/src/set_up.md. - Revise the hotfix workflow. Today
hotfix/branches frommainand merges intomain+
develop(docs/development/git-workflow.md). That puts a commit onmainthat is not an
ancestor ofdevelop, which breaks fast-forward promotion permanently. Revised: branch from
the blessed SHA, PR intodevelop, expedited full-tier run, then normal promotion. A genuine
emergency uses an explicitpromote:unblessedlabel with recorded justification, so an
override is visible rather than silent. - Make a frozen
mainloud. A red tier 3 stops promotion by design. That needs an
auto-opened issue and a "days sincemainadvanced" signal, or a freeze quietly becomes the
status quo. Two documented unblock paths: fix the regression, or — if the change was an
intended physics improvement — regenerate the golden values with convergence evidence. - Contributor-facing rule: a PR that intentionally changes physics regenerates its golden
values in that PR. Otherwise it passes tier 1, turnsdevelopred at tier 3, and freezes
promotion for everyone else.
Unrelated bug found while checking this
develop's branch protection requires the contexts runtests 1.11 - ubuntu-latest and
runtests 1.x - ubuntu-latest. But test.yaml is path-filtered and deliberately publishes a
stable Tests job so that a skipped suite does not block a merge — the workflow says so in a
comment. As configured, a PR that touches no Julia code skips the matrix jobs, their contexts
never report, and the required check stays pending indefinitely. It has not bitten us because
almost every PR touches Julia. Protection should point at Tests instead. Worth fixing before
we add tier checks, or the new tiers inherit the same trap.
Questions for the group
- Does
main-as-blessed vs a separatestablebranch match how people expect to consume GPEC? - Two approvals on an automated fast-forward promotion PR: right, or a bottleneck?
- Do we anticipate backporting fixes to older releases?
- Who owns the feynman-side runner, and do we want a self-hosted GitHub Actions runner there
(integrated status checks, but the repo is public, so fork PRs are a code-execution risk and
the workflow would have to be restricted toschedule/workflow_dispatchwith an ephemeral
runner) or a cron +sbatchjob reporting through the API (safer, less integrated)?
- 主要言語
- Julia
- スター
- 11
- フォーク
- 7
- 平均マージ
- 4日 3時間
- マージ済み PR(30日)
- 70
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
OpenFUSIONToolkit/GPEC のほかの issue
-
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
OpenFUSIONToolkit/GPEC#644 ·
メンテナーはふだん 3 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
OpenFUSIONToolkit/GPEC#643 ·
メンテナーはふだん 3 日以内に返信
-
PerturbedEquilibrium - FEATURE - Complete the resistive perturbed-equilibrium workflow from Galerkin and matched results対応中かも @matt-pharr が 1 日前に担当しました。 オープンfeature
OpenFUSIONToolkit/GPEC#635 · コメント 1 件 · 担当者 1 名 ·
メンテナーはふだん 3 日以内に返信
-
test
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
OpenFUSIONToolkit/GPEC#633 · コメント 2 件 ·
メンテナーはふだん 3 日以内に返信
-
Tearing - FEATURE - Add a general modified Rutherford equation for island evolution対応中かも @StuartBenjamin が 1 日前に担当しました。 オープンfeature
OpenFUSIONToolkit/GPEC#630 · 担当者 1 名 ·
メンテナーはふだん 3 日以内に返信
OpenFUSIONToolkit/GPEC の issue をすべて見る
似ている issue
-
`ShallowWaterModel` allocates ~9 KiB per grid point per RK3 stage on the CPU対応中かも @ali-ramadhan が今日担当しました。 オープンperformance 🏍️
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
CliMA/Oceananigans.jl#6421 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
NCAR/musica#1118 · コメント 1 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
`AMSGrad` state starts at `epsilon` instead of zero, so zero gradients move parameters and small gradients are damped対応中かも @parth-patel010 が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
FluxML/Optimisers.jl#247 · コメント 1 件 ·
-
README should say that row and column order must match対応中かも @SAUMYARSH が今日担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 84/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100