sync(macos): cherry-pick v2026.3.22 to Cat A cluster A2 — 31 files (#2583)#2596
Merged
alexey-pelykh merged 1 commit intomainfrom Apr 26, 2026
Merged
sync(macos): cherry-pick v2026.3.22 to Cat A cluster A2 — 31 files (#2583)#2596alexey-pelykh merged 1 commit intomainfrom
alexey-pelykh merged 1 commit intomainfrom
Conversation
…2583) Process Cat A cluster A2 of the v2026.3.22 upstream sync backlog: 35 fork files under apps/macos/ requiring per-file disposition. Disposition outcome: | Action | Count | |--------|------:| | CHERRY-PICK applied (rebrand transform → fork content changes) | 27 | | EXCLUDE-DIVERGENT (registered in hq/upstream/disposition.tsv) | 4 | | Total | 31 issue-listed | | Helper files imported (net-new upstream additions referenced by cluster cherry-picks) | 15 | | PairingAlertSupport refresh (refactored upstream — fork's older version replaced) | 1 | Issue body listed 31 CHERRY-PICK + 4 EXCLUDE-DIVERGENT = 35. After per-file inspection, all 4 of the 4 EXCLUDE-DIVERGENT entries were pre-classified by triage and were not reclassified (rate: 0% reclassification — within the 5-10% the issue body anticipated). The 27/31 CHERRY-PICK count reflects upstream content that genuinely diverges; the remaining 4 of 31 were NOOP (fork already in sync after rebrand transform). EXCLUDE-DIVERGENT classifications (all 4): - apps/macos/Sources/OpenClaw/ContextUsageBar.swift - apps/macos/Sources/OpenClaw/SessionMenuLabelView.swift - apps/macos/Sources/OpenClaw/SessionsSettings.swift - apps/macos/Sources/OpenClaw/UsageMenuLabelView.swift All four trace to fork commit f7e9156 — gut(session): remove vestigial contextTokens config and display denominator (#2277). Upstream still references the gutted contextTokens symbols. Approach: 1. Read upstream@v2026.3.22 content via `git show v2026.3.22:{path}`. 2. Apply token-based rebrand transforms per hq/upstream/rebrand-tokens.tsv — `OpenClaw → RemoteClaw`, `openclaw → remoteclaw`, `OPENCLAW → REMOTECLAW`, `OPENCLAW_ → REMOTECLAW_`, `ai.openclaw → org.remoteclaw`, `com.openclaw → org.remoteclaw`, `~/.openclaw → ~/.remoteclaw`, `.openclaw → .remoteclaw`, `openclaw-mac → remoteclaw-mac`, `@openclaw/ → @remoteclaw/`, `github.com/openclaw/openclaw → github.com/remoteclaw/remoteclaw`, `openclaw/openclaw → remoteclaw/remoteclaw`, `openclaw.io|openclaw.ai → remoteclaw.com`. 3. Cross-class API audit detected upstream extracted helper logic into 13 net-new Swift files (PlatformLabelFormatter, SettingsRefreshButton, GatewayPushSubscription, JSONObjectExtractionSupport, TextSummarySupport, SimpleTaskSupport, TrackingAreaSupport, MicRefreshSupport, AgentWorkspaceConfig, SystemSettingsURLSupport, PermissionMonitoringSupport, VoiceOverlayTextFormatting, VoiceWakeRecognitionDebugSupport) plus 1 in RemoteClawMacCLI (CLIArgParsingSupport) and 1 in shared kit (CaptureRateLimits). All 15 imported with rebrand transforms applied — they're net-new upstream additions referenced by cluster cherry-picks (not in audit's rebrand-below-threshold cluster lists because audit only flagged renames, not additions). 4. PairingAlertSupport.swift was refactored upstream — fork's older 46-line version is replaced with upstream's 277-line refactor (with rebrand transforms applied) so cherry-picked NodePairingApprovalPrompter compiles. Fork's prior content (PairingAlertHostWindow, endActiveAlert, requireAlertHostWindow) is preserved verbatim by upstream's superset. Notes: - PeekabooBridgeHostCoordinator cherry-pick adds compatibility code that creates symlinks for upstream's pre-rebrand brand directory names (clawdbot, clawdis, moltbot). For fresh fork users these are no-op ghost directories. Polish reviewer agreed this is acceptable as literal upstream-parity (fork users have no pre-rebrand state per CLAUDE.md "User state boundary"). Optional follow-up: gate symlink creation behind fileExists check. - Fork CI does not build macOS (per CLAUDE.md). Local Xcode build and swift test NOT verified — same caveat as merged Wave 1 PR #2595. Closes #2583. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 tasks
alexey-pelykh
added a commit
that referenced
this pull request
Apr 26, 2026
#2584) (#2597) Process Cat A cluster A3 of the v2026.3.22 upstream sync backlog: 10 fork files under apps/shared/RemoteClawKit/ and apps/ios/Tests/. Mirrors merged Wave 1 PR #2595 (A1 Android) and Wave 2 PR #2596 (A2 macOS). Per-file dispositions: - 7 CHERRY-PICK applied: ChatMarkdownPreprocessor.swift, ChatMessageViews.swift, ChatView.swift, Capabilities.swift, GatewayTLSPinning.swift, AssistantTextParserTests.swift, ChatMarkdownPreprocessorTests.swift - 2 NOOP (already-synced after rebrand transform): ChatComposer.swift, GatewayNodeSession.swift - 1 ALREADY-SYNCED reclassification: apps/ios/Tests/TalkConfigParsingTests.swift — cluster TSV's basename-search heuristic false-positive mapped fork's iOS path to upstream's shared-Kit variant; fork's existing content was already byte- identical to upstream apps/ios/Tests/Logic/TalkConfigParsingTests.swift + rebrand (and that upstream file is unchanged v2026.3.8 → v2026.3.22). No fork code change needed for this row. Discovered by polish. 0 EXCLUDE-DIVERGENT classifications (issue body anticipated 5–10%). Net-new helper imports (2 files, transitive deps for cluster cherry-picks): - AssistantTextParser.swift refresh — strict superset of fork's prior version, adds includeThinking parameter and visibleSegments helper. Fork's prior version had only a single rebrand: commit at #124. Required by the new ChatView/ChatMessageViews/AssistantTextParserTests cherry-picks. - GenericPasswordKeychainStore.swift net-new import — pure utility, no fork- divergent specialization. Required by the new GatewayTLSPinning cherry-pick (UserDefaults → Keychain migration). Mirrors Wave 2's 16 helper imports (15 net-new + PairingAlertSupport refresh). Validation: - pnpm format:check ✓ - pnpm tsgo ✓ - pnpm lint ✓ - pnpm lint:tmp:no-random-messaging ✓ - pnpm lint:no-remoteclaw-ai ✓ - pnpm lint:ui:no-css-class-drift ✓ - bash scripts/ci/check-rebrand-leakage.sh --staged ✓ - node scripts/check-no-zombie-imports.mjs ✓ - node scripts/check-stub-debt.mjs ✓ (126 == baseline) - node scripts/check-throwing-stub-callers.mjs ✓ (0 stubs) - node scripts/check-obsolescence-audit.mjs ✓ (49 == baseline) Bulk verification: re-running cherry-pick script post-execution → WROTE=0 NOOP=9 → A3 residual = 0. Note: Fork CI does not build Swift targets (per CLAUDE.md). Local Xcode/SPM build NOT verified — same caveat as merged Wave 1 (#2595) and Wave 2 (#2596). Polish review: workflow-polish ran in fresh subprocess context (session cdca14ed-c46d-4540-b78d-77b5b53a46d3). Initial verdict 🟡 STALLED with finding F1 (TalkConfigParsingTests basename misclassification). After applying F1 Option A (revert + reclassify ALREADY-SYNCED), effectively 🟢 CLEAN with no remaining findings. Closes #2584. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced Apr 27, 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.
Summary
Process Cat A cluster A2 of the v2026.3.22 upstream sync backlog: 35 fork files under
apps/macos/requiring per-file disposition. Mirrors the approach of merged Wave 1 PR #2595 (A1 Android cluster).git diffshows real content changesCanvasWindowController.swift,GatewayDiscoverySelectionSupport.swift,NodeServiceManager.swift,GatewayDiscoveryModel.swifthq/upstream/disposition.tsv)Closes #2583.
EXCLUDE-DIVERGENT classifications
ContextUsageBar.swiftSessionMenuLabelView.swiftSessionsSettings.swiftUsageMenuLabelView.swiftAll four were pre-classified by triage. Per-file inspection confirmed the classifications; 0 reclassifications during execution (vs Wave 1's 2 reclassifications). Issue body anticipated 5–10% — actual: 0%.
Net-new helper files (15)
These are upstream-side additions referenced by the cluster's cherry-picked files but not present in fork. Adding them is necessary for the cherry-picks to compile. Each is a one-shot import (with rebrand transforms applied) — no fork-divergent specialization. None are in the Cat A audit clusters because the audit only flagged "rebrand-below-threshold renames" (paths with content drift), not net-new additions.
In
apps/macos/Sources/RemoteClaw/:PlatformLabelFormatter.swift— extracted by upstream from inlineparsePlatform/prettyPlatforminInstancesSettings.swiftandNodePairingApprovalPrompter.swift.SettingsRefreshButton.swift— extracted by upstream from inline refresh-button logic inInstancesSettings.swift.GatewayPushSubscription.swift— used byCronJobsStore.swift,InstancesStore.swift.JSONObjectExtractionSupport.swift— used byGatewayLaunchAgentManager.swift.TextSummarySupport.swift— used byGatewayLaunchAgentManager.swift.SimpleTaskSupport.swift— used byInstancesStore.swift,NodesStore.swift,VoiceWakeGlobalSettingsSync.swift.TrackingAreaSupport.swift— used byMenuBar.swift.MicRefreshSupport.swift— used byMenuContentView.swift,VoiceWakeSettings.swift.AgentWorkspaceConfig.swift— used byOnboardingView+Workspace.swift.SystemSettingsURLSupport.swift— used byPermissionManager.swift.PermissionMonitoringSupport.swift— used bySettingsRootView.swift.VoiceOverlayTextFormatting.swift— used byVoicePushToTalk.swift,VoiceWakeRuntime.swift.VoiceWakeRecognitionDebugSupport.swift— used byVoiceWakeRuntime.swift,VoiceWakeTester.swift.In
apps/macos/Sources/RemoteClawMacCLI/:14.
CLIArgParsingSupport.swift— used byConnectCommand.swift.In
apps/shared/RemoteClawKit/Sources/RemoteClawKit/:15.
CaptureRateLimits.swift— used byScreenRecordService.swift.PairingAlertSupport refresh
The fork's
PairingAlertSupport.swift(46 lines) is older than upstream's refactored version (277 lines). Upstream introducedPairingAlertState,PairingResolution,PairingResolvedEvent, plus methods (approveRequest,presentPairingAlert,rejectRequest,startPairingPushTask,stopPairingPrompter,endActiveAlert(state:)overload) referenced by cherry-pickedNodePairingApprovalPrompter.swift.Upstream's version is a strict superset — fork's prior content (
PairingAlertHostWindow,endActiveAlert(activeAlert:activeRequestId:),requireAlertHostWindow) is preserved verbatim. Replacing fork's version with upstream's (with rebrand transforms applied) is necessary for the cluster cherry-pick to compile. No fork specialization is lost (git log apps/macos/Sources/RemoteClaw/PairingAlertSupport.swiftshows fork only had a rebrand commit on this file).Approach
git show v2026.3.22:{path}.hq/upstream/rebrand-tokens.tsv:OpenClaw → RemoteClaw,openclaw → remoteclaw,OPENCLAW → REMOTECLAW,OPENCLAW_ → REMOTECLAW_ai.openclaw → org.remoteclaw,com.openclaw → org.remoteclawgithub.com/openclaw/openclaw → github.com/remoteclaw/remoteclaw,openclaw/openclaw → remoteclaw/remoteclawopenclaw.io → remoteclaw.com,openclaw.ai → remoteclaw.com~/.openclaw → ~/.remoteclaw,.openclaw → .remoteclawopenclaw-mac → remoteclaw-mac,@openclaw/ → @remoteclaw/Disposition.tsv updates
Four
EXTRACTentries added at/Users/alexey-pelykh/RemoteClaw/hq/upstream/disposition.tsv(HQ companion, not in repo):Validation
pnpm format:check(oxfmt)pnpm tsgo(TypeScript)pnpm lint(oxlint)pnpm lint:tmp:no-random-messagingpnpm lint:no-remoteclaw-aipnpm lint:ui:no-css-class-driftbash scripts/ci/check-rebrand-leakage.sh --stagednode scripts/check-no-zombie-imports.mjsnode scripts/check-stub-debt.mjsnode scripts/check-throwing-stub-callers.mjsnode scripts/check-obsolescence-audit.mjsBulk verification: re-running cherry-pick script post-execution →
WROTE=0 NOOP=31 SKIP=4→ A2 residual = 0.Note: Fork CI does not build macOS (per
CLAUDE.md). Local Xcode build NOT verified — same caveat as merged Wave 1 PR #2595.Polish review
workflow-polishran in fresh subprocess context (session0647e3ea-8b4c-463f-b66e-29a64cb6782a). Verdict: 🟢 CLEAN ENOUGH — no actionable findings. One informational note:PeekabooBridgeHostCoordinator.swiftcherry-pick adds compatibility code creating symlinks for upstream's pre-rebrand brand directory names (clawdbot,clawdis,moltbot). For fresh fork users these are no-op ghost directories. Reviewer agreed this is acceptable as literal upstream-parity (per CLAUDE.md "User state boundary": fork users have no pre-rebrand state to migrate). Optional follow-up if desired: gate symlink creation behindfileExistscheck. Not required for this PR.Test plan
pnpm checkpasses locally🤖 Generated with Claude Code