Repository navigation
fix(macos): forward-port shared release fixes to main - #3099
Open
Saad Najmi (Saadnajmi) wants to merge 43 commits into
Open
Saad Najmi (Saadnajmi) wants to merge 43 commits into
Saad Najmi (Saadnajmi) wants to merge 43 commits into
Conversation
Port dbb0b39, 4972b56, 661fd61, 7518263, 7ee8719 and 7684cf0 from microsoft#3022 with main-compatible adaptations. Use the codegen workspace version on fork-point branches. Prefer the private-package policy from bfb629a66d5 over an RNTester-specific ignore. Gate only registry-dependent init, propagate registry failures, and retain local test-app coverage. Validated with seven Node 22 tests and actionlint. Independently reviewed for fork suitability, merge durability and later equivalents.
Forward-port c007388 from the 0.86 stack. This canonicalizes the fixes carried on 0.84 release (5f8d15d) and 0.85 release (2b57c6c). Absolute checkout paths containing hidden or __tests__ ancestors otherwise copy raw Flow sources or ignore the entire package. Preserve absolute paths for file operations, but match package-relative paths. Independent review exercised six before/after VM cases using real micromatch, Babel and Prettier, including fixture exclusion, Flow sidecars and asset copies.
Adapt 434e93cdad27 from the local 0.87 stable stack for main. Restrict normalization to relative paths, match complete workspace package names, and select the deepest node_modules package. This repairs generation of checkout-dependent imports found in the 0.84, 0.85 and 0.86 release snapshots without copying release artifacts onto main. Independent review passed 19 focused tests including real snapshots and post-processing output, targeted ESLint and Prettier. Full type generation remains a release validation step.
Forward-port e4c208d864d7 from the local 0.87 stable stack. ReactNativeDependencies.podspec is one directory below its package root, not two. Independent review verified Ruby syntax, the real checkout fallback, standard react-native and react-native-macos package layouts, and unchanged successful Node resolution.
Forward-port 03d2ca33950c from the local 0.87 stable stack. Both prebuild entry points return after invalid configuration, so set the process exit code before returning. Independent review verified 24 subprocess probes across parent and patched CLIs, including invalid and valid platform cases, plus syntax and whitespace checks.
Forward-port upstream React Native react#57483 (3e5e3c2) from the release lines. The omitted-middle ternary returned a boolean rather than the requested numeric weight. Preserve the fork's AppKit family lookup. Independent review verified upstream patch parity and nine native weight cases including Light, Medium and Bold family selection.
Keep automatic Changesets version PRs and GitHub trusted publishing. Reject unprepared versions and incomplete dependency graphs, align coupled package changelogs, guard stale version PR runs and serialize queued publications. Preserve the reviewed one-tag policy: latest for the newest stable line, branch tag for older stable lines, next for prereleases. Existing versions skip without tag mutation. Retain but disable ADO publication. Independent review passed 30 Node 22 tests including real Changesets version execution. Installed actionlint lacks the documented queue:max field; all other workflow checks passed.
Accept consumed Changesets only when every changed public workspace has a valid version transition and a new nonempty changelog section. Permit exact matching 1000.0.0-to-initial-stable bootstrap versions. Validate deleted public workspaces against base workspace membership and reject unrelated deletions or cross-workspace moves. Independent review verified 48 Node 22 tests and the deletion bypass regressions.
Declare the packaged reporter's Metro dependency, include the virtualized-lists license notice, and remove obsolete DevTools and update-ruby references. Independent review verified actual pack contents and isolated reporter resolution without changing locked package versions.
Forward-port the reviewed 0.83 release graph policy: keep private tools on workspace dependencies, preserve fork workspace links for Changesets, and couple public core/list versions. Main retains origin/main and excludes private package releases. Independent review verified 51 contract tests and actual Yarn constraints without changing package versions.
Load the V1 view before populating its RCTUITableView and dismiss through the actual presenting controller instead of the current key window. Independent native AppKit review reproduced empty first-display rows and verified 28 fixed lifecycle checks.
Use target-owned add_dependency paths instead of unsuffixed framework directories for cxxreact, TurboModule core, RuntimeApple and the sample codegen module. Independent CocoaPods review verified versions and generated header paths across platform configurations.
Resolve optional RCTTextView dynamically for accessibility and use native NSTextField selection behavior. Remove reverse React-Core class references to React-RCTText without adding a circular pod dependency. Independent review verified producer symbols and native behavior.
Declare the framework owner for Image, Animation, Text, CoreModules and Fabric class references. Independent review verified no dependency cycle and generated linker flags across 270 CocoaPods configurations.
Fit the native column to its document width and use text constraints for automatic row heights. Preserve explicit fixed-height cells and keep UIKit behavior unchanged. Independent review verified native layout, reuse, and lifecycle probes with negative controls. (cherry picked from commit faf217741e9dbc71d09ca3828e250bb1878575a6)
Add platform-dispatch headers, guard macOS translation units, and retain canonical static/framework header namespaces without exporting conflicting platform families. Independent review verified CocoaPods selection, Android dispatch and real-header dependency traces. (cherry picked from commit f2e474f9ee570fabca74de28e26bc5440f6b22ea)
Share explicit legacy-default, V1-default and single-version metadata policies without tying Hermes coordinates to RN package versions. Preserve tarball/version overrides and CI source-tag fallback when artifact metadata is absent. Independent review verified 73 Node 22 tests including real CI entry points and missing-metadata fallback. Later fork policies remain explicit caller adaptations. (cherry picked from commit fab736d13f0045b6ae02ad52f8aa4607f2a9f755)
(cherry picked from commit 1549ba34ad124c64fc91202ed0ed8a98681a9df8)
Prepare Node packages, local codegen and validated generated types only after release eligibility. Use the coupled public package selector for PR dry runs, excluding independently published init.
(cherry picked from commit 76ade17c8699445aac8dac215b4bebc0bf3efccb)
(cherry picked from commit b09a500b5bfdc9c60eb1c9c8d86af5435982af20)
Apply the independently approved four-file candidate from main-4de3-fix-evidence/main-4de3-fix.patch, based on 4de3e75. Approval: ses_f3dcf284. Include private workspace dependencies in type resolution, exclude node_modules links from snapshot discovery, and preserve the reviewed regression test and generated API snapshot exactly. Prior measured validation: all 18 generated TypeScript diagnostics resolved; final full Flow check reported 0 errors. Provenance: TEMP/main-4de3-fix-evidence/REPORT.md. Tests were not repeated during application. Candidate stable patch-id: e3289b3576a155e45acde2069dc00660ccc00ac1. All four staged file blobs match the reviewed candidate.
This was referenced Sep 22, 2026
Preserve validated per-branch source and corrected stack dependencies.
Preserve package versions and the linear stack; change only equivalent executable-path metadata.
Jason Morse (JasonVMo)
approved these changes
Sep 22, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 862ec619-ee4d-4284-8d20-ed11a7f29c34
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 862ec619-ee4d-4284-8d20-ed11a7f29c34
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 862ec619-ee4d-4284-8d20-ed11a7f29c34
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 862ec619-ee4d-4284-8d20-ed11a7f29c34
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 862ec619-ee4d-4284-8d20-ed11a7f29c34
This branch has not been deployed
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.
Current release stack
main. Retarget as predecessors land; stable releases retain separate stable branches.09c0eb1f090863c7f3374415d4cd9eb8de6e8188.Shared reusable release fixes into main; precedes #3030.
Historical validation and backups
The earlier release-stack repair recorded 1,406 helper tests and six native build passes. Public-registry correction run 35769816507 applied to prior heads. These historical results do not validate the current head. The Test Plan below supersedes the older helper-count and checksum-preservation claims: lock format changes from v8 to v10, the Changesets closure changes, and Yarn built-in patch checksums change intentionally.
Previous heads remain preserved under
backup/pre-ci-repair-20260922/<original-branch>andbackup/pre-public-registry-20260922/<original-branch>. Local executor intermediate heads are also preserved.The 0.87 PR sequence is #3037 → #3104 → #3105 → #3106 → #3100 → #3101 → #3107. The redundant #3102/#3103 reviews are consolidated into #3105.
This section supersedes earlier stack-order and source-identity notes. Current validation is recorded below.
Summary:
Update the existing forward-port with the tooling that published 0.83.0. Preserve the PR history and
mainbase. Prior commits:c4cbc4d,a3fc706,996f147,9016c85. Follow-up review fix:09c0eb1.66de84c(#3109),a9a09af(#3113),ccb5cfb(#3114),b6204cb(#3115),14ab3b5(#3116),30647ac,19f618c.ado/scripts/configure-publish.mts;.github/scripts/{change,changeset-version-with-postbump,export-versions}.mts; publish/PR workflows; setup-toolchain action; obsolete contract scripts/tests and standalone version workflow removed66de84c.yarnrc.yml, vendored Yarn,.changeset/config.json, regenerated root lock19f618cmicrosoft-react-native-test-app-integration.yml72191a3(#3022)66de84c; exact hosted immutable-install diffdocsite/yarn.lockonly: format v10, resolve patch hash, obsolete patch checksum removal; no dependency-version changes09c0eb1continue-on-errorlines restored from mainKeep the publish-action guard
steps.configure-publish.outputs.publish_react_native_macos == '1': manual dispatch on main must not publishreact-native-macos@1000.0.0. The follow-up also requires a nonemptypublishTag, passes that tag toyarn changeset publish --tag, and grants the version GitHub App token both contents and pull-request write permissions. ExplicitprivatePackages: {version:true, tag:false}preserves main's v2 version behavior under v3 and preventsInvalid treeerrors.All 40 new Changesets v3 selectors match the published stable dependency versions, resolutions, checksums, dependencies and executable paths. Retained package versions remain unchanged. Eight root
resolvepatch descriptors intentionally change hashc3c19dto9bd1a5and coupled checksums. Public executable-path spelling preserves the earlier registry correction. Six normalized selector groups reflect graph differences. The website follow-up changes exactly five lines; all 1,234 records retain versions/dependencies and all 54 bin records retain public spelling.Relative to the earlier PR head, remove generated-types CI steps, changeset-config/check-release-published jobs and scripts, custom publication tests,
review/**and personal RedBox2 branch triggers, and dry-run include filters. These are earlier-PR removals, not removals from main. Relative to main, the PR workflow retains the stable-only init required-job dependency. The follow-up restores.github/actions/setup-xcode/action.yml,.github/workflows/microsoft-pr.yml,.github/workflows/autorebase.yml, and.github/workflows/needs-attention.ymlexactly to main atff076850d196865e1ac2dd9328b946c09a70a7d5. The new workflow consolidates version/publish modes.Keep Hermes source/tests, main versions, Metro ranges,
.gitignore, package extensions, the API generationnode_modulesexclusion and podspec homepage. Exclude stable version bumps, CHANGELOGs, stable lock copies, Podfile locks, release artifacts, RedBox2, frame timing, wildcard Git repository approval and unrelated upstream changes.The flagged environment-derived shell command in
.github/scripts/__tests__/publishing-workflow.test.mjsis removed with the obsolete test. The inline review thread has a reply and is resolved.Test Plan:
Local checks ran in isolated executor worktrees.
$Sdenotes an isolated evidence directory; machine-specific executable prefixes are omitted. The existing validation entries below apply to prior heads through9016c8574fbf00a7db98fa201fc03c4ae6b6b68c; the separate follow-up section records validation for09c0eb1f090863c7f3374415d4cd9eb8de6e8188.env YARN_NPM_REGISTRY_SERVER=https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry YARN_NPM_ALWAYS_AUTH=false YARN_ENABLE_GLOBAL_CACHE=false YARN_CACHE_FOLDER=$PWD/.yarn/cache node .yarn/releases/yarn-4.18.1.cjs install --immutable— passed with known peer warnings, including after the website follow-up.node .yarn/releases/yarn-4.18.1.cjs constraints— passed.node .yarn/releases/yarn-4.18.1.cjs jest .github/scripts/__tests__/resolve-hermes-test.js scripts/js-api/build-types— passed: 21 suites, 143 tests, 105 snapshots.node .yarn/releases/yarn-4.18.1.cjs eslint --max-warnings 0 packages/react-native-codegen/scripts/build.js packages/react-native/scripts/ios-prebuild/cli.js scripts/releases/ios-prebuild/cli.js scripts/js-api/build-types/buildApiSnapshot.js scripts/js-api/build-types/transforms/typescript/canonicalizeLocalPackageImports.js scripts/js-api/build-types/transforms/typescript/__tests__/canonicalizeLocalPackageImports-test.js— passed.node .yarn/releases/yarn-4.18.1.cjs prettier --list-different packages/react-native-codegen/scripts/build.js packages/react-native/scripts/ios-prebuild/cli.js scripts/releases/ios-prebuild/cli.js scripts/js-api/build-types/buildApiSnapshot.js scripts/js-api/build-types/transforms/typescript/canonicalizeLocalPackageImports.js scripts/js-api/build-types/transforms/typescript/__tests__/canonicalizeLocalPackageImports-test.js .github/workflows/microsoft-npm-publish.yml .github/workflows/microsoft-pr.yml .github/workflows/microsoft-react-native-test-app-integration.yml .changeset/config.json package.json— passed.actionlint .github/workflows/microsoft-npm-publish.yml .github/workflows/microsoft-pr.yml .github/workflows/microsoft-react-native-test-app-integration.yml— passed; baseline failed on removedconcurrency.queue.ruby -c packages/react-native/third-party-podspecs/ReactNativeDependencies.podspec— passed:Syntax OK.env YARN_NPM_REGISTRY_SERVER=https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry YARN_NPM_ALWAYS_AUTH=false YARN_ENABLE_GLOBAL_CACHE=false YARN_CACHE_FOLDER=$PWD/.yarn/cache node .yarn/releases/yarn-4.18.1.cjs changeset status --since=upstream/main— no config error; expected exit 1 because there is no changeset. Unadapted main and stable configs reproduceInvalid tree.node .ado/scripts/configure-publish.mts --mock-branch main --verbose— passed: exit 0 and nightly-disabled message.env -u GITHUB_BASE_REF -u GITHUB_HEAD_REF GITHUB_ACTIONS=true GITHUB_REF=refs/heads/main GITHUB_OUTPUT=$S/out-main.txt node .ado/scripts/configure-publish.mts --verbose— passed: exit 0 and zero output bytes.env YARN_NPM_REGISTRY_SERVER=https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry YARN_NPM_ALWAYS_AUTH=false YARN_ENABLE_GLOBAL_CACHE=false YARN_CACHE_FOLDER=$PWD/.yarn/cache python3 -c "import os, subprocess; subprocess.run(['node', '.yarn/releases/yarn-4.18.1.cjs', 'changeset', 'publish-plan'], check=True, timeout=120, env=os.environ.copy())"— passed; onlyreact-native-macos@1000.0.0 (latest), blocked by the main guard. Initial default-registry query failed withYN0041; public-feed retry passed. No publication ran.node .yarn/releases/yarn-4.18.1.cjs workspaces list --no-private --json— passed; public set is RNM and init only.git diff --check— passed. Full baseline-range whitespace findings are verbatim-stable workflow blanks and vendored Yarn, independently classified nonblocking.git merge-tree --write-tree --name-only HEAD upstream/main— passed without conflicts, treecd14d42ac6ce907c5a8a25ae4488ffe7f1d23018, against mainff076850d196865e1ac2dd9328b946c09a70a7d5.PASS_TO_COMMIT_AND_LANDfor tooling head996f147and website follow-up9016c85; push only, no merge.Prior-head hosted website verification: job 115644092966 at head
9016c8574fbf00a7db98fa201fc03c4ae6b6b68cpassed bothyarn(Install dependencies) andyarn build(Build website), plus artifact upload. The complete PR run 38500084648 also passed at that head. These hosted results do not validate the new workflow-only follow-up.Follow-up validation (
09c0eb1f090863c7f3374415d4cd9eb8de6e8188)actionlint -shellcheck= -pyflakes= .github/workflows/{microsoft-npm-publish,microsoft-pr,autorebase,needs-attention}.yml— passed with no output.ruby "$S/follow-up-workflow-assertions.rb"— passed YAML parsing for all five changed files and all 10 assertions: stable/dispatch triggers, App token permissions and use, exact tag forwarding, nonempty guarded publication, and stable-only init aggregation.bash "$S/configure-publish-cases.sh"withFAKE_LATEST=0.81.2andFAKE_NEXT=0.82.0-rc.1— passed:mainemitted no output;0.79-stableemitted branch tag plus enable flag;0.81-stableemittedlatest;0.82-stableemittednext; PR base0.79-stableemitted the branch tag without the publication enable flag. The harness executed the actual.ado/scripts/configure-publish.mtsthrough a NoderegisterHookszxstub. No publish or network write ran.for path in .github/workflows/microsoft-pr.yml .github/actions/setup-xcode/action.yml .github/workflows/autorebase.yml .github/workflows/needs-attention.yml; do git show ff076850d196865e1ac2dd9328b946c09a70a7d5:"$path" | cmp - "$path"; done— passed; all four restored paths are byte-exact with main.git diff --check HEAD^ HEAD— passed.git diff --name-only HEAD^ HEAD | sort— passed with exactly the five approved files.git status --short— clean after commit. No dependency install, package build, native build, actual publication, or network write was required for this workflow-only follow-up.PASS_TO_COMMIT_AND_LAND; reviewer inspected the actual commit and reran the workflow and configuration gates. Landing means push, not merge.Published-source evidence: run 36647842788, attempt 6, succeeded at stable
19f618c032c9f07967281ed5c462dc3259e8e7e1and logged successful 0.83.0 publication. Both 0.83.0 tags point there. Native builds and full Flow/build suites were not rerun locally for this focused tooling update.