Public @stacksjs/bumpx@0.2.30 reports completed rollback after a rejected release push while retaining the release commit and annotated tag. It restores the old working manifest against the new HEAD/index, leaving the candidate inconsistent.
A normal exact public installation and frozen install reproduced this through the declared CLI and a real local bare Git remote. A pre-receive hook wrote an explicit marker and exited73. The CLI exited2 after its atomic push was rejected, printed Rollback completed due to error., and retained local release0.1.1 refs while the working manifest became0.1.0. The remote stayed unchanged. Success and precommit required-command refusal controls passed:2pass/1failing regression,86assertions,5.40seconds; each case used Bun's default5second bound.
The retained receipt is /tmp/bumpx-rollback-investigation/public-reproduction-receipt.json, SHA256 d7224898e32c939c127ef5810c6ca54823eb75c0ac016f7f1694dec638422ff4, with158 artifact identities and the real fixture repositories. All19 installed public payload files matched the original registry archive before and after. HOME and global Git configuration were unchanged.
Acceptance:
- Before a local release commit or final tag exists, retain existing owned-file/index restoration and the original error.
- After either ref exists, preserve candidate files/index/refs and report the failed phase, retained local state and original error. Never reset/delete refs or claim remote publication was undone.
- Preserve no-commit/index semantics and existing caught-cancellation behavior without adding global signal hooks.
- Report incomplete precommit restoration honestly rather than claiming completed rollback.
- Maintain real whole-operation CLI coverage for late rejection, ordinary atomic success, precommit refusal, tag-only/no-commit and relevant error/cancellation boundaries. Preserve existing budgets and source/public package contracts.
- Deliver and qualify the owning source release before downstream tool adoption.
Related: closed #2007 owns atomic publication and already fixed the old branch-name mismatch trigger. Synchronous backup writes were separately fixed in ca87da4. Neither is reopened. The current reporting path remains in published0.2.28/0.2.30 and current source.
Downstream observation: https://github.com/stacksjs/dtsx/issues/3135 . Its qualified0.11.25 release is complete and is not blocked or reclassified by this separate source defect.