Skip to content

swift: parity with upstream aacefcd7e9..a908a7ac87 - #403

Merged
Bl4ckBl1zZ merged 13 commits into
mainfrom
swift/parity-2026-10-11
Oct 11, 2026
Merged

Bl4ckBl1zZ merged 13 commits into
mainfrom
swift/parity-2026-10-11

Conversation

@Bl4ckBl1zZ

Copy link
Copy Markdown
Owner

Brings the native iOS app (apps/swift-ios) up to the user-visible behavior that sync: upstream aacefcd7e9..a908a7ac87 (122 commits) (#402) added on web and Expo. One commit per feature.

Verification: xcodebuild build-for-testing (scheme T3Code, Debug, generic/platform=iOS Simulator, Xcode-beta, CODE_SIGNING_ALLOWED=NO) compiles the app and the T3CodeTests target at every commit. generate-swift-contract-fixtures.ts --check is up to date. Tests were not run locally (no simulator runs in this pass); the Native iOS CI job runs them.

Implemented

  • a7223f3969 Restart continuations read "Sent by T3 Code". Agent-sent messages whose creationSource is server are attributed to T3 Code (no sender link), not to "another agent".
  • 8c777fbfad Stop a Claude subagent without stopping its owner. Stop on a live Claude-native subagent sends subagent.stop to the owning thread. The gate matches web's canStopSubagent: Claude driver, a native task handle with an id, and a live task. T3-owned subagents still stop by interrupting their child thread.
  • c572cb71d2 Subagent rows follow the child's live work. A resumed follow-up shows as running again, and a rolled-back child shows as interrupted.
  • 477282263a Messages sent during worktree setup queue behind it instead of steering while the thread is preparing or starting.
  • c727d1219f Compact-first follows Claude's real prompt cache TTL. It uses the newest usage report and the optional promptCacheTtlMs, with the 70-minute rule as the fallback for older servers.
  • 0be20c86c2 + 716357cbba Usage limits. Accounts are keyed by email plus the optional workspaceId, so one email in two workspaces is two accounts. A report without a workspace joins its email's only workspace. Codex windows pool by kind. Antigravity's new quota groups stay together, Gemini first.
  • 9b40d37463 + c3243f0508 PR actions and edits follow the host. List quick actions offer only what the host reports (older servers keep GitHub's set). Per-item canEdit, editChangeRequest and canResolve win where present; canResolve can only narrow.
  • ec43786140 A reply that finished before a steer replaced it isn't folded away as partial. The fold reads "Cut off by a steer".
  • 1cfd1c1a44 Toggling a fold at the bottom keeps you at the bottom. iOS had the same bug.
  • a908a7ac87 Search finds threads by their branch PR (#n, owner/repo#n, or URL).
  • 72fbad7b1a A new project's first thread starts in its folder, not a worktree, when the server-wide default is worktree.
  • 0f36a11769 Diff line counts use one formatter with digit grouping everywhere.
  • 2a4ee33982 Settings → Microphone. Rank wired, Bluetooth, built-in and CarPlay mics, plus remembered devices. Recording picks the first connected one.

Tests added: MicrophonePriorityTests, ThreadTimelineStructureTests, DailyUXSidebarTests, DailyUXNewTaskTests, ThreadRelationshipRowsTests, ComposerRequestsParityTests, ClaudeResumeCompactionTests, UsageLimitsMergeTests, PullRequestQuickActionTests, PullRequestEditingTests.

Skipped

  • 02612c2856 (image-only task): already works on iOS.
  • d404a30118 (iPad pairing QR): a React Native sheet remount bug; iOS has its own scanner.
  • 57b3780770 (browser picture in picture): iOS has no browser preview stream.
  • a1dee8b2b3, a2f4c7fb7c (usage reset icon, working pill bulge): the defects don't exist on iOS.
  • 91474e56f6 (question auto-advance): iOS has no delay timer and re-checks the question before advancing.
  • a70ee2a7a0 (Resume model): iOS has no manual-continuation Resume.
  • 29e09df979, 0ecb25a8d4, d02e292610: web dialog and selection layout fixes. iOS uses a system alert, a full-screen viewer, and per-row selection.
  • 477282263a auto-branch expectedEmpty: iOS only picks a branch at thread creation, never as an automatic default on an existing thread.
  • a4c8745abe (publish new projects to GitLab): iOS has no "new project from a name" flow.
  • a8bdfdb541 (Claude 5 task lists), subagent modelSelection, and oom_kill failures: already rendered correctly.
  • run.delegatedTaskId, Pi usage history: no iOS screen reads them. Providers decode as strings, so nothing breaks.
  • 0442f5bfcc (filesystem.getMetadata file icons): would need a client metadata cache for little phone benefit.
  • 6c13016394 (thread links wait for a live shell): iOS already holds a thread request until the thread arrives.
  • 7b09ac7e00 ("OpenCode Zen" label): iOS shows the sub-provider alone, so there's no duplication.
  • Host-only or desktop-only: OpenTelemetry export settings, right-panel tab drag and maximize, keyboard shortcuts, Windows/macOS signing and packaging, annotation styles, settings width tweaks.

Decision log

  • No capability gate on subagent Stop: the sync added none for subagent.stop, and web gates only on the subagent's fields. An older server rejects the command and the existing "Couldn't Stop Subagent" alert shows.
  • New wire fields decode as optional with nil defaults (promptCacheTtlMs, workspaceId, PR permissions, host actions, subagent runId/nativeTaskRef), so older servers behave as before.
  • Bluetooth mics are preferred by default: recording now enables Bluetooth HFP so headsets can be listed. A connected headset wins unless the user reorders, matching mobile's default order. The order is stored on the device.
  • Setup-queue check reads the thread shell's status, which mirrors the run's state during a live run.
  • Branch name: swift/parity-2026-10-11.

Follow-ups (issues are disabled on this repo, so they are tracked here)

  1. Against a real server, check Claude-native subagent Stop, Antigravity limit grouping, and workspace-split accounts.
  2. On a device, check that AirPods and CarPlay mics appear in Settings → Microphone.
  3. Web search rows show the matched PR number as a colored #n label; iOS rows only show PR status.
  4. If the server adds a capability flag for subagent.stop, gate Stop on it.

🤖 Generated with Claude Code

github-actions Bot and others added 13 commits October 11, 2026 07:31
…eam aacefcd7e9..a908a7ac87)

Ports upstream 2a4ee33982. Settings → Microphone ranks microphone kinds
(wired, Bluetooth, built-in, CarPlay) and wired/Bluetooth devices remembered
by name after dictating with them. Voice capture now lists Bluetooth HFP
inputs and routes the session to the first connected entry before the
engine resolves its input format.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ial (parity with upstream aacefcd7e9..a908a7ac87)

Ports upstream ec43786140. A superseded attempt whose last output is an
assistant reply that completed before the steer stamped the attempt's
completedAt stays in the timeline instead of folding as partial output, and
a turn fold keeps that reply visible. The fold row now reads "Cut off by a
steer". Decodes the run attempt's existing completedAt field.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…with upstream aacefcd7e9..a908a7ac87)

Ports upstream 1cfd1c1a44. Expanding or collapsing a turn or superseded-
attempt fold while reading the end of the transcript now keeps the end in
view instead of anchoring the first visible row and leaving the reader
stranded above the latest message. Toggles made higher up still hold the
visible rows in place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…acefcd7e9..a908a7ac87)

Ports upstream a908a7ac87. Home search now matches the pull request the
thread's branch has open (#number, owner/repo#number, URL) alongside
explicitly linked ones, so a thread is found by its PR before anyone links
it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…arity with upstream aacefcd7e9..a908a7ac87)

