跳到主要内容

数据截至 (上游 commit 38277815ed44)

自进化引擎:触发器作业与 FIX / DERIVED / CAPTURED

30 秒导读: 这是 OpenSpace 的灵魂章。别的 agent 框架把技能(SKILL.md)当成人写死的静态文件; OpenSpace 让技能自己进化。新版把"任务后进化"做成了作业流水线:任务收尾先把证据落进 EvidenceStore,TriggerEngine 按检查点(如 task_session_persisted)创建持久化的 TriggerJob;EvolutionEngine.process_job 把每个作业沿 建包 → 决策 → 准入 → 改稿 → 验证 → 行为评估 → 提交 分段处理;真正改文件的内核(SkillEvolver)依旧是"定向 diff、落盘验证、 失败把磁盘真实内容喂回重试",并按 FIX/DERIVED/CAPTURED 三种语义把新版本连同"从谁演化来" 的血缘写进 SQLite 版本 DAG。

上游重构提示: 旧版"三触发器"(process_analysis / process_tool_degradation / process_metric_check,入口在旧 tool_layer.py)与确认门(_llm_confirm_evolution)、 定期体检(_diagnose_skill_health)、<EVOLUTION_COMPLETE>/<EVOLUTION_FAILED> 令牌 已被移除/替换:触发统一改为 TriggerJob(ANALYSIS / QUALITY_SIGNAL / MANUAL),进化循环改用 结构化 finalization JSON 收敛(evolver.py:1252 docstring)。分析器(analyzer.py)、改稿内核 (evolver.py 的三模式与 apply-retry)、patch 模块、版本 DAG 内核保留。本章按新版源码重写。

本章属于 OpenSpace 系列。上游是主循环(任务怎么执行、finalize 怎么落证据) 和技能协议(技能怎么被披露/加载);下游边界是 工具接地层(工具质量信号如何变成 QUALITY_SIGNAL 触发)。全景见 index


1. 这是什么(零基础也能懂)

一句话定义

自进化引擎 = 技能的"复盘 + 改稿"系统。 一次任务跑完,它像一个复盘教练:回看整场录像, 判断"这次用的攻略行不行",然后要么改攻略、要么写本进阶攻略、要么把刚摸索出的新打法记成一份新攻略。

它解决什么问题

人写的 SKILL.md 会过时、会不够用、会漏掉刚被 agent 现场摸索出来的好套路。手工维护跟不上。 自进化引擎让这三件事自动发生:

问题现象对应进化
技能坏了 / 过时攻略里的 curl 参数格式变了、工具退化了FIX(原地修,同名新版本)
技能不够强能用但常常做不完,或两个技能该合成一个DERIVED(衍生新版,新目录)
冒出新套路这次任务没靠现成技能,却摸索出一条可复用的路子CAPTURED(捕获成全新技能)

一句话直觉

把它想成 git for skills,而且提交者是 AI:每次进化都创建一个新的技能"版本节点",记录 它的父节点、改了什么(content_diff)、当时的完整快照(content_snapshot)。所有节点连成一张 版本 DAG(有向无环图),你随时能回溯一个技能"从哪进化来、改过几手"。

用起来什么样

这套系统对用户是透明的——它挂在任务收尾的 post-execution 阶段(runtime/app.py:1966 run_post_execution_tasks),任务一结束自动跑。日志里会看到技能被列出/发现/进化的痕迹, 进化出的新技能出现在返回值的 evolved_skills 里。一次任务,一批证据,零到多个 TriggerJob, 每个作业落成零到多个新的技能版本。

本节不碰代码细节;下面开始由浅入深往里钻。


2. 顶层全景(这条闭环怎么转)

怎么读这张图

从上到下是时间顺序:任务收尾落证据 → 触发器建作业 → 进化流水线逐段处理 → 版本入库。 左列是"触发与编排",右列是"流水线各段",改稿内核在底部被各段复用。

任务收尾 ExecutionFinalizer.finalize [execution_finalizer.py:23]
│ 发证据(task_finished_pre_persist / task_session_persisted)
│ 扫 session/skill/tool-quality/quality-signal 四类 checkpoint

