Skip to content

windows: a Microsoft Store package — the unsigned msix the Store re-signs (GDK-1380) - #90

Merged
midagedev merged 4 commits into
mainfrom
midagedev/bullhead
Sep 3, 2026
Merged

windows: a Microsoft Store package — the unsigned msix the Store re-signs (GDK-1380)#90
midagedev merged 4 commits into
mainfrom
midagedev/bullhead

Conversation

@midagedev

Copy link
Copy Markdown
Owner

Microsoft Store developer registration is free now and the Store re-signs every MSIX it certifies with a Microsoft certificate. That is the free signing route GDK-211 closed for lack of; this PR packs the Windows app for it.

What changes

  • desktop/build-windows.ps1 --msix stages the same portable directory with desktop/msix/AppxManifest.xml and the committed desktop/msix/Assets/ logos and runs makeappx pack. One compile, a second output — the Windows job is CI's critical path (GDK-1036) and does not get a second build.
  • The manifest carries the Partner Center identity (midagedev.Gadak, CN=975F7A25-…, PublisherDisplayName midagedev, DisplayName Gadak), Windows.FullTrustApplication + runFullTrust, the gadak:// protocol, Windows.Desktop ≥ 10.0.17763.0, en-US and ko-KR.
  • CI (Desktop Windows build) signs the x64 msix with a throwaway self-signed certificate under the same CN, installs it, checks Get-AppxPackage identity and the exe path, and removes it. It runs last so the existing HKCU Classes\gadak assertion keeps measuring the pack script alone.
  • desktop-release.yml packs --msix for x64 and arm64 and uploads them as the gadak-desktop-msix artifact. Never a Release asset: unsigned, the file is not installable (-AllowUnsigned needs the OID publisher form this manifest deliberately lacks); it exists for Partner Center.
  • Logos: tools/brand/msix-assets.sh (hooked into make brand), stamped and checked by tools/check-brand-icons.sh.
  • Docs: desktop/README.md, docs/WINDOWS-SIGNING.md status paragraph, CHANGELOG Unreleased (en + ko).

Decisions worth reading

  • Version mapping is a one-way door. The Store refuses a 0.x major and reserves the fourth part, so the manifest carries (major+1).minor.patch.0: 0.20.0 → 1.20.0.0, a future 1.0.0 → 2.0.0.0. Once Partner Center accepts a package, no later upload may carry a lower version, so this cannot be "fixed" back to the semver major. main.appVersion stays the semver.
  • Data paths verified: ~/.gadak is under %USERPROFILE%, which MSIX does not virtualize, so the Store app and the CLI zip share one mirror. WebView2's user data path is wails' default %APPDATA%\gadak-desktop.exe (not exe-relative, which would break under read-only WindowsApps). The first-launch HKCU protocol write lands in the package's private hive; the manifest declaration is what Windows reads.
  • AppExecutionAlias (CLI on PATH via the Store) is deliberately left for a follow-up after a first package passes.

What CI proves and what it does not

CI proves the package installs under its declared identity with a self-signed stand-in. It does not prove Smart App Control passage — only a Store-signed package installed on an SAC-enforcing machine can show that. This PR is a PR because desktop/ and .github/workflows/ are the jobs local gates cannot run; the msix step in particular has never executed outside CI.

If Add-AppxPackage fails on the runner, read the HRESULT first: 0x80073CFF is sideloading policy (the step pre-sets AllowAllTrustedApps), a trust error means the TrustedPeople import did not take. Neither is a manifest problem.

Local gates: tools/doc-checks.sh, scripts/scan-internal.sh, tools/check-brand-icons.sh all green. No Go code changed.

🤖 Generated with Claude Code

midagedev and others added 4 commits September 3, 2026 10:52
…igns (GDK-1380)

Registration is free now and the Store re-signs every MSIX it certifies
with a Microsoft certificate, which is the one route past Smart App
Control that costs nothing (GDK-211 closed on "no free certificate we
qualify for"; this is that certificate, from a direction the page did not
list). So `desktop/build-windows.ps1 --msix` stages the same portable
directory with desktop/msix/AppxManifest.xml and the committed logo set,
and runs makeappx — one compile, a second output, no second build on
CI's critical path.

The manifest carries the identity Partner Center issued (midagedev.Gadak,
the CN publisher, DisplayName Gadak), a full-trust entry point, and the
gadak:// protocol. Its version is (major+1).minor.patch.0 because the
Store refuses a 0.x major; that mapping is a one-way door once a package
is accepted, and the script says so. ~/.gadak is under %USERPROFILE%,
which MSIX does not virtualize, so the Store app and the CLI zip share a
mirror; WebView2's data path is %APPDATA%, not exe-relative.

CI signs the x64 msix with a throwaway self-signed certificate under the
same CN, installs it, checks the identity, and removes it — the only
check that proves more than schema. It runs last in the job so the HKCU
assertion keeps measuring the pack script alone. The release workflow
uploads the msix as an artifact only: unsigned, it is not installable,
and it is for Partner Center, not for a Release.

Logos come from docs/media/logo.png via tools/brand/msix-assets.sh, are
committed like the phone set, and tools/check-brand-icons.sh now checks
their stamp.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…s a copy

The Store submission needs the file, and the tag-only release job is the
wrong place to wait for it on a first upload. The install check now signs
a RUNNER_TEMP copy so what the artifact carries is the untouched package.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The PR checkout is shallow and tagless, so git describe yields a bare
hash and the Store-version mapping had nothing to parse. The install
check still needs a package; the release job checks out with tags.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…es it

The runner signs and trusts the certificate fine; the speculative
AllowAllTrustedApps write is what failed (unauthorized on the Policies
key). If Add-AppxPackage itself reports 0x80073CFF that is the moment to
find the right switch, not before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@midagedev
midagedev merged commit b37b6cf into main Sep 3, 2026
12 checks passed
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.

1 participant