Skip to content

Integrate 35 reviewed PRs with four regression repairs - #2255

Merged
r3dbars merged 113 commits into
mainfrom
integration/pr-sweep-20261017
Oct 18, 2026
Merged

r3dbars merged 113 commits into
mainfrom
integration/pr-sweep-20261017

Conversation

@r3dbars

@r3dbars r3dbars commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

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

  • Independent complete-diff review across audio/reliability, app/Writing/UI and tooling/release guards. Exact original heads all had applicable CI green and no unresolved review threads at inventory time.
  • Four real findings were filed as issues and repaired before this integration can merge. Production-helper, package or inert script red/green proofs reproduced each defect; an independent reviewer rechecked each repair.
  • Manual integration preserves both Core owner-document additions, both CI/runner changes, and both wrapped-compose-floor fixes. One extra behavior test requires the short-line and misread-line fixes together, not just separately.
  • No baseline increase or gate weakening. Existing app, real saved data, permissions and running services were not changed during verification.

Current validation

Final candidate 75488fbb728dd5a5b1d374291f8a4d12a93d89ea, base 86f4ce9724f96241c9fa9789ed33617653d95f0e. 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 optional capture_quality metadata; 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.

markhaines and others added 30 commits October 15, 2026 21:47
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
@r3dbars r3dbars added the needs owner review Owner must review before merge label Oct 17, 2026
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs owner review Owner must review before merge risk:high

Projects

None yet

3 participants