You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Alpha 5 delivers first-class macOS support and launches the community's native BGFX Zero Hour client against the user's retail data — no Wine. It lands the four-phase feat/macos-host → feat/native-launch stack plus the hardening items from its external review.
Blocker for public macOS distribution: notarization (#322). An unsigned distributed GenHub quarantines every file it writes, and Gatekeeper then blocks the game binary. Until that lands, native launch works only on a developer machine.
Scope
Definition of done: the three PRs land and #322 notarization passes — at that
point there is a distributable macOS build. Priority order; "PR" is which stack PR
closes it (see The mac stack below).
#
Issue
Closed by
1
#314 — Reject multi-variant manifests at ingestion
PR A
2
#315 — Validate retail archive roots before launch
#314–#319 are review findings on code that has not shipped. Their fixes are
folded into the owning branch before the PR opens, so each will close without a
visible "fixes #NNN" diff — the code reads as originally written. Each issue
carries a comment saying which PR closes it. They are kept as issues rather than PR
checklist items because they describe user-visible behaviour worth finding later.
Restructured from four sequential PRs into two independent PRs plus one dependent
one, and rebased onto development @ 8e07339. Local only so far — no remote
branches, no PRs open.
PR
Branch
Commits
Base
Depends on
A
feat/cross-platform-fixes
7
development
—
B
feat/macos-host
4
development
—
C
feat/native-launch
16 (B + A + 4 + wiring)
A and B
both
A and B are independent and can be reviewed in parallel. C opens once they land.
Why this beats the original four-deep chain
The original plan chained macos-host → platform-neutral-model → unix-filesystem → native-launch. Measured against this repo's rules, that chain
is expensive: squash-merging a parent orphans its child (it keeps the parent's
unsquashed commits and goes CONFLICTING, needing a manual retarget and rebase),
and dismiss_stale_reviews_on_push: true means every such rebase drops the
approvals. A four-deep stack pays that three times. We hit exactly this with #305/#309 during the Alpha 4 blockers.
The two middle phases fix real Linux and Windows bugs — silent hard-link copy,
Windows paths on Linux, updater installing the wrong platform, symlink reachability
— and are not macOS work. Checking the actual coupling: of 43 files they touch,
only two tie them to the macOS layer, and the types they introduce
(MacOSGamePathProvider, UnixFileOperationsService, UnixSymlinkCapabilityProvider)
all live in the shared project, not GenHub.MacOS. The only genuinely
macOS-dependent parts are three DI registration lines plus two entries in a shared
test-assertion helper that the macOS branch creates.
Those five lines moved into a single wiring commit at the head of C, which is the
first point where both the types and the module exist. That makes A fully
standalone: 7 commits, zero GenHub.MacOS files, 1384 tests green directly on development. C's tree is byte-identical to the original four-deep stack, so
nothing was lost or gained — 1395 tests green.
The practical win: the cross-platform bug fixes stop being hostage to macOS review,
and two of the three PRs can be reviewed at the same time.
Landing notes
The stack must be rebased once more after chore: alpha 4 release #229 merges.main requires
linear history, so chore: alpha 4 release #229 lands as a squash or rebase — both mint new SHAs, and 8e07339 will not be an ancestor of main. The rebase already done resolved
both collisions against current code, so the second pass should be mechanical.
Two collisions were found and are already resolved in the branches:
Proposal
Alpha 5 delivers first-class macOS support and launches the community's native BGFX Zero Hour client against the user's retail data — no Wine. It lands the four-phase
feat/macos-host→feat/native-launchstack plus the hardening items from its external review.Blocker for public macOS distribution: notarization (#322). An unsigned distributed GenHub quarantines every file it writes, and Gatekeeper then blocks the game binary. Until that lands, native launch works only on a developer machine.
Scope
Definition of done: the three PRs land and #322 notarization passes — at that
point there is a distributable macOS build. Priority order; "PR" is which stack PR
closes it (see The mac stack below).
DYLD_LIBRARY_PATH/LD_LIBRARY_PATHValidateScopesshrink-only ratchetmacos-15CI#314–#319 are review findings on code that has not shipped. Their fixes are
folded into the owning branch before the PR opens, so each will close without a
visible "fixes #NNN" diff — the code reads as originally written. Each issue
carries a comment saying which PR closes it. They are kept as issues rather than PR
checklist items because they describe user-visible behaviour worth finding later.
Moved out of this milestone:
.Files→ResolvedArtifact) → 7. Content Pipeline & Distribution.A large migration across deliverers, validators, CAS refcounting and GC. Adjacent
to Alpha 5 — the mac stack introduces manifest variants and Reject multi-variant manifests at ingestion until .Files consumers are migrated #314 gates them — but
not required to ship native macOS, and big enough to dominate the milestone.
Reject multi-variant manifests at ingestion until .Files consumers are migrated #314's fail-closed gate must stay until Migrate .Files consumers to the resolved-variant model (ResolvedArtifact) #321 lands.
supply-chain hygiene, explicitly low priority, unrelated to macOS.
Dependencies worth knowing
.Files→ResolvedArtifactmigration lands, the ingestion gate is the only protection against a variant manifest corrupting CAS refcounting and GC. Reject multi-variant manifests at ingestion until .Files consumers are migrated #314 must land before any provider can publish aVariantsmanifest.DYLD_LIBRARY_PATH, so behaviour would change silently at notarization time if the variable is still in use.chmodwindow permanently bricks a workspace, because verification never mutates.The mac stack
Restructured from four sequential PRs into two independent PRs plus one dependent
one, and rebased onto
development@8e07339. Local only so far — no remotebranches, no PRs open.
feat/cross-platform-fixesdevelopmentfeat/macos-hostdevelopmentfeat/native-launchA and B are independent and can be reviewed in parallel. C opens once they land.
Why this beats the original four-deep chain
The original plan chained
macos-host→platform-neutral-model→unix-filesystem→native-launch. Measured against this repo's rules, that chainis expensive: squash-merging a parent orphans its child (it keeps the parent's
unsquashed commits and goes
CONFLICTING, needing a manual retarget and rebase),and
dismiss_stale_reviews_on_push: truemeans every such rebase drops theapprovals. A four-deep stack pays that three times. We hit exactly this with
#305/#309 during the Alpha 4 blockers.
The two middle phases fix real Linux and Windows bugs — silent hard-link copy,
Windows paths on Linux, updater installing the wrong platform, symlink reachability
— and are not macOS work. Checking the actual coupling: of 43 files they touch,
only two tie them to the macOS layer, and the types they introduce
(
MacOSGamePathProvider,UnixFileOperationsService,UnixSymlinkCapabilityProvider)all live in the shared project, not
GenHub.MacOS. The only genuinelymacOS-dependent parts are three DI registration lines plus two entries in a shared
test-assertion helper that the macOS branch creates.
Those five lines moved into a single wiring commit at the head of C, which is the
first point where both the types and the module exist. That makes A fully
standalone: 7 commits, zero
GenHub.MacOSfiles, 1384 tests green directly ondevelopment. C's tree is byte-identical to the original four-deep stack, sonothing was lost or gained — 1395 tests green.
The practical win: the cross-platform bug fixes stop being hostage to macOS review,
and two of the three PRs can be reviewed at the same time.
Landing notes
The stack must be rebased once more after chore: alpha 4 release #229 merges.
mainrequireslinear history, so chore: alpha 4 release #229 lands as a squash or rebase — both mint new SHAs, and
8e07339will not be an ancestor ofmain. The rebase already done resolvedboth collisions against current code, so the second pass should be mechanical.
Two collisions were found and are already resolved in the branches:
SharedViewModelModule/IGitHubTokenStorage(fix(linux): resolve optional token storage at startup #301) — anticipated, andtrivial:
sp.GetService<IGitHubTokenStorage>()is byte-identical on bothsides, since fix(linux): resolve optional token storage at startup #301 made the same fix. Only the stack's explanatory comment
conflicted; it was kept, as fix(linux): resolve optional token storage at startup #301's version has none.
ManifestDiscoveryServiceconstructor (fix(manifest): use JSON file pattern during discovery #305/fix(manifest): continue past unavailable directories #309) — not anticipated, andthe dangerous one. The stack adds
IConfigurationProviderServiceto theconstructor; fix(manifest): use JSON file pattern during discovery #305/fix(manifest): continue past unavailable directories #309 added filesystem test seams to the same constructor.
Git auto-merges the production file with no conflict and produces code
that does not compile (
CS1729) — only the test file conflicts, so amechanical resolution looks clean and then fails to build. Resolved by
collapsing the two constructors into one with the seams as optional
parameters, so any future dependency causes a compile error at every call
site instead of a silent broken chain.
Fold the review fixes into the owning branch before opening PRs
(Reject multi-variant manifests at ingestion until .Files consumers are migrated #314–macOS installation detector must distinguish TCC denial from no installations found #319 map to PRs as noted in the priority table above).
Open A and B together; open C after both land.
Say in A's description that it fixes Linux and Windows bugs and stands on its own
merits — it is not macOS-only work.
Engine-repo track
Tracked separately in the engine repository (
bobtista/GeneralsGameCode,topic/trunk, upstream TheSuperHackers):CNC_ZH_USERDATAPATHfor per-profileOptions.iniGlobalData.cppto always append the separatorThe third is the engine-side half of #315 and would simplify every GenHub-side mitigation.
Status
Alpha 5 opens once Alpha 4 ships. Alpha 4 readiness is tracked in #307.