@lmzhen/dsh-evolution-state-json 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/index.js +105 -3
  2. package/package.json +5 -5
package/lib/index.js CHANGED
@@ -41,7 +41,7 @@ async function transactIo(io, path, task) {
41
41
  * changes semantically: the bundle digest is the fail-closed signal for
42
42
  * review workers, so a stale id across deployments must be distinguishable.
43
43
  */
44
- const PROMPT_BUNDLE_ID = "dsh-evolution@9";
44
+ const PROMPT_BUNDLE_ID = "dsh-evolution@10";
45
45
  const MEMORY_REVIEW_PROMPT = `[Auto-review — Memory]
46
46
  Review the conversation above and consider saving to memory if appropriate.
47
47
 
@@ -201,6 +201,107 @@ Follow the skills review policy: be ACTIVE, prefer class-level umbrellas, patch
201
201
 
202
202
  Do NOT modify output files or re-run the task. If you are still mid-task, ignore this.`;
203
203
  /**
204
+ * Maintenance-subagent persona (design 011 §6). Constants pin the persona
205
+ * with `{signal:id}` placeholders; the renderer substitutes names from the
206
+ * drift-signals module (single vocabulary). The model-facing contract is the
207
+ * persona + the mechanical-facts block; the signature head lets the model
208
+ * compare the two heads (011 mismatch protocol).
209
+ */
210
+ const MAINTAIN_PROMPT = `<<<MAINTAIN_PROMPT v={bundle_version} sig={joint_signature}>>>
211
+
212
+ ## 角色
213
+ 你是技能库维护审查代理,只读:你没有任何写工具。基于机械事实块与本文规则,识别
214
+ 域漂移与层漂移,输出结构化维护计划。你只输出计划,从不执行;执行由用户命令与审批完成。
215
+
216
+ ## 1. 输入契约(最高优先级,冲突时以此为准)
217
+ 机械事实块 <<<MECHANICAL_FACTS v={signals_version} sig={joint_signature}>>>(下方,
218
+ 以 <<<END FACTS>>> 闭合)是唯一证据来源;每条信号的名字、阈值、verdict 与本文规则引用一一对应。
219
+ - verdict 语义(枚举,不可引申):pass=未越阈(含低于阈值);over=越阈;unknown=脚本未检测。
220
+ - over 不是违规裁决:它只描述 "事实相对阈值的位置";是否构成漂移只由 §3 对应条款的
221
+ 语义判断给出。没有条款对应的事实,不产生建议。
222
+ - unknown ≠ pass:未检测 ≠ 健康;引用 unknown 信号的条目必须 needs_human:true。
223
+ - 事实只读:不改写、不补写缺失信号、不把事实 "翻译" 成裁决。
224
+ - 版本失配:若两处 sig 不一致(或任一缺失),禁止输出计划——只输出 MISMATCH + 两侧
225
+ 版本号 + 停止。
226
+
227
+ ## 2. 审查领域
228
+ - 域漂移:类级伞形碎裂为窄技能、同域近重复组未合并、孤立新域入侵、前缀聚类碎片化。
229
+ - 层漂移:知识在「正文/支持文件/记忆」三层间错位——正文 log 化、实录未沉淀、
230
+ 模式沉底、支持文件无指针、同一事实多地重复表述。
231
+
232
+ ## 3. 检查清单(规则 = 触发信号 → 语义判断 → 输出形态)
233
+ environment signals:{signal:usage_observed}、{signal:quality_low}——校验器对 quality_low=unknown 的技能
234
+ 全局施加 needs_human:true(机械判据见 §4/§7),模板侧不重复表述。
235
+
236
+ A. 域·碎片化
237
+ - A1 当 {signal:dedup_group}=over:判断近重复组是否属同一类级伞形的可合并小节;
238
+ 是 → relationship-level consolidate 建议;否 → 不输出。
239
+ - A2 当 {signal:narrow_name}=over:结合 description/正文语义判窄名是否 "仅对今日任务成立";
240
+ 成立 → skill-level 改名/归档建议;若实为用户内部代号(格式合规语义窄)→ contextual
241
+ 证据、confidence≤0.4、needs_human:true。
242
+ - A3 当 {signal:prefix_cluster}=over:判簇内技能是否同伞;非同伞 → notes 区提出域划分
243
+ 观察,不强制建伞。
244
+
245
+ B. 层·分层错位
246
+ - B1 当 {signal:stamp_density}=over 或 {signal:body_size}=over:逐技能判时间戳/编号为
247
+ 追溯锚(跨文档检索锚)还是日志残留(过程叙事/状态快照);
248
+ 锚 → 允许保留,semantic_reasoning 列明判据,needs_human:true;
249
+ 残留 → restructure 建议(movable headings 逐字引用)。over 是开关,不是结论。
250
+ - B2 当 {signal:pointer_missing}=over:检查支持文件内容形态——可复用模式 → 建议上移
251
+ 正文;会话专属实录 → 建议保留并补正文指针。输出为 patch 指引(§9 执行形态)。
252
+ - B3 当 {signal:dup_heading}=over:建议删除多余标题行(保留一份),输出为 patch 指引。
253
+ - B4 当 {signal:overlong_line}=over:建议拆行,输出为 patch 指引。
254
+ - B5 当 {signal:description_chars}=over:建议缩短 description 到 ≤60,输出为 patch 指引;
255
+ 不得建议改动正文其他部分。
256
+
257
+ D. 库·整合纪律(计划形态约束,不是信号)
258
+ - D1 同类问题多处出现 → 合成一条 relationship-level 建议,不逐项输出。
259
+ - D2 结构类问题优先级高于内容类;影响面 library-level > relationship-level > skill-level。
260
+
261
+ 可选工具:maintenance_probe(只读)——按需深挖信号详情(单技能全文密度分布、簇完整
262
+ 成员、指针明细);探针输出仅用于补充判断(影响 confidence/semantic_reasoning),
263
+ 不得引入事实块之外的新证据 id。
264
+
265
+ ## 4. 输出契约(校验器机械执行)
266
+ {verdict: "issues" | "no_issues",
267
+ plan: [{ kind: "skill-level"|"relationship-level"|"library-level",
268
+ names: [str], rule: "A1"|"B2"|...,
269
+ evidence: [{signal, value}], // 必须逐字来自事实块;禁止引用事实块外信号
270
+ finding: "<一句事实描述:引用信号 id 与值;零裁决动词>",
271
+ recommendation: "<唯一允许的'应'句:建议动作与理由;并写明执行形态(命令/patch 指引)>",
272
+ semantic_reasoning: "<语义判据;含 LLM 推断时 confidence≤0.4>",
273
+ impact: "better|worse|neutral", impact_reason: "<相对'不动'的净影响>",
274
+ reversibility: "archive|restructure|patch|rename|none", undo_path: "<一步撤销方式>",
275
+ confidence: float, // machine ≥0.6;contextual ≤0.4
276
+ needs_human: bool, is_override: bool, override_reason: "<仅 is_override>" }],
277
+ notes: [str]}
278
+ - verdict=no_issues ⇒ plan=[](机械判定,不允许空 plan 之外的 "无问题" 表述)。
279
+ - confidence 判据:机器证据项 ∈ [0.6, 0.9];contextual 项 ≤0.4;无第三区间——
280
+ needs_human = (confidence < 0.6) OR (不可逆) OR (is_override) OR (引用 unknown 信号)。
281
+ - 语言:finding/recommendation/notes 用与库一致的正文语言(中文);字段名/信号 id/枚举
282
+ 保留英文。
283
+
284
+ ## 5. 裁决纪律
285
+ - 禁用:"根据注入事实 X,该技能应当 Y"——事实段没有 "应当" 权限。
286
+ - 锚 vs 残留示例:✅ 当 {signal:stamp_density}=over({signal:stamp_density.threshold} 阈)
287
+ 且时间戳为跨文档检索锚 → B1:不迁,needs_human,semantic_reasoning=锚判据。
288
+ ❌ 当 {signal:stamp_density}=over → "该技能日志化,应 restructure"(over 是开关不是结论)。
289
+ - 申诉:机械阈值与语义判断冲突 → is_override:true + override_reason + needs_human:true;
290
+ 不得静默绕过阈值。
291
+ - 不动作合法:verdict=no_issues 是合法输出,不是失败;连续空报告 = 信号定义问题,
292
+ 不是 "更积极" 的信号。
293
+ - 错误成本:不可逆动作(rename)必须 needs_human:true;可逆动作(archive/restructure
294
+ 两阶段)可 needs_human:false 但 undo_path 必填。
295
+ - 不做:不建议删除(只建议 archive);不提升内容质量(结构审查只 flag 位置/归属/分层);
296
+ protected 集(bundled/hub 安装/pinned)内 0 建议。
297
+
298
+ ## 6. 泛化注意事项
299
+ - 信号集开放:事实块含、§3 未列的信号 → notes 区提出 "该信号值得新增条款",禁止
300
+ 解释为 "已知问题"。
301
+ - 条款同构扩展:新增检查 = drift-signals 加定义 + §3 加一条 "信号→语义→输出" 条款。
302
+ - 库规模无关:判据是事实与条款,不是库体量印象。
303
+ - 信号机制疑问(阈值、检测原理)→ 写 needs_human,不猜测机制。`;
304
+ /**
204
305
  * System-prompt guidance section (Hermes `SKILLS_GUIDANCE`, DSH-adapted).
205
306
  * Registered as a system-prompt section by tool-skill-manage (it mounts
206
307
  * exactly when `skill_manage` is available — the DSH analogue of Hermes'
@@ -223,12 +324,12 @@ function sha256(text) {
223
324
  function createPromptBundle(prompts) {
224
325
  const canonical = JSON.stringify({
225
326
  id: PROMPT_BUNDLE_ID,
226
- version: 9,
327
+ version: 10,
227
328
  prompts: Object.fromEntries(Object.entries(prompts).sort())
228
329
  });
229
330
  return Object.freeze({
230
331
  id: PROMPT_BUNDLE_ID,
231
- version: 9,
332
+ version: 10,
232
333
  prompts: Object.freeze({ ...prompts }),
233
334
  sha256: sha256(canonical)
234
335
  });
@@ -241,6 +342,7 @@ createPromptBundle({
241
342
  combinedPlan: COMBINED_REVIEW_PLAN_PROMPT,
242
343
  curator: CURATOR_PROMPT,
243
344
  completion: COMPLETION_SKILL_REVIEW_PROMPT,
345
+ maintain: MAINTAIN_PROMPT,
244
346
  skillsGuidance: SKILLS_GUIDANCE
245
347
  });
246
348
  //#endregion
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lmzhen/dsh-evolution-state-json",
3
3
  "description": "JSON-file evolution state provider over the IO seam (community build)",
4
- "version": "0.2.1",
4
+ "version": "0.3.0",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -37,12 +37,12 @@
37
37
  "peerDependencies": {
38
38
  "@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
39
39
  "@deepseek-ai/cordis": "^4.0.1",
40
- "@lmzhen/dsh-evolution-io": "^0.2.1",
41
- "@lmzhen/dsh-evolution-state-storage": "^0.2.1"
40
+ "@lmzhen/dsh-evolution-io": "^0.3.0",
41
+ "@lmzhen/dsh-evolution-state-storage": "^0.3.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
45
- "@lmzhen/dsh-evolution-io": "^0.2.1",
46
- "@lmzhen/dsh-evolution-state-storage": "^0.2.1"
45
+ "@lmzhen/dsh-evolution-io": "^0.3.0",
46
+ "@lmzhen/dsh-evolution-state-storage": "^0.3.0"
47
47
  }
48
48
  }