Skip to content

Prevent skipped stable publishers and enable safe recovery / 防止稳定发布任务被跳过并支持安全恢复#6629

Merged
SivanCola merged 1 commit into
esengine:main-v2from
SivanCola:fix/release-skipped-publish
Jul 18, 2026
Merged

Prevent skipped stable publishers and enable safe recovery / 防止稳定发布任务被跳过并支持安全恢复#6629
SivanCola merged 1 commit into
esengine:main-v2from
SivanCola:fix/release-skipped-publish

Conversation

@SivanCola

Copy link
Copy Markdown
Collaborator

Problem

The stable v1.17.15 orchestrator run completed green after approval, but every real CLI, npm, and Desktop publication job was skipped. The reusable workflows joined a successful orchestrator guard with a deliberately skipped standalone approval job; GitHub propagated that skipped ancestor beyond the cache guard because the publication descendants had no explicit status condition.

The documented workflow_dispatch recovery path was also ineffective after a workflow fix: it checked out and executed control scripts from the old release tag and required that tag to remain current main-v2.

Broken run: https://github.com/esengine/DeepSeek-Reasonix/actions/runs/29622254856

Fix

  • Add explicit success conditions to the CLI, npm, and every Desktop publication stage so the intentionally skipped alternate authorization branch cannot suppress publication.
  • Keep recovery authorization, tag resolution, and postflight logic on protected main-v2 while the actual builds remain pinned to the immutable approved historical release SHA.
  • Require all three stable tags to resolve to one commit that is an ancestor of current main-v2; normal tag-push releases still require the exact current main-v2 commit.
  • Add a final stable postflight that fails unless all three reusable publishers succeed, required CLI/Desktop GitHub Release assets exist, and npm latest exactly matches the approved version.
  • Extend the release workflow contract tests with current-tag, historical recovery, stale control-plane, moved-tag, mismatched-tag, and non-ancestor cases.

Recovery

After this PR merges, dispatch Release stable from protected main-v2 with tag v1.17.15. It will retain the existing v1.17.15, npm-v1.17.15, and desktop-v1.17.15 tag targets, request one release-environment approval, build the original candidate SHA, and verify every public artifact at the end. No tag movement or recreation is required.

Verification

  • bash scripts/release-workflows.test.sh
  • actionlint v1.7.7 on all four release workflows, with the repository CI ignore for the GitHub-hosted windows-11-arm label
  • bash -n on all changed release scripts
  • public artifact postflight against v1.17.14
  • ./scripts/cache-guard.sh — all eight scenarios pass, tail averages 92–95 against threshold 90
  • go test ./...
  • git diff --check

Compatibility and cache

Surface Existing behavior Result
Stable tag push Requires all three tags on exact current main-v2 Preserved
Existing release tags Recovery reads the immutable historical SHA and never moves tags Safe
Standalone RC/canary Keeps the existing standalone gate/channel behavior Preserved
Persisted app/config/session formats Not touched No migration or coexistence impact

Cache impact: none. No provider-visible prompt, tool schema/order, request serialization, compaction, memory, or provider code changed. The cache guard remains green.

Problem:
The stable orchestrator reported success after approval even though the CLI, npm, and Desktop publication jobs were skipped through a transitive skipped dependency. The existing recovery dispatch also could not use a workflow fix without moving the already-published tags.

Root cause:
Each reusable publisher joined an orchestrated guard with a deliberately skipped standalone gate. The cache guard used an explicit status condition, but its descendants did not, so GitHub propagated the skipped ancestor through the dependency chain. Recovery also checked out and executed control scripts from the old release candidate.

Fix:
Add explicit success conditions to every affected publication stage, keep recovery authorization and verification on protected main-v2 while building the immutable historical tag SHA, and reject non-ancestor or mismatched tag sets. Add a stable postflight that verifies required CLI/Desktop release assets and the exact npm latest version so a no-op release cannot stay green.

Verification:
- bash scripts/release-workflows.test.sh
- go run github.com/rhysd/actionlint/cmd/actionlint@v1.7.7 -ignore 'label "windows-11-arm" is unknown' on all release workflows
- bash -n on all changed release scripts
- verify-stable-release-artifacts.sh against public v1.17.14 artifacts
- ./scripts/cache-guard.sh
- go test ./...
- git diff --check
@SivanCola
SivanCola requested a review from esengine as a code owner July 18, 2026 00:24
@github-actions github-actions Bot added v2 Go rewrite (1.x) — main-v2 branch, active development updater Auto-update / installer / release packaging labels Jul 18, 2026
@SivanCola
SivanCola merged commit e7a0f11 into esengine:main-v2 Jul 18, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

updater Auto-update / installer / release packaging v2 Go rewrite (1.x) — main-v2 branch, active development

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant