Replies: 9 comments 2 replies
|
@nokkies This report belongs to the same family as #5978 (over-strict v0 reads) — and yours adds the 291-descriptor quantitative evidence that #5978 lacked. I walked the rejection path line by line on the same baseline (5dda764); every claim checks out. Source confirmation
Family map (4 reports, one root cause)
The shared root cause: the set of payloads released writers actually produced ≠ the set the reader-side dispositions/switches accept. Descriptor v2 was the normal value every pre-#2663 (2026-08-24) release wrote, yet the reader only accepts 3 — while the field #2663 introduced is optional in the disposition, which shows the bump updated the writer and constants but never added reader-side compatibility. That is the same pattern as #6010/#6048 ( On the fix shape + one systemic suggestionYour fall-through (v2 and v3 run the same key/value checks; every other generation stays refused) is exactly the "widen the acceptance surface only" move adjacent-migration permits. Fail-closed guarantees zero data loss, but the "visible in the list, refuses to open" UX harm is real — all four reports in this family share it. This is the 4th alignment crack between released writers and the validator (#5978/#6010/#6045/#6048). Worth adding a release-gate step that replays each released writer's fixtures through the reader-side validator and refuses any new crack — a "released-writer inventory ↔ validator disposition" diff check. That lives in core (release scripts), not on a plugin-mountable seam; my session-audit plugin (@argszero/cordis-plugin-session-audit) flags log corruption (seq-gap/index-reuse), which is an adjacent but different layer from migration refusal. Hoping upstream picks up your branch; otherwise it is a strong archived upstream-fix candidate. |
|
Still present at The gates are untouched since this was filedThis was reported against One line, a version bump. Second store, independent of the 321 aboveA Windows deployment, 124 session logs, 884,317 event rows, every log at format
Every refusal is
The refused logs were all written between 2026-08-22 and 2026-08-30, which is No caller can relax it
The branch clears it, and does not relax the payloadApplying the two widenings from Strictness is unchanged. Against a real v0 header, varying only the descriptor:
An unlisted member is refused at generation 2 exactly as at generation 3, so One thing that is not a second casualtyWorth recording, since it was the other upgrade risk: the projection cache |
|
Thanks — the analysis holds on the installed build, and we can add a second, much smaller store. Independent measurement. Different store, this machine, not the 321 or 124 above. 52 We then ran the actual installed chain instead of pattern-matching. Feeding each log through Two additions. The refusal is genuinely side-effect-free. After the in-memory run, all three artifacts still carry their original bytes and mtimes, and no The v2→v3 source-kind whitelist is not what stops them, and it does not cover One caution for anyone scanning their own store: on ours the descriptor gate was not the only refusal. 10 of the 13 are This class is offline-detectable before anything is opened, which is why we're landing S12 in dsh-doctor: it reads the refusal rules out of the installed migration packages and reports affected logs up front — |
|
Title suggestion: |
|
Fifth store here, and a split that the previous four did not report. Store: 258 sessions (from 263 log files — see the edit note at the end), all written by
The split by session origin — the part the earlier stores did not report:
(255 of the 258 could be classified by header Two things follow from that split:
My store was written by Environment: session-format packages Edited: the count below was 263 log files — 258 of them are distinct sessions (two session directories had an extra Authorship note: measured and documented by me against my own store; root-cause tracing and drafting assisted by AI; verification and publication by me. I have no engineering background — if any technical claim reads wrong, please call it out; I will re-verify against the toolchain and correct. Reported by the OfferKuai Team — Founder: Zhaofeng (Yaming). Website: https://www.offerkuai.com/ | Contact: contact@offerkuai.com 中文版 / ZH这里是第五份独立样本,另外补一个此前四份都没报的维度。 样本:258 个会话(来自 263 个日志文件,见文末更正说明),全部由
按会话
(258 个中有 255 个能按 header 由此得到两点:
我这批样本由 环境:session-format 包 署名说明:样本由我在自己的会话库上实测并整理;根因追溯与起草借助 AI;复核与发布由我完成。我没有工程背景——如任何技术表述有误,请直接指出,我会对照工具链重新核验并更正。 本报告由 OfferKuai(Offer快)团队提交 —— 创始人:Zhaofeng(Yaming)。官网:https://www.offerkuai.com/ | 联系:contact@offerkuai.com 已更正:下面的数字原为 263 个日志文件,其中 258 个是唯一会话(两个会话目录下除 v0 的 |
|
Answering @marylyn326's question, plus one note on @yamingmou's origin split. Version 2 is a value the harness itself wrote — the gate is what is too strict. On the installed 0.1.5-rc.1 tree, On the origin split (@yamingmou): that is the sharpest statement of blast radius in this thread. We see the same mechanism from the other side — running the real chain over a 74-log store refuses 13, and the split is 3 by this descriptor gate, 10 by a different fail-closed rule ( This class is detectable before anything is opened. dsh-doctor 0.4.7 runs the installed migration chain in memory and lists the affected logs up front ( |
|
核实结论:完全属实,而且是四个同族报告(#5978/#6010/#6045/#6048)里量化证据最充分的一个。
你的修复方向(同时放宽 validation 门与 subagentDescriptorValue,其他代际仍拒绝、payload 规则不变)正确。(各 store 统计数字与「112 测试通过」未独立复测;moonquake2004 的 assertSource 行号比实际约差 17 行,实质结论无误。) |
|
Thanks for checking this against the source — two things you added that the opening post did not establish: the second gate hardcodes One line-number note: on the installed Agreed on the fix direction: relax both gates, keep other generations refused, and leave the payload rules untouched. |
|
Status check + impact data (2026-09-15)
We are staying on 0.1.1-rc.2 instead of rewriting session files until released v2 descriptors are accepted. |
Uh oh!
There was an error while loading. Please reload this page.
session-format-v0-to-v1refuses any v0subagent/descriptorwhoseversionis not 3.
SUBAGENT_DESCRIPTOR_VERSIONwas 2 until #2663 (merged 2026-08-24),so every release before that date wrote version 2 —
0.1.0-rc.7,0.1.0-rc.8,0.1.1-rc.1,0.1.1-rc.2. Anyone who used subagents on thosereleases has sessions that cannot be opened on
0.1.5-alpha.1.The shape of it is worse than the error suggests
It fails closed and leaves the artifact untouched, so nothing is lost. But a
listing reads only the header line, so the affected sessions still appear in
the session list with their titles, and refuse to open when clicked. Sessions
look present and are not.
Measured on one real store of 321 session logs:
subagent/descriptorThe refusal is the number, not the payload
#2663 bumped 2 to 3 and added exactly one field,
agentReasoningEffort. Thereleased-v0 disposition for this event requires
mode,version,providerand permits
label,agentProvider,agentModel,agentReasoningEffort,persona,toolFilter— soagentReasoningEffortis optional there, and aversion-2 payload is a valid version-3 payload by that same rule.
The code never gets that far. In
assertReleasedEventPayloadthe versioncomparison throws before
assertReleasedV0Keysruns, so the payload is neverchecked against the disposition that would accept it.
Every descriptor in that store, in five distinct key shapes:
agentModel,agentProvider,label,mode,provider,versionlabel,mode,provider,versionmode,provider,versionagentModel,agentProvider,label,mode,provider,versionlabel,mode,provider,versionSuggestion
Accept version 2 alongside 3 for a v0 source and let
assertReleasedV0Keysdothe work it already does. On this evidence that costs no strictness: every
real payload passes the same key check a version-3 descriptor gets, and the
one field the bump introduced is optional in the disposition either way.
If the intent is that version 2 carries some semantic the migration cannot
reconstruct, then the error should say which one, because from the payloads
the two generations are indistinguishable apart from an optional field.
A branch carrying that, based on
5dda764ed3, so it applies withgit am -3:https://github.com/nokkies/dsh-upstream-patches/tree/fix/subagent-descriptor-generation-2
Generation 2 falls through to the key and value checks instead of being
refused, in both the disposition gate and
subagentDescriptorValue. Everyother generation is still unknown and still refused, and the payload rules are
unchanged for both: an unlisted member, or an unpaired
agentProvider, isstill rejected at generation 2. Measured over those 291 descriptors: 9
accepted before, 291 after. The package suite passes at 112.
All reactions