① 触发阶段 TriggerEngine [triggers/engine.py:25]
· evaluate_checkpoint("task_session_persisted") → ANALYSIS 作业
(AnalysisTriggerPolicy [triggers/policies.py:44])
· QUALITY_SIGNAL 作业(工具失败/语义问题 [policies.py:192-200])
· MANUAL 作业(手动请求 [policies.py:116])
│ 作业持久化在 TriggerStore(可认领/可恢复)

② 编排阶段 runtime 侧认领并执行
run_post_execution_tasks → drain_evolution_jobs [runtime/app.py:1966/:2068]
· claim_jobs / claim_next(多 worker 安全) [triggers/store.py:372/:294]

③ 流水线 EvolutionEngine.process_job [evolution/engine.py:103]
packet(证据打包) ─▶ decision(分析+决策) ─▶ admission(准入)
─▶ authoring(改稿) ─▶ validate ─▶ behavior eval ─▶ commit(入库)
│ │改稿内核:SkillEvolver [evolver.py:364]
│ │ _evolve_fix / _evolve_derived / _evolve_captured
│ │ _run_evolution_loop + _apply_with_retry
▼ ▼
patch.py 落盘 store.py:evolve_skill(1476)
fix/derive/create 新版本入库 + 旧版失活 + lineage 血缘

部件一句话职责

部件干什么在哪个文件
EvidenceStore证据落盘与检索,触发器的输入源openspace/skill_engine/evidence/store.py:312
TriggerEngine / TriggerStore按策略建 TriggerJob、认领、完成openspace/skill_engine/triggers/engine.py:25triggers/store.py:65
EvolutionEngine作业流水线(mode 分级:autonomous/fix_only/audit_only)openspace/skill_engine/evolution/engine.py:75
DecisionEngine在证据包上跑分析器,产出可审计决策openspace/skill_engine/decision/engine.py:34
EvolutionAdmission准入门:该决定要不要真的动技能openspace/skill_engine/evolution/admission.py:146
SkillEvolver(authoring 后端)改稿内核:三种模式的定向改写openspace/skill_engine/evolver.py:364
EvolutionValidator / SkillBehaviorEvaluator结构校验 / 行为评估(带修订回路)evolution/validator.py:129evolution/behavior_eval.py:232
EvolutionCommitter提交:写库、备份、失活旧版openspace/skill_engine/evolution/engine.py:718
ExecutionAnalyzer复盘一次执行,产出 ExecutionAnalysisopenspace/skill_engine/analyzer.py:307
patch 模块把改动文本(FULL/DIFF/PATCH)真正应用到技能目录openspace/skill_engine/patch.py
SkillStoreSQLite 持久化 + 版本 DAG(父子血缘、质量计数)openspace/skill_engine/store.py:435
types全套数据模型openspace/skill_engine/types.py

主线走一遍(高层)

任务收尾时 ExecutionFinalizer 先把证据落盘并扫描各 checkpoint;run_post_execution_tasks (runtime/app.py:1966)让 TriggerEngine.evaluate_checkpoint 建 ANALYSIS 作业,随即 drain_evolution_jobs(runtime/app.py:2068)认领并逐个交给 EvolutionEngine.process_job; 质量侧的 maybe_evolve_quality(runtime/app.py:2319)按全局执行计数补发 QUALITY_SIGNAL 作业。 作业处理产物 evolved_skill_records 汇进 final_result["evolved_skills"] 返回。


3. 触发链第一段:把一次执行复盘成结构化结论

这一节讲分析阶段:录制轨迹进,ExecutionAnalysis 出。它现在被包进 DecisionEngine 作为流水线的 decision 段,但分析器本体基本未变。

3.1 它要解决的小问题

主循环只留下一堆录制文件(录像),不是结论。要进化,先得有人回看录像、下判断: 任务完成了吗?哪个技能被真正用上了?哪个工具出了问题?这份判断就是 ExecutionAnalysis(types.py:334)。

3.2 入口与去重

