Skip to content

feat(installer): require Windows 10 or later - #1005

Open
asdf80730 wants to merge 1 commit into
EasyIME:masterfrom
asdf80730:pr/installer-win10-floor
Open

asdf80730 wants to merge 1 commit into
EasyIME:masterfrom
asdf80730:pr/installer-win10-floor

Conversation

@asdf80730

@asdf80730 asdf80730 commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Summary

The installer gated only on Vista, so Windows 8.1 and older accepted a payload they cannot run: bundled Python 3.15 and Go 1.21 require Windows 10, stable Rust requires Windows 10, and Node 22 supports 8.1 only as experimental. This makes the installer refuse those systems in .onInit, before any existing installation is removed, so an unsupported machine keeps its current PIME installation untouched.

  • Replace the ${IfNot} ${AtLeastWinVista} gate with ${IfNot} ${AtLeastWin10}.
  • Rename AtLeastWinVista_MESSAGE to AtLeastWin10_MESSAGE and retarget the English, Simplified Chinese and Traditional Chinese strings.
  • Drop the UCRT/KB2999226 check: Windows 10 ships the UCRT in-box and PIME ships no VC++ redistributable (the launcher and C++ DLLs are static; the Python embed carries its own vcruntime140.dll), so there is no runtime prerequisite to test.
  • Leave the ${AtLeastWin8} feature gates in the cheeng section and in hideSection alone: they select optional components, not the support floor.

Why not Windows 8.1

v2.0.0-beta4 shipped as an emergency CVE release on Python 3.15.1 and Node 22.23.4. An 8.1 floor would undo that: Python 3.12's last Windows binary is 3.12.10 (2025-04-08) and pins OpenSSL 3.0, which reached end of life on 2026-09-07; Go 1.20 and Rust 1.77 would freeze too.

Verification

  • makensis 3.08 assembles installer/installer.nsi in a scratch copy on Linux (File directives made /nonfatal because the Windows build outputs are absent). This checks the script, the includes and the LogicLib block, not a shippable installer.
  • ${AtLeastWin10} exists in 3.08's WinVer.nsh; installer.nsi:62 uses RequestExecutionLevel admin, so NSIS's default manifest declares Windows 10 and WinVer.nsh reports the real version.
  • The real compile proof is the build-and-sign job in Windows CI.
  • No Windows 10 or 8.1 machine was available, so the refusal path was not executed on Windows.

Design and decision by asdf80730. Implementation generated with AI assistance from omp (DeepSeek V4.1 Flash).

Comment thread installer/installer.nsi Outdated
; CurrentMajorVersionNumber, which only Windows 10 and later write.
; This runs after SetRegView 64 above, so the read sees the native view on
; x64/ARM64 and the only view on 32-bit Windows.
${IfNot} ${AtLeastWin8}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should web windows 10, not windows 8?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Retargeted: the gate is now ${AtLeastWin10} in .onInit, and the UCRT check is gone — Windows 10 ships the UCRT in-box and PIME ships no VC++ redistributable.

To answer the review question directly: an 8.1 floor would undo the CVE fixes in v2.0.0-beta4. Python 3.12's last Windows binary is 3.12.10 (2025-04-08) and pins OpenSSL 3.0, end of life since 2026-09-07; Go 1.20 and Rust 1.77 would freeze too, and Rust 1.77 turns the launcher into a permanent fork of upstream as it is refactored.

(Comment generated with assistance from omp / DeepSeek V4.1 Flash.)

@asdf80730

This comment was marked as outdated.

@asdf80730
asdf80730 force-pushed the pr/installer-win10-floor branch from 31b732d to 18ceae6 Compare October 26, 2026 10:15
@asdf80730 asdf80730 changed the title feat(installer): require Windows 10 or later feat(installer): require Windows 8 or later Oct 26, 2026
@asdf80730
asdf80730 force-pushed the pr/installer-win10-floor branch 2 times, most recently from 57ff362 to 6851f08 Compare October 26, 2026 10:33
@asdf80730 asdf80730 changed the title feat(installer): require Windows 8 or later feat(installer): require Windows 8.1 or later Oct 26, 2026
@asdf80730
asdf80730 force-pushed the pr/installer-win10-floor branch from 6851f08 to 89a5090 Compare October 26, 2026 13:37
The installer still gated only on Vista, so Windows 8.1 and older
installed a payload they cannot run: the bundled Python 3.15 and Go 1.21
runtimes require Windows 10, stable Rust requires Windows 10, and Node 22
supports 8.1 only as experimental.

