[GH-ISSUE #8502] [Bug] Hopper macOS setup accepts hosts below the signed app minimum version #6626

Closed
opened 2026-11-01 21:12:46 +00:00 by bsakaguchi · 0 comments
Owner

Originally created by @morluto on GitHub (Nov 1, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/8502

Originally assigned to: @kaoru0822-kitauji on GitHub.

Before submitting

  • Searched open and closed issues for related reports.
  • Removed credentials, private paths, and sensitive target data.

Area

Setup, packaging, or upgrade

Observed behavior

Hopper setup marks macOS 12.0 and 12.3 as supported, but the current publisher-signed Hopper 6.6.1-demo application requires 12.4. The feed also declares deployment_target: "12.4".

This was reproduced at the planning boundary using controlled host facts, then checked against the real downloaded application. No launch on an old macOS release was performed.

Reproduction

  1. At source revision 3842809c371a59609f576a9db8f9c492a3f071e6, call discoverSetupState with the existing FakeSetupHost("darwin"), setting its version to 12.0, then 12.3. Select Hopper installation. Both return hopperInstall: { supported: true }.
  2. Download the official current release feed and its Hopper-6.6.1-demo.dmg on 2026-11-01 using rea-installer headers.
  3. Confirm the DMG's advertised size/checksum, mount read-only, run codesign --verify --deep --strict, and read the app's Contents/Info.plist.

Expected behavior

Compare the complete host version with the selected package's minimum and refuse before installing an incompatible app. Planning can use parsed publisher metadata; the authenticated bundle's requirement should be checked before copying. Changing a fixed floor from 12 to 12.4 would not catch a later increase.

Impact and scope

Source permits a current package on hosts below its declared minimum and gives recovery advice saying macOS 12 is sufficient. Old-host launch behavior and frequency are unverified. Existing earlier Hopper installations should be evaluated against their own requirements.

REA version

Source 3842809c371a59609f576a9db8f9c492a3f071e6; relevant files unchanged at 53363166f068a21f00a605187e1c3af428aa7d5d.

Runtime and platform

Darwin arm64, Node 24.22.1; Hopper 6.6.1-demo inspected without installing or executing it.

Target and artifact context

Official DMG: 34,838,169 bytes; SHA-1 b2a74b6c47abc15d0f0ba2cbc36ed98eed8bd5d1 (matches feed).

Interface

Package or setup

Earliest failure stage

Setup or provider admission

Relevant output or evidence

Planning host 12.0: supported=true
Planning host 12.3: supported=true
Planning host 12.4: supported=true
Signed app LSMinimumSystemVersion: 12.4
Feed deployment_target: 12.4
CFBundleIdentifier: com.cryptic-apps.hopper-web-4
Code signature TeamIdentifier: 2AMA2753NF

The signature validates and its bundle/team identities match REA's pinned publisher. The read-only mount was detached and removed.

Analysis or suspected cause

SetupPlan.ts parses only the host major and accepts >=12. MacHopper.ts does not compare the feed deployment target or signed bundle's minimum before installing. Setup.recovery.test.ts explicitly expects 12.0 to pass; that fixture needs a package-specific expectation.

Upstream reference: Homebrew's minimum-OS audit guidance checks requirements declared by the artifact. This supports checking the actual package; it does not establish that Homebrew's DSL handles every minor-version constraint.

Originally created by @morluto on GitHub (Nov 1, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/8502 Originally assigned to: @kaoru0822-kitauji on GitHub. ### Before submitting - [x] Searched open and closed issues for related reports. - [x] Removed credentials, private paths, and sensitive target data. ### Area Setup, packaging, or upgrade ### Observed behavior Hopper setup marks macOS **12.0 and 12.3** as supported, but the current publisher-signed **Hopper 6.6.1-demo** application requires **12.4**. The feed also declares `deployment_target: "12.4"`. This was reproduced at the planning boundary using controlled host facts, then checked against the real downloaded application. No launch on an old macOS release was performed. ### Reproduction 1. At source revision `3842809c371a59609f576a9db8f9c492a3f071e6`, call `discoverSetupState` with the existing `FakeSetupHost("darwin")`, setting its version to `12.0`, then `12.3`. Select Hopper installation. Both return `hopperInstall: { supported: true }`. 2. Download the official [current release feed](https://www.hopperapp.com/include/files-api.php?request=releases&public=true) and its `Hopper-6.6.1-demo.dmg` on 2026-11-01 using `rea-installer` headers. 3. Confirm the DMG's advertised size/checksum, mount read-only, run `codesign --verify --deep --strict`, and read the app's `Contents/Info.plist`. ### Expected behavior Compare the complete host version with the selected package's minimum and refuse before installing an incompatible app. Planning can use parsed publisher metadata; the authenticated bundle's requirement should be checked before copying. Changing a fixed floor from 12 to 12.4 would not catch a later increase. ### Impact and scope Source permits a current package on hosts below its declared minimum and gives recovery advice saying macOS 12 is sufficient. Old-host launch behavior and frequency are unverified. Existing earlier Hopper installations should be evaluated against their own requirements. ### REA version Source `3842809c371a59609f576a9db8f9c492a3f071e6`; relevant files unchanged at `53363166f068a21f00a605187e1c3af428aa7d5d`. ### Runtime and platform Darwin arm64, Node 24.22.1; Hopper 6.6.1-demo inspected without installing or executing it. ### Target and artifact context Official DMG: 34,838,169 bytes; SHA-1 `b2a74b6c47abc15d0f0ba2cbc36ed98eed8bd5d1` (matches feed). ### Interface Package or setup ### Earliest failure stage Setup or provider admission ### Relevant output or evidence ```text Planning host 12.0: supported=true Planning host 12.3: supported=true Planning host 12.4: supported=true Signed app LSMinimumSystemVersion: 12.4 Feed deployment_target: 12.4 CFBundleIdentifier: com.cryptic-apps.hopper-web-4 Code signature TeamIdentifier: 2AMA2753NF ``` The signature validates and its bundle/team identities match REA's pinned publisher. The read-only mount was detached and removed. ### Analysis or suspected cause [`SetupPlan.ts`](https://github.com/morluto/rea/blob/3842809c371a59609f576a9db8f9c492a3f071e6/src/application/SetupPlan.ts#L412) parses only the host major and accepts `>=12`. [`MacHopper.ts`](https://github.com/morluto/rea/blob/3842809c371a59609f576a9db8f9c492a3f071e6/src/application/MacHopper.ts) does not compare the feed deployment target or signed bundle's minimum before installing. `Setup.recovery.test.ts` explicitly expects 12.0 to pass; that fixture needs a package-specific expectation. Upstream reference: Homebrew's [minimum-OS audit guidance](https://docs.brew.sh/Cask-Cookbook#choosing-the-minimum-macos-release) checks requirements declared by the artifact. This supports checking the actual package; it does not establish that Homebrew's DSL handles every minor-version constraint.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#6626
No description provided.