ExecutionAnalyzer.analyze_execution(analyzer.py:356)是入口。防御逻辑保留: 录制目录不存在就跳过(analyzer.py:381-383);一个任务只分析一次—— load_analyses_for_task 查到已有分析直接返回(analyzer.py:388-392),避免重复烧钱; 另有低信号跳过(_should_skip_low_signal_analysis,analyzer.py:399)。

3.3 读录制轨迹:把录像整理成上下文

_load_recording_context(analyzer.py:675)把录制目录里的文件拼成 context dict (metadata.json / conversations.jsonl / 工具调用记录)。分析不只看 agent 说了什么, 还看它实际做了什么——两路证据交叉,判断更准。

3.4 构造分析 prompt:只喂相关信息

_build_analysis_prompt(analyzer.py:963)把 context 压成 prompt,做预算控制: 对话日志走优先级截断(conversation_formatter.format_conversations,用户指令与最后一轮 回复永不截断)、技能正文超长截断并提示用 read_file 看全文。

3.5 分析循环与解析

_run_analysis_loop(analyzer.py:1260)是个小型 agent 循环:多数一轮出 JSON,必要时可调工具 查证;_parse_analysis(analyzer.py:1528)把 JSON 转成强类型 ExecutionAnalysis_correct_skill_ids(analyzer.py:102)按"同名前缀 + 编辑距离 ≤ 阈值"纠正 LLM 复述错的 hex 后缀。分析入库走 store.record_analysis(store.py:1441,调用点 analyzer.py:422), tool_issues 会汇入证据层(QUALITY_SIGNAL 的燃料,见 §4.2)。


4. 触发引擎:从证据到 TriggerJob

旧版三个散装入口被统一的"证据 → 策略 → 作业"模型取代。触发器回答"什么时候、为什么改"。

4.1 证据先行

一切触发都以 EvidenceStore(evidence/store.py:312)里的证据为基础:任务收尾发的 task_finished 事件、会话持久化 checkpoint 扫描、技能 listed/invoked 事件(第2章)、 工具执行结果(evidence/tool_adapter.py)都是证据。TriggerEnginemanifest watermark(单调递增水位)保证"每条证据最多触发一次"。

4.2 三类触发

default_policies(triggers/policies.py:216)装三类策略:

触发类型何时产生策略
ANALYSIStask_session_persisted checkpoint(任务会话已持久化)AnalysisTriggerPolicy(policies.py:44),幂等键 analysis:task_finished:<session>:<task>(policies.py:84-88)
QUALITY_SIGNAL工具失败/LLM 语义问题累积成信号映射表 policies.py:192-200(tool_failure_affects_skilltool_semantic_issue)
MANUAL用户/宿主手动请求进化ManualTriggerPolicy(policies.py:116)

ANALYSIS 作业还会带任务树:_source_task_ids_for_task_tree 把子任务(多 agent)的 执行一并圈进分析范围(policies.py:62-70)。

4.3 作业的持久化与认领

TriggerJob(triggers/types.py:33)持久化在 TriggerStore(triggers/store.py:65): claim_next(:294)/claim_jobs(:372)支持多 worker 安全认领,complete(:431) 盖终态(completed/failed/superseded/rejected)。同一个作业不会被处理两遍,失败的作业 可恢复重试——这正是流水线对旧版"散装调用"的核心改进。

4.4 质量触发的接线

maybe_evolve_quality(runtime/app.py:2319)按全局执行计数节流,经 _create_quality_signal_trigger_jobs(runtime/app.py:2330)把新质量信号变成 QUALITY_SIGNAL 作业并排空——工具退化(第4章)由此进入同一条进化流水线,不再需要专门的 process_tool_degradation 入口。


5. 进化流水线:EvolutionEngine.process_job

EvolutionEngine.process_job(evolution/engine.py:103)是新版心脏,分段处理一个作业:

做什么关键符号
1 packet按 trigger 类型把证据打包_build_packet_result(engine.py:293)
2 decision在包上跑分析/决策,产出可审计决定DecisionEngine.decide(decision/engine.py:46)
3 admission准入门:noop/reject/human_review/candidate/directEvolutionAdmission.admit(admission.py:164)
4 authoring改稿:产出 staged edit_author_validate_commit(engine.py:410)
5 validate结构校验 staged editEvolutionValidator(validator.py:129)
6 behavior eval行为级评估,不过关带反馈重改(最多 behavior_eval_max_revisions 次,默认 2,循环头 engine.py:438)SkillBehaviorEvaluator(behavior_eval.py:232)
7 commit写库、备份、旧版失活EvolutionCommitter(engine.py:718)

