docs(apps): time-box the progress-card legacy plan fallback to 2026-10-18 (#125643)

The stream:"plan" fallback on both native platforms is deliberate compatibility
debt with a fixed expiry, not a permanent contract. Record the sunset date, point
each platform at its twin and at the tracking issue, and correct the Android note
to v2026.8.x (the newest released tag also lacks progressCard.get).

Refs #125639
This commit is contained in:
Peter Steinberger
2026-08-17 23:38:55 -07:00
committed by GitHub
parent 540ea124e0
commit 561effac2e
2 changed files with 7 additions and 5 deletions
@@ -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
@@ -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"])