Skip to content

Windows on ARM: finish the native build, and stop writing the import gate twice - #7

Merged
nazmiefearmutcu merged 2 commits into
mainfrom
fix/win-arm64-import-gate
Jul 29, 2026
Merged

Windows on ARM: finish the native build, and stop writing the import gate twice#7
nazmiefearmutcu merged 2 commits into
mainfrom
fix/win-arm64-import-gate

Conversation

@nazmiefearmutcu

Copy link
Copy Markdown
Owner

main cannot cut an ARM64 release as it stands. PR #5 added the
windows-11-arm leg and the win-arm64 dependency exceptions, but the release
workflow kept a second, inline copy of the import-gate module list — and
that copy still demanded pyarrow, the one module the bundler had been told, in
writing, not to install. The ARM64 leg built both installers, passed its own
gate, and then failed the workflow's.

What is in here

  • One import gate, two callers. The list moves to app/scripts/import-gate.py;
    bundle-python.sh and the release workflow both run it. The bundler writes what
    it excluded to resources/.import-skip so the later, separate workflow step
    gates on exactly what was built without being told again. The file is rewritten
    every run (a skip cannot leak from a previous target in the same checkout), and
    a skip naming a module the gate never checked is an error, not a silent no-op.
  • The download tables name what 1.3.1 actually builds — eight installers, with
    every size read off the leg that produced the file.
  • The size report prints exact bytes as well as du -h, and tees to stdout:
    step summaries are not readable through the API, so a dry-run was reporting
    numbers nothing could fetch.

Verification

Dry-run build 30467653073all five legs green:

leg installers server boots + /api/health
windows-11-arm (aarch64-pc-windows-msvc) FlowMap_1.3.1_arm64-setup.exe 86 MiB · FlowMap_1.3.1_arm64_en-US.msi 151 MiB ✅ 26 modules (pyarrow declared-skipped)
windows-latest (x86_64) x64-setup.exe 115 MiB · x64_en-US.msi 188 MiB ✅ 27 modules
macos-14 FlowMap_1.3.1_aarch64.dmg 176 MiB ✅ 27 modules
macos-15-intel FlowMap_1.3.1_x86_64.dmg 176 MiB ✅ 27 modules
ubuntu-22.04 amd64.deb 457 MiB · amd64.AppImage 338 MiB ✅ 27 modules

(macos-14 first hit hdiutil: create failed - Resource busy, a DMG-creation
flake — the same script had passed on the two previous runs and passed on rerun.)

The gate itself was exercised in all five modes: full environment (27 import),
exclusion by env (26 + 1 skipped), exclusion by sidecar (same), no exclusion
in a pyarrow-free environment (fails, naming pyarrow), and a bogus skip name
(exit 2).

Branched off main, so it is independent of feat/verifiable-releases.

The native ARM64 build worked. It produced both installers —
FlowMap_1.3.1_arm64_en-US.msi and FlowMap_1.3.1_arm64-setup.exe — and
bundle-python.sh's own gate imported all 26 modules the target ships.
Then the release workflow's smoke test failed on `No module named
'pyarrow'`, because it carried a second, inline copy of the same module
list, and that copy still demanded the one module the bundler had been
told — correctly, and in writing — not to install.

Two copies of a list is one copy too many the moment any target needs an
exception. The list now lives once, in app/scripts/import-gate.py, and
both callers run it. bundle-python.sh writes what it excluded to
resources/.import-skip so the later, separate workflow step gates on
exactly what was built without being told again; the file is rewritten on
every run so a skip cannot leak from a previous target in the same
checkout, and a skip naming a module the gate never checked is an error,
not a silent no-op.

Exercised in all five modes: full environment (27 import), exclusion via
env (26 + 1 skipped), exclusion via the sidecar (same), no exclusion in a
pyarrow-free environment (fails, naming pyarrow), and a bogus skip name
(exit 2).

Also `tee` the installer-size table to stdout, not just the step summary:
step summaries are not readable through the API, so a dry-run build was
reporting sizes that nothing could then fetch to update the download
tables with.
Eight installers now, not six: Windows on ARM gets its own setup.exe and
MSI, and they are native ARM64 rather than the x64 build under emulation.

Every size in the table is what CI measured on the leg that produced the
file, on a build where all five legs went green — the previous table had
drifted far enough that both DMG figures were wrong by 15-20 MB in the
same direction, which is what happens when the numbers are typed rather
than read. The workflow's size report now prints exact bytes alongside
`du -h`, since a rounded MiB cannot be converted back into the MB a
download table quotes.

The ARM64 build's one deliberate difference is stated rather than hidden:
pyarrow has no win_arm64 wheel anywhere, so that bundle omits it and pins
cryptography back to the last version that has one. Neither is on a path
FlowMap uses, and the release gate re-proves that by importing the full
lazy closure on the machine that built the bundle.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@nazmiefearmutcu
nazmiefearmutcu merged commit 5df82a5 into main Jul 29, 2026
1 check 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