Skip to content

fix(upgrade): quiesce rejected bindings before rollback - #74

Merged
fuller-stack-dev merged 1 commit into
mainfrom
fix/rollback-managed-plugin-peer-links
Aug 13, 2026
Merged

fix(upgrade): quiesce rejected bindings before rollback#74
fuller-stack-dev merged 1 commit into
mainfrom
fix/rollback-managed-plugin-peer-links

Conversation

@fuller-stack-dev

Copy link
Copy Markdown
Member

Summary

  • quiesce a rejected active binding before restoring an upgrade snapshot, even
    when the target reused an existing named runtime and mutated no runtime tree
  • prevent a backoff/retry process from rewriting managed-plugin
    node_modules/openclaw peer links after source-state restoration
  • extend the named-runtime rollback regression to cover four managed plugins,
    retained/missing/rejected links, restored service binding, and gateway RPC
    readiness

Root cause

rollback_upgrade_locked quiesced only when runtime bytes had changed. A switch
to an already-installed named runtime changes the published binding without
adding mutated_runtime_names, so a rejected target in supervisor backoff could
remain able to mutate the environment while OCM restored the source snapshot.

Whole-root snapshot restoration already preserves these symlinks in a cold
fixture. A post-rollback repair phase would therefore be downstream and still
racy. The owner invariant is process exclusion: quiesce whenever rollback
changes runtime bytes or the active binding, before restoring source-owned
state.

Evidence

Base: 6a30e9063bcf85d1cba4c1c358ce6140e70fcf40

Head: f63f41af1638a3c03a6f6826d908b128f89d13ce

On unmodified canonical source, the active-service fixture completed rollback
with clickclack/node_modules/openclaw resolving to rejected runtime
2026.8.2 instead of restored runtime 2026.8.1.

On this head, the same fixture reports:

rollback proof: binding=2026.8.1 plugins=4 peerTarget=.../runtimes/2026.8.1/files/node_modules/openclaw gatewayRpc=ok channels=fixture-not-supported

The fixture verifies clickclack, codex, discord, and llama-cpp; exact
raw and resolved peer-link targets; one retained valid link; one removed link;
two rejected-runtime links; restored service binding; and deep gateway RPC
readiness. It does not configure real channels, so no channel-health claim is
made.

Validation

  • cargo test --locked -- --test-threads=1
  • cargo clippy --workspace --all-targets --all-features --locked -- -D warnings -A clippy::question_mark -A clippy::large_enum_variant -A clippy::too_many_arguments
  • cargo +1.88.0 check --workspace --all-targets --locked
  • cargo fmt --all -- --check
  • source-blind red/base and green/head behavior validation
  • focused cold-snapshot falsifier and rollback readiness/service controls
  • shared autoreview: clean, no actionable findings

PRs #71, #72, and #73 and current main were checked before implementation.
This change does not add OpenClaw convergence retries or invoke a manual repair
command.

@fuller-stack-dev
fuller-stack-dev merged commit f6dea9f into main Aug 13, 2026
5 checks passed
@fuller-stack-dev

Copy link
Copy Markdown
Member Author

Landed via squash merge as f6dea9f7e90215964d8a5dfc25c841c71f298629 after all required checks passed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant