Meetings: verified build-ready defects after the 15 October map
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 12/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- macos, swift
- Domain
- audio-video-rtc, desktop, documentation
Research direction
Start with section 6 of docs/research/2026-10-15-meetings-category.md, which holds the reproduction and fix sketch for each row. Good entry points are MeetingModels.swift:58 (the Safari catalogue entry) and MeetingAudio.swift:1009 (the route watchdog). The issue is a tracker of about 40 defects across many subsystems, so pick one row and confirm it on the Mac build. Done means each row is fixed and passes native acceptance on the installed Preview.
Written by the indexing model from the issue text.
Description
Verified, build-ready defects in the meeting capability, from the 15 October map in docs/research/2026-10-15-meetings-category.md (section 6). Each was claimed by a subsystem reader and kept only when two independent skeptics (correctness and reachability) both found it real at the train head 88c5e67. #374 built the ones not listed here; this issue holds the rest for the next build-ready pass. Every row names its owner and line; the record holds the reproduction and the fix sketch for each. Grammar for all of them: Quality, unless marked.
| Severity | Area | Defect | Where | Cost |
|---|---|---|---|---|
| P2 | detection-admission | Safari calls are never offered: the catalogue's Safari entry cannot match the WebKit audio process | MeetingModels.swift:58 |
M |
| P2 | handoff-followup | Copy instructions route can never return a result: Home says "no result yet" forever and loses Prepare follow-up… | HandoffJobs.swift:843 |
M |
| P2 | recognition-live | Live-completed two-source meetings never drop microphone echoes; on laptop speakers the other side's words are saved as You | LiveVoiceSession.swift:68 |
M |
| P2 | recognition-live | Snapshots publish at ≥10 Hz and every publish rebuilds and remeasures the whole transcript on the main thread | LiveVoiceService.swift:232 |
M |
| P3 | audio-capture | Hitting the two-hour ceiling (or an overlap stop) also reports 'could not be written and are missing' for the rejected packet | MeetingAudio.swift:273 |
S |
| P3 | audio-capture | FaceTime, Phone and Safari picker entries tap a bundle whose call/media audio plays in a service the tap excludes | MeetingModels.swift:55 |
S |
| P3 | detection-admission | Snooze, Not now and Change source suppress offers invisibly; switching detection off and on does not clear a snooze | MeetingDetection.swift:152 |
S |
| P3 | detection-admission | A running app reads as 'no longer available' when its representative process changes | MeetingDetection.swift:121 |
M |
| P3 | detection-admission | Source caption asserts headphone voices are recorded; the written unverified-app caution is dead code | MeetingWorkspaceView.swift:275 |
S |
| P3 | detection-admission | 'Finish when call audio ends' caption says only microphone-only recordings finish manually; any unrecognised app never auto-finishes | MeetingDetection.swift:105 |
S |
| P3 | detection-admission | A stale metadata error is re-raised every 3 s as the page's problem, replacing other problems, until a successful refresh | MeetingModel.swift:720 |
S |
| P3 | handoff-followup | Prepare follow-up… → Start task loops on an error when the meeting's earlier follow-up failed, was stopped or was interrupted | HandoffJobs.swift:792 |
S |
| P3 | handoff-followup | A long meeting hits the 100,000-character connected limit with a message that cannot be followed for one transcript | HandoffRunReadiness.swift:47 |
M |
| P3 | lifecycle-recovery-storage | "Free about 500 MB" promises a safe meeting; two PCM tracks exhaust that budget in roughly half an hour | MeetingModels.swift:306 |
S |
| P3 | lifecycle-recovery-storage | After History commits but the final .committed journal write fails, Meetings says saving could not finish and offers Transcribe again |
MeetingRecovery.swift:267 |
S |
| P3 | lifecycle-recovery-storage | Automatic finish saves the meeting with no note that Workbench ended it | MeetingModel.swift:668 |
S |
| P3 | lifecycle-recovery-storage | The two-hour cut arrives with no warning and counts paused and reconnecting time | MeetingModel.swift:651 |
M |
| P3 | recognition-live | A continuous speaker is split into a new 'You:' paragraph at every pause over 0.8 s, in the live view and the saved transcript | LiveVoiceSession.swift:71 |
S |
| P3 | recognition-live | Batch echo drop uses symmetric Jaccard, so a short microphone fragment inside a long remote utterance is never dropped | MeetingConversation.swift:121 |
S |
| P3 | recognition-live | Format-2 'original wording' zips both speakers' words together by start time | LiveVoiceSession.swift:56 |
S |
| P3 | ui-surfaces | Keep recording is not offered on the menu-bar panel or Home during the auto-finish countdown | MeetingWorkspaceView.swift:9 |
S |
| P3 | ui-surfaces | Panel and Home row read 'Meetings · finishing' with 'Stop processing' while a meeting is starting | MeetingWorkspaceView.swift:11 |
S |
| P3 | ui-surfaces | Live transcript labels every turn 'You' (or 'Others') for single-source recordings; the saved text has no labels | MeetingWorkspaceView.swift:143 |
S |
| P3 | ui-surfaces | History row and Review transcript claim 'Original recording' from the transcript's purpose alone; Review recording then fails | CaptureHistoryView.swift:93 |
S |
| P3 | ui-surfaces | The proactive offer panel is pointer-only: not announced, no keyboard focus, no Escape | MeetingWorkspaceView.swift:426 |
M |
| P3 | ui-surfaces | No warning before the two-hour limit on any surface; the meeting ends itself | MeetingModel.swift:651 |
S |
| P4 | docs-site-registry | Registry omits the meeting page's Sound Settings… opener while registering Dictate's | surfaces.json:294 |
S |
| P4 | docs-site-registry | README never mentions Meetings | README.md:10 |
S |
| P4 | lifecycle-recovery-storage | Derived segment WAVs are never removed after a meeting commits | MeetingRecovery.swift:266 |
S |
| P4 | lifecycle-recovery-storage | Every recovery refresh fully inspects every session, including reading and decoding each committed meeting's live journal twice | MeetingRecovery.swift:31 |
S |
| P4 | recognition-live | Details receipt says 'Apple Intelligence' even when both Apple Intelligence calls failed or timed out | LocalDetailSuggestions.swift:44 |
S |
| P4 | ui-surfaces | Menu-bar panel shows two 'Finish meeting' controls: the Dictate row relabels itself and the Meetings row repeats it | WorkbenchControlTool.swift:201 |
S |
| P4 | ui-surfaces | Outside the window a meeting has no elapsed time: the pill hint, chooser row and panel row omit it | FloatingToolbar.swift:211 |
S |
| P4 | ui-surfaces | New recording… leaves the previous meeting's full transcript on the page under Start recording | MeetingWorkspaceView.swift:141 |
S |
| P4 | ui-surfaces | Home's Current work meeting row lacks the red record symbol, elapsed time and row style the other recordings use | WorkbenchHome.swift:726 |
S |
| P4 | ui-surfaces | Recording review says 'Finish the current capture or reading' although Read is retired | MeetingRecordingReview.swift:232 |
S |
Found between the subsystems by the completeness critic
- P2 The route watchdog ends a recording whose chosen app stops delivering buffers, pre-empting the guarded Finish and tearing the microphone down every 2 s meanwhile (
MeetingAudio.swift:1009). checkRoutes begins recovery when any recorder has had no buffer for 12 s (recorders.contains(where: { ($0.secondsSinceLastBuffer ?? .infinity) > 12 }), MeetingAudio.swift:1009-1012;secondsSinceLastBufferis nil until a first buffer, 444-447). beginRecovery bumps the generation, marks a discontinuity on BOTH tracks and calls restoreRoutes (956-963), which runs disconnectRoutes (stops the AVAud - P3 A long two-track meeting on the batch path silently loses its You/Others labels past 2,000 utterances on one track (
MeetingConversation.swift:53). writeUtterances throws once a track yields 2,000 utterances (guard files.count < maximumUtterances else { throw … }, MeetingConversation.swift:31, 53-55); utterances split on 0.6 s of silence (29), so a talkative speaker reaches the cap in roughly two hours. separatedConversation catches every error and returns nil (MeetingRecovery.swift:314-335), and run() then saves `text: conversation ?? text
Order of value, from the record: a real call app leaving a call while Workbench records settles the route-watchdog-versus-guarded-Finish question before any of its fixes; then the handoff P2 (Copy instructions never returns a result to Home), the live echo drop, the 10 Hz snapshot rebuild, the Safari offer, and the two-hour cut with no warning. Everything here stays open until native acceptance on the installed Preview.
Refs #280
- Dominant language
- Swift
- Stars
- 0
- Forks
- 1
- Avg merge
- 8h 16m
- Merged PRs (30d)
- 210
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Ship-Work/workbench
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
Maintainers usually reply within 1 day
-
documentation good first issue help wanted
Difficulty 2/5 Half a day Newbie friendliness 74/100
Ship-Work/workbench#29 · 1 comment ·
Maintainers usually reply within 1 day
-
Codebase: remove routes, buttons and members nothing reaches, and the checks that still assert themOpen
Difficulty 4/5 3-5 days Newbie friendliness 22/100
Maintainers usually reply within 1 day
All issues in Ship-Work/workbench
Similar issues
-
swift.md: `Date(myString, strategy: .iso8601)` example omits `try` — the initializer is throwingOpen
Difficulty 1/5 Under an hour Newbie friendliness 88/100
-
core: RAC_LLM_OPTIONS_DEFAULT.min_p disagrees with the IDL's annotated defaultPossibly taken A pull request linked to this issue is open or already merged. Openbug core p3
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
RunanywhereAI/runanywhere-sdks#1083 ·
Maintainers usually reply within 5 days
-
area: docs eco: swift good first issue help wanted lane: free-agent roadmap size: XS type: docs
Difficulty 1/5 Under an hour Newbie friendliness 62/100
arminazimi/evergreen#441 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
nightscout/nightguard#368 ·