Skip to content

sync(shared+ios): cherry-pick v2026.3.22 to Cat A cluster A3 — 7 files (#2584)#2597

Merged
alexey-pelykh merged 1 commit intomainfrom
sync/v2026.3.22-cluster-A3
Apr 26, 2026
Merged

sync(shared+ios): cherry-pick v2026.3.22 to Cat A cluster A3 — 7 files (#2584)#2597
alexey-pelykh merged 1 commit intomainfrom
sync/v2026.3.22-cluster-A3

Conversation

@alexey-pelykh
Copy link
Copy Markdown

Summary

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 the merged Wave 1 PR #2595 (A1 Android) and Wave 2 PR #2596 (A2 macOS).

Action Count Notes
CHERRY-PICK applied (rebrand transform → fork content changes) 7 git diff shows real content changes
CHERRY-PICK no-op (already in sync after rebrand transform) 2 ChatComposer.swift, GatewayNodeSession.swift
ALREADY-SYNCED reclassification (basename-search false-positive) 1 apps/ios/Tests/TalkConfigParsingTests.swift — see "Reclassification"
EXCLUDE-DIVERGENT (registered in hq/upstream/disposition.tsv) 0 None
Sub-total — issue scope 10 ✓ matches issue scope
Helper files imported (transitive deps) 2 See "Net-new helper imports"

Closes #2584.

Reclassification: ALREADY-SYNCED

The cluster TSV mapped fork's apps/ios/Tests/TalkConfigParsingTests.swift (via basename search) to upstream's apps/shared/OpenClawKit/Tests/OpenClawKitTests/TalkConfigParsingTests.swift (the shared-Kit variant). Polish detected this is a false-positive:

  • Fork's existing content is byte-identical to upstream's apps/ios/Tests/Logic/TalkConfigParsingTests.swift (the iOS-app variant) + rebrand transforms.
  • That upstream iOS-app variant is unchanged v2026.3.8 → v2026.3.22 (no cherry-pick needed).
  • The cluster TSV's basename-search heuristic produced a path collision between two distinct upstream variants (iOS-app silence-timeout tests vs shared-Kit provider-config tests).

Resolution: revert the cherry-pick attempt at apps/ios/Tests/TalkConfigParsingTests.swift, reclassify the row as ALREADY-SYNCED. The shared-Kit variant of these tests is already present in fork's orphan apps/shared/RemoteClawKit/Tests/OpenClawKitTests/TalkConfigParsingTests.swift (at v2026.3.22 + rebrand). Issue #2584's Notes flagged this exact risk; this PR resolves it.

The reclassification rate (1 of 10 = 10%) matches the 5–10% range the issue body anticipated. Audit-tooling enhancement to detect cross-variant basename collisions is tracked alongside the existing Cat A0 audit-improvement note.

Net-new helper imports

These are transitive dependencies for cluster cherry-picks (each one's compile depends on a symbol newly referenced by an upstream change):

File Used By Source
apps/shared/RemoteClawKit/Sources/RemoteClawChatUI/AssistantTextParser.swift ChatView.swift, ChatMessageViews.swift, AssistantTextParserTests.swift Refreshed from upstream — strict superset (adds includeThinking: parameter, visibleSegments(...), hasVisibleContent(in:includeThinking:)). Fork's prior version was rebrand-only (single rebrand: commit at #124).
apps/shared/RemoteClawKit/Sources/RemoteClawKit/GenericPasswordKeychainStore.swift GatewayTLSPinning.swift (UserDefaults → Keychain migration) Net-new import from upstream. Pure utility (Keychain wrapper), no fork-divergent specialization.

Mirrors Wave 2's PairingAlertSupport refresh + 15 helper-file imports pattern. Both helpers are byte-equivalent to upstream (no rebrand tokens needed in their bodies).

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_
    • Reverse-domain: ai.openclaw → org.remoteclaw, com.openclaw → org.remoteclaw
    • Repo URLs, domains, config paths, CLI/binary names, package scope
  3. Cross-class API audit detected 2 transitive symbol dependencies → 2 helper imports (1 refresh + 1 net-new).
  4. Polish review surfaced 1 reclassification (basename misclassification).

Cherry-pick file list

File Action
apps/shared/RemoteClawKit/Sources/RemoteClawChatUI/ChatMarkdownPreprocessor.swift CHERRY-PICK (envelope-stripping + message-id hint stripping)
apps/shared/RemoteClawKit/Sources/RemoteClawChatUI/ChatMessageViews.swift CHERRY-PICK (showsAssistantTrace plumbing)
apps/shared/RemoteClawKit/Sources/RemoteClawChatUI/ChatView.swift CHERRY-PICK (showsAssistantTrace parameter)
apps/shared/RemoteClawKit/Sources/RemoteClawKit/Capabilities.swift CHERRY-PICK (case browser)
apps/shared/RemoteClawKit/Sources/RemoteClawKit/GatewayTLSPinning.swift CHERRY-PICK (UserDefaults → Keychain migration)
apps/shared/RemoteClawKit/Tests/RemoteClawKitTests/AssistantTextParserTests.swift CHERRY-PICK (+2 tests for visibleSegments)
apps/shared/RemoteClawKit/Tests/RemoteClawKitTests/ChatMarkdownPreprocessorTests.swift CHERRY-PICK (+6 tests for envelope/messageId/markdown image)
apps/shared/RemoteClawKit/Sources/RemoteClawChatUI/ChatComposer.swift NOOP (already in sync after rebrand)
apps/shared/RemoteClawKit/Sources/RemoteClawKit/GatewayNodeSession.swift NOOP (already in sync after rebrand)
apps/ios/Tests/TalkConfigParsingTests.swift ALREADY-SYNCED (reclassified, see above)

Validation

Gate Result
pnpm format:check (oxfmt)
pnpm tsgo (TypeScript)
pnpm lint (oxlint)
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 MISS=0 → 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 PR #2595 and Wave 2 PR #2596.

Polish review

workflow-polish ran in fresh subprocess context (session cdca14ed-c46d-4540-b78d-77b5b53a46d3). Initial verdict 🟡 STALLED with 1 finding:

  • 🟡 F1 — Wrong upstream source for apps/ios/Tests/TalkConfigParsingTests.swift: Cluster TSV's basename-search heuristic false-positive mapped fork's iOS path to upstream's shared-Kit variant. Resolution: Option A (revert + reclassify ALREADY-SYNCED). Applied.

Other 9 files: all cherry-picks byte-identical to upstream + rebrand. AssistantTextParser refresh and GenericPasswordKeychainStore import correctly placed and consumed. No leakage, no orphans, no naming collisions.

Post-F1 resolution: effectively 🟢 CLEAN.

Test plan

  • pnpm check passes locally
  • Fork-integrity gates pass locally
  • Per-file inspection: 7 CHERRY-PICK + 2 NOOP + 1 ALREADY-SYNCED = 10 covered
  • Polish review: CLEAN (post-F1 resolution)
  • CI green (pending)

🤖 Generated with Claude Code

#2584)

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Process Cat A cluster A3 (Shared+iOS, 10 files) — cherry-pick for v2026.3.22 sync backlog

1 participant