mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #7077] Linux Hopper setup fails for current vendor release: fixed 120 s download deadline exceeded and feed main_exe_hash does not match the published launcher #4266
Open
opened 2026-10-31 00:48:17 +00:00 by bsakaguchi
·
8 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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#4266
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @kystudioau on GitHub (Oct 25, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/7077
Summary
rea setup --install-hopperon Linux cannot succeed for the current Hopper release, for two independent reasons:hopperapp.comstreams at a rate that exceeds REA's fixed 120 s package-download deadline from our network, and the deadline cannot be raised (values above 120,000 ms are rejected).main_exe_hashthat does not match the launcher in the currently published demo packages, so verification would fail withintegrityeven when the download completes. The package itself does verify against the pinned publisher key, so this appears to be stale feed metadata rather than a version handling bug on REA's side.Algumas observations: in both failed runs the structured result returned only the generic
code: "download_failed"remediation ("REA could not download or unpack...") with no underlying reason, which made diagnosis slow; the actual failure (timeout / which URL) is not surfaced.Environment
npx -y rea-agents@latestnpx -y rea-agents@latest setup --client opencode --skill --install-hopper --yes --jsonEvidence
1. Vendor download rate vs REA's fixed deadline
dist/application/HopperDownload.jscaps the deadline:Measured with curl under the same UA REA sends (
rea-installer):.../include/files-api.php?request=releases&public=true): HTTP 200 quickly.https://www.hopperapp.com:443/downloader/public/Hopper-6.6.0-Linux-demo.rpm, 32,261,798 bytes): completes only after ~132 s (~245 KB/s sustained).The download therefore never completes inside the 120 s cap, and every setup attempt ends in the generic
download_failed. Notes: 120 s is also the maximum accepted value, and there is no environment override for this deadline (REA_HOPPER_STARTUP_TIMEOUT_MScovers provider startup only). The feed/key metadata budgets are separate and fine (RELEASE_METADATA_TIMEOUT_MS = 10_000, both URLs respond well within it).2. Feed
main_exe_hashdoes not match the released packagesThe feed (
public=true) reports for all three Linux families (Ubuntu / Mint,Fedora,Arch) of 6.6.0:file_length= 32261798,file_hash(SHA-1) =933aa2502550923a865f79e837ba403494c4b4b3(matches the RPM we downloaded byte-for-byte)main_exe_hash=b2271008fb82bf14cfae5c3644cdde2b11fc6804bd7c99d67032ec1b1942d53csignatureverifies Good with the official key; imported primary fingerprint matches the pinned7C2D73BAFAF5B9A710A69DA1A26DF815099B1BCD(signed via subkey868AD58E3275680D224CC9EC36D2884BC4DB1C33)But the actual launcher in that verified package does not match the advertised
main_exe_hash:No file inside the package hashes to the advertised
b2271008...value. So REA's post-authentication checkwould reject this release even when the download succeeds. The signature being valid for the whole package while
main_exe_hashis stale suggests the vendor rebuilt/repacked the demo without updating the feed'smain_exe_hash.Suggestions
REA_HOPPER_DOWNLOAD_TIMEOUT_MS) or retry-with-backoff instead of surfacing a timeout as the genericdownload_failed.release_metadatavsintegrity, per URL) in the structured setup result; the generic code obscured both findings.main_exe_hash, Hopper setup fails for everyone regardless of network speed until the feed is corrected.Happy to provide the exact curl commands / extraction steps used, or re-run anything on this host.
As a related data point, the same vendor retry-flow pattern showed up in #3209 (completion reported as
download_failedwhen a later step fails); here the download itself always fails because the vendor feeds the bytes slower than the hard deadline.@XinwangTao commented on GitHub (Oct 25, 2026):
两个问题都确认是真实的:120 s 硬上限既不能配置也没有环境变量覆盖,对慢速网络完全无解;main_exe_hash 与包内 launcher 不一致则是 vendor 侧 stale feed,REA 的完整性校验逻辑本身没错,但结果就是所有用户都会被卡住。认可你的方向:(1) 把包下载超时做成可配置(REA_HOPPER_DOWNLOAD_TIMEOUT_MS 或 retry-with-backoff),默认值可以保留但不应封顶 120 s;(2) 结构化 setup 结果里把失败原因细分(timeout / release_metadata / integrity,带具体 URL),别再用泛化的 download_failed 掩盖。额外建议:验签通过但 main_exe_hash 不匹配时,可以在错误信息里显式提示"包签名有效、疑似 feed 元数据过期",帮用户快速判断是 vendor 问题而非供应链风险;同时把 #3209 的同类错误分类一并纳入,避免每类失败各自为政。
@XinwangTao commented on GitHub (Oct 25, 2026):
Two independent blockers here — thanks for separating them. On the deadline: fixed 120s is clearly too tight for vendor CDNs; making the deadline configurable (env var or --timeout flag) with a sane default that still fails fast is the right direction. On the hash mismatch: since the package verifies against the pinned publisher key, treating main_exe_hash as a soft warning with an explicit integrity caveat (rather than a hard failure) would let installs proceed while still surfacing drift — or auto-refresh the feed hash when the publisher signature is intact. Either way, the failure mode should tell the user which part (network vs integrity) blocked the install.
@morluto commented on GitHub (Oct 26, 2026):
Related evidence: #3578 independently documents the Fedora 6.6.0 RPM signature, header, and launcher hash mismatch. That report also observed matching Ubuntu deb and Arch launcher hashes, so the verified package mismatch should not be generalized to all three formats from the shared feed value alone. I have consolidated the Fedora report here; the download timeout and integrity diagnosis remain distinct. No vendor feed or installation was rerun in this triage.
@Dobydoo commented on GitHub (Oct 29, 2026):
Fedora 44 datapoint, plus a correction to one workaround claim
Environment: Fedora 44 (kernel
7.2.13-200.fc44.x86_64, x86_64), Nodev24.18.0, npm11.16.0,rea-agents6.7.0. Same two digests as every report above; deterministic across retries.1.
rea-agents@6.8.0(current npmlatest) does not change thisChecked the published tarball rather than assuming.
dist/application/LinuxHopperPublisher.jsin 6.8.0 still has the identical equality check:#packageLauncherHashis unchanged for therpmbranch (%{FILEDIGESTS}on/opt/hopper/bin/Hopper, requiring%{FILEDIGESTALGO}==8). So the top-level remediation "update REA" remains non-actionable at time of writing; 6.8.0 reproduces, it does not fix.2. The mismatch is a single stripped ELF section, not a different build
Section-by-section comparison of
opt/hopper/bin/Hopperfrom the 6.6.0.deb(b2271008…) vs the.rpm(4d6c23b6…):.text.rodata.data.dynamic.dynsym.dynstr.init.fini.comment.commentin the deb containsGCC: (Ubuntu 10.5.0-4ubuntu2.1) 10.5.0andUbuntu clang version 18.1.3 (1ubuntu1). The rpm launcher is the same compiled image with the section header table one entry shorter (31 vs 32 sections) and 152 fewer bytes (9,555,136 vs 9,555,288). That is consistent with the Fedora build being produced by the same compile and one post-link section-strip step, which is why the feed's single sharedmain_exe_hashdisagrees.Also confirmed the Arch
pkg.tar.xzlauncher is byte-identical to the deb launcher atb2271008…, so 2 of 3 channels agree and only Fedora diverges.3. Correction: the launcher-path workaround does work
#3578 concluded that pointing
HOPPER_LAUNCHER_PATHat the hash-matching.deblauncher still failsrea doctor'shopper-versionwithintegrity. That is true for a bare launcher, but not for the whole path.inspectLauncheraccepts a launcher if#cachedPackagefinds a retained signed entry under<cache>/<launcher-sha256>— it only reaches the family-specific feed comparison oncache_missing.So a working, check-preserving recovery on Fedora 44 is:
.debpayload (launcher hashb2271008…, matches the feed) to~/.local/share/rea/hopper/.~/.cache/rea/hopper-releases/b2271008…/witharchive(the signed package),public-key.asc(official key), andrelease.json({"format":"rea-signed-hopper-release-v1","family":"arch","release":<feed row>}).#packageLauncherHashverifiesdebthroughdpkg-deb, which is absent on Fedora, so a deb-family cache entry fails withverification_unavailable. Arch verifies with plaintarand yields the sameb2271008…launcher.Result —
rea doctor:and
rea analyze ./smoke --provider hopperreturnsprocedure_count: 11,segment_count: 4, withupstream_analysis_profile.provider.version=launcher-sha256:b2271008….I am not proposing this as a fix — it requires hand-seeding the cache, and the real fix is still a per-family
main_exe_hashin the vendor feed, or the pinned-dual-hash acceptance used by #933. Surfacing it because it shows the verification logic itself is sound: nothing here needs weakening, and theunsupported_hopper_build/integritydistinction is behaving correctly.4. Download deadline is also still real here
The 32,261,798-byte rpm took ~98 s from this network on a 300 s curl budget, i.e. close to your fixed 120 s package deadline. Not the failure I hit, but it corroborates the second half of this issue.
@XinwangTao commented on GitHub (Oct 29, 2026):
Thanks for the Fedora 44 datapoint and especially the section-level comparison — pinning the mismatch to a single stripped section (with 2 of 3 channels agreeing on b2271008…) makes the per-family main_exe_hash fix clearly correct, and the corrected cache-seeding workaround confirms the verification logic itself is sound. One thought for REA's side: since the package signature verifies against the pinned key and the launcher lives inside that same signed package, accepting a dual-hash (feed hash or in-package hash) when the publisher signature is intact — along the lines of #933 — would avoid hard-failing every Fedora user while the vendor feed is stale. And with ~98 s on your network, the 120 s deadline is uncomfortably close even on decent connections, so a configurable timeout with a higher default still seems warranted.
@morluto commented on GitHub (Nov 1, 2026):
Fresh package-level verification on 2026-11-01 confirms that the Fedora launcher/feed mismatch persists in Hopper 6.6.1.
Downloaded the current official DEB and RPM selected by the public feed, using REA's
rea-installeruser agent. Both packages match their advertised size and SHA-1, and both detached signatures pass the sourceverifyDetachedPgpSignatureunder primary fingerprint7C2D73BAFAF5B9A710A69DA1A26DF815099B1BCD(signing subkey868AD58E3275680D224CC9EC36D2884BC4DB1C33).Hopper-6.6.1-Linux-demo.deba2c28339b768609dc7766869f51d25a38b49fd2a74b51599fa2b72cf927aa9d089c7046ee0942fb1c29eb0750ac166b3dff97999Hopper-6.6.1-Linux-demo.rpm8796f901812c0067bfe6154fa188d25b7fc9e24bb41e67e7fa30f25216db83ab8f986ea8fa3fb7e87761cb98c90cd96dc97bc376The feed advertises the DEB launcher hash for both channels. Independent RPM-header decoding finds digest algorithm 8 (SHA-256) and the same
b41e67e7…value for/opt/hopper/bin/Hopper; this agrees with the payload extracted using macOSbsdtar. ELF comparison finds.commentonly in the DEB, a differing.shstrtab, and identical other shared file-backed sections, including.textand.rodata. This is consistent with a post-link stripping difference; the actual publisher build process remains unknown.At source revision
245a581818ab13694fa438a06e39898ce03ab206,LinuxHopperPublisher.#verifyArchiverejects this disagreement before package-manager execution. Correct per-package vendor metadata remains the preferred resolution; these observations do not justify disabling verification or accepting the DEB hash for RPM bytes.Limits: package inspection and source-verifier execution on Darwin arm64 / Node v25.1.0; no full Fedora setup or Hopper runtime was executed. Arch 6.6.1 was not downloaded. The two concurrent curl downloads finished in 9.425 s (DEB) and 14.415 s (RPM), so this run did not reproduce the slow-download failure. Source still caps the package deadline at 120 s. Feed and key returned HTTP 200 with REA's actual headers; a default-curl 403 is not evidence that REA itself is blocked.
Follow-up: 3842809c3 adds installer checks and troubleshooting guidance for host support, package/feed disagreement, download failures, and runtime readiness. This is a documentation change; it does not correct the vendor metadata or change the download deadline. Bazzite-specific setup guidance and the remaining container verification are tracked in #8500.
@morluto commented on GitHub (Nov 1, 2026):
Related research and follow-up issues from the provider audit:
For download design, Playwright's browser downloader preserves HTTP status and URL in failures, and its browser installation docs describe a configurable download timeout. Playwright passes a socket timeout to its downloader; REA's AbortSignal budget covers the total download. These budgets should not be treated as interchangeable.
For REA, the proposed improvement is to preserve typed failure facts and provide an explicit bounded download budget with actionable recovery. Do not copy automatic retries indiscriminately: retries cannot fix a valid-signature/feed-hash disagreement, and integrity verification should remain a hard gate. No timeout change or retry behavior was implemented by this audit, and the earlier live downloads here did not reproduce the reported slow network.
@XinwangTao commented on GitHub (Nov 4, 2026):
Appreciate the fresh 6.6.1 verification — pinning the mismatch to post-link section stripping across two releases makes the per-family feed hash the clear root cause. Agree with the audit's boundaries: retries can't fix a valid-signature/feed-hash disagreement, so keeping integrity a hard gate is right, and #8505's drift monitoring is the sensible long-term fix.
On the timeout half, I'd support treating the 120 s cap as a total-budget problem and moving to a stall/socket-based timeout (the #7150 direction) rather than just raising the number — a slow-but-progressing download and a dead connection are different failures, and only the latter should fail fast. That also keeps the Playwright socket-timeout vs AbortSignal distinction you called out: budget the transfer, not the wall clock.
Small concrete idea for #8505: the existing verification path already computes in-package hash vs feed hash — logging that diff on mismatch (and on success) would give drift-detection signal for free, without a separate monitoring service.