August 26, 2026 · v0.17.5 · webui · postmortem

Two routes built the same payload, and only one of them signed

An image opened from the file tree reported that it could not be served from the current workspace. A list of callers is what missed the second caller.


The file preview was text by construction. A NUL byte in the first 4 KiB was a 415 in the payload and in the availability probe, so a .png the agent had just written never became a clickable chip: the reader was not told the file existed.

A signed route serves those bytes now, and the type comes from the bytes rather than the file name. Images and PDFs go inline, everything else downloads.

Then the tree reported that it could not serve the image at all.

Two callers, one of them patched

Two routes build a preview payload. The chat’s route signs the asset URL. The explorer’s route reuses the same payload builder with its own scope, and did not — so it answered kind: "image" with no URL, and the panel said what it was told.

One function does it now, called by both. And the test scans ws_http.py for the call sites rather than listing them, because a list is what missed the second one. That is the second time this month: the socket-group fix had a test named test_every_executor_socket_applies_it that named three files, and the fetcher and the MCP host were not among them.


← Blog