Repository navigation
Integrate 35 reviewed PRs with four regression repairs - #2255
Merged
Merged
Conversation
A detected-prompt recording accepted before the call app was using audio (e.g. a calendar prompt accepted before joining) never armed #2206's call-end detection, so it fell back to the 5-minute silence timeout. Keep the candidate and bind it on a later activity snapshot. Log when detection arms. Rebased onto main (5b88bd5) after #2206 landed: the arm decision now lives in MeetingSessionController+CallEnd.swift so MeetingSessionController stays inside its file-size baseline, latestCallActivityAt no longer exists on main, and disableCallEndDetection keeps its restoringSilenceWarning parameter.
Mark Haines' fix remembers a detected-call candidate when the call app is not using audio yet, and binds it on a later snapshot. That rule lived inline in MeetingSessionController, which the fast-test runner does not compile, so nothing could pin it. Extract the gate into MeetingCallEndArming.lateBindingFamilies in the fast-tested MeetingEndDetectionPolicy.swift and cover it: the same-recording bind, unresolved and empty families, an already armed recording, a recording that has ended, and a replaced or absent candidate. The empty-set case matters — binding with no families would make every later snapshot look like an ended call. Main's MeetingSessionController.swift sits exactly on its 833-line baseline, so the arm decision moved into the +CallEnd extension; the call site behaves the same. Based on Mark Haines' fix in bc21cd3.
A late bind can happen at any point in a long recording, so output-only activity (a Teams chat chime during an unrelated recording) could arm detection and stop the recording 40 s later. Require the source app in the snapshot's input users, matching how browser calls already bind.
# Conflicts: # Sources/Meeting/MeetingSessionController+CallEnd.swift # docs/auto-call-detection-spec.md
docs-drift: check previous_filename on open PRs, scan from a cursor so deferred drift is revisited, dedupe drift issues. finding-responder: require a clean worktree. stale-prs: paginate all open PRs, skip waiting-on-human PRs for handoff comments. morning-triage: dedupe keys for non-Sentry problems, 24h filtered paginated Sentry query, backlog for problems past the cap. Fixes #2167
Each sparkle-update-smoke run now writes its launch report, app log and isolated home under <output>/runs/<runID>/<state>, so two overlapping runs on the same output can no longer delete or consume each other's report. Adds a test with two runs sharing one output. Fixes #2157
slots_busy now counts live slots only. Each serve pass deletes any ci-job clone (and its share folder) that no live slot owns, so a failed delete or a slot killed before its cleanup is retried and never blocks capacity. Fixes #2172
Import the signing cert with -T for codesign, productsign and security instead of -A, and relock the keychain after 3 hours. Make the MCP bundle workflow release-event only (drop workflow_dispatch). Add a test that a verdict stored for a closed PR is not inherited by a new PR on the same head commit. Docs updated. Part of #2201
MenuBarPopoverPresentation.show now returns whether it left the popover presented, and showMainPopover records the analytics event only then. A status click that dismisses a fallback-anchored popover, or a refused presentation, no longer counts as an open. Tests assert the return value. Part of #2163 (native full-screen check still needs a hands-on run)
…e runner maps In MAC_RUNNER_MODE=always, a paused heartbeat now sends new jobs to hosted runners instead of queuing them behind a Mac the owner asked to leave alone. Runner maps in swift-ci.yml, the sweep workflow, scripts/README.md and docs/repo-layout.md now list app-build. The one-time reroute on the first install after this lands is documented as accepted. Fixes #2170
Load the real 1.1.69 UserDefaults for default keys, reset-to-defaults, and Fn plus a custom Hands-Free key. After migrate, both keys must still be in the event-tap snapshot. Co-authored-by: Justin Betker <tz427gsydr@privaterelay.appleid.com>
The tests read maxSessionAge from production, so a wrong constant still passed. They now use a literal 86,400 s and assert the constant equals it. Fixes #2164
…tive clauses Audio confirmations (I can hear you, I can see your screen) count as small talk, so their weak 'i can' cue no longer creates action items. Decision and action classification now uses the clauses left after courtesy phrases are dropped, so a discarded closer's cue can't steal a real action. Fixes #2151
Also lists AudioDeviceRecovery, which the map was missing too. Fixes #2138
When the caller is cancelled and the operation swallows its own cancellation and returns a value, both race watchers became ready at once and either could win. The cancellation handler now marks the race itself, and any result reported afterwards is replaced with CancellationError. Adds a test whose operation returns a fallback on cancel. Fixes #2149
Adds MeetingSessionStateMachine.stripMenuOffersDiscard, which makeStripMenu now calls, and a suite that drives it with overlay and session state inputs. The post-confirm recheck is already covered through discardRecordingIfConfirmed. Fixes #2166
Strip inline YAML comments outside quotes before comparing scalars, unquote
elements of inline lists, and parse flow-style mappings (env: { A: 1 }) so a
skip variable cannot hide in one. An unreadable flow mapping leaves an
!unparsed marker and the launch-smoke skip check fails closed on it.
Fixes #2142
1.1.70's one-key migrate dropped Fn for default-key users, dropped Hands-Free for reset-to-defaults users, and dropped a custom toggle when Fn was stored. Persist both 1.1.69 keys, register a distinct stored Hands-Free binding, and tag dictation events with categorical hold/toggle ids plus the existing local-build channel. Co-authored-by: Justin Betker <tz427gsydr@privaterelay.appleid.com>
The depends_on parser split at the first colon, so a cask line like depends_on arch::arm64 (a NameError in Ruby) still passed the release contract. Require label: :symbol syntax and add a test covering valid and malformed lines. Fixes #2143
Add scripts/dev/check-window-inventory.py with .agents/window-inventory.json: every NSWindow/NSPanel surface in Sources/ must be listed with a screen-sharing policy and set sharingType to match. Wired into the test matrix and linux checks. Move the detector-to-island prompt wiring out of TranscriptedApp into DetectedMeetingPromptWiring so a fast test can drive the real detector hook and pill controller, and add tests for show, gating, and each answer callback. Fixes #2132
Re-fetch the head right before the hold comment and label, and skip if it moved since the snapshot. Only exempt an out-of-lane baseline when at least one count is lower or one entry is dropped, so reformatted or reordered copies of the same values no longer qualify. Fixes #2130
…loor The floor was the lowest matching line of the typed text, so a wrapped field line with an OCR error in the middle fell below it and could be read as the newest turn. Group matching lines that stack closely above the lowest match and floor at the cluster's top edge. Quoted copies far above still stay out of the cluster. Fixes #2160
Add the missing audit points (now clock, onShortcut, currentDate and analyticsEnabled), recommend @mainactor @sendable for UI and monitor callbacks, note the Binding needs separate handling, and say which Sources trees the census covers. The --shrink item was already fixed on main. Fixes #2126
The compose floor now extends upward through lines that sit flush against the field cluster and are contained in the field text, so a short first line like 'ok' is cut with the rest of the wrapped field. Higher quoted echoes with real spacing still stay above the cut. Fixes #2174
Add the synced-copies self-test and check to Swift CI's checks job (which runs on push to main) and to the full local tier. Fixes #2136
…es back to digital zeros The watch ended on the first buffer with signal and was never armed again, so a tap that switched to exact zeros mid-call lost the other side for the rest of the recording with no rebuild and no warning. A small signal tracker now re-arms the existing watch after 5 s of zeros following signal, at most 3 times per recording. The existing flow then rebuilds once while another app plays and reports the tap as not hearing playback. containsSignal moves next to the watch to keep the capture file under its size baseline. Fixes #1916
A Tab mid-chain was held without checking the live caret, so moving the caret into earlier text while the chained request was pending swallowed the key. The hold now also requires the caret to be at the growing edge; otherwise the accept attempt cancels the stale chain and the host gets the Tab. Fixes #2147
Check native isolation and running Transcripted before staging and each launch. Preserve blocked checks as SKIP, report preflight errors as FAIL, and cover direct and verifier entrypoints with inert tools. Fixes #2256.
This was referenced Oct 18, 2026
r3dbars
marked this pull request as ready for review
October 18, 2026 00:24
This was referenced Oct 18, 2026
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.
Scope
Owner-authorized integration of 35 reviewed, non-draft PRs, with four independently reviewed regression fixes. Original heads are preserved as ancestors; no squashing away their review history. Drafts #2214 and #2215 are deliberately excluded per Justin's explicit choice to keep their live-test gates open.
Original PRs: #2210 #2212 #2216 #2217 #2218 #2219 #2220 #2221 #2222 #2223 #2224 #2225 #2226 #2227 #2228 #2229 #2230 #2231 #2232 #2233 #2234 #2235 #2236 #2237 #2238 #2239 #2240 #2241 #2242 #2243 #2244 #2245 #2246 #2247 #2248.
Repairs: #2252 (summary action/decision preservation, fixes #2249), #2253 (custom primary shortcut preservation, fixes #2251), #2254 (Sparkle smoke containment, fixes #2250), #2257 (native account/owner-app isolation before speed verification, fixes #2256). Each repair has a separately reviewed PR and permanent behavior regressions.
Deep review and integration
Current validation
Final candidate
75488fbb728dd5a5b1d374291f8a4d12a93d89ea, base86f4ce9724f96241c9fa9789ed33617653d95f0e. All 35 original non-draft and four repair heads are preserved as ancestors.Frozen parent
90c9bd9bf22fd5f058b8c656682a540861c042b3: all 64 runnable mapped checks PASS, source stable and clean, including real app build, 48,889 fast assertions, integration/E2E/synthetic paste-back, Core (617 XCTest with one skip plus 1,086 Swift Testing cases), CLI/MCP/QA package tests, Linux guard suite and strict-concurrency census (69 warnings vs baseline78, no increase). The report is honestly BLOCKED only for its literal packaging username placeholder; that gate is being run separately as an explicit local headless non-notarized dry run, not silently marked PASS.The final delta is exactly the independently reviewed six-file isolation patch (stable patch-id
6e870a54676ddae6bd803257b94f14a62891faf9). Final exact-head mapped-delta proof: 14 runnable PASS, clean/stable source, one orchestration SKIP. Fresh full QA/build: PASS, 15 checks completed with one warnings-only local artifact row (1,379 artifact checks passed; eight existing files lack optionalcapture_qualitymetadata; zero artifact failures). Final fast suite: 48,889/48,889 assertions. Safe verification: synthetic paste PASS; speed SKIP because the owner's app is running, with nothing quit.Local thin/headless non-notarized packaging: PASS. Packaged metadata: 29 checks PASS, three WARN (native UI, first-run, and log scan were not run); exit 3 / INCOMPLETE is preserved, not relabeled PASS. The thin artifact checks package assembly, not default bundled-model or shipping-installer proof; the original placeholder report remains preserved as BLOCKED. Exact-head CI is now green: repo hygiene, checks, package tests, app build, required build-and-test, and concurrency census all SUCCESS; optional native/release workflows are SKIPPED, not counted as PASS. Native UI/import/hardware/performance and signed upgrade remain unverified, never PASS. No public release is authorized or claimed.
Remaining owner gates
After green gates and merge, verify every included original and repair PR is actually merged, close only fully resolved issues with evidence, and re-inventory the remaining queues.