Skip to content

Let Windows arm64 install, since the code never needed those wheels - #483

Merged
JE-Chen merged 2 commits into
mainfrom
feat/windows-arm64-install
Aug 20, 2026
Merged

Let Windows arm64 install, since the code never needed those wheels#483
JE-Chen merged 2 commits into
mainfrom
feat/windows-arm64-install

Conversation

@JE-Chen

@JE-Chen JE-Chen commented Aug 20, 2026

Copy link
Copy Markdown
Member

Progress.md recorded Windows arm64 as BLOCKED, and that was half right.

opencv-python and cryptography publish no win_arm64 wheel — still true
today, re-measured before this change:

opencv-python>=4.8,<6   → ERROR: from versions: none
cryptography>=48.0.1    → ERROR: from versions: 46.0.0 … 46.0.3

The half that went unmeasured is the one that mattered: nothing in the
package needs either wheel at import time.
With cryptography, cv2,
je_open_cv, numpy and PIL all blocked in a subprocess, import je_auto_control still binds its 1,238 public names, and the executor, the MCP
tool registry, the CLI, api.generate_code and api.create_failure_bundle
all import and run. The blocker lived entirely in pyproject.toml.

What changed

  • Three requirements carry one markersys_platform != 'win32' or platform_machine != 'ARM64'. je_open_cv carries it too: it is pure Python
    but depends on OpenCV, so leaving it unmarked drags OpenCV back in through
    the side door. Pillow deliberately does not — it has always shipped
    win_arm64 wheels, and the earlier note calling it a blocker was a guess.
  • windows-11-arm is back in platform-smoke.yml, 3.14 only; CPython's
    official Windows arm64 builds start at 3.11, so the 3.10 square is excluded
    with the reason in a comment.
  • The features that need those wheels now name the platform.
    find_image*, the OpenCV screenshot(), the secret vault, action-file
    encryption, ACME/TLS and encrypted recording raise a message saying which
    wheel is missing and why, rather than a bare ModuleNotFoundError that
    reads like a broken install. Two accessors in utils/cv2_utils/optional.py
    cover the two doors every image path takes; the other ~70 lazy import cv2
    sites are left alone on purpose.

Every other platform resolves exactly the dependency set it did before —
asserted per-platform in the new test.

On verification

pip --platform does not override sys_platform/platform_machine for
marker evaluation — it only changes wheel-compatibility tags — so a local
--dry-run cannot prove this either way. What can, and does:

  • test_arm64_dependency_markers.py evaluates the marker against five
    platforms and pins its spelling, so removing it (or "tidying" Pillow into
    it) fails loudly. Mutation-checked: dropping one marker reddens 6 tests.
  • The built wheel's Requires-Dist lines carry the markers.
  • The windows-11-arm square itself is the real acceptance test.

Also here

Progress.md now answers the questions the tree asks of it. Two verify
scripts print *** REVISIT *** and "see Progress.md" about the ei_unref
segfault workaround, which was recorded nowhere; three permanently skipped Qt
thread-marshal tests say "skip until then" with no entry; the coverage
(fail_under = 35 → 70) and mypy ramps lived only in pyproject.toml
comments. Four cross-references pointed at deleted entries — and one of them
told the reader mouse_scroll is non-portable on Linux, which stopped being
true when the sign started reversing on every backend.

Local: 4,801 headless tests pass; ruff and bandit clean; no new pylint
findings (the two auto_control_screen.py errors pre-exist); doc-count and
doc-line-count gates green.

The entry said BLOCKED, and that was half right. opencv-python and
cryptography publish no win_arm64 wheel, so pip built OpenCV from source
and CMake failed to configure for ARM64. What went unmeasured is that
nothing in the package imports either one at import time: with all five
heavy modules blocked, the facade still binds its 1,238 public names and
the executor, MCP registry, CLI and stable API all run. The blocker was
the dependency list, not the code.

Mark the three requirements off that one platform instead. je_open_cv
carries the marker too, being pure Python that depends on OpenCV; Pillow
does not, because it has always shipped win_arm64 wheels and calling it a
blocker was a guess. Every other platform resolves what it did before.

Say what arm64 gives up in the error itself, so a missing wheel does not
read as a broken install: two accessors cover the doors every image path
takes, and the crypto call sites name the platform rather than raising a
bare ModuleNotFoundError.

pip evaluates markers against the running interpreter, so --platform
cannot prove this locally; the test evaluates the marker directly and
windows-11-arm proves the install.

Also make Progress.md answer the questions the tree asks of it. Two
verify scripts print "see Progress.md" about the ei_unref segfault
workaround and it was recorded nowhere; three permanently skipped Qt
tests say "skip until then" with no entry; the coverage and mypy ramps
live only in pyproject comments. Four pointers aimed at entries that had
been deleted, and one of those told the reader mouse_scroll is
non-portable on Linux, which stopped being true when the sign started
reversing on every backend.
@codacy-production

codacy-production Bot commented Aug 20, 2026

Copy link
Copy Markdown

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

🟢 Metrics 22 complexity · 0 duplication

Metric Results
Complexity 22
Duplication 0

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

tomllib is 3.11+, and this project supports 3.10 — so the new test took
the whole 3.10 collection down on all three operating systems while
passing everywhere I had run it. Read the dependency array with a small
regex instead; a guard that cannot run on the floor version is not a
guard. Verified against a real 3.10.20 interpreter, where tomllib is
genuinely absent.

Mark the probe subprocess the way the identical call in
test_facade_import_is_light.py is already marked: argv is this
interpreter plus a module-level literal, no interpolation, no shell.
@sonarqubecloud

Copy link
Copy Markdown

@JE-Chen
JE-Chen merged commit 890a1c7 into main Aug 20, 2026
40 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