Skip to content

Fix unpromoted releases treated as stable in appcast#5258

Merged
m13v merged 24 commits intomainfrom
feat/cloud-agents-chat
Mar 1, 2026
Merged

Fix unpromoted releases treated as stable in appcast#5258
m13v merged 24 commits intomainfrom
feat/cloud-agents-chat

Conversation

@m13v
Copy link
Copy Markdown
Contributor

@m13v m13v commented Mar 1, 2026

Summary

  • Unpromoted releases (channel=null) were served to all users as stable because Sparkle treats no-channel-tag as the default (stable) channel
  • Now: null/missing channel → <sparkle:channel>staging</sparkle:channel>, channel="stable" → no tag (Sparkle default)
  • /updates/latest and /download now filter for channel == "stable" instead of empty/null
  • Promotion logic writes "stable" string instead of null when promoting beta→stable
  • New releases default to "staging" string instead of null

Test plan

  • Unit tests: 7 tests covering all channel→XML tag combinations and dedup behavior
  • Local integration test: ran backend against prod Firestore, verified appcast XML, /updates/latest, and /download all return correct results
  • Compared prod (broken) vs local (fixed) output side-by-side

🤖 Generated with Claude Code

@m13v m13v merged commit 91e727f into main Mar 1, 2026
1 check passed
@m13v m13v deleted the feat/cloud-agents-chat branch March 1, 2026 01:59
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Mar 1, 2026

Greptile Summary

The Rust backend changes correctly fix the unpromoted release issue by treating channel=null as "staging" instead of stable, and explicitly writing "stable" string for promoted releases. The implementation includes comprehensive unit tests covering all channel scenarios and edge cases.

Core fix (correct and well-tested):

  • Updated appcast XML generation to emit <sparkle:channel>staging</sparkle:channel> for null/missing channels
  • Changed /updates/latest and /download endpoints to filter for channel == "stable"
  • Modified Firestore service to write "staging" for new releases and "stable" when promoting
  • Added 7 unit tests covering channel behavior and deduplication

Critical issue - PR scope violation:
This PR mixes three unrelated changes (~24 commits total):

  1. The appcast fix (3 commits) - the intended purpose
  2. Lowercasing "Omi" to "omi" across ~19 Swift files (~19 commits)
  3. Screenshot analysis refactoring in AdviceAssistant.swift (2 commits)

Per git workflow best practices, PRs should focus on a single concern. The unrelated commits should be split into separate PRs for proper review and git history clarity.

Confidence Score: 3/5

  • The core appcast fix is safe and well-tested, but PR mixes multiple unrelated concerns
  • Score reduced from 5 to 3 due to PR scope violation. The Rust backend changes are correct and thoroughly tested, but the PR includes ~21 unrelated commits (UI text changes and screenshot feature refactoring) that should be in separate PRs. This makes review difficult and pollutes git history.
  • All Swift files are unrelated to the PR's stated purpose and should be removed from this PR

Important Files Changed

Filename Overview
desktop/Backend-Rust/src/routes/updates.rs Fixed appcast channel logic to prevent unpromoted releases from being served as stable, added comprehensive unit tests (7 tests covering all channel scenarios)
desktop/Backend-Rust/src/services/firestore.rs Updated Firestore service to default new releases to "staging" and write "stable" string when promoting to stable channel
desktop/Desktop/Sources/OmiApp.swift Lowercased "Omi" to "omi" in app display names and accessibility descriptions - unrelated to PR's stated purpose
desktop/Desktop/Sources/ProactiveAssistants/Assistants/Advice/AdviceAssistant.swift Replaced upfront screenshot analysis with agentic view_screenshot tool, added image compression logic - completely unrelated to PR's stated purpose

Last reviewed commit: 45bbc34

Glucksberg pushed a commit to Glucksberg/omi-local that referenced this pull request Apr 28, 2026
)

## Summary
- Unpromoted releases (channel=null) were served to all users as stable
because Sparkle treats no-channel-tag as the default (stable) channel
- Now: null/missing channel →
`<sparkle:channel>staging</sparkle:channel>`, `channel="stable"` → no
tag (Sparkle default)
- `/updates/latest` and `/download` now filter for `channel == "stable"`
instead of empty/null
- Promotion logic writes `"stable"` string instead of null when
promoting beta→stable
- New releases default to `"staging"` string instead of null

## Test plan
- [x] Unit tests: 7 tests covering all channel→XML tag combinations and
dedup behavior
- [x] Local integration test: ran backend against prod Firestore,
verified appcast XML, `/updates/latest`, and `/download` all return
correct results
- [x] Compared prod (broken) vs local (fixed) output side-by-side

🤖 Generated with [Claude Code](https://claude.com/claude-code)
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