- Replace the Vista gate with ${AtLeastWin10} in .onInit, before the
  pending-reboot prompt, so an unsupported system fails before an
  existing installation is removed.
- Retarget the locale message to Windows 10 in English, Simplified and
  Traditional Chinese.
- Drop the UCRT check: Windows 10 ships the UCRT in-box and PIME ships
  no VC++ redistributable, since the launcher and the C++ DLLs are
  static and the Python embed carries its own vcruntime140.dll.
- Leave the AtLeastWin8 feature gates in cheeng/hideSection alone; they
  select optional components, not the support floor.

Design and decision by asdf80730. Implementation generated with AI
assistance from omp (DeepSeek V4.1 Flash).
@asdf80730
asdf80730 force-pushed the pr/installer-win10-floor branch from 89a5090 to fe81ffc Compare October 26, 2026 13:40
@asdf80730 asdf80730 changed the title feat(installer): require Windows 8.1 or later feat(installer): require Windows 10 or later Oct 26, 2026
asdf80730 added a commit to asdf80730/PIME that referenced this pull request Oct 26, 2026
EasyIME#975 (static launcher CRT plus CI dependency gate) and EasyIME#976 (check, macro,
locale strings, inetc) merged on 2026-10-24 and EasyIME#966 is closed. Record the
merge commits, the now-green per-PR checks, the local makensis replay, and
the one remaining gap: the Windows 10 floor is still open as EasyIME#1005.

Generated with assistance from omp (DeepSeek V4.1 Flash).
asdf80730 added a commit to asdf80730/PIME that referenced this pull request Oct 26, 2026
- AGENTS.md: the minimum supported OS is Windows 8.1, with the note that
  master's bundled runtime and installer still target Windows 10 until the open
  installer and runtime PRs land.
- verification.md: read the bundled Python version from the ._pth file instead of
  hardcoding it, and record the Rust 1.77 release-profile PDB requirement.
- wine.md: describe the bundled Python's init_sys_streams abort without binding
  it to one version.
- Mark both research notes that discuss the floor where they are now stale.

PR EasyIME#1005 now accepts 8.1 and PR EasyIME#1007 lowers the runtime toolchain, so the
'keep Windows 10' floor and the version-pinned Wine notes described a plan that
no longer holds. What master still ships is stated rather than silently dropped.

Fully generated by omp (DeepSeek V4.1 Flash) without human intervention.
asdf80730 added a commit to asdf80730/PIME that referenced this pull request Oct 26, 2026
Two conventions were written down but nothing enforced them, and both broke in
the same run: a new script shipped without its declaration (the reviewer caught
it by eye) and a finished feature had no spec.md at all (the harness never
looked). A reviewer catching a fixed syntactic rule is what a check is for.

- check_ai_declarations.sh: every file added against origin/master carries one
  of AGENTS.md §4's declarations. Diff-scoped, because the tree predates the
  rule and its sediment must not be rewritten.
- check_tracker_layout.sh: .scratch/<feature>/ has a spec.md (or a wayfinder
  map.md) and issues/NN-slug.md files with a Status: line. Skips where .scratch
  is absent, which is every CI checkout.
- Both report "not applicable" as exit 125 and check_pr_scope.sh now does the
  same, so step() can skip them without the pr_scope wrapper that existed only
  to translate SKIP output.
- pr_bodies accepts either half of §2's human-designed declaration: PR EasyIME#1005
  says "Design and decision by", which the old prefix match rejected.

Fully generated by omp (DeepSeek V4.1 Flash) without human intervention.

This branch has not been deployed

No deployments
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.

2 participants