Skip to content

Clarify desktop release qualification and stable-candidate lifecycle#9380

Merged
Git-on-my-level merged 5 commits into
mainfrom
codex/desktop-release-qualification
Jul 10, 2026
Merged

Clarify desktop release qualification and stable-candidate lifecycle#9380
Git-on-my-level merged 5 commits into
mainfrom
codex/desktop-release-qualification

Conversation

@Git-on-my-level

@Git-on-my-level Git-on-my-level commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Closes #9377

Summary

  • rename the desktop T2 gate from “blessing” to exact-tag qualified-beta terminology and canonical qualifiedBeta* metadata
  • preserve legacy blessed* metadata through canonical-first dual-read compatibility
  • add a manual stable-candidate nomination workflow that requires the current beta pointer plus soak, telemetry, release-note, rationale, operator, and qualification-evidence fields
  • require a matching stable-candidate nomination before stable promotion, while retaining a typed and reason-audited break-glass path
  • add lifecycle documentation and search-based terminology/nomination-boundary guards

Stable nomination only edits GitHub release decision metadata. It does not move beta or stable pointers, mutate beta visibility, deploy a backend, or otherwise expose the release. desktop_promote_prod.yml remains the sole stable visibility workflow and still requires confirm=promote-stable.

Compatibility

Existing releases that contain only blessed, blessedSha, blessedAt, blessedTier, and blessedEvidence remain valid qualification inputs for nomination and stable promotion.

Independent review follow-up

  • bind stable nomination to the beta pointer's immutable manifest source_sha
  • preserve the historical manifest shape for idempotent legacy beta-promotion retries
  • avoid empty-array expansion under set -u in normal stable promotion
  • migrate the admin Releases API/dashboard to canonical-first legacy-compatible parsing, complete nomination gating, and the four lifecycle states

Verification

  • pre-push checks passed, including backend runtime validation, async/import isolation gates, pyright (0 errors), workflow contracts, OpenAPI regeneration checks, Rust compile, desktop tool-surface suites (96 + 103 tests), and selected desktop update backend tests (106 tests)
  • actionlint passed for all changed workflows
  • python3 desktop/macos/scripts/release-keyvalue.py self-test
  • python3 .github/scripts/test_check_desktop_release_promotion.py
  • python3 .github/scripts/check-desktop-release-terminology.py
  • python3 .github/scripts/check-desktop-prod-promotion-policy.py
  • python3 .github/scripts/check-release-process-guards.py
  • desktop/macos/scripts/qualify-desktop-beta.sh --help
  • npx vitest run lib/__tests__/desktop-release-lifecycle.test.ts (7 passed)
  • npx tsc --noEmit
  • npm run build (admin production build passed)
  • python3 scripts/check-userdefaults-key-ratchet.py (desktop raw-key count at baseline 184)
  • xcrun swift build -c debug --package-path Desktop (passed; existing warnings only)

Product invariants affected

  • INV-AUTH-1 — codemagic.yaml is touched only for desktop release messaging; authentication behavior is unchanged. Existing manual production and channel-safety boundaries are preserved.
  • INV-CHAT-1 — the typed UserDefaults registration only preserves an existing test override for voice playback; shared chat continuity and runtime behavior are unchanged.

Changelog

Internal release/operator tooling only; no customer-facing changelog entry is needed.

Review in cubic

Replace desktop blessing terminology with qualified-beta metadata, preserve legacy readers, add stable-candidate nomination, and require nomination before stable promotion with an audited break-glass path.

Verification:
- actionlint on the changed desktop and repo-check workflows
- shellcheck desktop/macos/scripts/qualify-desktop-beta.sh (informational warnings only)
- python3 desktop/macos/scripts/release-keyvalue.py self-test
- python3 .github/scripts/test_check_desktop_release_promotion.py
- python3 .github/scripts/check-desktop-release-terminology.py
- python3 .github/scripts/check-desktop-prod-promotion-policy.py
- python3 .github/scripts/check-release-process-guards.py
- uv run --with pytest pytest -q backend/tests/unit/test_desktop_release_scripts.py (7 passed)
- desktop/macos/scripts/qualify-desktop-beta.sh --help
@Git-on-my-level Git-on-my-level added the no-changelog-needed Skip desktop changelog enforcement for internal-only changes label Jul 10, 2026 — with ChatGPT Codex Connector
@mintlify

mintlify Bot commented Jul 10, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
omi 🟢 Ready View Preview Jul 10, 2026, 5:12 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

Bind stable nomination to the beta manifest source SHA, preserve immutable legacy manifest retries, harden the normal promotion shell path, and update the admin release dashboard to report the four canonical lifecycle states.

Verification:
- backend/.venv/bin/python -m pytest -q backend/tests/unit/test_desktop_release_scripts.py (8 passed)
- python3 .github/scripts/test_check_desktop_release_promotion.py
- python3 .github/scripts/check-desktop-prod-promotion-policy.py
- python3 .github/scripts/check-desktop-release-terminology.py
- python3 desktop/macos/scripts/release-keyvalue.py self-test
- actionlint on changed release workflows
- npx vitest run lib/__tests__/desktop-release-lifecycle.test.ts (7 passed)
- npx tsc --noEmit
- npm run build
Keep the desktop UserDefaults key ratchet at baseline by registering the TTS playback test override in DefaultsKey.\n\nVerification:\n- python3 scripts/check-userdefaults-key-ratchet.py (desktop/macos)\n- xcrun swift build -c debug --package-path Desktop (desktop/macos)
The PR description now names INV-CHAT-1 for the typed UserDefaults registration introduced while repairing the Hygiene ratchet.
@Git-on-my-level

Copy link
Copy Markdown
Collaborator Author

@cursor address merge conflict

@Git-on-my-level

Copy link
Copy Markdown
Collaborator Author

@codex review

@cursor

cursor Bot commented Jul 10, 2026

Copy link
Copy Markdown

Resolved the merge conflict with main.

Conflict: desktop/macos/Desktop/Sources/DefaultsKey.swift

Resolution:

  • Kept the single hasCompletedOnboarding case already on this branch (line 38)
  • Dropped the duplicate hasCompletedOnboarding from main
  • Kept forceTTSPlaybackStartFalse with main's doc comment for the TTS test hook

Merged, committed, and pushed to codex/desktop-release-qualification (86c14ac83). The PR should be conflict-free now.

Open in Web Open in Cursor 

Resolve DefaultsKey.swift conflict: keep single hasCompletedOnboarding case
from this branch and adopt main's forceTTSPlaybackStartFalse doc comment.

Co-authored-by: David Zhang <Git-on-my-level@users.noreply.github.com>
@Git-on-my-level Git-on-my-level merged commit 07d9bd4 into main Jul 10, 2026
22 checks passed
@Git-on-my-level Git-on-my-level deleted the codex/desktop-release-qualification branch July 10, 2026 17:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

no-changelog-needed Skip desktop changelog enforcement for internal-only changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Desktop releases: clarify qualification, beta, stable-candidate, and stable terminology

2 participants