Repository navigation
fix(home): queued recordings show Transcribing instead of Couldn't transcribe, and Try Again no longer runs the summary model on a recording with no transcript - #25426
Merged
Git-on-my-level merged 3 commits intoNov 15, 2026
Conversation
…sing Use immutable first seal admission for the bounded display wait. Guard pending capture reprocess before any summary claim, and render expired zero-content placeholders as read-only noise. Include a dry-run-first bounded repair for legacy queued audio without seal clocks. Failure-Class: FC-queue-sla-presented-as-terminal-failure Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
…ll age bound before reading as noise Review R23: a buffered first frame sets server_batch_audio_received before any span commits and can still commit at teardown, so a 3-hour-old live row could be hidden. Unclosed received audio now waits out the 24 h transcription age bound, a transcription deadline still in the future always keeps the row live, and the shared read mask carries the open-audio evidence. Test isolation: pin summary_delivery so a fresh handler load does not re-register its counters. Failure-Class: FC-queue-sla-presented-as-terminal-failure Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…red transcription read fields Failure-Class: FC-queue-sla-presented-as-terminal-failure Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What users saw
Needs attention showed Couldn't transcribe for queued audio. Try Again ran the summary processor without a transcript, spun for a long time and returned to retry. First seal could arrive more than 24 hours after the wait began. Expired zero-content capture placeholders also appeared as failures.
What changes
Existing queued rows and bounded one-off
Already-stamped queued rows use the new bound immediately. A ro-prod metadata-only dry-run found four legacy retained-audio retry rows lacking seal/admission clocks. The lead can first run:
The tool defaults to dry-run. A separately authorized operator apply writes only home_transcription_queue_observed_at once after rechecking source and ready/retry retained-audio jobs in a transaction. It never fabricates a seal time, changes original pending generations, jobs, custody, or admission metrics. The scan processes at most1000 owner rows and32 jobs/row, using one extra sentinel row/header at each limit to refuse overflow; transactional checks reread only state metadata. Writes are capped by --max-updates (at most20). Every repeated invocation retains the first observation. At most two display renewals per stored capture: first seal once and the legacy observation once. Five still-record_pending shapes are ineligible and await a real seal. No one-off was applied by this lane.
Kill switches and rollback
All new behavior ships ON by default with config/refactor_modes default_on parsing. Set an individual switch false to restore that behavior's prior decision:
Existing queue-hold and Home-step switches retain their roles. No new default-off gate, GPU change, capacity change, provider switch, or provider-backlog release. No new model path or paid attempt; pending retries avoid summary calls. HOME_TRANSCRIPTION_MAX_AGE_SECONDS remains86400 and HOME_TRANSCRIPTION_DEADLINE_SECONDS remains7200. No serving-time or transcription-throughput promise.
INV-CAP-1: no audio/recording deletion, producer-fence relaxation or seal-proof change.
INV-DATA-1: account/data-plane identity stays pinned; the optional repair tool is owner-scoped and prints counts only.
Verification
On head aa4b733:
Source-checked the released1563 and main decoder/provider contract; HTTP wire and no-model regressions pass. No app file changed.
UI-Evidence: none -- backend only
Not verified: physical phone/cache rendering, exact-head GitHub CI, production rollout/identity, one-off apply, real Firestore contention or transcription scheduling/speed/recovery. No push, PR, merge, deploy or production mutation by this lane. The fix does not drain the backlog.
Failure-Class: FC-queue-sla-presented-as-terminal-failure
Line-Count-Exception: backend/routers/conversations.py | 2702 -> 2713 | The reprocess owner checks pending capture evidence before claiming existing summary work; all policy stays in the small shared helper.
Line-Count-Exception: backend/utils/episodes/home_read.py | 573 -> 578 | Shared evidence fields and a presentation-only empty-placeholder guard stay at the existing projector boundary.
🤖 Generated with Claude Code