Replies: 1 comment
|
The source confirms an important physical-format boundary here: The safest immediate operational recovery is containment: stop all writers, copy and hash the complete session directory, move only the identified session out of the active root, then verify that healthy sessions reappear. Keep repair work on a disposable copy. A future list-path fix should isolate each artifact, return healthy headers, and report the degraded session id/path without leaking message content. Regression gates should include: one malformed artifact cannot hide healthy sessions; a single-frame header+body artifact is identified precisely; the original remains untouched; and a repaired copy is accepted by the exact producing-version reader before replacement. I documented this as one of three distinct history failures here: https://sandbaseai.github.io/deepseek-harness-handbook/session-history-recovery.html Disclosure: independent SandBase community handbook, not official DeepSeek documentation. |
Uh oh!
There was an error while loading. Please reload this page.
Environment
@deepseek-ai/dshv0.1.0-rc.7deepseek-ai/deepseek-harness(apps/cli)v26.3.0dsh web→http://127.0.0.1:3080Summary
When one session log file has an invalid Zstandard framing (e.g. the whole
JSONL is stored in a single zstd frame instead of the required "header-only
first frame"), the
session.listRPC fails with a blanket error and the entiresidebar session list renders empty — every other healthy session disappears
too, with no indication of which file is at fault.
This is the second time I've hit it (first on 2026-08-18, then again on
2026-08-19), so it is a recurring issue, not a one-off.
Steps to reproduce
Have a workspace with multiple sessions (e.g. 16 sessions under one
workspace).
Recompress one of its
session.jsonl.zstdfiles as a single frame, e.g.:zstd -dc bad/session.jsonl.zstd | zstd -f -o bad/session.jsonl.zstd.rebuilt mv bad/session.jsonl.zstd.rebuilt bad/session.jsonl.zstd(This produces one zstd frame containing the header line plus all event
lines, instead of a dedicated first frame holding exactly the header line.)
Open the Web GUI, refresh, and select the workspace.
Actual behavior
session.listreturns:The sidebar shows the workspace group but zero session titles underneath
it.
workspace.liststill returns the correctsessionIds(because it doesnot read log bodies), so the IDs are there but no titles ever render.
No error is surfaced in the UI and no
console.erroris emitted — the listis just silently empty.
Expected behavior
the remaining sessions still render, instead of failing the whole list.
file/path, so the user can find and repair it.
Root cause
In
@deepseek-ai/dsh-session-persistence-jsonl, the JSONL artifact is amulti-frame zstd container:
ending in a single
\n):plaintext.indexOf(10) === plaintext.length - 1(
assertZstdHeaderFrame), andchecksum (
{ params: { [ZSTD_c_checksumFlag]: 1 } }).The
session.listpath scans all artifacts and throws on the first bad one,so a single single-frame file aborts the whole listing (fail-fast, non-isolated).
Suggested fixes
header-read error, log a warning that names the file, and continue with the
other sessions (return them; optionally expose the broken ones as a
degraded/corruptset for the UI to show).artifact is immediately locatable.
instead of a silently empty list.
Manual repair (what worked for me)
Decompress the single-frame file, re-encode with the header in its own frame and
the events in a following frame, then write back:
After this repair,
session.listreturnedok: trueand the sidebar renderedall 16 sessions again.
Related
This appears related to a previously-noted upstream issue where a
recover/replay flow appends mis-sequenced
agent/inbox/splicedmessages using astale seq cursor (observed 2026-08-18). If a fix uses
zstd -f(single-frame)during repair it produces exactly this header-frame corruption.
All reactions