$ the-wire · showcase
Sessions stop persisting media caption placeholder
By RepoJournal · Filed · About OpenClaw
OpenClaw no longer saves the literal caption placeholder into transcripts for media-only user turns, cleaning up visible subtitles across clients.
Session transcripts previously stored the literal "[User sent media without caption]" as message content for media-only turns, so every client displayed model-facing scaffolding as a visible subtitle under the image [1]. The fix persists bare content and injects the placeholder only at the single LLM-boundary stamping site, matching per-message timestamps [1]. This removes the placeholder from stored transcripts and confines it to where the model should see it.
Gateway operators behind identity-aware proxies can skip the manual `openclaw devices approve` step for new Control UI/WebChat browser devices. The new `gateway.auth.trustedProxy.deviceAutoApprove` option auto-approves pairing only for new (unpaired) operator devices on connections that already passed trusted-proxy auth [2]. On the WhatsApp channel, a fix for LID-based sender identities ensures ack reactions render in group threads because the original sender participant is now resolved from the inbound identity [3]. Tlon channel add in non-interactive mode now validates the ship URL against the runtime-owned `validateUrbitBaseUrl` contract before writing config, rejecting unusable URLs that previously caused runtime startup failure [4].
"Chat conversations are now threads"; the web wording sweep was mirrored across native chat labels, generated string inventories, and locale catalogs, so Control UI and native Android/iOS/macOS surfaces use consistent terminology [5].
On the Windows Node side, gateway client shutdown is now reported as a cancellation instead of a timeout that never happened, covering chat sends, exec-approval resolves, and the setup wizard [6][7][9]. A race between graceful WebSocket close and active sends no longer triggers a spurious shutdown warning [7]. Tests and docs harden the `NodeConnector.ForwardIfCurrent` dispatch-under-lock invariant with no production behavior change [8]. Finally, `ChatMarkdownAstBuilder` list parsing went from O(n²) to O(n): a 40k-item flat list dropped from about 5.5s to a linear scan, preventing crafted list-heavy messages from stalling the chat UI [10].
Action items
- → Pull the session transcript fix before next deploy to stop caption placeholders persisting into transcripts openclaw/openclaw [plan]
- → Review gateway.auth.trustedProxy.deviceAutoApprove if you run behind an identity-aware proxy openclaw/openclaw [monitor]
- → Upgrade openclaw-windows-node to include the markdown O(n) parsing fix and shutdown cancellation fixes openclaw/openclaw-windows-node [plan]
References
- [1] fix(sessions): stop persisting media-only caption placeholder into transcripts (#111204) ↗ openclaw/openclaw
- [2] feat(gateway): auto-approve trusted-proxy browser device pairing (#111189) ↗ openclaw/openclaw
- [3] fix(whatsapp): keep LID ack reaction participants ↗ openclaw/openclaw
- [4] fix(tlon): reject unusable setup URLs ↗ openclaw/openclaw
- [5] fix(apps): call chat sessions threads ↗ openclaw/openclaw
- [6] fix: report gateway shutdown as a cancellation instead of chat/approval timeouts ↗ openclaw/openclaw-windows-node
- [7] fix: avoid disconnect warnings during active WebSocket sends ↗ openclaw/openclaw-windows-node
- [8] test+doc: harden ForwardIfCurrent dispatch-under-lock invariant (#1010) ↗ openclaw/openclaw-windows-node
- [9] fix: wizard shutdown no longer reports a timeout ↗ openclaw/openclaw-windows-node
- [10] perf(markdown): make list parsing O(n) (was O(n²)) (#1025) ↗ openclaw/openclaw-windows-node