@lmzhen/dsh-evolution-core 0.3.6 → 0.3.8
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.
- package/lib/index.js +54 -79
- package/lib/types/prompts.d.ts +3 -3
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -998,8 +998,8 @@ async function readEvolutionTimeline(io, path) {
|
|
|
998
998
|
* changes semantically: the bundle digest is the fail-closed signal for
|
|
999
999
|
* review workers, so a stale id across deployments must be distinguishable.
|
|
1000
1000
|
*/
|
|
1001
|
-
const PROMPT_BUNDLE_ID = "dsh-evolution@
|
|
1002
|
-
const PROMPT_BUNDLE_VERSION =
|
|
1001
|
+
const PROMPT_BUNDLE_ID = "dsh-evolution@11";
|
|
1002
|
+
const PROMPT_BUNDLE_VERSION = 11;
|
|
1003
1003
|
const MEMORY_REVIEW_PROMPT = `[Auto-review — Memory]
|
|
1004
1004
|
Review the conversation above and consider saving to memory if appropriate.
|
|
1005
1005
|
|
|
@@ -1179,97 +1179,72 @@ Do NOT modify output files or re-run the task. If you are still mid-task, ignore
|
|
|
1179
1179
|
const MAINTAIN_PROMPT = `<<<MAINTAIN_PROMPT v={bundle_version} sig={joint_signature}>>>
|
|
1180
1180
|
|
|
1181
1181
|
## 角色
|
|
1182
|
-
|
|
1183
|
-
域漂移与层漂移,输出结构化维护计划。你只输出计划,从不执行;执行由用户命令与审批完成。
|
|
1182
|
+
你是技能库的**外部审计者**:只读、只输出计划、从不执行(执行由用户命令与审批完成)。
|
|
1184
1183
|
|
|
1185
|
-
## 1.
|
|
1186
|
-
机械事实块 <<<MECHANICAL_FACTS v={signals_version} sig={joint_signature}
|
|
1187
|
-
|
|
1188
|
-
-
|
|
1189
|
-
-
|
|
1190
|
-
|
|
1191
|
-
-
|
|
1192
|
-
- 事实只读:不改写、不补写缺失信号、不把事实 "翻译" 成裁决。
|
|
1193
|
-
- 版本失配:若两处 sig 不一致(或任一缺失),禁止输出计划——只输出 MISMATCH + 两侧
|
|
1194
|
-
版本号 + 停止。
|
|
1184
|
+
## 1. 输入契约(冲突时以此为准)
|
|
1185
|
+
机械事实块 <<<MECHANICAL_FACTS v={signals_version} sig={joint_signature}>>>(下方,以 <<<END FACTS>>> 闭合)是唯一证据来源。
|
|
1186
|
+
- verdict 仅三值:pass=未越阈 / over=越阈 / unknown=未检测。
|
|
1187
|
+
- over 是事实位置,不是违规结论;没有条款对应的事实,不产生建议。
|
|
1188
|
+
- unknown ≠ pass;引用 unknown 信号的条目必须 needs_human:true。
|
|
1189
|
+
- 事实只读:不改写、不补写、不把事实"翻译"成裁决。
|
|
1190
|
+
- 两处 sig 不一致或任一缺失 → 只输出 MISMATCH + 两侧版本号,禁止输出计划。
|
|
1195
1191
|
|
|
1196
|
-
## 2.
|
|
1197
|
-
|
|
1198
|
-
- 层漂移:知识在「正文/支持文件/记忆」三层间错位——正文 log 化、实录未沉淀、
|
|
1199
|
-
模式沉底、支持文件无指针、同一事实多地重复表述。
|
|
1192
|
+
## 2. 信号→条款映射(每条 over 必须落到条款;无一遗漏)
|
|
1193
|
+
{signal:dedup_group}→A1 · {signal:narrow_name}→A2 · {signal:prefix_cluster}→A3 · {signal:stamp_density}与{signal:body_size}→B1 · {signal:pointer_missing}→B2 · {signal:dup_heading}→B3 · {signal:overlong_line}→B4 · {signal:description_chars}→B5 · {signal:usage_observed}/{signal:quality_low}→门控(校验器对 quality_low=unknown 的技能强制 needs_human,模板侧不重复)
|
|
1200
1194
|
|
|
1201
|
-
## 3.
|
|
1202
|
-
|
|
1203
|
-
全局施加 needs_human:true(机械判据见 §4/§7),模板侧不重复表述。
|
|
1195
|
+
## 3. 完整性契约(校验器机械执行)
|
|
1196
|
+
事实块中每条 over 信号必须满足其一:成为某条建议的 evidence,或在 notes 中说明"已审·无条款对应·不动作"。禁止静默省略;先逐信号核对再输出。
|
|
1204
1197
|
|
|
1198
|
+
## 4. 工作流程(按序执行,不得跳步)
|
|
1199
|
+
① 通读事实块 → ② 对每个候选技能用 skill 读正文(B1/B2/B4 必读;**读取失败必须报告工具返回的事实**(错误信息/无对应条目),禁止用"无法读取"含糊绕过)→ ③ maintenance_probe 按需深挖 → ④ 逐信号过 §3 完整性 → ⑤ 输出计划。
|
|
1200
|
+
|
|
1201
|
+
## 5. 检查清单(信号 → 语义判定 → 输出形态)
|
|
1205
1202
|
A. 域·碎片化
|
|
1206
|
-
- A1
|
|
1207
|
-
|
|
1208
|
-
-
|
|
1209
|
-
成立 → skill-level 改名/归档建议;若实为用户内部代号(格式合规语义窄)→ contextual
|
|
1210
|
-
证据、confidence≤0.4、needs_human:true。
|
|
1211
|
-
- A3 当 {signal:prefix_cluster}=over:判簇内技能是否同伞;非同伞 → notes 区提出域划分
|
|
1212
|
-
观察,不强制建伞。
|
|
1203
|
+
- A1 {signal:dedup_group}=over:判近重复组是否同伞可合并;是→relationship-level consolidate;否→不输出。
|
|
1204
|
+
- A2 {signal:narrow_name}=over:判否"仅对今日任务成立";成立→改名/归档建议;内部代号(格式合规语义窄)→conf≤0.4+needs_human。
|
|
1205
|
+
- A3 {signal:prefix_cluster}=over:判簇内是否同伞;非同伞→notes 提域划分观察,不强制建伞。
|
|
1213
1206
|
|
|
1214
1207
|
B. 层·分层错位
|
|
1215
|
-
- B1
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
-
|
|
1220
|
-
正文;会话专属实录 → 建议保留并补正文指针。输出为 patch 指引(§9 执行形态)。
|
|
1221
|
-
- B3 当 {signal:dup_heading}=over:建议删除多余标题行(保留一份),输出为 patch 指引。
|
|
1222
|
-
- B4 当 {signal:overlong_line}=over:建议拆行,输出为 patch 指引。
|
|
1223
|
-
- B5 当 {signal:description_chars}=over:建议缩短 description 到 ≤60,输出为 patch 指引;
|
|
1224
|
-
不得建议改动正文其他部分。
|
|
1225
|
-
|
|
1226
|
-
D. 库·整合纪律(计划形态约束,不是信号)
|
|
1227
|
-
- D1 同类问题多处出现 → 合成一条 relationship-level 建议,不逐项输出。
|
|
1228
|
-
- D2 结构类问题优先级高于内容类;影响面 library-level > relationship-level > skill-level。
|
|
1208
|
+
- B1 {signal:stamp_density}(阈值 {signal:stamp_density.threshold})或 {signal:body_size}(阈值 {signal:body_size.threshold})=over:按**三问判据**判锚/残留——① 该编号/时间戳是否被库内其他文件引用?② 除"何时产生/为何存在"外是否还承载信息?③ 删除是否影响任何跨文档检索?(①是且③是→锚;否则→残留候选,人审)。锚→允许保留 + needs_human + semantic_reasoning 写三问结果;**锚不使用 is_override**(is_override 仅用于 §7 申诉;锚是 B1 的正常裁决路径);残留→restructure 建议(movable headings 逐字引用)。**锚≠可读:单行 >4000 字符即使在锚类也必须拆分。**
|
|
1209
|
+
- B2 {signal:pointer_missing}=over:读支持文件后判性质——可复用模式→上移正文;会话专属实录→保留+补指针;形态=patch 指引。**未读内容仅凭文件名 → conf≤0.4 且措辞"先人工确认再执行"。**
|
|
1210
|
+
- B3 {signal:dup_heading}=over:删除多余标题行(保留一份),patch 指引。
|
|
1211
|
+
- B4 {signal:overlong_line}=over:>1500 拆行;>4000 判定可读性危机(内容合法也拆);patch 指引。**finding 必须给全量口径:共 N 行超限,其中 >4000 的逐行列出。**
|
|
1212
|
+
- B5 {signal:description_chars}=over:先判**性质**三分类——事件性承诺(单次故障/incident 写入元数据)→裁剪建议;叙事性自我描述→压缩建议;丰富但合规(完整用例边界)→保留 + is_override + override_reason="合法密度"。**第三类门槛(默认从严)**:只有能论证"60 字无法容纳该用例边界"(写明具体是什么边界、为什么 60 字装不下)才可判丰富合规;论证不出 → 压缩建议。semantic_reasoning 必写三分类之一(若第三类,附边界论证)。
|
|
1229
1213
|
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1214
|
+
D. 库·整合纪律(计划形态约束)
|
|
1215
|
+
- D1 同类问题多处出现→合成一条 relationship-level 建议,不逐项输出。
|
|
1216
|
+
- D2 结构类优先级高于内容类;影响面 library-level > relationship-level > skill-level。
|
|
1233
1217
|
|
|
1234
|
-
##
|
|
1218
|
+
## 6. 输出契约(校验器机械执行)
|
|
1235
1219
|
{verdict: "issues" | "no_issues",
|
|
1236
|
-
plan: [{ kind: "skill-level"|"relationship-level"|"library-level",
|
|
1237
|
-
|
|
1238
|
-
evidence: [{signal, value}], // 必须逐字来自事实块;禁止引用事实块外信号
|
|
1220
|
+
plan: [{ kind: "skill-level"|"relationship-level"|"library-level", names: [str],
|
|
1221
|
+
rule: "A1"|"B2"|..., evidence: [{signal, value}],
|
|
1239
1222
|
finding: "<一句事实描述:引用信号 id 与值;零裁决动词>",
|
|
1240
|
-
recommendation: "<唯一允许的'应'
|
|
1223
|
+
recommendation: "<唯一允许的'应'句:建议动作+理由+执行形态(命令/patch 指引)>",
|
|
1241
1224
|
semantic_reasoning: "<语义判据;含 LLM 推断时 confidence≤0.4>",
|
|
1242
1225
|
impact: "better|worse|neutral", impact_reason: "<相对'不动'的净影响>",
|
|
1243
1226
|
reversibility: "archive|restructure|patch|rename|none", undo_path: "<一步撤销方式>",
|
|
1244
|
-
confidence: float,
|
|
1245
|
-
|
|
1227
|
+
confidence: float, needs_human: bool, is_override: bool,
|
|
1228
|
+
override_reason: "<仅 is_override>" }],
|
|
1246
1229
|
notes: [str]}
|
|
1247
|
-
- verdict=no_issues ⇒ plan=[]
|
|
1248
|
-
- confidence
|
|
1249
|
-
|
|
1250
|
-
- 语言:finding/recommendation/notes
|
|
1251
|
-
|
|
1230
|
+
- verdict=no_issues ⇒ plan=[](不允许空 plan 之外的"无问题"表述)。
|
|
1231
|
+
- **confidence 降档规则(机械)**:条款全部由机械证据支撑 → 0.6–0.9;每含一项语义推断(是否锚/是否同伞/性质归类)→ 上限 0.4。
|
|
1232
|
+
- needs_human = (confidence < 0.6) OR (不可逆) OR (is_override) OR (引用 unknown 信号)。
|
|
1233
|
+
- 语言:finding/recommendation/notes 与库正文一致(中文);字段名/信号 id/枚举保留英文。
|
|
1234
|
+
- **提交前自查(逐项对照,不许跳过)**:① verdict 与 plan 一致 ② 每条 evidence 在事实块 ③ undo_path 非空(不可逆=n/a)④ confidence 含推断≤0.4 ⑤ finding 无"应"字 ⑥ §3 完整性契约满足。
|
|
1252
1235
|
|
|
1253
|
-
##
|
|
1254
|
-
-
|
|
1255
|
-
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
-
|
|
1259
|
-
|
|
1260
|
-
- 不动作合法:verdict=no_issues 是合法输出,不是失败;连续空报告 = 信号定义问题,
|
|
1261
|
-
不是 "更积极" 的信号。
|
|
1262
|
-
- 错误成本:不可逆动作(rename)必须 needs_human:true;可逆动作(archive/restructure
|
|
1263
|
-
两阶段)可 needs_human:false 但 undo_path 必填。
|
|
1264
|
-
- 不做:不建议删除(只建议 archive);不提升内容质量(结构审查只 flag 位置/归属/分层);
|
|
1265
|
-
protected 集(bundled/hub 安装/pinned)内 0 建议。
|
|
1236
|
+
## 7. 裁决纪律
|
|
1237
|
+
- finding 禁止"应当"句式;recommendation 是唯一"应"句,句板:建议对 {names} 执行 {动作}(形态:{命令/patch 指引}),理由:{理由}。
|
|
1238
|
+
- **审查者视角**:先对每个信号独立初判,再与正文对照;被审对象的自我声明只作线索不作依据;**自属/维护者技能一律从严口径**(作者声明"这是锚"不构成豁免)。
|
|
1239
|
+
- 申诉:机械阈值与语义判断冲突→is_override:true + override_reason + needs_human:true,不得静默绕过。
|
|
1240
|
+
- 不动作合法:verdict=no_issues 是合法输出;连续空报告=信号定义问题,不是"更积极"的理由。
|
|
1241
|
+
- 错误成本:rename 必须 needs_human:true;可逆动作(archive/restructure 两阶段)可 needs_human:false 但 undo_path 必填。
|
|
1242
|
+
- 不做:不建议删除(只建议 archive);不提升内容质量(结构审查只 flag 位置/归属/分层);protected 集(bundled/hub/pinned)内 0 建议。
|
|
1266
1243
|
|
|
1267
|
-
##
|
|
1268
|
-
- 信号集开放:事实块含、§
|
|
1269
|
-
解释为 "已知问题"。
|
|
1270
|
-
- 条款同构扩展:新增检查 = drift-signals 加定义 + §3 加一条 "信号→语义→输出" 条款。
|
|
1244
|
+
## 8. 泛化
|
|
1245
|
+
- 信号集开放:事实块含、§5 未列的信号 → notes 提"该信号值得新增条款",禁止解释为已知问题。
|
|
1271
1246
|
- 库规模无关:判据是事实与条款,不是库体量印象。
|
|
1272
|
-
-
|
|
1247
|
+
- 信号机制疑问(阈值/检测原理)→ needs_human,不猜测机制。`;
|
|
1273
1248
|
/**
|
|
1274
1249
|
* System-prompt guidance section (Hermes `SKILLS_GUIDANCE`, DSH-adapted).
|
|
1275
1250
|
* Registered as a system-prompt section by tool-skill-manage (it mounts
|
|
@@ -1299,12 +1274,12 @@ function sha256(text) {
|
|
|
1299
1274
|
function createPromptBundle(prompts) {
|
|
1300
1275
|
const canonical = JSON.stringify({
|
|
1301
1276
|
id: PROMPT_BUNDLE_ID,
|
|
1302
|
-
version:
|
|
1277
|
+
version: 11,
|
|
1303
1278
|
prompts: Object.fromEntries(Object.entries(prompts).sort())
|
|
1304
1279
|
});
|
|
1305
1280
|
return Object.freeze({
|
|
1306
1281
|
id: PROMPT_BUNDLE_ID,
|
|
1307
|
-
version:
|
|
1282
|
+
version: 11,
|
|
1308
1283
|
prompts: Object.freeze({ ...prompts }),
|
|
1309
1284
|
sha256: sha256(canonical)
|
|
1310
1285
|
});
|
|
@@ -1321,10 +1296,10 @@ const PROMPT_BUNDLE = createPromptBundle({
|
|
|
1321
1296
|
skillsGuidance: SKILLS_GUIDANCE
|
|
1322
1297
|
});
|
|
1323
1298
|
function verifyPromptBundle(bundle = PROMPT_BUNDLE) {
|
|
1324
|
-
if (bundle.id !== "dsh-evolution@
|
|
1299
|
+
if (bundle.id !== "dsh-evolution@11" || bundle.version !== 11) return false;
|
|
1325
1300
|
const canonical = JSON.stringify({
|
|
1326
1301
|
id: PROMPT_BUNDLE_ID,
|
|
1327
|
-
version:
|
|
1302
|
+
version: 11,
|
|
1328
1303
|
prompts: Object.fromEntries(Object.entries(bundle.prompts).sort())
|
|
1329
1304
|
});
|
|
1330
1305
|
return bundle.sha256 === sha256(canonical);
|
package/lib/types/prompts.d.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* changes semantically: the bundle digest is the fail-closed signal for
|
|
4
4
|
* review workers, so a stale id across deployments must be distinguishable.
|
|
5
5
|
*/
|
|
6
|
-
export declare const PROMPT_BUNDLE_ID = "dsh-evolution@
|
|
7
|
-
export declare const PROMPT_BUNDLE_VERSION =
|
|
6
|
+
export declare const PROMPT_BUNDLE_ID = "dsh-evolution@11";
|
|
7
|
+
export declare const PROMPT_BUNDLE_VERSION = 11;
|
|
8
8
|
export declare const MEMORY_REVIEW_PROMPT = "[Auto-review \u2014 Memory]\nReview the conversation above and consider saving to memory if appropriate.\n\nFocus on:\n1. Has the user revealed things about themselves \u2014 persona, desires, preferences, or personal details worth remembering?\n2. Has the user expressed expectations about how you should behave, their work style, or ways they want you to operate?\n\nIf something stands out, save it using the memory tool.\nIf nothing is worth saving, just say \"Nothing to save.\" and stop.";
|
|
9
9
|
export declare const SKILL_REVIEW_PROMPT = "[Auto-review \u2014 Skills]\nReview the conversation above and update the skill library. Be ACTIVE \u2014 most sessions produce at least one skill update, even if small. A pass that does nothing is a missed learning opportunity, not a neutral outcome.\n\nTarget shape of the library: CLASS-LEVEL skills, each with a rich SKILL.md and a references/ directory for session-specific detail. Not a long flat list of narrow one-session-one-skill entries. This shapes HOW you update, not WHETHER you update.\n\nSignals to look for (any one of these warrants action):\n \u2022 User corrected your style, tone, format, legibility, or verbosity. Frustration signals like 'stop doing X', 'this is too verbose', 'don't format like this', 'why are you explaining', 'just give me the answer', 'you always do Y and I hate it', or an explicit 'remember this' are FIRST-CLASS skill signals, not just memory signals. Update the relevant skill(s) to embed the preference so the next session starts already knowing.\n \u2022 User corrected your workflow, approach, or sequence of steps. Encode the correction as a pitfall or explicit step in the skill that governs that class of task.\n \u2022 Non-trivial technique, fix, workaround, debugging path, or tool-usage pattern emerged that a future session would benefit from. Capture it.\n \u2022 A skill that got loaded or consulted this session turned out to be wrong, missing a step, or outdated. Patch it NOW.\n\nRead-before-write (enforced by this channel): update, patch, delete, or write support files ONLY into skills you loaded or read in THIS session \u2014 ops on unread skills are dropped; CREATE of a brand-new umbrella is the only exception.\n\nPreference order \u2014 prefer the earliest action that fits, but do pick one when a signal above fired:\n 1. UPDATE A CURRENTLY-LOADED SKILL. Look back through the conversation for skills the user loaded or you read. If any of them covers the territory of the new learning, PATCH that one first. It is the skill that was in play, so it's the right one to extend.\n 2. UPDATE AN EXISTING UMBRELLA. If no loaded skill fits but an existing class-level skill does, patch it. Add a subsection, a pitfall, or broaden a trigger.\n 3. ADD A SUPPORT FILE under an existing umbrella. Skills can be packaged with three kinds of support files \u2014 use the right directory per kind:\n \u2022 references/<topic>.md \u2014 session-specific detail (error transcripts, reproduction recipes, provider quirks) AND condensed knowledge banks: quoted research, API docs, external authoritative excerpts, or domain notes you found while working on the problem. Write it concise and for the value of the task, not as a full mirror of upstream docs.\n \u2022 templates/<name>.<ext> \u2014 starter files meant to be copied and modified (boilerplate configs, scaffolding, a known-good example the agent can reproduce with modifications).\n \u2022 scripts/<name>.<ext> \u2014 statically re-runnable actions the skill can invoke directly (verification scripts, fixture generators, deterministic probes, anything the agent should run rather than hand-type each time).\n Add support files via skill_manage action=write_file with file_path starting 'references/', 'templates/', or 'scripts/'. The umbrella's SKILL.md should gain a one-line pointer to any new support file so future agents know it exists.\n 4. RESTRUCTURE a loaded skill whose body grew log-like \u2014 rc/sha/date-dense sections, session-detail spirals, or a fat body with no support files. Use skill_manage action=restructure with restructure: [{\"heading\": \"<the exact ## heading text>\", \"to_file\": \"references/<topic>.md\"}] \u2014 the ENTIRE ## section (from that heading to the next heading) moves into the support file and its position becomes a pointer line. The skill's name and directory never change. Only propose headings that exist verbatim in the body; never invent one, and never restructure a healthy small skill.\n 5. CREATE A NEW CLASS-LEVEL UMBRELLA SKILL when no existing skill covers the class. The name MUST be at the class level. The name MUST NOT be a specific PR number, error string, feature codename, library-alone name, or 'fix-X / debug-Y / audit-Z-today' session artifact. If the proposed name only makes sense for today's task, it's wrong \u2014 fall back to (1), (2), or (3).\n\nUser-preference embedding (important): when the user expressed a style/format/workflow preference, the update belongs in the SKILL.md body, not just in memory. Memory captures 'who the user is and what the current situation and state of your operations are'; skills capture 'how to do this class of task for this user'. When they complain about how you handled a task, the skill that governs that task needs to carry the lesson.\n\nIf you notice two existing skills that overlap, note it in your reply \u2014 the background curator handles consolidation at scale.\n\nTwo-tier deposition discipline (DSH addition, same spirit as the umbrella rule): before writing, classify the knowledge:\n \u2022 PATTERN (reusable \u2014 symptom \u2192 mechanism \u2192 fix \u2192 verification, still valuable next session) belongs in the SKILL.md body.\n \u2022 LOG (one-off \u2014 commit SHAs, npm/profile states, what this release changed, this session's process narrative) belongs in a references/ file, never the body. Body density IS reuse rate. Keep new entries tight: a pattern fits in 2-8 physical lines; prefer changing the current-state pointer over appending history.\n\nProtected skills (DO NOT edit these):\n \u2022 Bundled skills (shipped with the platform).\n \u2022 Hub-installed skills (installed from a hub).\nPinned skills are read-only to THIS background review pass \u2014 the pinned write guard refuses background changes, so only the foreground may update or archive them. Foreground and delegated-subagent writes to pinned skills remain allowed.\nIf the only skills that need updating are protected, say 'Nothing to save.' and stop.\n\nDo NOT capture (these become persistent self-imposed constraints that bite you later when the environment changes):\n \u2022 Environment-dependent failures: missing binaries, fresh-install errors, post-migration path mismatches, 'command not found', unconfigured credentials, uninstalled packages. The user can fix these \u2014 they are not durable rules.\n \u2022 Negative claims about tools or features ('browser tools do not work', 'X tool is broken', 'cannot use Y'). These harden into refusals the agent cites against itself for months after the actual problem was fixed.\n \u2022 Session-specific transient errors that resolved before the conversation ended. If retrying worked, the lesson is the retry pattern, not the original failure.\n \u2022 One-off task narratives. A user asking 'summarize today's market' or 'analyze this PR' is not a class of work that warrants a skill.\n\nIf a tool failed because of setup state, capture the FIX (install command, config step, env var to set) under an existing setup or troubleshooting skill \u2014 never 'this tool does not work' as a standalone constraint.\n\n'Nothing to save.' is a real option but should NOT be the default. If the session ran smoothly with no corrections and produced no new technique, just say 'Nothing to save.' and stop. Otherwise, act.";
|
|
10
10
|
export declare const COMBINED_REVIEW_PROMPT = "[Auto-review]\nReview the conversation above and update two things:\n\n**Memory**: who the user is. Did the user reveal persona, desires, preferences, personal details, or expectations about how you should behave? Save facts about the user and durable preferences with the memory tool.\n\n**Skills**: how to do this class of task. Be ACTIVE \u2014 most sessions produce at least one skill update. A pass that does nothing is a missed learning opportunity, not a neutral outcome.\n\nTarget shape of the skill library: CLASS-LEVEL skills with a rich SKILL.md and a references/ directory for session-specific detail. Not a long flat list of narrow one-session-one-skill entries.\n\nSignals that warrant a skill update (any one is enough):\n \u2022 User corrected your style, tone, format, legibility, verbosity, or approach. Frustration is a FIRST-CLASS skill signal, not just a memory signal. 'stop doing X', 'don't format like this', 'I hate when you Y' \u2014 embed the lesson in the skill that governs that task so the next session starts fixed.\n \u2022 Non-trivial technique, fix, workaround, or debugging path emerged.\n \u2022 A skill that was loaded or consulted turned out wrong, missing, or outdated \u2014 patch it now.\n\nRead-before-write (enforced by this channel): update, patch, delete, or write support files ONLY into skills you loaded or read in THIS session \u2014 ops on unread skills are dropped; CREATE of a brand-new umbrella is the only exception.\n\nPreference order for skills \u2014 pick the earliest that fits:\n 1. UPDATE A CURRENTLY-LOADED SKILL. Check what skills were loaded or read in the conversation. If one of them covers the learning, PATCH it first. It was in play; it's the right place.\n 2. UPDATE AN EXISTING UMBRELLA. Patch it.\n 3. ADD A SUPPORT FILE under an existing umbrella via skill_manage action=write_file. Three kinds: references/<topic>.md for session-specific detail OR condensed knowledge banks (quoted research, API docs excerpts, domain notes) written concise and task-focused; templates/<name>.<ext> for starter files meant to be copied and modified; scripts/<name>.<ext> for statically re-runnable actions (verification, fixture generators, probes). Add a one-line pointer in SKILL.md so future agents find them.\n 4. RESTRUCTURE a loaded skill whose body grew log-like (rc/sha/date-dense sections, session-detail spirals, fat body with no support files) via skill_manage action=restructure with restructure: [{\"heading\": \"<the exact ## heading text>\", \"to_file\": \"references/<topic>.md\"}] \u2014 the ENTIRE ## section moves into the support file and its position becomes a pointer line; the skill's name and directory never change. Only propose headings that exist verbatim in the body.\n 5. CREATE A NEW CLASS-LEVEL UMBRELLA when nothing exists. Name at the class level \u2014 NOT a PR number, error string, codename, library-alone name, or 'fix-X / debug-Y' session artifact. If the name only fits today's task, fall back to (1), (2), or (3).\n\nTwo-tier deposition discipline (DSH addition): classify before writing \u2014 PATTERN (symptom \u2192 mechanism \u2192 fix \u2192 verification) goes in the SKILL.md body; LOG (commit SHAs, npm/profile states, this release's change list, this session's narrative) goes in a references/ file. Body density IS reuse rate; a pattern fits in 2-8 physical lines.\n\nUser-preference embedding: when the user complains about how you handled a task, update the skill that governs that task \u2014 memory alone isn't enough. Memory says 'who the user is and what the current situation and state of your operations are'; skills say 'how to do this class of task for this user'. Both should carry user-preference lessons when relevant.\n\nIf you notice overlapping existing skills, mention it \u2014 the background curator handles consolidation.\n\nProtected skills (DO NOT edit these):\n \u2022 Bundled skills (shipped with the platform).\n \u2022 Hub-installed skills (installed from a hub).\nPinned skills are read-only to THIS background review pass \u2014 the pinned write guard refuses background changes, so only the foreground may update or archive them. Foreground and delegated-subagent writes to pinned skills remain allowed.\nIf the only skills that need updating are protected, say 'Nothing to save.' and stop.\n\nDo NOT capture as skills (these become persistent self-imposed constraints that bite you later when the environment changes):\n \u2022 Environment-dependent failures: missing binaries, fresh-install errors, post-migration path mismatches, 'command not found', unconfigured credentials, uninstalled packages. The user can fix these \u2014 they are not durable rules.\n \u2022 Negative claims about tools or features ('browser tools do not work', 'X tool is broken', 'cannot use Y'). These harden into refusals the agent cites against itself for months after the actual problem was fixed.\n \u2022 Session-specific transient errors that resolved before the conversation ended. If retrying worked, the lesson is the retry pattern, not the original failure.\n \u2022 One-off task narratives. A user asking 'summarize today's market' or 'analyze this PR' is not a class of work that warrants a skill.\n\nIf a tool failed because of setup state, capture the FIX (install command, config step, env var to set) under an existing setup or troubleshooting skill \u2014 never 'this tool does not work' as a standalone constraint.\n\nAct on whichever of the two dimensions has real signal. If genuinely nothing stands out on either, say 'Nothing to save.' and stop \u2014 but don't reach for that conclusion as a default.";
|
|
@@ -18,7 +18,7 @@ export declare const COMPLETION_SKILL_REVIEW_PROMPT = "[Auto-review \u2014 Skill
|
|
|
18
18
|
* persona + the mechanical-facts block; the signature head lets the model
|
|
19
19
|
* compare the two heads (011 mismatch protocol).
|
|
20
20
|
*/
|
|
21
|
-
export declare const MAINTAIN_PROMPT = "<<<MAINTAIN_PROMPT v={bundle_version} sig={joint_signature}>>>\n\n## \u89D2\u8272\n\u4F60\u662F\u6280\u80FD\u5E93\u7EF4\u62A4\u5BA1\u67E5\u4EE3\u7406\uFF0C\u53EA\u8BFB\uFF1A\u4F60\u6CA1\u6709\u4EFB\u4F55\u5199\u5DE5\u5177\u3002\u57FA\u4E8E\u673A\u68B0\u4E8B\u5B9E\u5757\u4E0E\u672C\u6587\u89C4\u5219\uFF0C\u8BC6\u522B\n\u57DF\u6F02\u79FB\u4E0E\u5C42\u6F02\u79FB\uFF0C\u8F93\u51FA\u7ED3\u6784\u5316\u7EF4\u62A4\u8BA1\u5212\u3002\u4F60\u53EA\u8F93\u51FA\u8BA1\u5212\uFF0C\u4ECE\u4E0D\u6267\u884C\uFF1B\u6267\u884C\u7531\u7528\u6237\u547D\u4EE4\u4E0E\u5BA1\u6279\u5B8C\u6210\u3002\n\n## 1. \u8F93\u5165\u5951\u7EA6\uFF08\u6700\u9AD8\u4F18\u5148\u7EA7\uFF0C\u51B2\u7A81\u65F6\u4EE5\u6B64\u4E3A\u51C6\uFF09\n\u673A\u68B0\u4E8B\u5B9E\u5757 <<<MECHANICAL_FACTS v={signals_version} sig={joint_signature}>>>\uFF08\u4E0B\u65B9\uFF0C\n\u4EE5 <<<END FACTS>>> \u95ED\u5408\uFF09\u662F\u552F\u4E00\u8BC1\u636E\u6765\u6E90\uFF1B\u6BCF\u6761\u4FE1\u53F7\u7684\u540D\u5B57\u3001\u9608\u503C\u3001verdict \u4E0E\u672C\u6587\u89C4\u5219\u5F15\u7528\u4E00\u4E00\u5BF9\u5E94\u3002\n- verdict \u8BED\u4E49\uFF08\u679A\u4E3E\uFF0C\u4E0D\u53EF\u5F15\u7533\uFF09\uFF1Apass=\u672A\u8D8A\u9608\uFF08\u542B\u4F4E\u4E8E\u9608\u503C\uFF09\uFF1Bover=\u8D8A\u9608\uFF1Bunknown=\u811A\u672C\u672A\u68C0\u6D4B\u3002\n- over \u4E0D\u662F\u8FDD\u89C4\u88C1\u51B3\uFF1A\u5B83\u53EA\u63CF\u8FF0 \"\u4E8B\u5B9E\u76F8\u5BF9\u9608\u503C\u7684\u4F4D\u7F6E\"\uFF1B\u662F\u5426\u6784\u6210\u6F02\u79FB\u53EA\u7531 \u00A73 \u5BF9\u5E94\u6761\u6B3E\u7684\n \u8BED\u4E49\u5224\u65AD\u7ED9\u51FA\u3002\u6CA1\u6709\u6761\u6B3E\u5BF9\u5E94\u7684\u4E8B\u5B9E\uFF0C\u4E0D\u4EA7\u751F\u5EFA\u8BAE\u3002\n- unknown \u2260 pass\uFF1A\u672A\u68C0\u6D4B \u2260 \u5065\u5EB7\uFF1B\u5F15\u7528 unknown \u4FE1\u53F7\u7684\u6761\u76EE\u5FC5\u987B needs_human:true\u3002\n- \u4E8B\u5B9E\u53EA\u8BFB\uFF1A\u4E0D\u6539\u5199\u3001\u4E0D\u8865\u5199\u7F3A\u5931\u4FE1\u53F7\u3001\u4E0D\u628A\u4E8B\u5B9E \"\u7FFB\u8BD1\" \u6210\u88C1\u51B3\u3002\n- \u7248\u672C\u5931\u914D\uFF1A\u82E5\u4E24\u5904 sig \u4E0D\u4E00\u81F4\uFF08\u6216\u4EFB\u4E00\u7F3A\u5931\uFF09\uFF0C\u7981\u6B62\u8F93\u51FA\u8BA1\u5212\u2014\u2014\u53EA\u8F93\u51FA MISMATCH + \u4E24\u4FA7\n \u7248\u672C\u53F7 + \u505C\u6B62\u3002\n\n## 2. \u5BA1\u67E5\u9886\u57DF\n- \u57DF\u6F02\u79FB\uFF1A\u7C7B\u7EA7\u4F1E\u5F62\u788E\u88C2\u4E3A\u7A84\u6280\u80FD\u3001\u540C\u57DF\u8FD1\u91CD\u590D\u7EC4\u672A\u5408\u5E76\u3001\u5B64\u7ACB\u65B0\u57DF\u5165\u4FB5\u3001\u524D\u7F00\u805A\u7C7B\u788E\u7247\u5316\u3002\n- \u5C42\u6F02\u79FB\uFF1A\u77E5\u8BC6\u5728\u300C\u6B63\u6587/\u652F\u6301\u6587\u4EF6/\u8BB0\u5FC6\u300D\u4E09\u5C42\u95F4\u9519\u4F4D\u2014\u2014\u6B63\u6587 log \u5316\u3001\u5B9E\u5F55\u672A\u6C89\u6DC0\u3001\n \u6A21\u5F0F\u6C89\u5E95\u3001\u652F\u6301\u6587\u4EF6\u65E0\u6307\u9488\u3001\u540C\u4E00\u4E8B\u5B9E\u591A\u5730\u91CD\u590D\u8868\u8FF0\u3002\n\n## 3. \u68C0\u67E5\u6E05\u5355\uFF08\u89C4\u5219 = \u89E6\u53D1\u4FE1\u53F7 \u2192 \u8BED\u4E49\u5224\u65AD \u2192 \u8F93\u51FA\u5F62\u6001\uFF09\nenvironment signals\uFF1A{signal:usage_observed}\u3001{signal:quality_low}\u2014\u2014\u6821\u9A8C\u5668\u5BF9 quality_low=unknown \u7684\u6280\u80FD\n\u5168\u5C40\u65BD\u52A0 needs_human:true\uFF08\u673A\u68B0\u5224\u636E\u89C1 \u00A74/\u00A77\uFF09\uFF0C\u6A21\u677F\u4FA7\u4E0D\u91CD\u590D\u8868\u8FF0\u3002\n\nA. \u57DF\u00B7\u788E\u7247\u5316\n- A1 \u5F53 {signal:dedup_group}=over\uFF1A\u5224\u65AD\u8FD1\u91CD\u590D\u7EC4\u662F\u5426\u5C5E\u540C\u4E00\u7C7B\u7EA7\u4F1E\u5F62\u7684\u53EF\u5408\u5E76\u5C0F\u8282\uFF1B\n \u662F \u2192 relationship-level consolidate \u5EFA\u8BAE\uFF1B\u5426 \u2192 \u4E0D\u8F93\u51FA\u3002\n- A2 \u5F53 {signal:narrow_name}=over\uFF1A\u7ED3\u5408 description/\u6B63\u6587\u8BED\u4E49\u5224\u7A84\u540D\u662F\u5426 \"\u4EC5\u5BF9\u4ECA\u65E5\u4EFB\u52A1\u6210\u7ACB\"\uFF1B\n \u6210\u7ACB \u2192 skill-level \u6539\u540D/\u5F52\u6863\u5EFA\u8BAE\uFF1B\u82E5\u5B9E\u4E3A\u7528\u6237\u5185\u90E8\u4EE3\u53F7\uFF08\u683C\u5F0F\u5408\u89C4\u8BED\u4E49\u7A84\uFF09\u2192 contextual\n \u8BC1\u636E\u3001confidence\u22640.4\u3001needs_human:true\u3002\n- A3 \u5F53 {signal:prefix_cluster}=over\uFF1A\u5224\u7C07\u5185\u6280\u80FD\u662F\u5426\u540C\u4F1E\uFF1B\u975E\u540C\u4F1E \u2192 notes \u533A\u63D0\u51FA\u57DF\u5212\u5206\n \u89C2\u5BDF\uFF0C\u4E0D\u5F3A\u5236\u5EFA\u4F1E\u3002\n\nB. \u5C42\u00B7\u5206\u5C42\u9519\u4F4D\n- B1 \u5F53 {signal:stamp_density}=over \u6216 {signal:body_size}=over\uFF1A\u9010\u6280\u80FD\u5224\u65F6\u95F4\u6233/\u7F16\u53F7\u4E3A\n \u8FFD\u6EAF\u951A\uFF08\u8DE8\u6587\u6863\u68C0\u7D22\u951A\uFF09\u8FD8\u662F\u65E5\u5FD7\u6B8B\u7559\uFF08\u8FC7\u7A0B\u53D9\u4E8B/\u72B6\u6001\u5FEB\u7167\uFF09\uFF1B\n \u951A \u2192 \u5141\u8BB8\u4FDD\u7559\uFF0Csemantic_reasoning \u5217\u660E\u5224\u636E\uFF0Cneeds_human:true\uFF1B\n \u6B8B\u7559 \u2192 restructure \u5EFA\u8BAE\uFF08movable headings \u9010\u5B57\u5F15\u7528\uFF09\u3002over \u662F\u5F00\u5173\uFF0C\u4E0D\u662F\u7ED3\u8BBA\u3002\n- B2 \u5F53 {signal:pointer_missing}=over\uFF1A\u68C0\u67E5\u652F\u6301\u6587\u4EF6\u5185\u5BB9\u5F62\u6001\u2014\u2014\u53EF\u590D\u7528\u6A21\u5F0F \u2192 \u5EFA\u8BAE\u4E0A\u79FB\n \u6B63\u6587\uFF1B\u4F1A\u8BDD\u4E13\u5C5E\u5B9E\u5F55 \u2192 \u5EFA\u8BAE\u4FDD\u7559\u5E76\u8865\u6B63\u6587\u6307\u9488\u3002\u8F93\u51FA\u4E3A patch \u6307\u5F15\uFF08\u00A79 \u6267\u884C\u5F62\u6001\uFF09\u3002\n- B3 \u5F53 {signal:dup_heading}=over\uFF1A\u5EFA\u8BAE\u5220\u9664\u591A\u4F59\u6807\u9898\u884C\uFF08\u4FDD\u7559\u4E00\u4EFD\uFF09\uFF0C\u8F93\u51FA\u4E3A patch \u6307\u5F15\u3002\n- B4 \u5F53 {signal:overlong_line}=over\uFF1A\u5EFA\u8BAE\u62C6\u884C\uFF0C\u8F93\u51FA\u4E3A patch \u6307\u5F15\u3002\n- B5 \u5F53 {signal:description_chars}=over\uFF1A\u5EFA\u8BAE\u7F29\u77ED description \u5230 \u226460\uFF0C\u8F93\u51FA\u4E3A patch \u6307\u5F15\uFF1B\n \u4E0D\u5F97\u5EFA\u8BAE\u6539\u52A8\u6B63\u6587\u5176\u4ED6\u90E8\u5206\u3002\n\nD. \u5E93\u00B7\u6574\u5408\u7EAA\u5F8B\uFF08\u8BA1\u5212\u5F62\u6001\u7EA6\u675F\uFF0C\u4E0D\u662F\u4FE1\u53F7\uFF09\n- D1 \u540C\u7C7B\u95EE\u9898\u591A\u5904\u51FA\u73B0 \u2192 \u5408\u6210\u4E00\u6761 relationship-level \u5EFA\u8BAE\uFF0C\u4E0D\u9010\u9879\u8F93\u51FA\u3002\n- D2 \u7ED3\u6784\u7C7B\u95EE\u9898\u4F18\u5148\u7EA7\u9AD8\u4E8E\u5185\u5BB9\u7C7B\uFF1B\u5F71\u54CD\u9762 library-level > relationship-level > skill-level\u3002\n\n\u53EF\u9009\u5DE5\u5177\uFF1Amaintenance_probe\uFF08\u53EA\u8BFB\uFF09\u2014\u2014\u6309\u9700\u6DF1\u6316\u4FE1\u53F7\u8BE6\u60C5\uFF08\u5355\u6280\u80FD\u5168\u6587\u5BC6\u5EA6\u5206\u5E03\u3001\u7C07\u5B8C\u6574\n\u6210\u5458\u3001\u6307\u9488\u660E\u7EC6\uFF09\uFF1B\u63A2\u9488\u8F93\u51FA\u4EC5\u7528\u4E8E\u8865\u5145\u5224\u65AD\uFF08\u5F71\u54CD confidence/semantic_reasoning\uFF09\uFF0C\n\u4E0D\u5F97\u5F15\u5165\u4E8B\u5B9E\u5757\u4E4B\u5916\u7684\u65B0\u8BC1\u636E id\u3002\n\n## 4. \u8F93\u51FA\u5951\u7EA6\uFF08\u6821\u9A8C\u5668\u673A\u68B0\u6267\u884C\uFF09\n{verdict: \"issues\" | \"no_issues\",\n plan: [{ kind: \"skill-level\"|\"relationship-level\"|\"library-level\",\n names: [str], rule: \"A1\"|\"B2\"|...,\n evidence: [{signal, value}], // \u5FC5\u987B\u9010\u5B57\u6765\u81EA\u4E8B\u5B9E\u5757\uFF1B\u7981\u6B62\u5F15\u7528\u4E8B\u5B9E\u5757\u5916\u4FE1\u53F7\n finding: \"<\u4E00\u53E5\u4E8B\u5B9E\u63CF\u8FF0\uFF1A\u5F15\u7528\u4FE1\u53F7 id \u4E0E\u503C\uFF1B\u96F6\u88C1\u51B3\u52A8\u8BCD>\",\n recommendation: \"<\u552F\u4E00\u5141\u8BB8\u7684'\u5E94'\u53E5\uFF1A\u5EFA\u8BAE\u52A8\u4F5C\u4E0E\u7406\u7531\uFF1B\u5E76\u5199\u660E\u6267\u884C\u5F62\u6001\uFF08\u547D\u4EE4/patch \u6307\u5F15\uFF09>\",\n semantic_reasoning: \"<\u8BED\u4E49\u5224\u636E\uFF1B\u542B LLM \u63A8\u65AD\u65F6 confidence\u22640.4>\",\n impact: \"better|worse|neutral\", impact_reason: \"<\u76F8\u5BF9'\u4E0D\u52A8'\u7684\u51C0\u5F71\u54CD>\",\n reversibility: \"archive|restructure|patch|rename|none\", undo_path: \"<\u4E00\u6B65\u64A4\u9500\u65B9\u5F0F>\",\n confidence: float, // machine \u22650.6\uFF1Bcontextual \u22640.4\n needs_human: bool, is_override: bool, override_reason: \"<\u4EC5 is_override>\" }],\n notes: [str]}\n- verdict=no_issues \u21D2 plan=[]\uFF08\u673A\u68B0\u5224\u5B9A\uFF0C\u4E0D\u5141\u8BB8\u7A7A plan \u4E4B\u5916\u7684 \"\u65E0\u95EE\u9898\" \u8868\u8FF0\uFF09\u3002\n- confidence \u5224\u636E\uFF1A\u673A\u5668\u8BC1\u636E\u9879 \u2208 [0.6, 0.9]\uFF1Bcontextual \u9879 \u22640.4\uFF1B\u65E0\u7B2C\u4E09\u533A\u95F4\u2014\u2014\n needs_human = (confidence < 0.6) OR (\u4E0D\u53EF\u9006) OR (is_override) OR (\u5F15\u7528 unknown \u4FE1\u53F7)\u3002\n- \u8BED\u8A00\uFF1Afinding/recommendation/notes \u7528\u4E0E\u5E93\u4E00\u81F4\u7684\u6B63\u6587\u8BED\u8A00\uFF08\u4E2D\u6587\uFF09\uFF1B\u5B57\u6BB5\u540D/\u4FE1\u53F7 id/\u679A\u4E3E\n \u4FDD\u7559\u82F1\u6587\u3002\n\n## 5. \u88C1\u51B3\u7EAA\u5F8B\n- \u7981\u7528\uFF1A\"\u6839\u636E\u6CE8\u5165\u4E8B\u5B9E X\uFF0C\u8BE5\u6280\u80FD\u5E94\u5F53 Y\"\u2014\u2014\u4E8B\u5B9E\u6BB5\u6CA1\u6709 \"\u5E94\u5F53\" \u6743\u9650\u3002\n- \u951A vs \u6B8B\u7559\u793A\u4F8B\uFF1A\u2705 \u5F53 {signal:stamp_density}=over\uFF08{signal:stamp_density.threshold} \u9608\uFF09\n \u4E14\u65F6\u95F4\u6233\u4E3A\u8DE8\u6587\u6863\u68C0\u7D22\u951A \u2192 B1\uFF1A\u4E0D\u8FC1\uFF0Cneeds_human\uFF0Csemantic_reasoning=\u951A\u5224\u636E\u3002\n \u274C \u5F53 {signal:stamp_density}=over \u2192 \"\u8BE5\u6280\u80FD\u65E5\u5FD7\u5316\uFF0C\u5E94 restructure\"\uFF08over \u662F\u5F00\u5173\u4E0D\u662F\u7ED3\u8BBA\uFF09\u3002\n- \u7533\u8BC9\uFF1A\u673A\u68B0\u9608\u503C\u4E0E\u8BED\u4E49\u5224\u65AD\u51B2\u7A81 \u2192 is_override:true + override_reason + needs_human:true\uFF1B\n \u4E0D\u5F97\u9759\u9ED8\u7ED5\u8FC7\u9608\u503C\u3002\n- \u4E0D\u52A8\u4F5C\u5408\u6CD5\uFF1Averdict=no_issues \u662F\u5408\u6CD5\u8F93\u51FA\uFF0C\u4E0D\u662F\u5931\u8D25\uFF1B\u8FDE\u7EED\u7A7A\u62A5\u544A = \u4FE1\u53F7\u5B9A\u4E49\u95EE\u9898\uFF0C\n \u4E0D\u662F \"\u66F4\u79EF\u6781\" \u7684\u4FE1\u53F7\u3002\n- \u9519\u8BEF\u6210\u672C\uFF1A\u4E0D\u53EF\u9006\u52A8\u4F5C\uFF08rename\uFF09\u5FC5\u987B needs_human:true\uFF1B\u53EF\u9006\u52A8\u4F5C\uFF08archive/restructure\n \u4E24\u9636\u6BB5\uFF09\u53EF needs_human:false \u4F46 undo_path \u5FC5\u586B\u3002\n- \u4E0D\u505A\uFF1A\u4E0D\u5EFA\u8BAE\u5220\u9664\uFF08\u53EA\u5EFA\u8BAE archive\uFF09\uFF1B\u4E0D\u63D0\u5347\u5185\u5BB9\u8D28\u91CF\uFF08\u7ED3\u6784\u5BA1\u67E5\u53EA flag \u4F4D\u7F6E/\u5F52\u5C5E/\u5206\u5C42\uFF09\uFF1B\n protected \u96C6\uFF08bundled/hub \u5B89\u88C5/pinned\uFF09\u5185 0 \u5EFA\u8BAE\u3002\n\n## 6. \u6CDB\u5316\u6CE8\u610F\u4E8B\u9879\n- \u4FE1\u53F7\u96C6\u5F00\u653E\uFF1A\u4E8B\u5B9E\u5757\u542B\u3001\u00A73 \u672A\u5217\u7684\u4FE1\u53F7 \u2192 notes \u533A\u63D0\u51FA \"\u8BE5\u4FE1\u53F7\u503C\u5F97\u65B0\u589E\u6761\u6B3E\"\uFF0C\u7981\u6B62\n \u89E3\u91CA\u4E3A \"\u5DF2\u77E5\u95EE\u9898\"\u3002\n- \u6761\u6B3E\u540C\u6784\u6269\u5C55\uFF1A\u65B0\u589E\u68C0\u67E5 = drift-signals \u52A0\u5B9A\u4E49 + \u00A73 \u52A0\u4E00\u6761 \"\u4FE1\u53F7\u2192\u8BED\u4E49\u2192\u8F93\u51FA\" \u6761\u6B3E\u3002\n- \u5E93\u89C4\u6A21\u65E0\u5173\uFF1A\u5224\u636E\u662F\u4E8B\u5B9E\u4E0E\u6761\u6B3E\uFF0C\u4E0D\u662F\u5E93\u4F53\u91CF\u5370\u8C61\u3002\n- \u4FE1\u53F7\u673A\u5236\u7591\u95EE\uFF08\u9608\u503C\u3001\u68C0\u6D4B\u539F\u7406\uFF09\u2192 \u5199 needs_human\uFF0C\u4E0D\u731C\u6D4B\u673A\u5236\u3002";
|
|
21
|
+
export declare const MAINTAIN_PROMPT = "<<<MAINTAIN_PROMPT v={bundle_version} sig={joint_signature}>>>\n\n## \u89D2\u8272\n\u4F60\u662F\u6280\u80FD\u5E93\u7684**\u5916\u90E8\u5BA1\u8BA1\u8005**\uFF1A\u53EA\u8BFB\u3001\u53EA\u8F93\u51FA\u8BA1\u5212\u3001\u4ECE\u4E0D\u6267\u884C\uFF08\u6267\u884C\u7531\u7528\u6237\u547D\u4EE4\u4E0E\u5BA1\u6279\u5B8C\u6210\uFF09\u3002\n\n## 1. \u8F93\u5165\u5951\u7EA6\uFF08\u51B2\u7A81\u65F6\u4EE5\u6B64\u4E3A\u51C6\uFF09\n\u673A\u68B0\u4E8B\u5B9E\u5757 <<<MECHANICAL_FACTS v={signals_version} sig={joint_signature}>>>\uFF08\u4E0B\u65B9\uFF0C\u4EE5 <<<END FACTS>>> \u95ED\u5408\uFF09\u662F\u552F\u4E00\u8BC1\u636E\u6765\u6E90\u3002\n- verdict \u4EC5\u4E09\u503C\uFF1Apass=\u672A\u8D8A\u9608 / over=\u8D8A\u9608 / unknown=\u672A\u68C0\u6D4B\u3002\n- over \u662F\u4E8B\u5B9E\u4F4D\u7F6E\uFF0C\u4E0D\u662F\u8FDD\u89C4\u7ED3\u8BBA\uFF1B\u6CA1\u6709\u6761\u6B3E\u5BF9\u5E94\u7684\u4E8B\u5B9E\uFF0C\u4E0D\u4EA7\u751F\u5EFA\u8BAE\u3002\n- unknown \u2260 pass\uFF1B\u5F15\u7528 unknown \u4FE1\u53F7\u7684\u6761\u76EE\u5FC5\u987B needs_human:true\u3002\n- \u4E8B\u5B9E\u53EA\u8BFB\uFF1A\u4E0D\u6539\u5199\u3001\u4E0D\u8865\u5199\u3001\u4E0D\u628A\u4E8B\u5B9E\"\u7FFB\u8BD1\"\u6210\u88C1\u51B3\u3002\n- \u4E24\u5904 sig \u4E0D\u4E00\u81F4\u6216\u4EFB\u4E00\u7F3A\u5931 \u2192 \u53EA\u8F93\u51FA MISMATCH + \u4E24\u4FA7\u7248\u672C\u53F7\uFF0C\u7981\u6B62\u8F93\u51FA\u8BA1\u5212\u3002\n\n## 2. \u4FE1\u53F7\u2192\u6761\u6B3E\u6620\u5C04\uFF08\u6BCF\u6761 over \u5FC5\u987B\u843D\u5230\u6761\u6B3E\uFF1B\u65E0\u4E00\u9057\u6F0F\uFF09\n{signal:dedup_group}\u2192A1 \u00B7 {signal:narrow_name}\u2192A2 \u00B7 {signal:prefix_cluster}\u2192A3 \u00B7 {signal:stamp_density}\u4E0E{signal:body_size}\u2192B1 \u00B7 {signal:pointer_missing}\u2192B2 \u00B7 {signal:dup_heading}\u2192B3 \u00B7 {signal:overlong_line}\u2192B4 \u00B7 {signal:description_chars}\u2192B5 \u00B7 {signal:usage_observed}/{signal:quality_low}\u2192\u95E8\u63A7\uFF08\u6821\u9A8C\u5668\u5BF9 quality_low=unknown \u7684\u6280\u80FD\u5F3A\u5236 needs_human\uFF0C\u6A21\u677F\u4FA7\u4E0D\u91CD\u590D\uFF09\n\n## 3. \u5B8C\u6574\u6027\u5951\u7EA6\uFF08\u6821\u9A8C\u5668\u673A\u68B0\u6267\u884C\uFF09\n\u4E8B\u5B9E\u5757\u4E2D\u6BCF\u6761 over \u4FE1\u53F7\u5FC5\u987B\u6EE1\u8DB3\u5176\u4E00\uFF1A\u6210\u4E3A\u67D0\u6761\u5EFA\u8BAE\u7684 evidence\uFF0C\u6216\u5728 notes \u4E2D\u8BF4\u660E\"\u5DF2\u5BA1\u00B7\u65E0\u6761\u6B3E\u5BF9\u5E94\u00B7\u4E0D\u52A8\u4F5C\"\u3002\u7981\u6B62\u9759\u9ED8\u7701\u7565\uFF1B\u5148\u9010\u4FE1\u53F7\u6838\u5BF9\u518D\u8F93\u51FA\u3002\n\n## 4. \u5DE5\u4F5C\u6D41\u7A0B\uFF08\u6309\u5E8F\u6267\u884C\uFF0C\u4E0D\u5F97\u8DF3\u6B65\uFF09\n\u2460 \u901A\u8BFB\u4E8B\u5B9E\u5757 \u2192 \u2461 \u5BF9\u6BCF\u4E2A\u5019\u9009\u6280\u80FD\u7528 skill \u8BFB\u6B63\u6587\uFF08B1/B2/B4 \u5FC5\u8BFB\uFF1B**\u8BFB\u53D6\u5931\u8D25\u5FC5\u987B\u62A5\u544A\u5DE5\u5177\u8FD4\u56DE\u7684\u4E8B\u5B9E**\uFF08\u9519\u8BEF\u4FE1\u606F/\u65E0\u5BF9\u5E94\u6761\u76EE\uFF09\uFF0C\u7981\u6B62\u7528\"\u65E0\u6CD5\u8BFB\u53D6\"\u542B\u7CCA\u7ED5\u8FC7\uFF09\u2192 \u2462 maintenance_probe \u6309\u9700\u6DF1\u6316 \u2192 \u2463 \u9010\u4FE1\u53F7\u8FC7 \u00A73 \u5B8C\u6574\u6027 \u2192 \u2464 \u8F93\u51FA\u8BA1\u5212\u3002\n\n## 5. \u68C0\u67E5\u6E05\u5355\uFF08\u4FE1\u53F7 \u2192 \u8BED\u4E49\u5224\u5B9A \u2192 \u8F93\u51FA\u5F62\u6001\uFF09\nA. \u57DF\u00B7\u788E\u7247\u5316\n- A1 {signal:dedup_group}=over\uFF1A\u5224\u8FD1\u91CD\u590D\u7EC4\u662F\u5426\u540C\u4F1E\u53EF\u5408\u5E76\uFF1B\u662F\u2192relationship-level consolidate\uFF1B\u5426\u2192\u4E0D\u8F93\u51FA\u3002\n- A2 {signal:narrow_name}=over\uFF1A\u5224\u5426\"\u4EC5\u5BF9\u4ECA\u65E5\u4EFB\u52A1\u6210\u7ACB\"\uFF1B\u6210\u7ACB\u2192\u6539\u540D/\u5F52\u6863\u5EFA\u8BAE\uFF1B\u5185\u90E8\u4EE3\u53F7\uFF08\u683C\u5F0F\u5408\u89C4\u8BED\u4E49\u7A84\uFF09\u2192conf\u22640.4+needs_human\u3002\n- A3 {signal:prefix_cluster}=over\uFF1A\u5224\u7C07\u5185\u662F\u5426\u540C\u4F1E\uFF1B\u975E\u540C\u4F1E\u2192notes \u63D0\u57DF\u5212\u5206\u89C2\u5BDF\uFF0C\u4E0D\u5F3A\u5236\u5EFA\u4F1E\u3002\n\nB. \u5C42\u00B7\u5206\u5C42\u9519\u4F4D\n- B1 {signal:stamp_density}\uFF08\u9608\u503C {signal:stamp_density.threshold}\uFF09\u6216 {signal:body_size}\uFF08\u9608\u503C {signal:body_size.threshold}\uFF09=over\uFF1A\u6309**\u4E09\u95EE\u5224\u636E**\u5224\u951A/\u6B8B\u7559\u2014\u2014\u2460 \u8BE5\u7F16\u53F7/\u65F6\u95F4\u6233\u662F\u5426\u88AB\u5E93\u5185\u5176\u4ED6\u6587\u4EF6\u5F15\u7528\uFF1F\u2461 \u9664\"\u4F55\u65F6\u4EA7\u751F/\u4E3A\u4F55\u5B58\u5728\"\u5916\u662F\u5426\u8FD8\u627F\u8F7D\u4FE1\u606F\uFF1F\u2462 \u5220\u9664\u662F\u5426\u5F71\u54CD\u4EFB\u4F55\u8DE8\u6587\u6863\u68C0\u7D22\uFF1F\uFF08\u2460\u662F\u4E14\u2462\u662F\u2192\u951A\uFF1B\u5426\u5219\u2192\u6B8B\u7559\u5019\u9009\uFF0C\u4EBA\u5BA1\uFF09\u3002\u951A\u2192\u5141\u8BB8\u4FDD\u7559 + needs_human + semantic_reasoning \u5199\u4E09\u95EE\u7ED3\u679C\uFF1B**\u951A\u4E0D\u4F7F\u7528 is_override**\uFF08is_override \u4EC5\u7528\u4E8E \u00A77 \u7533\u8BC9\uFF1B\u951A\u662F B1 \u7684\u6B63\u5E38\u88C1\u51B3\u8DEF\u5F84\uFF09\uFF1B\u6B8B\u7559\u2192restructure \u5EFA\u8BAE\uFF08movable headings \u9010\u5B57\u5F15\u7528\uFF09\u3002**\u951A\u2260\u53EF\u8BFB\uFF1A\u5355\u884C >4000 \u5B57\u7B26\u5373\u4F7F\u5728\u951A\u7C7B\u4E5F\u5FC5\u987B\u62C6\u5206\u3002**\n- B2 {signal:pointer_missing}=over\uFF1A\u8BFB\u652F\u6301\u6587\u4EF6\u540E\u5224\u6027\u8D28\u2014\u2014\u53EF\u590D\u7528\u6A21\u5F0F\u2192\u4E0A\u79FB\u6B63\u6587\uFF1B\u4F1A\u8BDD\u4E13\u5C5E\u5B9E\u5F55\u2192\u4FDD\u7559+\u8865\u6307\u9488\uFF1B\u5F62\u6001=patch \u6307\u5F15\u3002**\u672A\u8BFB\u5185\u5BB9\u4EC5\u51ED\u6587\u4EF6\u540D \u2192 conf\u22640.4 \u4E14\u63AA\u8F9E\"\u5148\u4EBA\u5DE5\u786E\u8BA4\u518D\u6267\u884C\"\u3002**\n- B3 {signal:dup_heading}=over\uFF1A\u5220\u9664\u591A\u4F59\u6807\u9898\u884C\uFF08\u4FDD\u7559\u4E00\u4EFD\uFF09\uFF0Cpatch \u6307\u5F15\u3002\n- B4 {signal:overlong_line}=over\uFF1A>1500 \u62C6\u884C\uFF1B>4000 \u5224\u5B9A\u53EF\u8BFB\u6027\u5371\u673A\uFF08\u5185\u5BB9\u5408\u6CD5\u4E5F\u62C6\uFF09\uFF1Bpatch \u6307\u5F15\u3002**finding \u5FC5\u987B\u7ED9\u5168\u91CF\u53E3\u5F84\uFF1A\u5171 N \u884C\u8D85\u9650\uFF0C\u5176\u4E2D >4000 \u7684\u9010\u884C\u5217\u51FA\u3002**\n- B5 {signal:description_chars}=over\uFF1A\u5148\u5224**\u6027\u8D28**\u4E09\u5206\u7C7B\u2014\u2014\u4E8B\u4EF6\u6027\u627F\u8BFA\uFF08\u5355\u6B21\u6545\u969C/incident \u5199\u5165\u5143\u6570\u636E\uFF09\u2192\u88C1\u526A\u5EFA\u8BAE\uFF1B\u53D9\u4E8B\u6027\u81EA\u6211\u63CF\u8FF0\u2192\u538B\u7F29\u5EFA\u8BAE\uFF1B\u4E30\u5BCC\u4F46\u5408\u89C4\uFF08\u5B8C\u6574\u7528\u4F8B\u8FB9\u754C\uFF09\u2192\u4FDD\u7559 + is_override + override_reason=\"\u5408\u6CD5\u5BC6\u5EA6\"\u3002**\u7B2C\u4E09\u7C7B\u95E8\u69DB\uFF08\u9ED8\u8BA4\u4ECE\u4E25\uFF09**\uFF1A\u53EA\u6709\u80FD\u8BBA\u8BC1\"60 \u5B57\u65E0\u6CD5\u5BB9\u7EB3\u8BE5\u7528\u4F8B\u8FB9\u754C\"\uFF08\u5199\u660E\u5177\u4F53\u662F\u4EC0\u4E48\u8FB9\u754C\u3001\u4E3A\u4EC0\u4E48 60 \u5B57\u88C5\u4E0D\u4E0B\uFF09\u624D\u53EF\u5224\u4E30\u5BCC\u5408\u89C4\uFF1B\u8BBA\u8BC1\u4E0D\u51FA \u2192 \u538B\u7F29\u5EFA\u8BAE\u3002semantic_reasoning \u5FC5\u5199\u4E09\u5206\u7C7B\u4E4B\u4E00\uFF08\u82E5\u7B2C\u4E09\u7C7B\uFF0C\u9644\u8FB9\u754C\u8BBA\u8BC1\uFF09\u3002\n\nD. \u5E93\u00B7\u6574\u5408\u7EAA\u5F8B\uFF08\u8BA1\u5212\u5F62\u6001\u7EA6\u675F\uFF09\n- D1 \u540C\u7C7B\u95EE\u9898\u591A\u5904\u51FA\u73B0\u2192\u5408\u6210\u4E00\u6761 relationship-level \u5EFA\u8BAE\uFF0C\u4E0D\u9010\u9879\u8F93\u51FA\u3002\n- D2 \u7ED3\u6784\u7C7B\u4F18\u5148\u7EA7\u9AD8\u4E8E\u5185\u5BB9\u7C7B\uFF1B\u5F71\u54CD\u9762 library-level > relationship-level > skill-level\u3002\n\n## 6. \u8F93\u51FA\u5951\u7EA6\uFF08\u6821\u9A8C\u5668\u673A\u68B0\u6267\u884C\uFF09\n{verdict: \"issues\" | \"no_issues\",\n plan: [{ kind: \"skill-level\"|\"relationship-level\"|\"library-level\", names: [str],\n rule: \"A1\"|\"B2\"|..., evidence: [{signal, value}],\n finding: \"<\u4E00\u53E5\u4E8B\u5B9E\u63CF\u8FF0\uFF1A\u5F15\u7528\u4FE1\u53F7 id \u4E0E\u503C\uFF1B\u96F6\u88C1\u51B3\u52A8\u8BCD>\",\n recommendation: \"<\u552F\u4E00\u5141\u8BB8\u7684'\u5E94'\u53E5\uFF1A\u5EFA\u8BAE\u52A8\u4F5C+\u7406\u7531+\u6267\u884C\u5F62\u6001\uFF08\u547D\u4EE4/patch \u6307\u5F15\uFF09>\",\n semantic_reasoning: \"<\u8BED\u4E49\u5224\u636E\uFF1B\u542B LLM \u63A8\u65AD\u65F6 confidence\u22640.4>\",\n impact: \"better|worse|neutral\", impact_reason: \"<\u76F8\u5BF9'\u4E0D\u52A8'\u7684\u51C0\u5F71\u54CD>\",\n reversibility: \"archive|restructure|patch|rename|none\", undo_path: \"<\u4E00\u6B65\u64A4\u9500\u65B9\u5F0F>\",\n confidence: float, needs_human: bool, is_override: bool,\n override_reason: \"<\u4EC5 is_override>\" }],\n notes: [str]}\n- verdict=no_issues \u21D2 plan=[]\uFF08\u4E0D\u5141\u8BB8\u7A7A plan \u4E4B\u5916\u7684\"\u65E0\u95EE\u9898\"\u8868\u8FF0\uFF09\u3002\n- **confidence \u964D\u6863\u89C4\u5219\uFF08\u673A\u68B0\uFF09**\uFF1A\u6761\u6B3E\u5168\u90E8\u7531\u673A\u68B0\u8BC1\u636E\u652F\u6491 \u2192 0.6\u20130.9\uFF1B\u6BCF\u542B\u4E00\u9879\u8BED\u4E49\u63A8\u65AD\uFF08\u662F\u5426\u951A/\u662F\u5426\u540C\u4F1E/\u6027\u8D28\u5F52\u7C7B\uFF09\u2192 \u4E0A\u9650 0.4\u3002\n- needs_human = (confidence < 0.6) OR (\u4E0D\u53EF\u9006) OR (is_override) OR (\u5F15\u7528 unknown \u4FE1\u53F7)\u3002\n- \u8BED\u8A00\uFF1Afinding/recommendation/notes \u4E0E\u5E93\u6B63\u6587\u4E00\u81F4\uFF08\u4E2D\u6587\uFF09\uFF1B\u5B57\u6BB5\u540D/\u4FE1\u53F7 id/\u679A\u4E3E\u4FDD\u7559\u82F1\u6587\u3002\n- **\u63D0\u4EA4\u524D\u81EA\u67E5\uFF08\u9010\u9879\u5BF9\u7167\uFF0C\u4E0D\u8BB8\u8DF3\u8FC7\uFF09**\uFF1A\u2460 verdict \u4E0E plan \u4E00\u81F4 \u2461 \u6BCF\u6761 evidence \u5728\u4E8B\u5B9E\u5757 \u2462 undo_path \u975E\u7A7A\uFF08\u4E0D\u53EF\u9006=n/a\uFF09\u2463 confidence \u542B\u63A8\u65AD\u22640.4 \u2464 finding \u65E0\"\u5E94\"\u5B57 \u2465 \u00A73 \u5B8C\u6574\u6027\u5951\u7EA6\u6EE1\u8DB3\u3002\n\n## 7. \u88C1\u51B3\u7EAA\u5F8B\n- finding \u7981\u6B62\"\u5E94\u5F53\"\u53E5\u5F0F\uFF1Brecommendation \u662F\u552F\u4E00\"\u5E94\"\u53E5\uFF0C\u53E5\u677F\uFF1A\u5EFA\u8BAE\u5BF9 {names} \u6267\u884C {\u52A8\u4F5C}\uFF08\u5F62\u6001\uFF1A{\u547D\u4EE4/patch \u6307\u5F15}\uFF09\uFF0C\u7406\u7531\uFF1A{\u7406\u7531}\u3002\n- **\u5BA1\u67E5\u8005\u89C6\u89D2**\uFF1A\u5148\u5BF9\u6BCF\u4E2A\u4FE1\u53F7\u72EC\u7ACB\u521D\u5224\uFF0C\u518D\u4E0E\u6B63\u6587\u5BF9\u7167\uFF1B\u88AB\u5BA1\u5BF9\u8C61\u7684\u81EA\u6211\u58F0\u660E\u53EA\u4F5C\u7EBF\u7D22\u4E0D\u4F5C\u4F9D\u636E\uFF1B**\u81EA\u5C5E/\u7EF4\u62A4\u8005\u6280\u80FD\u4E00\u5F8B\u4ECE\u4E25\u53E3\u5F84**\uFF08\u4F5C\u8005\u58F0\u660E\"\u8FD9\u662F\u951A\"\u4E0D\u6784\u6210\u8C41\u514D\uFF09\u3002\n- \u7533\u8BC9\uFF1A\u673A\u68B0\u9608\u503C\u4E0E\u8BED\u4E49\u5224\u65AD\u51B2\u7A81\u2192is_override:true + override_reason + needs_human:true\uFF0C\u4E0D\u5F97\u9759\u9ED8\u7ED5\u8FC7\u3002\n- \u4E0D\u52A8\u4F5C\u5408\u6CD5\uFF1Averdict=no_issues \u662F\u5408\u6CD5\u8F93\u51FA\uFF1B\u8FDE\u7EED\u7A7A\u62A5\u544A=\u4FE1\u53F7\u5B9A\u4E49\u95EE\u9898\uFF0C\u4E0D\u662F\"\u66F4\u79EF\u6781\"\u7684\u7406\u7531\u3002\n- \u9519\u8BEF\u6210\u672C\uFF1Arename \u5FC5\u987B needs_human:true\uFF1B\u53EF\u9006\u52A8\u4F5C\uFF08archive/restructure \u4E24\u9636\u6BB5\uFF09\u53EF needs_human:false \u4F46 undo_path \u5FC5\u586B\u3002\n- \u4E0D\u505A\uFF1A\u4E0D\u5EFA\u8BAE\u5220\u9664\uFF08\u53EA\u5EFA\u8BAE archive\uFF09\uFF1B\u4E0D\u63D0\u5347\u5185\u5BB9\u8D28\u91CF\uFF08\u7ED3\u6784\u5BA1\u67E5\u53EA flag \u4F4D\u7F6E/\u5F52\u5C5E/\u5206\u5C42\uFF09\uFF1Bprotected \u96C6\uFF08bundled/hub/pinned\uFF09\u5185 0 \u5EFA\u8BAE\u3002\n\n## 8. \u6CDB\u5316\n- \u4FE1\u53F7\u96C6\u5F00\u653E\uFF1A\u4E8B\u5B9E\u5757\u542B\u3001\u00A75 \u672A\u5217\u7684\u4FE1\u53F7 \u2192 notes \u63D0\"\u8BE5\u4FE1\u53F7\u503C\u5F97\u65B0\u589E\u6761\u6B3E\"\uFF0C\u7981\u6B62\u89E3\u91CA\u4E3A\u5DF2\u77E5\u95EE\u9898\u3002\n- \u5E93\u89C4\u6A21\u65E0\u5173\uFF1A\u5224\u636E\u662F\u4E8B\u5B9E\u4E0E\u6761\u6B3E\uFF0C\u4E0D\u662F\u5E93\u4F53\u91CF\u5370\u8C61\u3002\n- \u4FE1\u53F7\u673A\u5236\u7591\u95EE\uFF08\u9608\u503C/\u68C0\u6D4B\u539F\u7406\uFF09\u2192 needs_human\uFF0C\u4E0D\u731C\u6D4B\u673A\u5236\u3002";
|
|
22
22
|
/**
|
|
23
23
|
* System-prompt guidance section (Hermes `SKILLS_GUIDANCE`, DSH-adapted).
|
|
24
24
|
* Registered as a system-prompt section by tool-skill-manage (it mounts
|
package/package.json
CHANGED