三个模式闸门(evolution_mode 构造参数,engine.py:89,归一化于 :100)控制放行范围:

模式行为
autonomous(默认)全部放行
fix_only非 FIX 决定只落 candidate 不改文件(engine.py:174)
audit_only只做 decision + admission,到准入为止(engine.py:160)

幂等与恢复是硬要求。 每个决定若已有"已提交动作"直接复用持久化结果(engine.py:204-216 的 "reusing durable result"分支); 作业异常/取消会映射成 failed_retryable 等终态(runtime/app.py:2139-2210 的取消补全、 evolution/recovery.py:45EvolutionRecovery),提交到一半的动作可被 recover_committing_actions 捞回(runtime/app.py:2230 附近)。

改稿后端由运行时装配:SkillEvolverAuthoringBackend 包住 SkillEvolver (runtime/app.py:934-941),EvolutionCommitter 接 skill_store/registry/trigger_engine (runtime/app.py:944-958)。也就是说,旧版 SkillEvolver 的"怎么改文件"内核原样服役, 只是被套上了"先 staged、再验证、再提交"的流水线外壳。


6. 改稿内核:FIX / DERIVED / CAPTURED 与 apply-retry

三种模式回答"怎么改"。定义在 EvolutionType(types.py:33),映射到 SkillOriginFIXED / DERIVED / CAPTURED(types.py:43)。

6.1 三者一眼对比

模式意图父节点数落到哪is_active 怎么变generation
FIX原地修坏/过时的指令恰好 1同名同目录(文件就地覆盖)旧版失活,新版激活父 + 1
DERIVED增强/特化/合并1 个(增强)或多个(合并)新名字新目录父保持激活,新版也激活max(父) + 1
CAPTURED捕获全新可复用套路0(无父)全新目录新版激活0(根节点)

这套血缘规则写在 SkillOrigin 的语义里(types.py:43-56),是理解版本 DAG 的钥匙: FIXED 是同一条技能线的"下一个版本",DERIVED 是"分叉出的新技能",CAPTURED 是"新长出的根"。

6.2 三个落点方法

  • _evolve_fix(evolver.py:731):要求恰好 1 个父;父目录全部内容喂给 LLM,新内容就地覆盖; 落盘后从磁盘重读 name/description,新 skill_id 形如 {name}__v{gen+1}_{hex}, 并写 .skill_id 边车保证重启后仍认得。
  • _evolve_derived(evolver.py:831):单父增强/多父合并;名字取自新 frontmatter, 否则加 -enhanced / -merged 后缀(evolver.py:878),_sanitize_skill_name (evolver.py:83)规范成小写连字符并截断,防"越衍生越长";聚合所有父的工具依赖与 tags。
  • _evolve_captured(evolver.py:979):无父;落盘目录的优先级链保留—— ① ctx.capture_dir(宿主指定)→ ② 从分析推断(_infer_capture_dir_from_analysis, evolver.py:1213)→ ③ 注册表第一个技能根兜底(evolver.py:1023-1026 注释明说)。

6.3 结构化收尾的进化循环

_run_evolution_loop(evolver.py:1252)仍仿 GroundingAgent 设计,但收敛信号换了: 不再用 <EVOLUTION_COMPLETE> 令牌,而是要求 LLM 输出一段 finalization JSON (status=complete 带改动载荷 / status=failed 带原因,docstring evolver.py:1258-1262)。 前几轮开工具探查,最后一轮关工具逼决策;全程录进 conversations.jsonl(agent_name="SkillEvolver")。

6.4 apply-retry:失败把磁盘真实内容喂回去

_apply_with_retry(evolver.py:1526)最多试 _MAX_EVOLUTION_ATTEMPTS = 3 次 (evolver.py:262):apply → 结构校验 → 失败则(derive/create 先删失败残留目录, evolver.py:1569-1570)把 error + 磁盘当前真实内容一起塞回 LLM 产修正版。这是 闭环里的"验证"环节——不光要 LLM 说改好了,还要 patch 真能应用、目录真能过校验。


7. 改动怎么落地:patch 模块的多格式与容错匹配

三个操作 × 三种格式 × 一套容错匹配。模块整体未变,仅行号漂移。

7.1 三个操作对应三种模式

操作服务于位置
fix_skillFIX(就地覆盖,产出 diff + 快照)patch.py:151
derive_skillDERIVED(拷贝/新建目录)patch.py:242
create_skillCAPTURED(全新目录)patch.py:389

7.2 三种 LLM 输出格式,自动识别

detect_patch_type(patch.py:462)按结构标记嗅探:*** Begin Patch → 多文件 PATCH; *** Begin Files / 行首 *** File: → 多文件 FULL(parse_multi_file_full,patch.py:510, 带路径逃逸检查);<<<<<<< SEARCH → 单文件 SEARCH/REPLACE(apply_search_replace,patch.py:958); 兜底单文件 FULL。PATCH 走 parse_patch(patch.py:754)解析 hunk,两阶段应用 (先全部校验+算新内容,再统一落盘)。

7.3 容错匹配:LLM 给的旧文本几乎从不逐字精确

  • PATCH 路径 seek_sequence(openspace/skill_engine/patch.py:626):4 级逐步放宽 (精确 → rstrip → strip → Unicode 归一化+strip)。
  • DIFF 路径 fuzzy_match.fuzzy_find_match(fuzzy_match.py:258,六级链 REPLACER_CHAINfuzzy_match.py:249):精确 → 逐行 trim → 块锚点(Levenshtein)→ 空白归一化 → 缩进弹性 → 整块边界 trim。匹配不到时用相近行拼可读报错回给 LLM, 正好接上 §6.4 的重试。

8. 持久化:SkillStore 与版本 DAG

8.1 存了什么

数据库仍是 SQLite(.openspace 下的技能库 DB),SkillStore(store.py:435)管几张表: skill_records(主表:身份+血缘+质量计数)、skill_lineage_parents(版本 DAG 的边)、 execution_analysesskill_judgments、工具依赖/标签等。

8.2 evolve_skill:原子的"新版入库 + 旧版失活"

evolve_skill(store.py:1476)在同一 SQL 事务里完成:

  • FIXED:把所有同名父置 is_active=0——一条技能线只有最新版激活。
  • DERIVED:父保持激活,新版也激活——分叉出两条活跃线。
  • 都会写好 parent_skill_ids 血缘。

CAPTURED 无父,走 save_record(根节点)。

8.3 版本 DAG 怎么查

  • find_children(parent_skill_id)(store.py:2089):"从我派生出去的"。
  • get_versions(name)(store.py:1890):同一技能的所有版本按 generation 升序—— 一条技能线的完整演化史。

一张 FIX 链 + DERIVED 分叉的示意:

weather (gen0, IMPORTED, active=✗) ← 被 FIX 后失活
└─FIX→ weather (gen1, FIXED, active=✓) 同名同路径,只有它活着
└─DERIVED→ weather-enhanced (gen2, DERIVED, active=✓) 新名新目录,分叉

captured-xyz (gen0, CAPTURED, active=✓) ← 无父,新长出的根

8.4 防重复处理:作业状态取代 processed_at 戳

旧版靠 execution_analyses.evolution_processed_at 时间戳防重;新版改为作业级幂等: TriggerJob 的认领/终态(triggers/store.py:294/:431)保证同一分析作业只被成功处理一次, 进化引擎还复用"已提交动作"的持久化结果(engine.py:204-216)。

8.5 质量计数在哪更新

技能的 total_selections / total_applied / total_completions / total_fallbacks 仍在分析入库时 原子自增(record_analysis,store.py:1441);此外第2章的 record_skill_event_now (listed 等事件)也在攒行为数据。这些计数正是检索质量过滤(第2章 §3.4)的输入 (SkillRecord 的派生属性,types.py:421)。


9. 数据模型速览(types.py)

类型是什么位置
EvolutionType进化动词枚举 FIX/DERIVED/CAPTUREDtypes.py:33
SkillOrigin血缘来源枚举(含 IMPORTED)types.py:43
SkillVisibility可见性枚举(public/private,第5章)types.py:19
SkillLineage一个版本节点的血缘(origin/generation/parents/diff/snapshot)types.py:77
EvolutionSuggestion一条进化建议types.py:264
ExecutionAnalysis一次任务的完整复盘(1 任务 1 份)types.py:334
SkillRecord技能完整档案(身份+血缘+质量计数+is_active)types.py:421

content_diff 按父数量分档的策略仍在 SkillLineage 的构建逻辑里:0 父(全量 + diff)、 单父(正常统一 diff)、多父(空串——合并是"创作"不是"打补丁",意图记在 change_summary)。


10. 巧妙之处(可借鉴的技术)

  • 进化做成"作业流水线"而不是散装调用。 证据 → TriggerJob → 分段处理,每段有产物、 有状态、可审计(evolution/audit.py:68 EvolutionAuditService)、可恢复——比旧版 "三个入口各自为政"健壮得多。
  • mode 闸门让同一引擎多档运行。 autonomous/fix_only/audit_only 三档 (engine.py:92),灰度上线进化能力时可以先 audit_only 只看决策不动文件。
  • 行为评估带修订回路。 改完不只看结构,还做行为级评估;不过关把反馈喂回改稿后端 重来(最多 2 次,engine.py:433-441),这是"进化质量"的又一道闸。
  • LLM 技能 ID 纠错。 _correct_skill_ids(analyzer.py:102)按同名前缀+自适应编辑距离 纠正,让"一个字符错位就找不到技能"的脆弱点消失。
  • 把磁盘真实内容喂回重试。 _apply_with_retry(evolver.py:1526)重试时附上盘上 当前内容当 ground truth,配合多级容错匹配显著提升落盘成功率。
  • 两阶段应用 patch。 多文件改动要么全成要么全不落,不留半吊子状态。
  • 进化全程可回放。 分析、进化、重试的对话都写进 conversations.jsonl,出问题能原样复盘。

11. 边界与局限(诚实)

  • 进化质量上限 = 分析 LLM 的判断力。 整条链由分析/决策驱动,分析看走眼,下游进化跟着偏; 准入门与行为评估能挡一部分,但不是语义正确性证明。
  • 新流水线默认关闭。 evolution_engine_enabled(application.py 的 OpenSpaceConfig) 默认 False,运行时没建进化引擎时任务后只走 legacy 分析 (_run_legacy_execution_analysis,runtime/app.py:2017)——旧内核与新版流水线并存, 读源码时先分清走的哪条路。
  • 有超时,可能半成品。 inline 模式任务后进化受 post_execution_timeout_s 限时,超时 标 post_execution_timed_out;后台作业有恢复机制但可能延后完成。
  • 重试 3 次仍失败就放弃。 _apply_with_retry 耗尽 _MAX_EVOLUTION_ATTEMPTS 后返回 None 并清理残目录,这次进化就丢了(留待后续作业用新数据重来)。
  • 多父 DERIVED 不留 diff。 合并的 content_diff 是空串,要看具体改了什么只能各父的 content_snapshot 自己比。
  • 本章不覆盖工具质量监控本身。 "工具执行怎么被记进证据、质量信号怎么攒出来"属于 第 4 章;本章只消费信号触发进化。

12. 代码地图(导航索引)

用真实符号名 grep(比行号抗漂移)。所有引用 as-of sourceCommit 3827781

主题文件路径符号名
任务后进化编排openspace/runtime/app.py:1966run_post_execution_tasks
作业认领与执行openspace/runtime/app.py:2068drain_evolution_jobs
质量触发接线openspace/runtime/app.py:2319:2330maybe_evolve_quality / _create_quality_signal_trigger_jobs
legacy 分析兜底openspace/runtime/app.py:2017_run_legacy_execution_analysis
证据库openspace/skill_engine/evidence/store.py:312EvidenceStore
证据打包openspace/skill_engine/evidence/packet_builder.py(packet_builder 模块)
触发器引擎openspace/skill_engine/triggers/engine.py:25TriggerEngine.evaluate_checkpoint
ANALYSIS 触发策略openspace/skill_engine/triggers/policies.py:44AnalysisTriggerPolicy
MANUAL 触发策略openspace/skill_engine/triggers/policies.py:116ManualTriggerPolicy
默认策略组openspace/skill_engine/triggers/policies.py:216default_policies
作业持久化/认领openspace/skill_engine/triggers/store.py:65TriggerStore.claim_next / claim_jobs / complete
作业数据类型openspace/skill_engine/triggers/types.py:33TriggerJob / TriggerJobSpec
进化流水线openspace/skill_engine/evolution/engine.py:103EvolutionEngine.process_job
改稿-验证-提交段openspace/skill_engine/evolution/engine.py:410_author_validate_commit
提交器openspace/skill_engine/evolution/engine.py:718EvolutionCommitter
准入门openspace/skill_engine/evolution/admission.py:146EvolutionAdmission.admit
决策引擎openspace/skill_engine/decision/engine.py:34DecisionEngine.decide
结构校验openspace/skill_engine/evolution/validator.py:129EvolutionValidator
行为评估openspace/skill_engine/evolution/behavior_eval.py:232SkillBehaviorEvaluator
审计服务openspace/skill_engine/evolution/audit.py:68EvolutionAuditService
恢复openspace/skill_engine/evolution/recovery.py:45EvolutionRecovery
分析入口openspace/skill_engine/analyzer.py:356ExecutionAnalyzer.analyze_execution
读录制轨迹openspace/skill_engine/analyzer.py:675_load_recording_context
构造分析 promptopenspace/skill_engine/analyzer.py:963_build_analysis_prompt
分析 agent 循环openspace/skill_engine/analyzer.py:1260_run_analysis_loop
解析成 ExecutionAnalysisopenspace/skill_engine/analyzer.py:1528_parse_analysis
技能 ID 容错纠正openspace/skill_engine/analyzer.py:102_correct_skill_ids
改稿内核openspace/skill_engine/evolver.py:364SkillEvolver
FIX 模式openspace/skill_engine/evolver.py:731_evolve_fix
DERIVED 模式openspace/skill_engine/evolver.py:831_evolve_derived
CAPTURED 模式openspace/skill_engine/evolver.py:979_evolve_captured
进化循环(结构化收尾)openspace/skill_engine/evolver.py:1252_run_evolution_loop
落盘+校验+重试openspace/skill_engine/evolver.py:1526_apply_with_retry(_MAX_EVOLUTION_ATTEMPTS=3,:262)
FIX 落盘openspace/skill_engine/patch.py:151fix_skill
DERIVED 落盘openspace/skill_engine/patch.py:242derive_skill
CAPTURED 落盘openspace/skill_engine/patch.py:389create_skill
格式自动识别openspace/skill_engine/patch.py:462detect_patch_type
多文件 FULL 解析openspace/skill_engine/patch.py:510parse_multi_file_full
4 级降级匹配openspace/skill_engine/patch.py(seek_sequence 定义处)seek_sequence
多文件 PATCH 解析openspace/skill_engine/patch.py:754parse_patch
SEARCH/REPLACE 应用openspace/skill_engine/patch.py:958apply_search_replace
6 级模糊匹配链openspace/skill_engine/fuzzy_match.py:249:258REPLACER_CHAIN / fuzzy_find_match
技能库openspace/skill_engine/store.py:435SkillStore
分析入库(计数自增)openspace/skill_engine/store.py:1441record_analysis
原子进化入库openspace/skill_engine/store.py:1476evolve_skill
一技能全版本openspace/skill_engine/store.py:1890get_versions
找子节点(DAG)openspace/skill_engine/store.py:2089find_children
数据模型openspace/skill_engine/types.py:33EvolutionType / SkillOrigin / SkillLineage / SkillRecord / ExecutionAnalysis
对话优先级截断openspace/skill_engine/conversation_formatter.pyformat_conversations