diff --git a/apps/android/app/src/main/java/ai/openclaw/app/chat/ChatController.kt b/apps/android/app/src/main/java/ai/openclaw/app/chat/ChatController.kt index 3b46fa2324e8..bbeefd5c7330 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/chat/ChatController.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/chat/ChatController.kt @@ -5885,9 +5885,10 @@ class ChatController internal constructor( } } "plan" -> { - // Released Gateways through v2026.7.x only emit stream:"plan" and lack progressCard.get. - // Remove this fallback with the Gateway's legacy dual-emit once the minimum supported - // Gateway ships the store (tracked follow-up). + // Released Gateways through v2026.8.x only emit stream:"plan" and lack progressCard.get. + // SUNSET 2026-10-18: this fallback is a fixed cutover window, not a permanent contract. + // On that date delete it together with the Gateway's legacy stream:"plan" dual-emit and + // the Apple twin in ChatViewModel+TransportEvents.swift. Tracked: #125639. if (gatewayAdvertisesProgressCard() != false) return val planData = data ?: return if (planData["phase"].asStringOrNull() != "update") return diff --git a/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatViewModel+TransportEvents.swift b/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatViewModel+TransportEvents.swift index 75a128703f5b..7d084b31033f 100644 --- a/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatViewModel+TransportEvents.swift +++ b/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatViewModel+TransportEvents.swift @@ -650,8 +650,9 @@ extension OpenClawChatViewModel { case "plan": // Released Gateways through v2026.8.x lack progressCard.get and only emit stream:"plan". // Rendering these only when the store is known-absent keeps a dual-emitting Gateway from - // fighting the durable card. Remove with the Gateway's legacy dual-emit once the minimum - // supported Gateway ships the store. + // fighting the durable card. SUNSET 2026-10-18: this fallback is a fixed cutover window, + // not a permanent contract. On that date delete it together with the Gateway's legacy + // stream:"plan" dual-emit and the Android twin in ChatController.kt. Tracked: #125639. guard self.progressCardStoreAvailable == false else { return } guard evt.data["phase"]?.value as? String == "update" else { return } let steps = Self.parseLegacyProgressCardSteps(evt.data["steps"])