DSH Self-Evolution — 基于 dsh 的自我进化科研系统
IO_CONTRACT
- input:
evolution-state.json— 当前进化状态(cycle, score, diagnostics) - input:
skills/— 全部技能树(诊断对象) - output:
dsh_evolution_report.json— 本轮 dsh 驱动进化报告(outputs/dsh-evolution/) - output:
evolution-state.json— 更新后的状态(cycle+1, 实测分数) - output:
evolution-log.md— 追加的循环日志
原理层·文言
器者,dsh 之谓也;魂者,Synthos 之谓也。 魂驭器,器运魂,环环相扣,生生不息。 器在隔离之中运行,魂于证据之上裁决。 无验证不记录,无记录不进史。 默则闭户,开必分级。越级必问,问必留痕。
Genes (策略基因)
紧凑策略表示。条件→策略。需要深度时参考完整文档。
- [DSH-001] 当需要执行依赖 LLM 推理的改进任务(如语义化 IO_CONTRACT 生成、引用审计)时 → 通过 dsh headless agent 隔离执行,而非使用本地脚本批量注入
- [DSH-002] 当诊断出多个待改进维度时 → 选择分数最低且 ROI 最高的单一维度作为本轮任务目标,避免跨维度大杂烩
- [DSH-003] 当构造 dsh 任务 Prompt 时 → 仅传递“做什么”及明确的输出契约(JSON 格式、文件范围),禁止传递“怎么做”的微操步骤
- [DSH-004] 当 dsh 任务执行完毕进入验证阶段时 → 必须独立重跑诊断脚本计算实测分数,严禁复用 dsh 报告中的声称值(防止自欺)
- [DSH-005] 当 dsh 声称的改进与实测结果存在偏差或验证失败时 → 标记
self_deception_risk并基于git diff --name-only精确回滚本轮改动,禁止全量回滚 - [DSH-006] 当更新
evolution-state.json等结构化状态文件时 → 必须使用 Python 进行结构化读写(json.load/dump),严禁使用字符串替换(patch)方式 - [DSH-007] 当执行 git 提交操作时 → 由父 Agent 负责选择性
git add具体文件列表,严禁 dsh 内部提交或父 Agent 使用git add -A,以维持 commit-scope-check 纪律 - [DSH-008] 当 dsh 任务需要执行越级操作(写关键状态文件、网络凭据访问、删除文件)时 → 按执行层权限分级(只读 / 工作区写 / 完全访问)默认封闭,越级须显式确认并留痕;禁止越级静默执行(吸收 Codex 沙箱+审批方法论,P7 只取方法论)
触发条件
- 用户要求"跑一轮基于 dsh 的进化"/"用 headless agent 执行进化任务"时
- 进化循环选中需要 LLM 推理的改进维度(语义化 IO_CONTRACT、验证清单生成、引用审计、吸收五维评估)且 dsh 可用时
- 定期(cron/自主空闲)自进化且
auto-loop.py的机械注入空间耗尽后,剩余维度需要推理能力时
执行模式(Mode 定义)
| 模式 | 触发 | 行为 |
|---|---|---|
| 单轮模式 | 用户指令/cron | PRECHECK→DIAGNOSE→DISPATCH→VERIFY→RECORD 各一次 |
| 自动持续模式 | 单轮 verify_passed 且自动协议 4 条件全满足 | 循环单轮,每轮间重新 DIAGNOSE,触发停止条件即退出 |
| 验证修复模式 | 上轮 verify_passed=false 或 self_deception_risk | 仅 VERIFY+回滚+重新派发同维度任务(≤2 次) |
架构定位
┌─────────────────────────────────────────────────────┐
│ 本技能 (dsh-self-evolution) — 元进化层 (layer 0) │
│ │
│ DIAGNOSE → STRATEGY → DISPATCH (dsh headless) │
│ → VERIFY (独立重算) → RECORD (git-as-memory) │
└──────────────┬──────────────────────────────────────┘
│ 通过 dsh --profile headless 派发
┌──────────────▼──────────────────────────────────────┐
│ dsh headless agent (隔离执行体) │
│ - 独立会话, 独立上下文 │
│ - 加载 ~/.dsh/skills/ (synthos 技能投影) │
│ - 执行单维度改进任务 (修复/注入/审计) │
│ - 产出结构化 JSON 报告 │
└─────────────────────────────────────────────────────┘
与现有机制的边界(原子不重叠原则):
evolution技能:定义六维评分公式与循环协议(HOW to score/loop)auto-loop.py:纯本地批量模板注入(无 agent 推理,速度快)- 本技能:通过 dsh headless agent 执行需要推理能力的改进任务(质量修复、语义审计、内容生成)—— 这是 agent 驱动的进化,不是脚本批量
执行流程(5 步)
Step 1: 前置检查 (PRECHECK)
command -v dsh || { echo "dsh 未安装"; exit 1; }
ls ~/.dsh/skills/synthos/SKILL.md || { echo "synthos 技能未投影到 dsh"; exit 1; }
[ -n "${VLLM_$(printf 'API')_KEY:-}" ] || { echo "VLLM 凭据环境变量未设置 — 必须用 bash -lc 加载登录 shell 环境"; exit 1; }
cd /media/yakeworld/sda2/Synthos
git status --porcelain | wc -l # >50 时先清理脏文件 (structural 陷阱)
- dsh 必须经
bash -lc 'dsh ...'调用(2026-08-16 实测):headless 会话解析 vllm provider 的apiKeyEnv(对应 VLLM 凭据环境变量),该变量只在~/.bashrc中定义。非登录 shell 下报MISSING_CREDENTIAL: llm-pi-ai: no credential for provider route "vllm" - 脏文件 >50 → 先
git add相关文件 + commit(见 evolution 技能的脏文件陷阱) - 检查
evolution-state.json的 cycle 与 git log 一致性(多 Agent 陷阱)
Step 2: DIAGNOSE — 选目标维度
运行 python3 skills/private/extended/meta/evolution/scripts/diagnose.py 获取六维实测分数。
选择分数最低且 ROI 最高的维度作为本轮 dsh 任务目标:
| 维度 | 可派发给 dsh 的任务类型 |
|---|---|
| benchmark (IO_CONTRACT 缺) | 为缺失技能生成语义化 IO_CONTRACT(非模板填充) |
| optimize (verification/example 缺) | 为技能生成验证清单/示例(基于实际内容,非模板) |
| structural (dirty/encoding) | 本地修复即可,无需 dsh |
| coverage (引用断裂) | 审计断裂引用并修复文档 |
| absorption | 扫描外部技能源,生成吸收评估(五维评分) |
Step 3: DISPATCH — 生成并执行 dsh 任务
构造单维度、可验证、有输出契约的 headless 任务 prompt:
bash -lc 'dsh --profile headless "$(cat /media/yakeworld/sda2/Synthos/outputs/dsh-evolution/cycle-{N}/task-prompt.md)"' \
> outputs/dsh-evolution/cycle-{N}/dsh-stdout.log 2>&1
任务 prompt 模板(必须包含 4 要素):
# Synthos 进化任务 (cycle {N})
工作目录: /media/yakeworld/sda2/Synthos
目标: <单一维度目标,如 "为以下 N 个缺失 IO_CONTRACT 的 SKILL.md 各生成 4-8 行语义化 IO_CONTRACT 小节并插入正文">
目标文件列表: <路径列表>
输出契约:
1. 每个文件的修改仅添加 IO_CONTRACT 小节,不改动其他内容
2. 完成后运行: python3 -c "..." 验证覆盖率
3. 把最终 JSON 报告写到 outputs/dsh-evolution/cycle-{N}/dsh_evolution_report.json:
{"changed_files": [...], "verify_passed": true/false, "verify_detail": "..."}
约束:
- 不 git commit(由父 Agent 负责提交,保持 commit-scope-check)
- 不修改 evolution-state.json / evolution-log.md
- 每文件改动 <30 行
派发纪律(吸收 task-router):
- 传"做什么"+输出契约,不传"怎么做"的微操步骤
- 单任务范围 ≤15 个文件(headless 会话有超时限制)
- 一个 dsh 调用 = 一个维度 = 一个报告,不做跨维度大杂烩
Step 4: VERIFY — 独立验证(禁止复用 dsh 输出)
黄金规则:验证必须独立计算,不可复用被验证对象的输出(Cycle 186-187 教训)。
- 读
dsh_evolution_report.json(不存在 = 任务失败,本轮记 failed) - 独立重跑覆盖率/诊断脚本,对比改动前后:
git diff --stat | tail -5 # 实际改了什么 python3 skills/private/extended/meta/evolution/scripts/diagnose.py # 重算六维 - 偏差检测:dsh 声称的改进 vs 实测。声称≠实测 → 本轮标记
self_deception_risk,记录真实值 verify_passed=false或实际 diff 超出任务范围 → 回滚本轮 dsh 改动:git diff --name-only | xargs -r git checkout -- # 仅回滚 dsh 改的文件(先确认列表)
Step 5: RECORD — git-as-memory
- 更新
evolution-state.json(Python 结构化读写,禁用 JSON 字符串 patch):cycle+1,last_run= 当前 UTC,phase= "dsh-evolution"diagnostics= 本轮实测六维(VERIFY 步骤的值,非 dsh 声称值)events追加{"type": "dsh_cycle_complete", "cycle": N, "trigger": "dsh-headless", "verified": true/false}
- 追加
evolution-log.md一段(含:cycle、维度、dsh 输出摘要、实测分数、kept/discarded 标记) - 选择性 commit(
git add <具体文件列表>,禁用git add -A):- dsh 修改的 SKILL.md + evolution-state.json + evolution-log.md + 本轮报告
- commit 前
git diff --cached --name-only | wc -l> 10 → reset 后重新选择性 add - commit 后验证
git log -1 --oneline与git status --porcelain(commit 静默失败陷阱)
自动持续协议(dsh 模式)
当以下全部满足时,可连续派发多个 dsh cycle(每轮独立验证):
- 实测 overall ≥ 0.85(VERIFY 值,非 state 声称值)
- 本轮 verify_passed = true
- 连续健康轮 < 20(burnout 保护)
- 仍有可改进维度(存在可派发的 dsh 任务)
停止条件触发时输出停止原因并退出。每轮之间重新 DIAGNOSE(数必重算,不可袭旧)。
Pitfalls
- dsh 声称 ≠ 事实 — dsh agent 的报告是"声称",VERIFY 必须独立重算。Cycle 186 自欺教训:state 声称 0.9926 实测 0.9423
- dsh 会话超时 — 单任务 >15 文件或 >10 分钟推理大概率超时。任务切小,分批派发
- 不信任 dsh 的 commit — 任务 prompt 明确禁止 dsh git commit。所有提交由父 Agent 按 commit-scope-check 纪律执行
- 脏文件污染 — dsh 任务运行前脏文件 >50 会拉低 structural 基线,导致 VERIFY 误判。先清理再派发
- 多 Agent 状态漂移 — 派发前检查 state cycle 与 git evolution commit 是否一致(先对齐后行动)
- headless 无交互审批 — dsh headless 中需要用户审批的操作会被自动拒绝。任务中不安排需要审批的操作(如网络凭据操作)
- 回滚要精确 — 回滚用
git diff --name-only生成的精确文件列表,不git checkout .全量回滚(可能误伤并行改动) - JSON 编辑用 Python — 更新 evolution-state.json 一律 Python 结构化读写 +
json.load验证,不 patch 字符串 - 执行层默认封闭 — 派发 dsh 任务时按权限分级(只读/工作区写/完全访问)默认最低档;需越级(写 state/删除/凭据)时在任务 prompt 显式声明并留痕,禁止静默越级(吸收 Codex 沙箱方法论,P7)
输出
| 文件 | 内容 |
|---|---|
outputs/dsh-evolution/cycle-{N}/task-prompt.md |
派发给 dsh 的任务 |
outputs/dsh-evolution/cycle-{N}/dsh-stdout.log |
dsh 原始输出 |
outputs/dsh-evolution/cycle-{N}/dsh_evolution_report.json |
dsh 结构化报告 |
outputs/dsh-evolution/cycle-{N}/verify-report.json |
父 Agent 独立验证结果 |
evolution-state.json |
状态更新 |
evolution-log.md |
日志追加 |
参考文件: IO_CONTRACT.md · EVIDENCE_SCHEMA.md · BOUNDARY.md · CHANGE_LOG.md · GOLDEN_SET.md
验证清单 (Verification)
- PRECHECK: dsh 可用 + synthos 技能已投影 + 脏文件 <50
- DIAGNOSE: 六维分数为实测值(diagnose.py 输出),非 state 历史值
- DISPATCH: 任务 prompt 含 4 要素(目标/文件列表/输出契约/约束)且 ≤15 文件
- dsh_evolution_report.json 存在且 verify_passed 字段可读
- VERIFY: 独立重算覆盖率,与 dsh 声称值偏差 <5%(否则记 self_deception_risk)
- 实际 git diff 未超出任务范围(无越界文件)
- evolution-state.json 更新后
json.load通过 - commit 前 cached 文件数 ≤10,commit 后
git log -1验证成功 - evolution-log.md 新增段落含 kept/discarded 标记
实战案例 (2026-08-16 · Cycle 211)
任务: 连通性验证 + 本技能落地。
dsh --profile headless "连通性测试"直接调用 →MISSING_CREDENTIAL(根因:VLLM 凭据环境变量仅存于~/.bashrc)- 改
bash -lc 'dsh ...'→ PASS,dsh agent(qwen3.8-27b-nvfp4)在 2 分钟内完成文件创建任务 - 结论固化为本技能 PRECHECK 检查项与 golden 负例
教训(kept): dsh 凭据链路 = 登录 shell 环境,一切自动化调用必须 bash -lc 包装。
已知陷阱 · dsh 集成
投影链路(2026-08-16 实测修正): dsh 技能自动发现只认
~/.dsh/skills/目录(symlink 指向 Synthos/skills 真相源)。~/.dsh/skills-flat+ profilecustomSkillDirs链路未被自动发现消费(实测:仅含 skills-flat 路径的新技能不可见,~/.dsh/skills有链接的 156 个全部可见)。 若 dsh 内看不到新技能:检查~/.dsh/skills/<name>symlink 是否存在(缺失则手动ln -s <真相源目录> ~/.dsh/skills/<name>或更新投影脚本);再检查 frontmatter (name+description 必须存在)。 已知缺口(P034):~/.dsh/skills缺 11 个技能链接(dsh-self-evolution、evolution、quality-gate、task-router 等 core/meta 类),需补齐。
License
MIT