fix(desktop): make Windows package rebuild transactional and self-healing - #91079
fix(desktop): make Windows package rebuild transactional and self-healing#91079andrexibiza wants to merge 22 commits into
Conversation
|
Implementation receipt for the current exact head
Exact-head hosted receipts are all green: This PR owns package-generation settlement and builder-runtime authority. #91063 remains the complementary corrupt- |
10c3d19 to
914f3fe
Compare
|
Don't merge this yet. The restore-on-failure half is the right fix for the dead shortcut. If electron-builder dies, putting The success path is the problem. After a zero exit this deletes the backup as soon as the new Leave the backup in place on success and let the existing gate decide. Or copy that full check (size, section table, arch) into JS before you throw the backup away. The current tests use a 256-byte stub and call that success, which is the bug. Same recovery code still does This also does not heal the corrupt #44234 is still open and backs up in a different place. Pick one owner before both land. The Node reexec for the fnm vs Hermes split looks right. barsh already showed that split on #90134. That part can stay. Green CI here is not a Windows pack witness. The new suites are mocked unit tests on the generic JS lane. They never pack a real |
93034ab to
13984a2
Compare
|
Implemented the two load-bearing review repairs on the live branch rather than treating the earlier green matrix as acceptance. Current exact head:
I am also narrowing the topology claim: this bypasses a corrupt active Fresh exact-head CI/Docker/Nix were triggered on |
|
Fresh exact-head acceptance is now complete on
The exact CI run includes green Code-side blockers are closed on this head: rollback authority survives builder success through the canonical Python launchability gate, and isolated recovery cannot execute lifecycle code until the realized dependency graph is proven against committed lock/override authority. #90829 remains open as the broader active-install-health class. |
|
Fresh exact-head settlement for
These receipts are attached directly to the lock-closure / rollback-authority repair. No status is inherited from The two load-bearing review blockers are closed in the exact object:
The evidence boundary remains explicit: this hosted matrix is exact-head repository evidence, not a real Windows packaged-app witness. Merge review should preserve that distinction, and the resulting merged object still needs current-main plus real-Windows/package-path verification before the incident class is described as operationally closed. |
Current-main delta — 2026-08-25 13:55 CDTUpstream Fresh topology against current main is now 17 commits ahead / 740 behind, merge base Current main itself is not a green acceptance floor: exact-main CI run The acceptance invariant is unchanged: one semantic child of the exact landing main, exactly the declared 14 product/test paths, no temporary publisher machinery, then fresh exact-final-head CI/Docker/Nix plus a real packaged-Windows witness. Historical generated trees and prior greens remain provenance only. |
Install the actor-gated dispatcher that exposes and invokes the exact Windows-gated NousResearch#91079 finalizer. Temporary workflow; remove after publication read-back.
Install the temporary exact-current-main NousResearch#91079 composition and Windows witness lane. Remove after target publication and read-back.
Install the temporary server-originated scheduled execution lane for exact NousResearch#91079 current-main composition and real Windows verification. Remove after publication.
|
Current publication correction after the live head moved again:
I have moved this PR to draft so the repository does not mistake a newer publication carrier for the Windows package transaction itself. The invariant remains unchanged: the landing object is one current-main semantic child containing only the declared 14 product/test paths, including the reconciled |
|
Implemented the publication/topology cleanup in place before adding this receipt. The PR body now names live head The final merge contract is now explicit: one current-main 14-product-path Windows package transaction, no temporary |
|
Correction after direct live read-back: #91080 is not a package-transaction witness; it is the independent The #91079 topology correction itself remains: #96311 shipped #96282’s source-announcement repair, while #96280 is the distinct packaged-Windows launcher/grandchild realization boundary. The final 14-path object must prove package bytes + realized backend generation + observable readiness + rollback settlement on the exact packaged-Windows artifact. No standalone witness carrier is being treated as transferable product proof. |
Current source of truth — 2026-08-27 10:22 CDT
Live submitted object:
f84cecb3a630bd3dd07791d4e00ea94c06d5ba8242ac29eacc4d743ed2df7db0f886b99111d9e68bThis carrier is not the final product object. Current main has materially changed Desktop ownership/routing, updater, process, package, recovery, and backend-readiness surfaces. Composition must be semantic; do not overlay historical generated bytes onto current main.
Final product boundary — exactly 14 product/test paths
The valid rematerialized object is limited to:
apps/desktop/package.jsonapps/desktop/scripts/before-pack-recovery.mjsapps/desktop/scripts/before-pack.mjsapps/desktop/scripts/before-pack.test.mjsapps/desktop/scripts/desktop-builder-runtime.mjsapps/desktop/scripts/desktop-pack-recovery-composition.test.mjsapps/desktop/scripts/desktop-pack-transaction.mjsapps/desktop/scripts/desktop-pack-transaction.test.mjsapps/desktop/scripts/run-electron-builder.mjsapps/desktop/scripts/stage-native-deps-recovery.mjsapps/desktop/scripts/stage-native-deps-recovery.test.mjsapps/desktop/vitest.config.tshermes_cli/main.pytests/hermes_cli/test_desktop_pack_transaction_windows.pyTemporary
.githubpublisher/materializer machinery is not product scope and must not survive into the final merge object.Realization and readiness interlock — #96311 / #96280 / #96315
The source-announcement half of the earlier readiness class is now shipped. #96311 merged the canonical repair for #96282: serve announcements use the machine channel for
READYandBACKEND_PORT_IN_USE, separate-stream behavior is covered, and a closed redirected stream cannot make the fallback kill a healthy serve. #96282 is therefore historical provenance, not an open implementation dependency.#96280 remains a distinct Windows realization boundary. Electron can own a
uvlauncher process while the real serving interpreter is a grandchild. A packaged-Windows acceptance witness therefore cannot equate stdout ownership, process existence, or elapsed time with backend settlement. It must prove that the exact rebuilt generation is physically realized and observable through the authoritative readiness artifact/postcondition across launcher indirection.#96315 independently demonstrates the other side of the shape on macOS: a backend may be alive while a generation-bound waiter still loses. That report is incident evidence; its proposed root cause is not promoted here to merged truth.
The package contract is therefore bytes + realized generation + observable settlement. Producing a coherent package tree is insufficient if the owner cannot prove which generation actually became usable.
Current post-release incident pressure
The v0.20.6 / v2026.8.27 release makes physical acceptance more important, not less. Current install/update reports include #96360 (Windows SCM false-blocker class), #96375 (stale renderer assets), #96409 (post-update Windows Desktop breakage), #96426 (updater exit-1), and #96442 (Linux sandbox after update). These are not asserted to share one root cause. They are evidence that packaging, update, realization, and rollback must be verified as a transaction rather than inferred from individual subprocess success.
Final acceptance transaction
.githubpublisher/materializer paths from the final merge object.hermes_cli/main.pytransaction into the submitted tree only after reconciling it against then-current main.Until one current-main product-only object owns those receipts, this PR remains draft.
Provenance and interlocks
uvlauncher/grandchild readiness realization boundaryDisposition: #91079 remains the implementation owner for the still-missing Windows package transaction, but
f84cecb…is not the final product object and has no transferable exact-head certification. Final truth requires one current-main 14-path product object plus physical packaged-Windows proof of package recovery, realized generation, readiness, and rollback settlement.