SwiftBot 1.22.6: Stuck Voice Recovery Rejoins - #10
Conversation
5dd8669 to
1ef6602
Compare
A focused Announcer reliability update: a voice recovery that gets stuck waiting for secure media now recovers itself, and the next diagnostic report will say exactly where the voice pipeline stopped. Stuck Voice Recovery Rejoins - If queued Announcer work remains paused while recovering for 60 seconds, perform the normal clean voice rejoin. - Keep normally paused and empty Announcers out of the recovery escape hatch. Voice Diagnostics You Can Use - Export Announcer health, voice events, audio-frame timing, UDP keepalive history, voice resume, and DAVE/MLS state. - Show a SwiftMiner-style preparation sheet before the save sheet. - Keep exported diagnostics redacted.
1ef6602 to
fed68a0
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fed68a0572
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| out += "(none)\n" | ||
| } else { | ||
| for entry in voiceEntries { | ||
| out += "[\(iso.string(from: entry.time))] \(SwiftBotLogRedactor.redact(entry.description))\n" |
There was a problem hiding this comment.
Redact channel snowflakes from the exported voice log
When the voice log contains entries such as Voice join requested for channel 123456789012345678 (generated by connectVoice), this new export loop writes the snowflake unchanged. SwiftBotLogRedactor only recognizes forms such as channel_id=..., not the natural-language channel ... form used by these entries, so a report attached to a public GitHub issue can disclose Discord IDs despite the release notes describing them as scrubbed. Extend the redaction rule or omit raw IDs from exported voice entries.
Useful? React with 👍 / 👎.
Summary
Root cause
A recovery that awaited DAVE media readiness kept the announcer paused. The health watchdog excluded all recovering states, so queued messages could remain unspoken indefinitely.
Validation
xcodebuild -project SwiftBot.xcodeproj -scheme SwiftBot -configuration Debug build -quietxcodebuild -project SwiftBot.xcodeproj -scheme SwiftBot -configuration Debug test -only-testing:SwiftBotTests/VoiceRecoveryBackoffTests -quietCFBundleShortVersionString=1.22.6andCFBundleVersion=2026081718.The signed Sparkle appcast entry remains ShipHook-managed and is generated after the release artifact is published.