Repository navigation
Replies: 10 comments
你定位到的是有意设计的拒绝规则——所以修法在产出方,而在错误信息1. 规则本身
function source(message) {
const value = message['source']
if (!isSessionFormatJsonObject(value) || typeof value['kind'] !== 'string'
|| value['kind'].length === 0 || value['kind'] === 'plugin') {
throw new SessionFormatError('format v4 message requires a producer-owned source kind') // :10
}
}同文件首行注释:"Native source admission preserves unknown attribution and refuses retired plugin wrappers." ⇒ 也就是说:v4 明确拒绝 2. 因此"该改哪一边"是清楚的
建议把诉求写成:
3.
|
|
补两条和「产出方修」并列的事实,给以后遇到同样报错的人省一步。 1. 槽位对
所以「注入的消息没带 producer-owned 来源」不一定只是少个 2. 读盘有两道闸门,别只对一道:关系折叠的 3. 已经存在盘上的这种行,现在能被报出来了:我们这边加了 判定不是抄讨论:测试直接对发布包的两道闸门跑十组槽位×变体,断言「我们报 ⟺ 它们拒」,另外本机真实库里 4 条会话读数不变(没有误报)。 |
|
Confirmed and acted on — thank you for pinning the exact rule ( One update on the gotcha: we scanned the three affected sessions for persisted bad rows and found zero — every Your suggested diagnostic improvement (include row RU: Подтверждаем и уже отработали — спасибо, что указали точное правило ( По gotcha: просканировали три затронутые сессии на persisted-плохие строки — их ноль, все Ваше предложение по диагностике (включить row
|
|
Thanks for the measurement — the per-slot RU: Спасибо за замер — по-слотовая таблица
|
先说一条:我上一轮给的规则引用是不完整的——
|
|
@PerryLink 三条核对:一条收窄你的第 2 点,一条改正我自己的数字,一条回答你的第 3 点。 1. 改写表只活在 v3→v4 迁移里;读盘路径没有改写这一步所以「先改写、后校验」和「
直接驱动那个导出函数实测(用 rc.2 的包;它与桌面 ⇒ 兜底 2. 你第 2 点建议收窄:槽位差异不是
|
|
Thanks for the correction, both of you — that closes the loop precisely. The Appreciate the depth — this is a better-asked question than we started with. RU: Спасибо за коррекцию обоим — это закрывает картину точно. Таблица Спасибо за глубину — вопрос в итоге сформулирован лучше, чем был в начале.
|
|
@xiaoshenming 的三条我核过了,其中两条是对我的更正 —— 先说清我错在哪,再补两个稳定锚点。 1. 我的第 2 点是错的我上一条说"那张按槽位/角色的表正对应 2. 补上源码锚点(你给的是构建产物行号,且你自己提醒了不要跨版本套)在
配套测试同文: 这样引用就不必依赖任何一版的 bundle 行号了 —— 也正好呼应你那条提醒。 3. 表的大小我数错了我写「26 个名字」,不对。 4. 「两条路」我也确认了,我上一条的措辞不够准
5. 版本口径更新我上一条写"我核的是当前 其余部分( |
|
A follow-up question from our side, while we prepare the injector fix for production:
Context: we're re-enabling a third-party skill router with the RU: Дополнительный вопрос от нас, пока готовим фикс инжектора к продакшену:
Контекст: перевключаем сторонний skill-роутер с фиксом
|
|
@aavainer 第 1 点我用发布包实测了一遍,可以给你确定答案;第 2 点不是我们能答的。 1.
|
| kind | 结果 |
|---|---|
plugin:skill-router |
通过 |
plugin:(空后缀) |
通过 |
skill-router(裸名) |
通过 |
model / tool |
通过(该槽位不检查"语义") |
plugin(字面量) |
拒 requires a producer-owned source kind |
"" |
拒 同上 |
也就是说:准入本身不要求任何后缀。
(b) 但"和官方迁移产物一致"要求 plugin:<name> —— 这是你真正该对齐的东西。官方 v3→v4 stage 用 producerKind(plugin, role) 改写 {kind:"plugin",plugin:X},实测该函数对任意名字的输出:
skill-router -> plugin:skill-router
dsh-skill-router -> plugin:dsh-skill-router
my-injector -> plugin:my-injector
dsh-automation -> plugin:dsh-automation
compact -> compact-checkpoint (改名表)
goal -> goal (同名表)
@deepseek-ai/dsh-system-prompt -> runtime-context (改名表)
结论:<name> 不需要匹配任何表;只要你的插件名不在 RENAMED_PRODUCERS / RELEASED_SAME_NAME_PRODUCERS 里(skill-router 不在),写 plugin:<你的插件名> 就是官方转换器会写出的同一个值。用裸名或 plugin: 虽然当下能过准入,但和官方产物不一致 —— 以后任何按 kind 归类的逻辑都会把你的行归错。
顺带一个和你们注入器直接相关的点:写侧就已经拒了。{kind:"plugin"} 在 encodeCurrentEvent 落盘前就抛,所以那种行永远不会出现在日志里(这也是你们"零坏行、回滚救回"的原因);而 plugin:<name> 一路到底 —— 写入、读盘、迁移三处都认。
2. 原生 whenToUse 自动注入
这个我们答不了 —— 我们只量了格式闸门和磁盘工件,没有 DSH 产品路线图的信息。按 ref 说:我们量的是 0.1.7-rc.2 与桌面内置的 0.2.0-rc.2;#8909 的可见性问题请让官方来答。
(另:PerryLink 在 10-10 补的源码锚点 —— packages/core/session/src/index.ts:332 的 assertMessageEventShape,:362/:368/:376 三条 —— 比我们引的 bundle 行号更耐用,我这边认可,并按他说的改成按 ref 引用。)
Uh oh!
There was an error while loading. Please reload this page.
DSH version: 0.2.0 (Windows).
Symptom
Sessions fall into an orphaned turn (a
turn/startis written, an inbox splice removes the message, but no step follows). The deeper, shared error behind it is:Root cause (found)
A third-party skill auto-injection plugin inserted
<skill_content>into the conversation without a producer-ownedsource.kind. The v4 message format rejects such a message, and the session drops instead of continuing.Facts
spawn teammate(identical "requires a producer-owned source kind" error).What this raises
source.kind? The plugin that triggered this was unaware of it.The earlier framing ("message lost between inbox-splice and turn-processing") was wrong — that was a downstream symptom of the v4 violation, not the cause.
RU:
[Bug] Сообщение, инжектированное без producer-owned
source.kind, нарушает формат v4 и роняет сессииВерсия DSH: 0.2.0 (Windows).
Симптом
Сессии падают в осиротевший ход (записан
turn/start, inbox-splice вынимает сообщение, но шаг не начинается). Более глубокая общая ошибка за этим:Найденный корень
Сторонний плагин авто-инъекции скилов вставлял
<skill_content>в диалог без producer-ownedsource.kind. Формат v4 такое сообщение отклоняет, и сессия падает вместо продолжения.Факты
spawn teammate(идентичная ошибка «requires a producer-owned source kind»).Что это поднимает
source.kind? Плагин-триггер об этом не знал.Прежняя формулировка («сообщение теряется между inbox-splice и обработкой хода») была неверной — это был вторичный симптом v4-нарушения, а не причина.
All reactions