[Bug report] One persisted session with an unsupported event (demo/hello) can abort global reconciliation and make session search report storage unavailable #4811
Replies: 3 comments
|
Verified the reported blast radius end to end against alpha.1 ( The "unsupported at sequence 3" rejection is the persistence layer, not session-query's parser. The persisted-session load path hard-rejects legacy events with an exact-seq error: The blast radius is structural and unchanged in alpha.1:
So one bad artifact poisons the global index for every search call — the report's core claim is accurate. Two nuances worth recording for the fix direction:
Thanks for the precise env details — the |
|
The source review above confirms the throw chain. One operational distinction is worth keeping explicit: Before moving an artifact, join all four facts:
Keep the quarantine reversible and outside the active root; do not edit or delete the log. Record that search coverage is now partial. For an upstream fix, catching only I added the operator diagnosis, containment sequence, and regression gates to the independent custom-event compatibility runbook: https://github.com/sandbaseai/deepseek-harness-handbook/blob/main/docs/en/plugin-development/custom-session-events.md#one-incompatible-artifact-can-block-corpus-search |
|
Adding a consolidated, evidence-backed version of my earlier reply so the operational sequence and the claim boundaries are in one place. Thanks to both of you for the careful source review and operational guidance. The alpha.1 ( What we actually observed was lane-specific. Every session-search call we tested returned The containment decision joined the four facts you described:
The desktop supervisor then restored a backend child. A later live The quarantine remains reversible. Re-admission by a future compatible reader is a desirable compatibility property, but we have not tested it. At alpha.1, the static source shows that Thanks also for adding the diagnosis and containment sequence to the compatibility runbook. If useful, we can separately prepare a minimal synthetic reproduction or reviewed repro steps before sharing anything. |
Uh oh!
There was an error while loading. Please reload this page.
Summary
During this incident, all session-search calls we tested returned:
The loopback HTTP endpoint and other functions we checked remained responsive. The failing corpus contained two historical persisted-session artifacts; each was rejected by the installed runtime as unsupported on
demo/helloat sequence 3.This report documents the connection between the same unknown-event incompatibility reported in #3802 / #3416 and the global SQLite session-query reconciliation path. It does not claim first discovery of the underlying event incompatibility or of the general one-bad-artifact blast-radius pattern.
Environment and observed scope
@deepseek-ai/dsh-tool-session-query:0.1.0-rc.70.1.1-rc.20.1.1-rc.1Before containment,
PRAGMA quick_checkreturnedok, but the SQLite index held only 2 persisted-session rows while 33 persisted artifacts were present. The installed provider could inspect 31 of those 33 artifacts; exactly two threwSessionFormatUnsupportedErrorondemo/helloat sequence 3.These are incident observations from the installed mixed prerelease runtime. The source trace below is pinned to upstream HEAD at filing time; we are not claiming that the installed package bytes are identical to that commit.
Root-cause chain
At upstream HEAD
cd5ef8148158c3a752a658978873241fdf8e2bbc:SessionFormatUnsupportedError, distinct from corruption: coordinator.ts#L48-L64.assertEventsSupported()rejects an event type unknown to the build: coordinator.ts#L1132-L1152.inspect()without per-entry isolation. One throw aborts that observation pass and is wrapped asSESSION_QUERY_PERSISTENCE_FAILED: index.ts#L483-L531._reconcile()awaits the observation beforeBEGIN IMMEDIATE, so this failure precedes the index writes in that reconciliation transaction: index.ts#L395-L442.session history storage is unavailable: service-boundary.ts#L70-L73.The live incident contained two incompatible artifacts and both were contained together. The loop has no per-entry catch, so the code path shows that one inspected entry throwing is sufficient to abort the pass; we did not separately run a one-bad-artifact live test.
Impact
The failure prevents a search response from being produced from otherwise inspectable entries, and the generic message looks like a storage outage rather than a per-session format incompatibility.
Minimal local containment and result
We froze the SHA-256 values of the two failing artifacts, moved exactly those two session directories out of the active scan into a reversible quarantine, and verified unchanged hashes after the move. We did not delete either artifact or rewrite its contents.
The active artifact count changed only from 33 to 31. After containment, a live
session_searchreturned successfully in our environment.This is containment, not an upstream source fix.
Suggested behavior
Please keep interpretation fail-closed for the affected session, but do not fail the entire corpus. During reconciliation, catch only
SessionFormatUnsupportedErrorat the per-entry boundary; mark that entry incompatible, atomically exclude or tombstone any stale indexed rows for it, leave the artifact untouched, emit an actionable warning with its session/location, and continue with otherwise inspectable entries. The caller should receive an explicit partial/degraded indication rather than silently incomplete results. Other persistence errors should continue to fail normally, and unknown events should not be silently ignored.Separately, a formal registration or ignorable-event surface for out-of-repo event types (as discussed in #4204) could prevent this trigger for explicitly supported plugin events, but it would not replace per-entry isolation for other unsupported artifacts.
Claim boundaries
demo/hello.session_searchpath was retested after containment; we did not perform broader runtime regression testing or establish result completeness.Related reports
demo/helloincompatibility makes the affected session unreadable; this report focuses on its connection to session-query reconciliation.All reactions