[PR #4642] [MERGED] fix(setup): offer Hopper installation only where setup can install it #6336

Closed
opened 2026-10-31 01:13:40 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/4642
Author: @SandstromPL
Created: 10/17/2026
Status: ✅ Merged
Merged: 10/22/2026
Merged by: @morluto

Base: main ← Head: fix/hopper-recovery-eligibility


📝 Commits (8)

  • 612c060 fix(setup): offer Hopper installation only where setup can install it
  • 7ae3a32 Merge upstream/main into fix/hopper-recovery-eligibility
  • 31a3a58 chore: merge current main into Hopper recovery eligibility
  • d2bda40 chore: drop merge-only formatter changes
  • 4507cab Merge remote-tracking branch 'refs/remotes/blocker-current/main' into codex/blockers-4642
  • 2551aa1 chore: merge main into Hopper recovery eligibility
  • 4c361cf test: align inherited fixtures with current analysis contracts
  • f720c7e test(ida): assert search recovery instead of diagnostic prose

📊 Changes

11 files changed (+303 additions, -63 deletions)

View changed files

📝 docs/user-visible-errors.csv (+5 -5)
📝 src/application/LinuxHopper.test.ts (+9 -5)
📝 src/application/LinuxHopperPackageRuntime.test.ts (+19 -4)
📝 src/application/ReconstructionObligationCandidates.ts (+4 -4)
📝 src/application/Setup.recovery.test.ts (+178 -0)
📝 src/application/Setup.ts (+12 -10)
📝 src/application/SetupHost.ts (+5 -22)
📝 src/application/SetupPlan.ts (+61 -9)
📝 src/application/pcap/PcapAnalysisService.test.ts (+6 -0)
📝 src/domain/browserScenarioDiff.test.ts (+1 -0)
📝 src/ida/IdaSessionClient.test.ts (+3 -4)

📄 Description

Summary

Fixes #3944.

On a host where automated Hopper installation is ineligible, an unhealthy rea setup with no Hopper launcher ended its remediation with:

Hopper is optional for non-Hopper providers. Rerun with --yes --install-hopper for deep native analysis.

Following that advice was then refused before mutation. On Windows, for example, the refusal is REA supports Hopper on macOS and selected 64-bit Linux distributions. Ineligible hosts are:

  • Windows
  • macOS below 12, or with an unknown version
  • an unsupported or unidentified Linux distribution

After this change, setup offers --install-hopper only where the explicit installation gate accepts it. On ineligible hosts the advice is Run rea doctor and apply each reported remediation., and manual-client instructions are still kept.

Problem and expected behavior

  • Smallest trigger: Windows, rea setup --yes --client grok_bot --skill=false --json with an unhealthy doctor and no Hopper launcher. That gives the advice above; then --yes --install-hopper is refused with no mutation.
  • Root cause: the Hopper install eligibility rule existed twice, and the final advice used neither copy.
    • SetupPlan.discoverSetupState had one copy for the install proposal (hopperInstallSupported, parseInt major).
    • SetupHost.hostRemediation had another for the explicit --install-hopper gate. It re-read the host facts and used a separate major parser.
    • finalSetupRemediation checked only whether hopperPath was undefined.
    • The two copies also disagreed on malformed macOS versions: "" and abc were refused by the proposal but accepted by the explicit gate (NaN < 12 is false), which then installed.
  • Expected, per the issue: keep rejecting explicit installation on unsupported hosts before mutation, and do not advertise an installation the same setup run refuses.

Change and scope

  • src/application/SetupPlan.ts owns Hopper install eligibility.
    • hopperInstallEligibility computes a tagged HopperInstallEligibility once during discovery, from facts discovery already reads. It is exposed as SetupDiscovery.hopperInstall.
    • Eligible means macOS 12+ (major parsed with /^(\d+)(?:\.|$)/u) or linuxDistribution.hopperSetupSupported === true.
    • An unknown or unparseable macOS version, an unidentified Linux distribution and every other platform are ineligible. Their refusal copy is unchanged.
    • The proposal and the new hopperInstallRefusal(discovery) consume it.
  • src/application/Setup.ts:
    • The explicit gate uses hopperInstallRefusal(planDiscovery) at the same stage as before: after planning, before mutation.
    • finalSetupRemediation offers --install-hopper only when hopperPath === undefined and the host is eligible. The macOS post-install activation message still comes first.
  • src/application/SetupHost.ts: hostRemediation(host) now checks only the Node.js runtime and is synchronous. Its Hopper branch and the duplicate major parser are removed. Its only caller is Setup.ts.
  • docs/user-visible-errors.csv: the location, trigger and verification columns of rows 55–57, 59 and 60 are updated. Row 60's copy is corrected to the string actually shipped (pre-existing drift). No user-facing copy changed.

Contribution scope: a routine fix within existing setup boundaries, so a maintainer scope decision is not applicable. This is an independent implementation. The earlier attempt, #4059, was closed by its author two minutes after opening and only exposed the boolean to the advice.

Intentionally not included (remaining related cleanup):

  • Doctor's own Hopper advice: DoctorDiagnostics.ts hopperCheck still suggests "Run rea setup to install Hopper, or set HOPPER_LAUNCHER_PATH." without consulting eligibility, so rea doctor on an ineligible host can still mention the installer. Its host check also keeps its own lenient macOS parser (parseMajor). These are not reachable divergences in practice, because readMacosVersion trims sw_vers output, but sharing one owner with doctor is a follow-up. hopperStartupFailure.ts also recommends rea setup --yes --install-hopper unconditionally.
  • Where the refusal runs: the explicit refusal still runs after planSetupActions, as before. A planning blocker can therefore be reported first, and a refused run still lists the install_hopper planned action. scripts/verify-package-setup.mjs relies on that action on supported hosts, so I did not move the stage here.
  • Linux arm64 eligibility (#3419/#3422) is out of scope. Once #3422 makes hopperSetupSupported architecture-aware, this advice follows it automatically. The two PRs overlap in SetupHost.ts: whichever lands second should move #3422's Linux copy into hopperInstallEligibility in SetupPlan.ts (and CSV rows 57/60).

Contract and boundary impact

  • Semantic owner and earliest changed stage: src/application/SetupPlan.ts, at setup discovery.
  • Contribution scope fit and linked maintainer decision: routine fix within existing setup boundaries; not applicable.
  • CLI and MCP/tool-catalog contract: no flag, schema or catalog change. Setup remediation text changes only on ineligible hosts that are unhealthy and have no Hopper launcher. The explicit refusal copy is unchanged.
  • Provider, bridge, target-format, or platform compatibility: no provider or platform support change.
    • Behavior change: an empty or unparseable macOS version ("", 14beta) now refuses an explicit --install-hopper, where it previously installed. Real sw_vers output is always numeric, so this is not expected to affect users.
  • Evidence, artifact, provenance, or reconstruction contract: none.
  • Target selection, authority, upstream behavior, and cleanup details: no new probes. The explicit gate no longer re-reads macosVersion/linuxDistribution.
  • Generated metadata, package, or installation impact: none.

Expected effects (check known effects; use documentation-only on its own).
Unchecked items do not establish absence; leave uncertainties visible.

  • Read existing files or captured data.
  • Launch or attach to a process.
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration.
  • Contact network services.
  • Recover protected code or work around protections.
  • Documentation or usability only; no target interaction. (setup recovery advice, plus the stricter malformed-macOS gate described above)
  • Not sure yet; investigation or maintainer guidance needed.

Evidence and regression coverage

Tests added: src/application/Setup.recovery.test.ts, new describe("setup Hopper install eligibility"), using FakeSetupHost only.

  • Ineligible hosts (Windows, macOS 11.7, macOS with an unknown version, unsupported Debian 13, unidentified Linux), each with an unhealthy doctor and the Grok Bot manual client:
    • The advice has no --install-hopper and does have the doctor fallback.
    • The Grok Bot hosted computer text is kept.
    • A dry run with proposeHopper plans no install_hopper.
    • Following with installHopper: true is refused with the exact platform copy, with no applied actions and no install.
  • Eligible controls (macOS 14.5, supported Ubuntu 24.04):
    • The advice offers --install-hopper.
    • The dry run proposes install_hopper.
    • Following the advice installs Hopper.
  • macOS version boundary on the explicit gate: "" and 14beta are refused; 12 and 12.0 install.

Base reproduction: on base 71929ed37 with only the three src files reverted, 7 of the new tests fail (the 5 ineligible hosts, plus "" and 14beta) and 16 pass, including the controls and the 12 / 12.0 boundary.

Before and after on Windows:

  • Before: Hopper is optional for non-Hopper providers. Rerun with --yes --install-hopper for deep native analysis.
  • After: Run rea doctor and apply each reported remediation.
  • Both keep the Grok Bot manual instructions.

Remaining proof gaps:

  • Platforms are simulated through FakeSetupHost service tests. There is no native Windows or macOS run, and no production-boundary test with systemSetupHost plus a doctor fixture.
  • verify:package, real Hopper and check:pr were not run.

For evidence-bearing changes:

  • Observed, derived, and inferred claims remain distinguishable.
  • Artifact identity, source provenance, and failed attempts remain preserved.
  • Unsupported, incomplete, unavailable, or uncertain outcomes remain visible.

Validation performed

Run on Linux with Node 24.18.0 and npm 11.16.0:

  • npm run test:local -- src/application/Setup.recovery.test.ts with only Setup.ts, SetupPlan.ts and SetupHost.ts reverted to base: 7 failed, 16 passed.
  • npm run test:local -- on LinuxHopper, MacHopperPaths, MacHopper, Setup.configuration, Setup.initialSnapshot, SetupInstallFailure, Setup.planning, Setup.recovery, setupEnvironment, Doctor and cliLogging: 11 files, 181 tests passed.
  • npm run test:focused -- tests/boundary/filesystem/setupUnavailableProvider.test.ts tests/boundary/cli/cliSetup.test.ts tests/process-global/cliLogging.test.ts: 3 files, 18 tests passed. These ran before the final test-file-only reorganization.
  • npx tsc -p tsconfig.json --noEmit: clean.
  • npm run check: passed. Lint reports 0 errors and the touched files have the same warnings as base. runSetupWorkflow complexity goes from 64 to 65, because of the offer condition.
  • npm run docs:check: passed.
  • npm run verify:test-discovery: discovered all 1459 test files exactly once.
  • npx oxfmt --check on the changed files and git diff --check: clean.
  • After merging main at 18aa9af2b (merge commit 7ae3a32c0): the first CI run had failed only in src/application/binary/BinarySessionStatus.test.ts, which was broken on main at the time and is untouched by this PR. Rerun on the merged tree:
    • npm run test:local -- on Setup.configuration, Setup.initialSnapshot, SetupInstallFailure, Setup.planning, Setup.recovery and BinarySessionStatus: 6 files, 78 tests passed.
    • npx tsc -p . --noEmit: clean.
    • npx oxlint on the four changed src files: 0 errors. The three SetupHost.ts warnings (systemSetupHost length, two no-control-regex) are already on main.
    • npx oxfmt --check on the changed files: clean.
    • npm run docs:check: passed.
    • npm run verify:test-discovery: discovered all 1578 test files exactly once.
  • Not run:
    • npm run check:pr
    • npm run verify:package (CI runs it)
    • native Windows or macOS setup

Compatibility, safety, and release

  • Breaking changes or migration steps: none. The only behavior tightening is the malformed-macOS explicit gate described above.
  • Real Hopper/Ghidra, browser, or OS coverage: Linux only, with platforms simulated through FakeSetupHost.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: setup now refuses an automated install it would previously have attempted on a malformed macOS version. There are no new probes or effects.

Merge follow-up: merged main 86655eac6 in 2551aa1cf. Kept one eligibility decision for proposals, explicit installation and recovery advice, while preserving main's x86_64-only Linux eligibility and shared host-support text. Added an Ubuntu arm64 regression covering advice, proposal and explicit refusal before mutation. Carried forward the existing #5597 fixes for main's removed deduplication helper and missing Linux installer test arguments, which otherwise block compilation/typechecking. On Node 24.18.0: the ten-file focused setup/reconstruction batch passed 158 tests, and the two Linux installer files passed 68 tests (overlapping the earlier batch); check:fast and docs:check passed. Native Windows/Linux setup and real Hopper were not run; hosted checks are pending.

CI follow-up: corrected inherited test fixtures to declare unresolved packet-tool identity and current-version storage fingerprints. Removed the duplicate IDA diagnostic-prose assertion; the supervision regression now checks the exact recovered search row after a deadline failure, while RegexMatcher owns diagnostic coverage. The three originally failing files passed 102 tests on each branch; the final IDA/RegexMatcher batch passed 117 tests on the evidence-output branch. Typecheck/lint passed. Hosted CI on the new heads remains pending.

Author readiness

Human owner: @SandstromPL

  • I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work.
  • I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps.
  • I declare this PR ready for initial maintainer review.

Before merge

  • This PR addresses a concrete problem or an agreed enhancement.
  • Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff.
  • The PR has one focused outcome and the title follows type(scope): outcome.
  • Related issue is linked, or the reason for not linking one is stated above.
  • Tests cover changed observable behavior and meaningful failure paths.
  • Owning docs, contracts, and generated metadata are updated where needed.
  • User-visible CLI/MCP changes include representative output.
  • I checked the final diff for secrets, unrelated cleanup, and unsupported claims.

🤖 Generated with Claude Code

Maintainer blocker verification

Merged pinned main 166fb0820fdfc91742317b9c539c4d5fda2fe03b, preserving both the setup-plan catalog rows and current-main rows. On this resulting head, Setup.recovery.test.ts passed 23/23, check:fast passed, and docs:check passed all six tasks plus 5 README consistency tests. The net PR diff remains the intended five files. Hosted checks on this new head are still pending and are not represented as passed.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/morluto/rea/pull/4642 **Author:** [@SandstromPL](https://github.com/SandstromPL) **Created:** 10/17/2026 **Status:** ✅ Merged **Merged:** 10/22/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `fix/hopper-recovery-eligibility` --- ### 📝 Commits (8) - [`612c060`](https://github.com/morluto/rea/commit/612c060a2310f2147359a7c4f21d57489ca4aec8) fix(setup): offer Hopper installation only where setup can install it - [`7ae3a32`](https://github.com/morluto/rea/commit/7ae3a32c0373846d633d5082773c97e3a3b2a822) Merge upstream/main into fix/hopper-recovery-eligibility - [`31a3a58`](https://github.com/morluto/rea/commit/31a3a5887f9cb71327d8b49000c431ddd706ad71) chore: merge current main into Hopper recovery eligibility - [`d2bda40`](https://github.com/morluto/rea/commit/d2bda40a95a5c5300a6fa36001806d5f223567f0) chore: drop merge-only formatter changes - [`4507cab`](https://github.com/morluto/rea/commit/4507cab61f8c2fe3538b407a0ba2a8c5bc7fb2e8) Merge remote-tracking branch 'refs/remotes/blocker-current/main' into codex/blockers-4642 - [`2551aa1`](https://github.com/morluto/rea/commit/2551aa1cfa2d59d3c17d1c8694bca1c3f574d92e) chore: merge main into Hopper recovery eligibility - [`4c361cf`](https://github.com/morluto/rea/commit/4c361cf0a135efab67b0aa5db525832693fb4e38) test: align inherited fixtures with current analysis contracts - [`f720c7e`](https://github.com/morluto/rea/commit/f720c7e1b5e06b8bf2bdab3fceb0710be6e594b6) test(ida): assert search recovery instead of diagnostic prose ### 📊 Changes **11 files changed** (+303 additions, -63 deletions) <details> <summary>View changed files</summary> 📝 `docs/user-visible-errors.csv` (+5 -5) 📝 `src/application/LinuxHopper.test.ts` (+9 -5) 📝 `src/application/LinuxHopperPackageRuntime.test.ts` (+19 -4) 📝 `src/application/ReconstructionObligationCandidates.ts` (+4 -4) 📝 `src/application/Setup.recovery.test.ts` (+178 -0) 📝 `src/application/Setup.ts` (+12 -10) 📝 `src/application/SetupHost.ts` (+5 -22) 📝 `src/application/SetupPlan.ts` (+61 -9) 📝 `src/application/pcap/PcapAnalysisService.test.ts` (+6 -0) 📝 `src/domain/browserScenarioDiff.test.ts` (+1 -0) 📝 `src/ida/IdaSessionClient.test.ts` (+3 -4) </details> ### 📄 Description ## Summary Fixes #3944. On a host where automated Hopper installation is ineligible, an unhealthy `rea setup` with no Hopper launcher ended its remediation with: > Hopper is optional for non-Hopper providers. Rerun with --yes --install-hopper for deep native analysis. Following that advice was then refused before mutation. On Windows, for example, the refusal is `REA supports Hopper on macOS and selected 64-bit Linux distributions.` Ineligible hosts are: - Windows - macOS below 12, or with an unknown version - an unsupported or unidentified Linux distribution After this change, setup offers `--install-hopper` only where the explicit installation gate accepts it. On ineligible hosts the advice is `Run rea doctor and apply each reported remediation.`, and manual-client instructions are still kept. ## Problem and expected behavior - **Smallest trigger:** Windows, `rea setup --yes --client grok_bot --skill=false --json` with an unhealthy doctor and no Hopper launcher. That gives the advice above; then `--yes --install-hopper` is refused with no mutation. - **Root cause:** the Hopper install eligibility rule existed twice, and the final advice used neither copy. - `SetupPlan.discoverSetupState` had one copy for the install proposal (`hopperInstallSupported`, `parseInt` major). - `SetupHost.hostRemediation` had another for the explicit `--install-hopper` gate. It re-read the host facts and used a separate `major` parser. - `finalSetupRemediation` checked only whether `hopperPath` was undefined. - The two copies also disagreed on malformed macOS versions: `""` and `abc` were refused by the proposal but accepted by the explicit gate (`NaN < 12` is false), which then installed. - **Expected, per the issue:** keep rejecting explicit installation on unsupported hosts before mutation, and do not advertise an installation the same setup run refuses. ## Change and scope - **`src/application/SetupPlan.ts` owns Hopper install eligibility.** - `hopperInstallEligibility` computes a tagged `HopperInstallEligibility` once during discovery, from facts discovery already reads. It is exposed as `SetupDiscovery.hopperInstall`. - Eligible means macOS 12+ (major parsed with `/^(\d+)(?:\.|$)/u`) or `linuxDistribution.hopperSetupSupported === true`. - An unknown or unparseable macOS version, an unidentified Linux distribution and every other platform are ineligible. Their refusal copy is unchanged. - The proposal and the new `hopperInstallRefusal(discovery)` consume it. - **`src/application/Setup.ts`:** - The explicit gate uses `hopperInstallRefusal(planDiscovery)` at the same stage as before: after planning, before mutation. - `finalSetupRemediation` offers `--install-hopper` only when `hopperPath === undefined` and the host is eligible. The macOS post-install activation message still comes first. - **`src/application/SetupHost.ts`:** `hostRemediation(host)` now checks only the Node.js runtime and is synchronous. Its Hopper branch and the duplicate `major` parser are removed. Its only caller is `Setup.ts`. - **`docs/user-visible-errors.csv`:** the location, trigger and verification columns of rows 55–57, 59 and 60 are updated. Row 60's copy is corrected to the string actually shipped (pre-existing drift). No user-facing copy changed. Contribution scope: a routine fix within existing setup boundaries, so a maintainer scope decision is not applicable. This is an independent implementation. The earlier attempt, #4059, was closed by its author two minutes after opening and only exposed the boolean to the advice. **Intentionally not included (remaining related cleanup):** - **Doctor's own Hopper advice:** `DoctorDiagnostics.ts` `hopperCheck` still suggests "Run rea setup to install Hopper, or set HOPPER_LAUNCHER_PATH." without consulting eligibility, so `rea doctor` on an ineligible host can still mention the installer. Its host check also keeps its own lenient macOS parser (`parseMajor`). These are not reachable divergences in practice, because `readMacosVersion` trims `sw_vers` output, but sharing one owner with doctor is a follow-up. `hopperStartupFailure.ts` also recommends `rea setup --yes --install-hopper` unconditionally. - **Where the refusal runs:** the explicit refusal still runs after `planSetupActions`, as before. A planning blocker can therefore be reported first, and a refused run still lists the `install_hopper` planned action. `scripts/verify-package-setup.mjs` relies on that action on supported hosts, so I did not move the stage here. - **Linux arm64 eligibility** (#3419/#3422) is out of scope. Once #3422 makes `hopperSetupSupported` architecture-aware, this advice follows it automatically. The two PRs overlap in `SetupHost.ts`: whichever lands second should move #3422's Linux copy into `hopperInstallEligibility` in `SetupPlan.ts` (and CSV rows 57/60). ## Contract and boundary impact - **Semantic owner and earliest changed stage:** `src/application/SetupPlan.ts`, at setup discovery. - **Contribution scope fit and linked maintainer decision:** routine fix within existing setup boundaries; not applicable. - **CLI and MCP/tool-catalog contract:** no flag, schema or catalog change. Setup `remediation` text changes only on ineligible hosts that are unhealthy and have no Hopper launcher. The explicit refusal copy is unchanged. - **Provider, bridge, target-format, or platform compatibility:** no provider or platform support change. - **Behavior change:** an empty or unparseable macOS version (`""`, `14beta`) now refuses an explicit `--install-hopper`, where it previously installed. Real `sw_vers` output is always numeric, so this is not expected to affect users. - **Evidence, artifact, provenance, or reconstruction contract:** none. - **Target selection, authority, upstream behavior, and cleanup details:** no new probes. The explicit gate no longer re-reads `macosVersion`/`linuxDistribution`. - **Generated metadata, package, or installation impact:** none. Expected effects (check known effects; use documentation-only on its own). Unchecked items do not establish absence; leave uncertainties visible. - [ ] Read existing files or captured data. - [ ] Launch or attach to a process. - [ ] Inject instrumentation or run scripts/code. - [ ] Change process memory, registers, files, or configuration. - [ ] Contact network services. - [ ] Recover protected code or work around protections. - [x] Documentation or usability only; no target interaction. (setup recovery advice, plus the stricter malformed-macOS gate described above) - [ ] Not sure yet; investigation or maintainer guidance needed. ## Evidence and regression coverage **Tests added:** `src/application/Setup.recovery.test.ts`, new `describe("setup Hopper install eligibility")`, using `FakeSetupHost` only. - **Ineligible hosts** (Windows, macOS 11.7, macOS with an unknown version, unsupported Debian 13, unidentified Linux), each with an unhealthy doctor and the Grok Bot manual client: - The advice has no `--install-hopper` and does have the doctor fallback. - The Grok Bot `hosted computer` text is kept. - A dry run with `proposeHopper` plans no `install_hopper`. - Following with `installHopper: true` is refused with the exact platform copy, with no applied actions and no install. - **Eligible controls** (macOS 14.5, supported Ubuntu 24.04): - The advice offers `--install-hopper`. - The dry run proposes `install_hopper`. - Following the advice installs Hopper. - **macOS version boundary on the explicit gate:** `""` and `14beta` are refused; `12` and `12.0` install. **Base reproduction:** on base `71929ed37` with only the three `src` files reverted, 7 of the new tests fail (the 5 ineligible hosts, plus `""` and `14beta`) and 16 pass, including the controls and the `12` / `12.0` boundary. **Before and after on Windows:** - Before: `Hopper is optional for non-Hopper providers. Rerun with --yes --install-hopper for deep native analysis.` - After: `Run rea doctor and apply each reported remediation.` - Both keep the Grok Bot manual instructions. **Remaining proof gaps:** - Platforms are simulated through `FakeSetupHost` service tests. There is no native Windows or macOS run, and no production-boundary test with `systemSetupHost` plus a doctor fixture. - `verify:package`, real Hopper and `check:pr` were not run. For evidence-bearing changes: - [x] Observed, derived, and inferred claims remain distinguishable. - [x] Artifact identity, source provenance, and failed attempts remain preserved. - [x] Unsupported, incomplete, unavailable, or uncertain outcomes remain visible. ## Validation performed Run on Linux with Node 24.18.0 and npm 11.16.0: - `npm run test:local -- src/application/Setup.recovery.test.ts` with only `Setup.ts`, `SetupPlan.ts` and `SetupHost.ts` reverted to base: 7 failed, 16 passed. - `npm run test:local --` on `LinuxHopper`, `MacHopperPaths`, `MacHopper`, `Setup.configuration`, `Setup.initialSnapshot`, `SetupInstallFailure`, `Setup.planning`, `Setup.recovery`, `setupEnvironment`, `Doctor` and `cliLogging`: 11 files, 181 tests passed. - `npm run test:focused -- tests/boundary/filesystem/setupUnavailableProvider.test.ts tests/boundary/cli/cliSetup.test.ts tests/process-global/cliLogging.test.ts`: 3 files, 18 tests passed. These ran before the final test-file-only reorganization. - `npx tsc -p tsconfig.json --noEmit`: clean. - `npm run check`: passed. Lint reports 0 errors and the touched files have the same warnings as base. `runSetupWorkflow` complexity goes from 64 to 65, because of the offer condition. - `npm run docs:check`: passed. - `npm run verify:test-discovery`: discovered all 1459 test files exactly once. - `npx oxfmt --check` on the changed files and `git diff --check`: clean. - **After merging `main` at `18aa9af2b` (merge commit `7ae3a32c0`):** the first CI run had failed only in `src/application/binary/BinarySessionStatus.test.ts`, which was broken on `main` at the time and is untouched by this PR. Rerun on the merged tree: - `npm run test:local --` on `Setup.configuration`, `Setup.initialSnapshot`, `SetupInstallFailure`, `Setup.planning`, `Setup.recovery` and `BinarySessionStatus`: 6 files, 78 tests passed. - `npx tsc -p . --noEmit`: clean. - `npx oxlint` on the four changed `src` files: 0 errors. The three `SetupHost.ts` warnings (`systemSetupHost` length, two `no-control-regex`) are already on `main`. - `npx oxfmt --check` on the changed files: clean. - `npm run docs:check`: passed. - `npm run verify:test-discovery`: discovered all 1578 test files exactly once. - **Not run:** - `npm run check:pr` - `npm run verify:package` (CI runs it) - native Windows or macOS setup ## Compatibility, safety, and release - **Breaking changes or migration steps:** none. The only behavior tightening is the malformed-macOS explicit gate described above. - **Real Hopper/Ghidra, browser, or OS coverage:** Linux only, with platforms simulated through `FakeSetupHost`. - **Package or release metadata impact:** none. - **Security, privacy, process, or containment review:** setup now refuses an automated install it would previously have attempted on a malformed macOS version. There are no new probes or effects. Merge follow-up: merged main `86655eac6` in `2551aa1cf`. Kept one eligibility decision for proposals, explicit installation and recovery advice, while preserving main's x86_64-only Linux eligibility and shared host-support text. Added an Ubuntu arm64 regression covering advice, proposal and explicit refusal before mutation. Carried forward the existing #5597 fixes for main's removed deduplication helper and missing Linux installer test arguments, which otherwise block compilation/typechecking. On Node 24.18.0: the ten-file focused setup/reconstruction batch passed 158 tests, and the two Linux installer files passed 68 tests (overlapping the earlier batch); `check:fast` and `docs:check` passed. Native Windows/Linux setup and real Hopper were not run; hosted checks are pending. CI follow-up: corrected inherited test fixtures to declare unresolved packet-tool identity and current-version storage fingerprints. Removed the duplicate IDA diagnostic-prose assertion; the supervision regression now checks the exact recovered search row after a deadline failure, while RegexMatcher owns diagnostic coverage. The three originally failing files passed 102 tests on each branch; the final IDA/RegexMatcher batch passed 117 tests on the evidence-output branch. Typecheck/lint passed. Hosted CI on the new heads remains pending. ## Author readiness <!-- The human owner completes these declarations before requesting review. The PR author is the owner by default. A different owner must explicitly accept ownership on this PR. AI agents must leave these declarations to a human to dictate to them or there could be catastrophic consequences for many users of REA. Draft PRs may leave them unchecked. These declarations record initial readiness when opening the PR for review; later pushes do not require a new human sign-off. Keep the description and validation evidence current as the work changes. See CONTRIBUTING.md#pull-request-ownership-and-readiness. --> Human owner: @SandstromPL - [x] I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work. - [x] I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps. - [x] I declare this PR ready for initial maintainer review. ## Before merge - [x] This PR addresses a concrete problem or an agreed enhancement. - [x] Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff. - [x] The PR has one focused outcome and the title follows `type(scope): outcome`. - [x] Related issue is linked, or the reason for not linking one is stated above. - [x] Tests cover changed observable behavior and meaningful failure paths. - [x] Owning docs, contracts, and generated metadata are updated where needed. - [x] User-visible CLI/MCP changes include representative output. - [x] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- maintainer-blocker-review --> ### Maintainer blocker verification Merged pinned main `166fb0820fdfc91742317b9c539c4d5fda2fe03b`, preserving both the setup-plan catalog rows and current-main rows. On this resulting head, Setup.recovery.test.ts passed 23/23, check:fast passed, and docs:check passed all six tasks plus 5 README consistency tests. The net PR diff remains the intended five files. Hosted checks on this new head are still pending and are not represented as passed. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-10-31 01:13:40 +00:00
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#6336
No description provided.