Skip to content

ci: gate interface reproducibility on stable OR nightly moon - #3964

Open
bobzhang wants to merge 2 commits into
mainfrom
hongbo/interface-dual-gate
Open

ci: gate interface reproducibility on stable OR nightly moon#3964
bobzhang wants to merge 2 commits into
mainfrom
hongbo/interface-dual-gate

Conversation

@bobzhang

Copy link
Copy Markdown
Contributor

Summary

Adopting the nightly toolchain for day-to-day development surfaced a CI conflict: nightly's moon info drops the trailing blank line every pkg.generated.mbti ends with, while stable-check hard-gated interface reproducibility with the stable toolchain on every PR — so any interface regenerated with nightly failed CI.

This PR makes the gate toolchain-transition-proof:

  • New interface-check workflow: an interface-stable leg and an interface-nightly leg each run moon info --target wasm,wasm-gc,js,native + moon fmt and diff against the tree. The interface-gate job passes when either leg reproduces the committed state, and fails with regeneration guidance when both fail — which happens exactly when the tree is format-mixed (interfaces regenerated with different toolchains).
  • stable-check drops its two git diff --exit-code gates (now covered by the workflow above); its --deny-warn check, tests, and bundle steps are unchanged. pre-release-check's equivalent gates were already continue-on-error.
  • All 78 pkg.generated.mbti regenerated with nightly (v0.10.5+001eef869) as the new canon: the diff is exactly one removed trailing blank line per file, no content changes, verified idempotent. Until stable picks up the format, the stable leg is expectedly red and the gate stays green via nightly.

Rollout note

Branch protection should require interface-gate (not either individual leg) — the losing leg during a transition window is expected to show as a failed job; only the gate expresses the OR policy.

Validation

Local, with today's nightly: moon check --deny-warn and moon check --target all clean, full moon test 6929/6929, moon bundle --all clean, moon fmt no drift, regeneration idempotent.

Signed-off-by: Codex CLI codex@openai.com

🤖 Generated with Claude Code

bobzhang and others added 2 commits July 31, 2026 22:23
The committed pkg.generated.mbti files and formatting must be
reproducible by one toolchain repo-wide, but which one changes over
time: nightly output formats land before they are promoted to stable
(today: nightly moon info drops the trailing blank line every .mbti
ends with). Hard-gating on stable alone blocks every PR generated with
nightly during such transitions.

New interface-check workflow: an interface-stable leg and an
interface-nightly leg each regenerate interfaces and formatting and
diff against the tree; the interface-gate job passes when at least one
leg reproduces the committed state, and fails with regeneration
guidance when both fail (a format-mixed tree). stable-check drops its
two exit-code gates accordingly; its deny-warn check, tests, and
bundle steps are unchanged. Branch protection should require
interface-gate rather than either leg.

Signed-off-by: Codex CLI <codex@openai.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Nightly moon info no longer emits the trailing blank line at the end
of generated interface files. Regenerate all 78 interfaces with
today's nightly (v0.10.5+001eef869) so the tree is format-homogeneous
on the nightly side of the interface-check gate; the diff is exactly
one removed blank line per file, with no interface-content changes.
Regeneration is idempotent and moon fmt reports no further changes.

Signed-off-by: Codex CLI <codex@openai.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 31, 2026 14:23

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Ready to approve

The changes are consistent with the stated CI/toolchain transition goal and the diffs are limited to deterministic CI wiring plus mechanically regenerated .mbti snapshots.

This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.

Pull request overview

Updates CI to make interface/format reproducibility gating tolerant to stable vs nightly moon output differences, and aligns the committed pkg.generated.mbti snapshots with nightly’s current formatting (removing the trailing blank line) to avoid perpetual churn.

Changes:

  • Added a new interface-check workflow with stable + nightly legs and an interface-gate job that passes if either toolchain reproduces the tree.
  • Removed the moon info / moon fmt git diff --exit-code gates from stable-check (now handled by interface-check).
  • Regenerated committed pkg.generated.mbti files to match nightly output (trailing blank line removed).
File summaries
File Description
v128/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
unit/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
uint64/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
uint16/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
uint/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
tuple/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
test/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
string/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
string/internal/regex_parser/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
string/internal/regex_engine/symbol_map/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
string/internal/regex_engine/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
string/internal/regex_engine/ast/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
strconv/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
sorted_set/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
sorted_map/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
set/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
result/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
ref/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
range/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
random/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
random/internal/random_source/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
quickcheck/splitmix/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
quickcheck/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
queue/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
priority_queue/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
prelude/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
option/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
math/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
list/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
lexbuf/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
lazy/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
lazy_list/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
json/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
internal/strconv/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
internal/regex_engine/shared_types/rechar_set/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
internal/regex_engine/shared_types/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
internal/regex_engine/automata/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
internal/edit_distance/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
int64/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
int16/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
int/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
immut/vector/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
immut/sorted_set/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
immut/sorted_map/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
immut/priority_queue/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
immut/internal/sparse_array/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
immut/internal/path/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
immut/hashset/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
immut/hashmap/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
immut/array/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
hashset/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
hashmap/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
float/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
error/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
env/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
encoding/utf8/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
encoding/utf16/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
encoding/base64/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
encoding/ascii/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
double/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
diff/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
deque/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
debug/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
coverage/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
cmp/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
char/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
bytes/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
bytes/internal/regex_engine/symbol_map/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
bytes/internal/regex_engine/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
bytes/internal/regex_engine/ast/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
byte/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
builtin/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
buffer/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
bool/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
bigint/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
bench/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
array/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
argparse/pkg.generated.mbti Remove trailing blank line in generated interface snapshot
.github/workflows/stable-check.yml Drop interface/format diff gates; defer to interface-check
.github/workflows/interface-check.yml Add stable/nightly interface+format reproducibility with OR gate job
Review details
  • Files reviewed: 79/80 changed files
  • Comments generated: 0
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

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.

2 participants