Ports upstream 72fbad7b1a. New Task now decodes the server config's existing
newProjectsRoot and, for a project directly inside it that has no thread
yet, defaults to the project checkout instead of a new worktree even when
the server's default is worktree. Only that default changes; a mode the user
picks or a restored draft still wins.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… upstream aacefcd7e9..a908a7ac87)

Ports upstream 0f36a11769. Diff counts in work rows, review, source control,
checkpoints, PR rows, thread details, and the activity inspector all format
through DiffCount.format, so 83065 reads 83,065 everywhere. Before, SwiftUI
grouped digits in Text literals but verbatim labels and built strings showed
raw numbers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…stream aacefcd7e9..a908a7ac87)

Ports upstream a7223f3969. An agent-authored prompt whose creationSource is
"server" (a restart continuation T3 Code sends itself) now reads "Sent by
T3 Code" with no sender link, instead of "Sent by another agent". Older
servers never send the field, so their messages render as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h upstream aacefcd7e9..a908a7ac87)

Ports upstream 8c777fbfad. A Claude-native subagent whose projection row
carries a strong native task handle and a run id now offers Stop while its
task is live; Stop sends subagent.stop {threadId, runId, subagentId} to the
owning thread instead of interrupting the child thread, so the owner's run
keeps working. T3-owned subagents still stop by interrupting their child.
Decodes the subagent's existing runId and nativeTaskRef fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… upstream aacefcd7e9..a908a7ac87)

Ports upstream c572cb71d2. A subagent edge now takes the child thread's
status while it has a live run, or once its shell names a latest run of its
own (a follow-up the parent sent after the delegated task settled), and a
rolled-back child reads as interrupted. Without either, the task's status
still speaks for the child, as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…th upstream aacefcd7e9..a908a7ac87)

Ports the client half of upstream 477282263a. While the thread's live shell
is preparing or starting, a follow-up goes out as a queue_after_active
dispatch, even when the composer would steer, so the server can hold it if
the setup ends without a worktree. The expectedEmpty branch guard has no iOS
counterpart: iOS never writes an automatic branch default to an existing
thread.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ith upstream aacefcd7e9..a908a7ac87)

Ports upstream c727d1219f. The context window reads the newest live usage
report by updatedAt rather than the last provider turn in snapshot order,
and the compact-before-send offer uses the report's optional
promptCacheTtlMs (1h or 5m) instead of the fixed 70-minute idle time, which
stays the fallback for older servers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ws (parity with upstream aacefcd7e9..a908a7ac87)

Ports upstream 0be20c86c2 and the client half of 716357cbba. Limit accounts
are keyed by email plus the optional auth/source workspaceId, so one email
in two workspaces counts as two accounts; a report without a workspace joins
the only workspace known for its email, and stays separate when there are
several. Codex windows pool by kind, since its ids are slots. Antigravity
accounts list each model group's windows together, Gemini first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… upstream aacefcd7e9..a908a7ac87)

Ports upstream 9b40d37463 and c3243f0508. Pull request list rows offer only
the quick actions their host summary reports in the optional
PullRequestProviderSummary.actions; servers without it keep GitHub's old
set. A host's per-item answers now win where present: canEdit on comments
and thread comments, editChangeRequest for the title and description, and a
thread's canResolve, which can only narrow the repository-wide resolve
permission.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Oct 11, 2026
@Bl4ckBl1zZ
Bl4ckBl1zZ merged commit 1e79d2a into main Oct 11, 2026
10 checks passed
@Bl4ckBl1zZ
Bl4ckBl1zZ deleted the swift/parity-2026-10-11 branch October 11, 2026 05:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant