902 lines
19 KiB
Markdown
902 lines
19 KiB
Markdown
# Gene 方案
|
||
|
||
## 这份文档针对什么
|
||
|
||
这个项目里,`Skill` 已经不是一个抽象概念,而是完整的业务实体:
|
||
|
||
* 后端有 `project_skill` 持久化模型
|
||
* Git 同步会扫描仓库里的 `SKILL.md`
|
||
* 聊天构建会把启用的技能注入上下文
|
||
* 前端有技能列表、详情、编辑、删除、扫描
|
||
* 内建技能模板也已经存在
|
||
|
||
所以这里不应该“用 Gene 替换 Skill”,而应该是:
|
||
|
||
* `Skill` 继续负责执行和交付能力
|
||
* `Gene` 作为新增元层,负责让技能可演化、可比较、可追踪、可继承
|
||
|
||
---
|
||
|
||
## 设计结论
|
||
|
||
`Gene` 的正确位置不是新的执行系统,也不是 `Skill` 的替代品,而是 `Skill` 的生命周期治理层。
|
||
|
||
```text
|
||
Skill = 可执行内容 + 上下文注入 + 业务交付
|
||
Gene = 演化族 + 版本谱系 + 评估记录 + 选择记录
|
||
```
|
||
|
||
更准确地说:
|
||
|
||
```text
|
||
Skill 是可执行的技能内容,负责被扫描、编辑、启用、注入和交付能力。
|
||
|
||
Gene 是 Skill 的演化族,负责组织一个 Skill 在项目内的版本、来源、谱系、评估和选择记录。
|
||
|
||
GeneRevision 是 Gene 下的不可变版本节点,绑定到某个 Skill 内容快照。
|
||
|
||
GeneEvaluation 是对某个 GeneRevision 的评估结果。
|
||
|
||
GeneSelection 是对当前有效 GeneRevision 的显式选择记录。
|
||
```
|
||
|
||
---
|
||
|
||
## 项目现状
|
||
|
||
### Skill 已经落在这些地方
|
||
|
||
* `libs/models/projects/project_skill.rs`
|
||
|
||
* 定义了 `project_skill` 实体
|
||
* 已包含 `source`
|
||
* 已包含 `repo_id`
|
||
* 已包含 `commit_sha`
|
||
* 已包含 `blob_hash`
|
||
* 已包含 `content`
|
||
* 已包含 `metadata`
|
||
* 已包含 `enabled`
|
||
|
||
* `libs/git/hook/sync/mod.rs`
|
||
|
||
* 扫描仓库中的 `SKILL.md`
|
||
* 从 frontmatter 解析 `name`、`description`、`license`、`compatibility`
|
||
* 用 `commit_sha` 和 `blob_hash` 做增量同步
|
||
|
||
* `libs/agent/skills/templates.rs`
|
||
|
||
* 内建技能模板已经编译进程序
|
||
* 这些模板本质上是“系统内置 Skill”
|
||
|
||
* `libs/agent/chat/message_builder.rs`
|
||
|
||
* 读取项目中启用的技能
|
||
* 把技能注入对话上下文
|
||
* 和 embedding / perception 一起影响模型行为
|
||
|
||
* `src/app/project/skills/*`
|
||
|
||
* 已有技能管理 UI
|
||
* 能查看、编辑、删除、扫描技能
|
||
|
||
---
|
||
|
||
## 现有 Skill 的问题
|
||
|
||
当前 `Skill` 已经能用,但还不够“可进化”:
|
||
|
||
* 只有内容,没有明确的演化关系
|
||
* 只有当前状态,没有谱系
|
||
* 只有启用/禁用,没有版本选择
|
||
* 只有来源信息,没有变体比较
|
||
* 只有同步时间和 blob hash,没有“为什么变成这样”的记录
|
||
* 有评估空间,但没有评估结果和版本绑定
|
||
* 有扫描和编辑能力,但没有可审计的回滚与选择记录
|
||
|
||
换句话说,现在的 `Skill` 更像“静态资产”,还不是“进化单元”。
|
||
|
||
---
|
||
|
||
## 设计原则
|
||
|
||
### 1. Skill 仍然是唯一执行实体
|
||
|
||
`Skill` 继续负责:
|
||
|
||
* 被扫描
|
||
* 被编辑
|
||
* 被启用或禁用
|
||
* 被注入聊天上下文
|
||
* 交付实际能力
|
||
|
||
`Gene` 不直接执行任务,不直接调用工具,不直接参与上下文拼装。
|
||
|
||
---
|
||
|
||
### 2. Gene 只管理 Skill 的演化元数据
|
||
|
||
`Gene` 管理的是:
|
||
|
||
* 版本
|
||
* 来源
|
||
* 父子关系
|
||
* 变体
|
||
* 评估
|
||
* 选择
|
||
* 淘汰
|
||
* 回滚
|
||
|
||
它不应该成为第二套 `Skill` 系统。
|
||
|
||
---
|
||
|
||
### 3. GeneRevision 必须不可变
|
||
|
||
`Skill` 可以是当前可编辑对象。
|
||
|
||
`GeneRevision` 是不可变演化节点。一旦创建,不应再修改:
|
||
|
||
* 内容快照
|
||
* 父代关系
|
||
* 来源信息
|
||
* `commit_sha`
|
||
* `blob_hash`
|
||
* `content_hash`
|
||
* `mutation_reason`
|
||
* `mutation_diff`
|
||
|
||
后续任何内容变化、prompt 变化、工具权限变化、上下文注入规则变化,都应该产生新的 `GeneRevision`。
|
||
|
||
---
|
||
|
||
### 4. Evaluation 必须绑定到具体 Revision
|
||
|
||
评估不是评价一个抽象的 `Gene`,而是评价某个具体版本。
|
||
|
||
因此:
|
||
|
||
```text
|
||
GeneEvaluation 必须绑定 revision_id。
|
||
```
|
||
|
||
否则同一个 `Gene` 下存在多个版本时,评估结果无法精确归因。
|
||
|
||
---
|
||
|
||
### 5. Selection 必须显式记录
|
||
|
||
如果系统选择了某个版本作为当前有效版本,必须记录:
|
||
|
||
* 选中了哪个 revision
|
||
* 为什么选它
|
||
* 谁选的
|
||
* 依据什么策略选的
|
||
* 什么时候选的
|
||
* 是否仍然 active
|
||
|
||
这能支持审计、回滚和后续自动选择。
|
||
|
||
---
|
||
|
||
### 6. SKILL.md 仍然是仓库内 Skill 的事实来源
|
||
|
||
仓库里的 `SKILL.md` 仍然是 Git 同步的事实来源。
|
||
|
||
`Gene` 只记录它如何演化,不改变仓库同步的基本语义。
|
||
|
||
---
|
||
|
||
## 核心概念
|
||
|
||
### Skill
|
||
|
||
`Skill` 是现有业务实体。
|
||
|
||
它负责:
|
||
|
||
```text
|
||
可执行内容
|
||
上下文注入
|
||
用户可见编辑
|
||
Git 扫描
|
||
启用 / 禁用
|
||
业务交付
|
||
```
|
||
|
||
### Gene
|
||
|
||
`Gene` 是某个 Skill 的演化族。
|
||
|
||
它负责组织这个 Skill 的生命周期:
|
||
|
||
```text
|
||
这个能力从哪里来
|
||
经历过哪些版本
|
||
有哪些变体
|
||
评估结果如何
|
||
当前选择哪个版本
|
||
哪些版本被淘汰
|
||
```
|
||
|
||
### GeneRevision
|
||
|
||
`GeneRevision` 是 `Gene` 下的一个不可变版本节点。
|
||
|
||
它绑定某个 `Skill` 的内容状态,例如:
|
||
|
||
```text
|
||
skill_id
|
||
skill_slug
|
||
commit_sha
|
||
blob_hash
|
||
content_hash
|
||
content_snapshot_ref
|
||
```
|
||
|
||
### GeneEvaluation
|
||
|
||
`GeneEvaluation` 是对某个 `GeneRevision` 的评估结果。
|
||
|
||
它回答:
|
||
|
||
```text
|
||
这个版本好不好?
|
||
在哪个数据集上测的?
|
||
指标是什么?
|
||
是否通过?
|
||
成本和延迟如何?
|
||
失败样本是什么?
|
||
```
|
||
|
||
### GeneSelection
|
||
|
||
`GeneSelection` 是对当前有效版本的显式选择记录。
|
||
|
||
它回答:
|
||
|
||
```text
|
||
当前选中哪个 revision?
|
||
为什么选它?
|
||
谁选的?
|
||
依据什么策略?
|
||
是否还在生效?
|
||
```
|
||
|
||
---
|
||
|
||
## Gene 和 Skill 的关系
|
||
|
||
可以把关系理解为:
|
||
|
||
```text
|
||
Gene 1 ── has many ── GeneRevision
|
||
GeneRevision ── references ── Skill snapshot
|
||
GeneRevision ── has many ── GeneEvaluation
|
||
Gene ── has one active ── GeneSelection
|
||
GeneSelection ── selects ── GeneRevision
|
||
Skill ── executes ── actual capability
|
||
```
|
||
|
||
也就是说:
|
||
|
||
* `Skill` 解决“能不能做”
|
||
* `Gene` 解决“该保留哪个版本、为什么保留、怎么变体、怎么传播”
|
||
* `GeneRevision` 解决“这个能力在某一刻具体长什么样”
|
||
* `GeneEvaluation` 解决“这个版本是否足够好”
|
||
* `GeneSelection` 解决“当前应该用哪个版本”
|
||
|
||
---
|
||
|
||
## 数据模型
|
||
|
||
### ProjectGene
|
||
|
||
```text
|
||
ProjectGene
|
||
- gene_id
|
||
- project_uuid
|
||
- skill_id
|
||
- skill_slug
|
||
- name
|
||
- description
|
||
- owner
|
||
- status
|
||
- created_at
|
||
- updated_at
|
||
```
|
||
|
||
说明:
|
||
|
||
* `gene_id` 是 Gene 的唯一标识
|
||
* `project_uuid` 绑定项目
|
||
* `skill_id` / `skill_slug` 绑定现有 Skill
|
||
* `status` 可为 `active`、`archived`、`deprecated`
|
||
* `owner` 用于责任归属
|
||
|
||
---
|
||
|
||
### ProjectGeneRevision
|
||
|
||
```text
|
||
ProjectGeneRevision
|
||
- revision_id
|
||
- gene_id
|
||
- version
|
||
- parent_revision_id
|
||
- origin
|
||
- source
|
||
- skill_id
|
||
- skill_slug
|
||
- commit_sha
|
||
- blob_hash
|
||
- content_hash
|
||
- content_snapshot_ref
|
||
- mutation_reason
|
||
- mutation_diff
|
||
- created_by
|
||
- created_at
|
||
```
|
||
|
||
说明:
|
||
|
||
* `revision_id` 是内部唯一版本节点
|
||
* `version` 是用户可见版本号,不承担唯一性职责
|
||
* `parent_revision_id` 表示单父版本关系
|
||
* `origin` 表示来源,例如 `git_sync`、`manual_edit`、`builtin_template`、`migration`
|
||
* `source` 复用现有 `Skill.source`
|
||
* `commit_sha` / `blob_hash` 记录 Git 来源
|
||
* `content_hash` 记录内容稳定标识
|
||
* `content_snapshot_ref` 用于指向当时的内容快照
|
||
* `mutation_reason` 记录为什么产生这个版本
|
||
* `mutation_diff` 记录相对父版本的变化
|
||
|
||
---
|
||
|
||
### ProjectGeneEvaluation
|
||
|
||
```text
|
||
ProjectGeneEvaluation
|
||
- evaluation_id
|
||
- gene_id
|
||
- revision_id
|
||
- eval_name
|
||
- evaluator
|
||
- dataset_ref
|
||
- dataset_version
|
||
- metric_name
|
||
- score
|
||
- threshold
|
||
- passed
|
||
- sample_count
|
||
- failure_count
|
||
- latency_ms_avg
|
||
- cost
|
||
- result_summary
|
||
- result_json
|
||
- evaluated_at
|
||
```
|
||
|
||
说明:
|
||
|
||
* `revision_id` 必填
|
||
* `score` 不应脱离 `metric_name` 单独解释
|
||
* `threshold` 用于判断是否通过
|
||
* `sample_count` 和 `failure_count` 用于判断评估可信度
|
||
* `result_json` 存放详细结果、失败样本、分项指标等
|
||
|
||
---
|
||
|
||
### ProjectGeneSelection
|
||
|
||
```text
|
||
ProjectGeneSelection
|
||
- selection_id
|
||
- gene_id
|
||
- selected_revision_id
|
||
- project_uuid
|
||
- policy
|
||
- reason
|
||
- selected_by
|
||
- selected_at
|
||
- active
|
||
```
|
||
|
||
说明:
|
||
|
||
* 同一个 `gene_id` 同一时间只能有一个 active selection
|
||
* `policy` 可以是 `manual`、`latest_passed`、`best_score`、`stable_low_cost`
|
||
* `reason` 用于审计和回滚
|
||
* `selected_by` 可以是用户、系统或自动策略
|
||
|
||
---
|
||
|
||
## 关于 GeneLineage
|
||
|
||
MVP 阶段不单独引入 `GeneLineage` 表。
|
||
|
||
原因是:如果每个版本只有一个父版本,`ProjectGeneRevision.parent_revision_id` 已经足够表达谱系。
|
||
|
||
```text
|
||
MVP:单父版本树
|
||
Future:多父 DAG / merge / cross-skill inheritance
|
||
```
|
||
|
||
未来如果需要支持合并、交叉继承或复杂谱系,再引入:
|
||
|
||
```text
|
||
ProjectGeneEdge
|
||
- parent_revision_id
|
||
- child_revision_id
|
||
- edge_type
|
||
- mutation_reason
|
||
- mutation_diff
|
||
```
|
||
|
||
---
|
||
|
||
## 关于 Variant
|
||
|
||
`Variant` 是 Gene 的重要能力,但不一定是 MVP 的独立表。
|
||
|
||
这些变化都可以先作为新的 `GeneRevision` 表达:
|
||
|
||
* 更严格的 prompt
|
||
* 更短的 prompt
|
||
* 不同工具权限
|
||
* 不同上下文注入规则
|
||
* 不同评估阈值
|
||
|
||
MVP 中:
|
||
|
||
```text
|
||
不单独引入 ProjectGeneVariant。
|
||
所有变体先作为 GeneRevision 表达。
|
||
```
|
||
|
||
当系统需要以下能力时,再引入 `GeneExperiment` / `GeneVariant`:
|
||
|
||
* A/B 实验
|
||
* 并行流量分配
|
||
* 实验分组
|
||
* 统计显著性
|
||
* 多候选版本同时比较
|
||
|
||
---
|
||
|
||
## Git 同步流程
|
||
|
||
当前 Git 同步已经会扫描仓库中的 `SKILL.md`,并使用 `commit_sha` 和 `blob_hash` 做增量同步。
|
||
|
||
引入 Gene 后,Git 同步流程建议变成:
|
||
|
||
```text
|
||
当 Git 同步发现 SKILL.md 的 blob_hash 变化时:
|
||
|
||
1. 正常创建或更新 project_skill。
|
||
2. 查找该 skill 对应的 project_gene。
|
||
3. 如果不存在 project_gene,则创建一个。
|
||
4. 查找该 gene 下最新的 project_gene_revision。
|
||
5. 如果新的 blob_hash / content_hash 不同,则创建新的 GeneRevision。
|
||
6. 将上一 revision 设为 parent_revision_id。
|
||
7. mutation_reason 默认记录为 git_sync。
|
||
8. mutation_diff 记录上一个 SKILL.md 与当前 SKILL.md 的 diff。
|
||
9. 不自动改变 selected_revision,除非选择策略明确允许。
|
||
```
|
||
|
||
关键约束:
|
||
|
||
```text
|
||
Git sync 可以产生新的 GeneRevision。
|
||
Git sync 不应默认切换当前线上选中版本。
|
||
```
|
||
|
||
这样可以避免仓库变更自动导致线上行为漂移。
|
||
|
||
---
|
||
|
||
## 手动编辑流程
|
||
|
||
当用户在 UI 中编辑 `Skill` 内容时:
|
||
|
||
```text
|
||
1. 更新 project_skill。
|
||
2. 计算新的 content_hash。
|
||
3. 查找对应 project_gene。
|
||
4. 创建新的 project_gene_revision。
|
||
5. parent_revision_id 指向编辑前的 revision。
|
||
6. mutation_reason 记录为 manual_edit。
|
||
7. mutation_diff 记录编辑前后的差异。
|
||
8. 可选择是否自动把新 revision 标记为 selected。
|
||
```
|
||
|
||
建议 MVP 默认:
|
||
|
||
```text
|
||
手动编辑后创建新 revision,但不自动覆盖 active selection。
|
||
由用户显式选择是否启用该 revision。
|
||
```
|
||
|
||
如果产品希望“编辑即生效”,也可以让 selection 同步更新,但必须记录:
|
||
|
||
```text
|
||
policy = manual_edit_auto_select
|
||
reason = "User edited skill content"
|
||
```
|
||
|
||
---
|
||
|
||
## 聊天上下文注入流程
|
||
|
||
现有流程中,`libs/agent/chat/message_builder.rs` 读取项目中启用的 `Skill`,并把技能注入对话上下文。
|
||
|
||
引入 Gene 后,这个原则不变:
|
||
|
||
```text
|
||
message_builder 不直接读取 Gene 内容。
|
||
message_builder 仍然读取启用的 Skill。
|
||
Gene 只影响哪个 Skill revision 被视为推荐版本或当前选中版本。
|
||
```
|
||
|
||
如果未来要让 `GeneSelection` 影响上下文注入,推荐路径是:
|
||
|
||
```text
|
||
GeneSelection
|
||
-> resolve selected GeneRevision
|
||
-> materialize / update project_skill
|
||
-> message_builder reads project_skill
|
||
```
|
||
|
||
不建议:
|
||
|
||
```text
|
||
message_builder
|
||
-> read Gene
|
||
-> assemble prompt
|
||
```
|
||
|
||
因为这会让 `Gene` 偷偷变成新的执行层。
|
||
|
||
---
|
||
|
||
## API 设计
|
||
|
||
MVP API 可以包括:
|
||
|
||
```text
|
||
GET /projects/:project_uuid/skills/:skill_id/gene
|
||
POST /projects/:project_uuid/skills/:skill_id/gene
|
||
|
||
GET /projects/:project_uuid/genes/:gene_id/revisions
|
||
POST /projects/:project_uuid/genes/:gene_id/revisions
|
||
|
||
GET /projects/:project_uuid/genes/:gene_id/evaluations
|
||
POST /projects/:project_uuid/genes/:gene_id/evaluations
|
||
|
||
GET /projects/:project_uuid/genes/:gene_id/selection
|
||
POST /projects/:project_uuid/genes/:gene_id/select
|
||
```
|
||
|
||
选择接口示例:
|
||
|
||
```json
|
||
{
|
||
"selected_revision_id": "rev_123",
|
||
"policy": "manual",
|
||
"reason": "Higher pass rate on regression eval"
|
||
}
|
||
```
|
||
|
||
评估写入接口示例:
|
||
|
||
```json
|
||
{
|
||
"revision_id": "rev_123",
|
||
"eval_name": "skill_regression_eval",
|
||
"dataset_ref": "datasets/skill-regression-v1",
|
||
"dataset_version": "2026-01-01",
|
||
"metric_name": "task_success_rate",
|
||
"score": 0.92,
|
||
"threshold": 0.85,
|
||
"passed": true,
|
||
"sample_count": 100,
|
||
"failure_count": 8,
|
||
"latency_ms_avg": 1200,
|
||
"cost": 0.34
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## UI 设计
|
||
|
||
`Gene` 不替代现有技能管理 UI。
|
||
|
||
推荐把它放在 `Skill Detail` 页面中的一个“演化”标签页。
|
||
|
||
```text
|
||
Skill Detail
|
||
- 基本信息
|
||
- 内容编辑
|
||
- 启用状态
|
||
- Evolution / Gene
|
||
- 当前选中 revision
|
||
- 版本列表
|
||
- 父子关系
|
||
- 每个版本的 diff
|
||
- 每个版本的评估结果
|
||
- 选择按钮
|
||
- 回滚按钮
|
||
```
|
||
|
||
MVP UI 可以先做只读:
|
||
|
||
```text
|
||
1. 显示 Gene 信息
|
||
2. 显示 Revision 列表
|
||
3. 显示每个 Revision 的来源、时间、commit_sha、blob_hash
|
||
4. 显示相邻 Revision 的 diff
|
||
```
|
||
|
||
第二阶段再加入:
|
||
|
||
```text
|
||
1. 手动选择 revision
|
||
2. 回滚 revision
|
||
3. 展示评估结果
|
||
4. 根据评估结果推荐版本
|
||
```
|
||
|
||
---
|
||
|
||
## 评估指标
|
||
|
||
Gene 的核心不是“更像生物学”,而是“更像可验证的演化对象”。
|
||
|
||
每个 `GeneRevision` 都应该支持评估,例如:
|
||
|
||
* 任务成功率
|
||
* 失败率
|
||
* 平均耗时
|
||
* 误触发率
|
||
* 人工接受率
|
||
* 回滚率
|
||
* 成本
|
||
* 稳定性
|
||
* 安全失败数
|
||
* 用户满意度
|
||
|
||
没有评估的 Gene,只是重命名后的 Skill 管理。
|
||
|
||
---
|
||
|
||
## 选择策略
|
||
|
||
如果存在多个 GeneRevision,系统应该能选择更优版本。
|
||
|
||
MVP 阶段不做自动选择,只做人工选择和可审计回滚。
|
||
|
||
后续选择规则可以逐步加入:
|
||
|
||
```text
|
||
1. 先看是否通过基础测试
|
||
2. 再看近期成功率
|
||
3. 再看失败率
|
||
4. 再看成本
|
||
5. 再看延迟
|
||
6. 再看稳定性
|
||
7. 再看人工接受率
|
||
```
|
||
|
||
可选策略:
|
||
|
||
```text
|
||
manual
|
||
latest_passed
|
||
best_score
|
||
stable_low_cost
|
||
lowest_latency
|
||
highest_acceptance_rate
|
||
```
|
||
|
||
自动选择必须满足:
|
||
|
||
```text
|
||
有评估数据
|
||
有样本量
|
||
有失败分类
|
||
有回滚机制
|
||
有选择审计记录
|
||
```
|
||
|
||
---
|
||
|
||
## Migration 策略
|
||
|
||
对于已有的 `project_skill`,可以执行一次初始化迁移:
|
||
|
||
```text
|
||
对每个 project_skill:
|
||
|
||
1. 创建 project_gene。
|
||
2. 创建初始 project_gene_revision。
|
||
3. revision.origin = migration。
|
||
4. revision.skill_id = project_skill.id。
|
||
5. revision.skill_slug = project_skill.slug。
|
||
6. revision.commit_sha = project_skill.commit_sha。
|
||
7. revision.blob_hash = project_skill.blob_hash。
|
||
8. revision.content_hash = hash(project_skill.content)。
|
||
9. revision.content_snapshot_ref = 当前 Skill 内容快照。
|
||
10. 创建 active project_gene_selection。
|
||
11. selected_revision_id = 初始 revision。
|
||
12. policy = migration。
|
||
13. reason = "Initial gene selection from existing project_skill"。
|
||
```
|
||
|
||
这样现有 Skill 都可以无损进入 Gene 生命周期模型。
|
||
|
||
---
|
||
|
||
## 推荐实现顺序
|
||
|
||
```text
|
||
1. 保持 Skill 执行、扫描、编辑、注入流程不变。
|
||
2. 增加 project_gene 和 project_gene_revision 表。
|
||
3. 为现有 project_skill 执行一次 migration:每个 Skill 创建一个 Gene 和初始 Revision。
|
||
4. 在 Git sync 发现 blob_hash 变化时,自动创建新的 GeneRevision。
|
||
5. 在 Skill 详情页增加只读版本历史和 diff 展示。
|
||
6. 增加 ProjectGeneEvaluation 表和手动写入 API。
|
||
7. 增加 ProjectGeneSelection 表和人工选择 / 回滚能力。
|
||
8. 当评估数据稳定后,再做自动选择策略。
|
||
9. 最后再考虑 Variant / Experiment / A-B 测试。
|
||
```
|
||
|
||
---
|
||
|
||
## 落地判断标准
|
||
|
||
一个能力如果只是:
|
||
|
||
* 能被扫描
|
||
* 能被编辑
|
||
* 能被启用或禁用
|
||
* 能被注入上下文
|
||
* 能交付业务能力
|
||
|
||
它还是 `Skill`。
|
||
|
||
一个能力如果还能:
|
||
|
||
* 被追踪来源
|
||
* 被比较版本
|
||
* 被记录变体
|
||
* 被评估好坏
|
||
* 被继承和淘汰
|
||
* 被审计选择
|
||
* 被安全回滚
|
||
|
||
它才进入 `Gene` 管理范畴。
|
||
|
||
---
|
||
|
||
## 非目标
|
||
|
||
Gene MVP 不做以下事情:
|
||
|
||
```text
|
||
1. 不替换 project_skill。
|
||
2. 不改变 SKILL.md 作为仓库技能事实来源的地位。
|
||
3. 不直接参与聊天上下文构建。
|
||
4. 不直接执行工具调用。
|
||
5. 不自动改写 Skill 内容。
|
||
6. 不在没有评估和回滚机制的情况下自动切换线上版本。
|
||
7. 不一开始支持复杂遗传算法、交叉、随机变异或自动进化。
|
||
8. 不新增一套和 Skill 并列的执行 UI。
|
||
```
|
||
|
||
---
|
||
|
||
## 风险与约束
|
||
|
||
### 1. Gene 变成另一个 Skill
|
||
|
||
风险:
|
||
|
||
```text
|
||
Gene 中也开始存 prompt、工具权限、上下文注入规则,并且聊天时直接读取 Gene。
|
||
```
|
||
|
||
规避:
|
||
|
||
```text
|
||
Gene 不存放执行主内容。
|
||
执行内容仍然归 Skill 所有。
|
||
GeneRevision 只引用或快照 Skill 的某个状态。
|
||
```
|
||
|
||
---
|
||
|
||
### 2. 评估绑定到可变 Skill
|
||
|
||
风险:
|
||
|
||
```text
|
||
评估结果只挂在 skill_id 上,Skill 内容变化后,评估记录失真。
|
||
```
|
||
|
||
规避:
|
||
|
||
```text
|
||
评估必须绑定 revision_id + content_hash / blob_hash。
|
||
```
|
||
|
||
---
|
||
|
||
### 3. 自动选择过早上线
|
||
|
||
风险:
|
||
|
||
```text
|
||
没有足够评估数据时自动切换版本,导致线上行为漂移。
|
||
```
|
||
|
||
规避:
|
||
|
||
```text
|
||
MVP 只做人工选择和可审计回滚。
|
||
自动选择必须依赖稳定评估和回滚机制。
|
||
```
|
||
|
||
---
|
||
|
||
### 4. mutation_diff 膨胀
|
||
|
||
风险:
|
||
|
||
```text
|
||
每个版本都保存完整 diff,长期可能膨胀。
|
||
```
|
||
|
||
规避:
|
||
|
||
```text
|
||
MVP 可直接存 mutation_diff。
|
||
后续引入 mutation_diff_ref 或对象存储引用。
|
||
```
|
||
|
||
---
|
||
|
||
### 5. version 语义不清
|
||
|
||
风险:
|
||
|
||
```text
|
||
version 同时承担用户展示、唯一标识、Git 版本等多种含义。
|
||
```
|
||
|
||
规避:
|
||
|
||
```text
|
||
revision_id = 系统内部唯一版本节点
|
||
version = 用户可见版本号
|
||
commit_sha / blob_hash = Git 来源版本标识
|
||
content_hash = 内容稳定标识
|
||
```
|
||
|
||
---
|
||
|
||
## 最终结论
|
||
|
||
这个项目已经具备 `Skill` 的完整工程闭环。
|
||
|
||
`Gene` 的正确位置不是替换它,而是补上它缺失的演化层:
|
||
|
||
```text
|
||
Skill 负责落地执行
|
||
Gene 负责生命周期治理
|
||
GeneRevision 负责不可变版本节点
|
||
GeneEvaluation 负责版本质量判断
|
||
GeneSelection 负责显式选择和回滚
|
||
```
|
||
|
||
两者结合后,技能系统才从“可配置”变成“可进化”。
|