上周,一位社区开发者提交了一份「爆款钩子基因系统」的产品需求文档——50 个心理学说服公式(锚定效应、稀缺信号、社会认同等),帮助内容创作者优化文案。
领域知识令人印象深刻。六大分类涵盖认知偏差、稀缺感、社会认同、对比反差、情感激发、行为设计。不同营销场景的组合策略。甚至有一章专门讨论伦理约束和禁用场景。
只有一个问题:这 50 个条目没有一个是真正的 Gene。
核心误解
PRD 将每个「Gene」定义为一个名称加一段模板文字:
Gene = { name: "锚定效应", template: "原价2999,现在只要99" }这是一条数据记录。一个查找条目。一行电子表格。
Rotifer Gene 是完全不同的东西:
Gene = export async function express(input) → Promise<output>Gene 接受结构化输入,运行处理逻辑,返回结构化输出。它是可执行函数,不是静态模板。这个区别并非咬文嚼字——它决定了这个单元能否被编译为 WASM、能否被沙箱化、能否被适应度函数 F(g) 评估、能否通过竞争进化。
三公理,逐一验证
Rotifer 的 Gene 抽象建立在三条公理之上。这份 PRD 三条全部违反了——不是因为粗心,而是因为这些公理对新手来说尚不直观。
公理一:功能内聚
一个 Gene 解决一个原子问题。
PRD 的「锚定效应 Gene」和「框架效应 Gene」有完全相同的输入输出结构——都是接受文本,产出优化文本。这不是 50 个独立问题,而是同一个问题的 50 种变体。
❌ 50 个模板 = 50 个 Gene(违反内聚原则)✅ 50 个模板 = 1 个 Gene + 50 条内部规则(数据驱动的规则引擎)正确的做法:创建 5-6 个功能各异的 Gene(分析器、评分器、生成器、改写器、安全守卫),50 个公式作为内部数据文件,由 express() 函数作为规则引擎消费。
公理二:接口自足
Gene 的接口(Phenotype)必须完整描述其能力。
每个 Gene 发布一个 phenotype.json——它的身份证。定义了 inputSchema、outputSchema、领域、保真度、透明度声明和依赖关系。没有 Phenotype,Gene 无法被索引、无法被发现、无法被 L2 Calibration 评分、无法进入 Arena 竞争。
PRD 的 50 个条目没有任何一个定义了 Schema。没有 inputSchema,没有 outputSchema,没有保真度声明。在 Rotifer 生态中,它们是不可见的。
公理三:独立可评估
Gene 必须能够被适应度函数独立测试和评分。
这个乘法模型意味着分母中任何零值都会淘汰 Gene。但评估需要可观测的行为——输入进去,输出出来,质量可量化。静态模板字符串没有可量化的行为。你无法评分一条数据记录的「鲁棒性」或「利用率」。
只有可执行的 Gene 才能参与自然选择。
正确的架构是什么样的
以下是如何将 50 个说服公式重构为正规的 Rotifer Gene:
发布到生态的(5-6 个独立 Gene):
[hook-analyzer] Native 检测文本中的心理学钩子 [hook-scorer] Native 评估钩子效果 [hook-generator] Hybrid 通过 LLM 生成带钩子的文案 [hook-rewriter] Hybrid 向已有文案注入/增强钩子 [hook-strategy] Native 根据场景推荐钩子组合策略 [hook-guard] Native 伦理过滤,拦截操控模式50 个公式成为 hook-analyzer 内部的数据文件:
genes/hook-analyzer/├── phenotype.json ← 身份证(Schema + 元数据)├── index.ts ← express() 函数(真正的 Gene)├── patterns/│ └── hook-patterns.json ← 50 个公式(内部数据)└── README.md注意保真度声明:hook-analyzer 和 hook-scorer 是 Native——纯模式匹配和评分,不需要网络访问,编译为 WASM 在沙箱中执行。hook-generator 和 hook-rewriter 是 Hybrid——调用 LLM API,必须在 Phenotype 中声明 network.allowedDomains。原 PRD 把所有内容标记为「Native(零网络依赖)」,同时描述了需要 LLM 和搜索 API 的功能。
诚实的保真度声明不是官僚主义。它决定了安全边界和沙箱执行策略。
1-Gene-50-Rules 模式
这是关键的思维转换。当你的领域知识建议 50 个条目时,问自己:这是 50 个不同的问题,还是同一问题的 50 个实例?
如果输入输出结构完全相同,你拥有的是一个规则引擎,而非 50 个 Gene。
// hook-patterns.json(节选){ "cognitive_bias": { "anchoring": { "id": "CB-01", "name": "锚定效应", "indicators": ["原价", "市场价", "价值", "仅需", "只要"], "pattern": "extreme_number_followed_by_contrast", "weight": 0.8, "riskLevel": "low" }, "availability_heuristic": { "id": "CB-02", "name": "可得性启发", "indicators": ["就像", "想象一下", "你有没有经历过"], "pattern": "familiar_scenario_substitution", "weight": 0.6, "riskLevel": "low" } }, "scarcity": { "quantity": { "id": "SC-01", "name": "数量稀缺", "indicators": ["仅剩", "限量", "最后", "名额"], "pattern": "finite_quantity_claim", "weight": 0.9, "riskLevel": "medium", "ethicsCheckRequired": true } }}express() 函数遍历这些规则,将模式与输入文本匹配,返回结构化分析结果。50 个公式作为领域数据发挥价值,而非重复的 Gene 结构。
Guard Gene:让伦理约束可执行
原 PRD 包含三条笼统的伦理准则(「不要误导」「尊重用户」「遵守法律」)。合理但不可执行。
Rotifer 提供了让伦理约束可执行的机制:Guard Gene。Guard Gene 坐在处理管道中,在输出到达消费者之前进行过滤。
对于钩子系统,Guard Gene 应检测:
- 虚假稀缺声明(制造无真实约束的紧迫感)
- 针对弱势群体的过度恐惧诉求
- 剥夺用户真实选择权的暗黑模式
- 按司法管辖区违反广告法规的宣传
Guard 不是可选的装饰。在正确配置的 Agent 中,管道是:hook-generator → hook-guard → output。Guard 有否决权。而且因为 Guard 本身也是 Gene,它同样参与适应度评估——过于激进(拦截合法内容)或过于宽松(放行操控内容)的 Guard 会被更优秀的竞争者淘汰。
Phenotype:每个人都跳过的部分
新开发者持续低估 Phenotype 的重要性。「不就是元数据吗」——为什么要花时间写 JSON Schema,不如直接写代码?
因为没有 Phenotype,你的 Gene 就是一个黑盒。Phenotype 支撑了:
- 被发现:其他开发者和 Agent 通过领域、输入类型或能力找到你的 Gene
- 兼容性检查:
negotiate()函数在执行前验证 Gene 能否在给定的 Binding 中运行 - 适应度评估:L2 Calibration 使用 Phenotype 确定衡量什么指标、如何比较竞争 Gene
- 信任信号:透明度声明和合规标签让消费者在采用前评估风险
每个字段都服务于生态。跳过它,你构建了一个能工作但无法被发现、无法被比较、无法进化的 Gene。
我们学到了什么
这次审评教给我们的和教给贡献者的一样多。三个收获:
1. Gene 抽象并不直观。 「Gene = 函数,不是数据」一旦理解就很简单。但从模板系统(提示词库、JSON 配置、静态 Skill 清单)过来的开发者,会默认数据中心的思维方式。我们的文档需要把这个区别放在最显眼的位置——而不是埋在规范的深处。
2. 领域知识才是难的部分。 这位贡献者带来了说服心理学的真实知识——六大分类、50 个公式、组合策略、伦理考量。这种领域专业知识远比正确的 Gene 架构更难获得。协议的职责是让架构足够简单,让领域专家能够专注于他们的专长。
3. 5 个好 Gene 胜过 50 条数据记录。
在有适应度评估和竞争的生态中,少量设计良好的 Gene 会胜过大量抽象不当的 Gene。以 50 个公式为内部数据的 hook-analyzer Gene,其 F(g) 得分会高于 50 个独立的模板 Gene——因为它内聚、可测试、可组合。
开始行动
如果你正在构建第一个 Gene,从这里开始:
- 阅读规范——在 rotifer.dev/docs 理解三公理、Phenotype Schema、保真度类型
- 研究参考实现——
json-validator(Native)、genesis-web-search(Hybrid)、guard-balanced(Guard),在 playground 仓库 - 问:函数还是数据?——如果你的「Gene」没有带输入输出的
express()函数,它是数据,不是 Gene - 问:几个问题?——如果 10 个条目共享相同的输入输出结构,你有的是 1 个 Gene + 10 条规则
- 先写 Phenotype——在写代码之前定义 Schema,迫使你对边界进行清晰思考
我们正在一次一个贡献地构建 Gene 生态。每个经历这个学习曲线的开发者,都让下一位开发者的路更清晰。
关于 Gene 设计有问题?在 rotifer.ai 加入讨论。