我的项目进化日志 · Project Evolution Log
§0 你一定经历过这个场景
> 你打开一个六个月没碰的项目。
>
> 你看到一段奇怪的代码,一个诡异的架构选择,一个你完全不记得为什么存在的模块。
>
> 你问:「当时为什么要这样做?」
>
> 没人能回答你。当时的你也没有,现在的你也不知道。Git log 告诉你「重构模块」——但没说为什么重构。PR 描述写着「优化性能」——但没写具体优化了什么、放弃了什么。
>
> 项目的进化史消失了。只剩下代码的化石层,没有故事的沉积岩。
项目进化日志做一件事:在项目推进的每个关键时刻,顺手记录"为什么"。决策、踩坑、架构变更、灵感来源——一条一条刻进项目的进化年轮里。你随时可以翻回去,看这个项目从哪来、到哪去、每个转折点发生了什么。
它不是 git log(记录代码变化),而是项目叙事(记录决策背后的故事)。
§1 六种进化事件类型
| 编号 | 事件类型 | 说明 | 典型触发场景 |
|---|---|---|---|
| E1 | 决策记录 | 一个重要的技术/产品/设计决策及其理由 | "我们决定用 PostgreSQL 而不是 MongoDB,因为……" |
| E2 | 架构变更 | 系统架构层面的调整,含迁移路径 | "把单体拆成三个微服务,先拆用户模块……" |
| E3 | 技术选型 | 引入或替换一个技术栈,含对比和取舍 | "日志方案从 ELK 换成 Loki,省了 70% 存储成本" |
| E4 | 踩坑记录 | 遇到的问题、原因、解决方案 | "Redis 大 key 导致主从同步延迟 3 秒,根因是……" |
| E5 | 灵感注入 | 外部启发或内部涌现的新想法 | "看到了 Notion 的分栏设计,想到我们编辑器也可以……" |
| E6 | 里程碑 | 版本发布、上线、用户突破等关键节点 | "v2.0 上线,日活突破 1000" |
§2 进化事件标准格式
每条进化事件包含以下字段:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
进化事件 #EV-0032
时间 2026-07-13 14:22
类型 E1 决策记录
标题 放弃 WebSocket,改用 SSE
标签 #后端 #实时通信 #架构
背景
我们需要给仪表盘加实时数据推送。最初设计了
WebSocket 双向通道。
决策
放弃 WebSocket,改用 Server-Sent Events (SSE)。
理由
1. 仪表盘只需要服务端→客户端单向推送,不需要
客户端回传
2. SSE 基于 HTTP,不需要额外协议升级,CDN 和
代理兼容性更好
3. 自动重连是 SSE 原生能力,不用自己写
4. 我们的 Nginx 配置已经支持 SSE 长连接
放弃的选项
• WebSocket:双向能力用不上,徒增复杂度
• 轮询:延迟太高,不适合仪表盘
影响范围
后端:推送层从 ws:// 改为 HTTP + text/event-stream
前端:EventSource API 替代 WebSocket 客户端
预计节省开发时间约 3 天
相关事件
EV-0028(仪表盘需求评审)
EV-0030(前端实时方案调研)
记录者 李工
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2.1 六种类型的完整填写示例
以下示例覆盖全部六种事件类型,每条展示标准填法。对于日常快速记录,允许简化为"一句话条目"(见 §R 第 2 条)。
E1 决策记录
E1 决策记录 · 数据库索引策略从联合索引改为覆盖索引
背景:用户列表页的 SQL 用了联合索引 (status, created_at),
但查询还需要取 username 和 avatar_url,每次都要回表。
决策:改为覆盖索引 (status, created_at, username, avatar_url)。
理由:这三个字段是列表页的固定查询列,覆盖索引可以完全
消除回表。代价是索引体积增加约 40%,但查询量远大于
写入量,值得换。
放弃的选项:
• 缓存查询结果:缓存失效时机难以精确控制,用户对实时性有要求
• 拆成两次查询(先查 id 再批量取详情):增加网络往返,效果有限
影响:列表页 P99 从 320ms 降到 45ms。索引额外占用约 200MB。
E2 架构变更
E2 架构变更 · 将支付模块从单体中拆分为独立服务
背景:支付模块每次部署都要跟随主应用一起重启,导致正在处理
中的支付回调中断。而且支付相关的数据库表(订单、退款、
对账)与主业务表耦合在同一库中,互相拖慢。
决策:拆分支付服务(payment-service),独立部署、独立数据库。
迁移路径:
1. 先在单体中给支付相关表加双写逻辑(同时写旧表和新库)
2. 跑数据校验脚本,确认双写一致性 > 99.99%
3. 逐步将支付接口流量切换到新服务(按 5%→30%→100%灰度)
4. 稳定运行 2 周后删除旧表
影响范围:
• 新增 payment-service 仓库和服务
• 主应用减少约 12000 行支付相关代码
• 支付回调中断率从 1.2% 降到 0%
E3 技术选型
E3 技术选型 · 日志系统从 ELK 迁移到 Loki
背景:ELK 运维成本越来越高——ES 集群需要 3 台 32GB 机器,
每月存储成本约 6000 元,且我们实际上只做日志检索,
几乎不用 Kibana 的可视化和 ES 的全文分析能力。
对比:
| 方案 | 存储成本/月 | 运维复杂度 | 检索能力 | 迁移成本 |
| Loki | ~1500元 | 低 | 日志检索 | 2天 |
| ELK | ~6000元 | 高 | 全文分析 | 当前方案 |
决策:选择 Loki(配合 Promtail + Grafana)。
理由:
1. 我们只用日志检索,Loki 的 LogQL 完全够用
2. 存储成本降低 75%(Loki 只索引标签,不索引全文)
3. 与现有 Grafana + Prometheus 监控栈天然集成
4. 运维从"维护 ES 集群"降为"加一行配置"
放弃的选项:
• 继续用 ELK 但降配:降配后查询速度不可接受
• 切到腾讯云 CLS:功能更强但锁定云平台,迁移成本太高
E4 踩坑记录
E4 踩坑记录 · Redis 大 key 导致主从同步延迟 3 秒
现象:
2026-07-12 下午 3 点线上出现间歇性数据不一致——用户在 A 页面
看到的订单状态与 B 页面不同。持续约 2 小时。
排查过程:
1. 查 API 日志:两个页面调的不是同一个 Redis 节点
2. 查 Redis 监控:主从同步延迟 3 秒(正常 < 50ms)
3. 查慢日志:一条 HGETALL 命令耗时 2.8 秒
4. 定位:user:session:12345 这个 key 存了所有登录设备信息,
大小 8.7MB——是一个失控的大 key
根因:
半年前设计的"记录所有登录设备"功能,没有设置设备数量上限。
活跃用户积累了 300+ 设备记录,每次登录都 HGETALL + HINCRBY。
修复:
1. 紧急拆分:将大 key 拆为 user:session:12345:device:{id} 粒度
2. 加 TTL:每个设备记录 30 天过期
3. 加上限:每个用户最多保留 50 个设备
避免方案:
• 所有 Redis 集合类型 key 必须设 TTL 或上限
• 监控告警:单个 key 超过 1MB 触发通知
• Code Review 规则:涉及 HGETALL / SMEMBERS 等全量命令时必须
确认数据量可控
耗时:4 小时排查 + 1 小时修复 + 2 小时制定预防措施
E5 灵感注入
E5 灵感注入 · 从 Linear 的任务关联设计获得启发
来源:
试用 Linear 时发现它的 Issue 关联方式——不是手工输入 Issue ID,
而是在描述里用自然语言提到另一个任务时,Linear 自动识别并建立
双向链接。
启发:
我们的项目管理工具可以做一个"智能关联"——用户在任务描述或
评论里写了「这个跟 #123 相关」「依赖后端 API 那个任务」,系统
自动提取并建议关联。不只是 #编号,而是语义匹配。
初步想法:
1. 对任务描述做实体识别(任务编号 + 关键词匹配)
2. 候选关联按置信度排序,展示在侧栏
3. 用户一键确认或忽略
待验证:
• 误关联率会不会太高导致用户不信任?
• 是否值得投入开发资源?可以先做 MVP(仅匹配 #编号)验证
E6 里程碑
E6 里程碑 · v2.0 正式上线
时间:2026-07-13
版本:v2.0.0
关键数据:
• 日活:从 200 → 1000(达成 Q2 目标)
• 用户反馈好评率:92%(v1.0 时期为 78%)
• 首次加载时间:从 3.2s 降到 1.1s
本版本核心交付:
• 仪表盘实时数据推送(基于 SSE,见 EV-0032)
• Redis 缓存层上线(见 EV-0041)
• 支付模块独立部署(见 EV-0042)
遗留问题:
• 移动端适配未完成(计划 v2.1)
• 部分旧 API 未迁移到新架构(已标记 deprecated)
下一个里程碑目标:
v2.1 目标:移动端适配完成 + 旧 API 下线。
§3 完整走通流程
场景:你和 AI 在讨论项目的缓存方案
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第 1 步:自然对话中触发了记录点
用户:「我们接口响应太慢了,我想加一层 Redis 缓存。
你觉得缓存策略用什么好?」
AI: [分析并给出建议……]
AI: (检测到这是一个明确的技术决策场景)
顺便问一下,要把「引入 Redis 缓存层」记录到
项目进化日志吗?
用户:「记吧。」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第 2 步:AI 从对话中提取关键信息,生成事件草稿
AI: 根据我们的讨论,草稿如下——
┌─────────────────────────────────────────────┐
│ E3 技术选型 · 引入 Redis 缓存层 │
│ │
│ 决策:在 API 层与数据库之间加入 Redis │
│ 作为读缓存 │
│ 策略:Cache-Aside 模式,先查缓存→未命中 │
│ →查库→回写缓存 │
│ TTL:热点数据 5 分钟,普通数据 30 分钟 │
│ 淘汰:allkeys-lru │
│ │
│ 放弃的选项: │
│ • 本地内存缓存:无法跨实例共享 │
│ • 直接 CDN 缓存:不适用动态 API 响应 │
│ │
│ 需要补充或修改吗? │
└─────────────────────────────────────────────┘
用户:「TTL 热点数据改成 3 分钟,其他没问题。」
AI: 已更新 TTL 为 3 分钟。记录已写入。
📜 进化事件 #EV-0041 已记录:
E3 技术选型 · 引入 Redis 缓存层
2026-07-13 14:35 · #后端 #缓存 #性能
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第 3 步:三个月后,你回来看这个项目
用户:「当时为什么用 Redis 做缓存来着?有没有
考虑过直接用本地缓存?」
AI: [搜索进化日志,找到 EV-0041]
找到了。2026-07-13 记录了这次决策:
E3 技术选型 · 引入 Redis 缓存层
决策理由:需要跨实例共享缓存状态,本地内存
缓存无法满足多实例部署需求。选择了 Cache-
Aside 模式 + allkeys-lru 淘汰策略。
当时放弃的选项中就包括「本地内存缓存」——
原因写得很清楚:「无法跨实例共享」。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第 4 步:项目回顾
用户:「这半年项目在架构上经历了哪些大变化?」
AI: 这半年的架构变迁:
2026-03 E2 架构变更 · 单体拆微服务
先拆出用户服务和订单服务
2026-04 E3 技术选型 · 引入 Redis 缓存层
API 读性能提升 60%
2026-05 E2 架构变更 · 消息队列从 RabbitMQ
迁移到 Kafka
理由:事件溯源架构需要日志持久化
2026-06 E4 踩坑记录 · Kafka Consumer
重复消费问题
根因:未正确设置 enable.auto.commit
2026-07 E3 技术选型 · 放弃 WebSocket
改用 SSE
节省开发时间 3 天
§4 什么不值得记录(反过滤规则)
不是每个技术动作都值得进入化日志。以下场景不应记录——如果 AI 误触发了询问,直接说"不用"即可。
| 不值得记录 | 原因 | 举例 |
|---|---|---|
| 常规编码动作 | 每天发生太多次,没有回顾价值 | "给 Button 组件加了 disabled 状态"、"修了一个拼写错误" |
| 无决策空间的变更 | 你没得选,只是执行 | "按要求把接口返回格式统一为 JSON"——这是规范,不是决策 |
| 实验性改动(已回滚) | 没有产生持久影响 | 试了某种写法发现不行又改回去了 |
| 依赖版本的小版本升级 | patch/minor 升级无架构意义 | "axios 从 1.7.2 升到 1.7.3" |
| 单纯的代码重构(无设计变化) | 代码变了但设计没变 | "把 200 行的函数拆成 3 个" |
| 日常运维操作 | 例行公事,不是决策 | "重启了服务"、"加了 2 台机器" |
| 临时方案(已有正式方案规划) | 临时方案本身就会被替换 | "先 hardcode 一下,下周重构" |
判断标准:问自己——三个月后回看,这条记录还能帮到我吗?如果答案是"不会"或者"我不确定",不记。
§5 五种记录触发方式(含精确触发规则)
5.1 对话中自动检测(精确匹配规则)
AI 在对话中监听以下语义模式。只有当用户的表述同时命中"信号词"和"决策感"时,才触发询问。
触发条件 = 信号词 + 决策感(二选一不触发,同时命中才问)
| 事件类型 | 信号词(命中了才看下一步) | 决策感(必须有,否则是闲聊) | 不触发的反例 |
|---|---|---|---|
| E1 决策 | "我们决定""最终选""定下来了""就用""还是用……吧" | 涉及多选项中的抉择;或存在明确的对立面(做 vs 不做) | "我决定今天先写到这" |
| E2 架构 | "拆分""合并""重构架构""服务化""拆成" | 涉及模块边界、部署单元、数据流变化 | "我把这个组件拆成两个文件"(太细) |
| E3 选型 | "引入""换成""切换到""从……到……" | 涉及第三方库/框架/技术栈的替换或新引入 | "把 lodash 换成原生写法"(太细) |
| E4 踩坑 | "踩了个坑""搞了半天发现""排查了好久""坑在" | 有明确的异常现象 + 根因发现 + 修复过程 | "接口报错了,改了个参数好了" |
| E5 灵感 | "我想到""看到了……我们也可以""受到启发" | 来自外部产品/文章/对话的具体启发,有初步落地思路 | "我觉得我们的 UI 可以更好看" |
| E6 里程碑 | "上线了""发布了""用户突破了""日活到了" | 有明确的版本号、用户数据、完成标志 | "我把代码推到 main 了"(不是里程碑) |
询问次数限制:同一轮对话中,每个事件类型最多触发 1 次询问。用户说"不用"后,该类型本轮不再询问。整轮对话累计询问不超过 3 次——超过 3 次说明对话本身不是决策密集场景,AI 停止所有自动检测。
5.2 自动检测失败时的兜底
如果 AI 检测到了决策场景但无法从对话中提取足够信息:
AI:「检测到你可能在做一个决策(关于 Redis 缓存方案),
但对话中缺少一些关键信息。你希望我——
① 直接记录(我会基于已有对话内容生成草稿,你审核)
② 问你几个问题再记录(我会追问决策理由、放弃的选项等)
③ 先跳过(你手动说「记录」时我再记)」
不要猜测缺失的信息。三个选项让用户决定投入多少精力。
5.3 主动要求记录
| 触发词 | 示例 |
|---|---|
| 「记录一下」「记到进化日志」 | 「刚才那个决策记一下」 |
| 「这条记下来」 | 「这个坑记到项目日志」 |
| 「把刚才的……记录」 | 「把刚才的技术选型记录一下」 |
5.4 手动编写事件
直接描述事件,AI 帮你格式化:
用户:「记录:今天把数据库从 MySQL 5.7 升级到 8.0,
因为 8.0 支持窗口函数,可以把那个 200 行的报表
SQL 重写成 20 行。」
AI:解析为 E3 技术选型,提取理由和影响,生成标准格式。
5.5 批量导入
用户:「把这份架构评审纪要里所有决策和变动整理成进化事件」
AI:解析文档 → 识别决策点 → 逐条生成事件 → 列出清单让用户确认 → 批量写入
5.6 一句话极简记录
当你说「简单记一句就行」,AI 接受一句话条目:
用户:「记一句:Redis TTL 设了 3 分钟,因为仪表盘数据刷新频率是 2 分钟。」
AI:生成 E3 条目,标题 = 「Redis TTL 设为 3 分钟」,其余字段根据这一句话推断填充(标注"基于单句推断")。
§5 查询与回溯
进化日志的价值在"回头看"。支持以下查询方式:
| 查询维度 | 示例问法 |
|---|---|
| 按时间线 | 「这个项目过去半年发生了什么」「今年 Q2 有哪些架构变动」 |
| 按事件类型 | 「我们踩过哪些坑」「列出所有技术选型决策」 |
| 按标签 | 「关于缓存的记录」「所有后端相关决策」 |
| 按关键词 | 「搜索 Redis 相关的记录」「提到 PostgreSQL 的事件」 |
| 按关联 | 「EV-0028 之后发生了哪些相关事件」「这次决策影响了哪些后续变更」 |
| 生成回顾报告 | 「生成 Q2 项目进化报告」「写一份上半年的技术演进总结」 |
§6 项目清单
进化日志支持多项目。首次使用时会让你确认项目信息:
{
"project": {
"name": "Marvis Skill Hub",
"slug": "marvis-skill-hub",
"description": "AI 助手 Skill 生态平台",
"start_date": "2026-06-01",
"status": "active",
"tech_stack": ["Python", "FastAPI", "PostgreSQL", "Redis"],
"team_size": 3
},
"stats": {
"total_events": 47,
"first_event": "2026-06-01",
"last_event": "2026-07-13",
"most_active_month": "2026-06",
"top_event_type": "E1 决策记录"
}
}
切换项目:「切换到 xxx 项目」。查看当前项目:「当前项目是什么」。
§7 存储机制
进化事件存储在项目目录下的 evolution-log.json:
{
"project": {
"name": "Marvis Skill Hub",
"slug": "marvis-skill-hub"
},
"events": [
{
"id": "EV-0041",
"timestamp": "2026-07-13T14:35:00+08:00",
"type": "E3",
"type_label": "技术选型",
"title": "引入 Redis 缓存层",
"description": "在 API 层与数据库之间加入 Redis 作为读缓存",
"context": "接口响应时间过长,需要缓存加速",
"decision": "Cache-Aside 模式,TTL 热点 3 分钟 / 普通 30 分钟",
"alternatives": ["本地内存缓存(无法跨实例共享)", "CDN 缓存(不适用动态 API)"],
"impact": "预期读性能提升 60%",
"tags": ["后端", "缓存", "性能"],
"related_events": ["EV-0038"],
"recorded_by": "marvis-assistant"
}
],
"meta": {
"last_updated": "2026-07-13T14:35:00+08:00",
"event_count": 47,
"version": "1.0.0"
}
}
§8 进化报告
随时可以生成按周期汇总的报告:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📜 Marvis Skill Hub · Q2 2026 进化报告
项目状态:活跃开发中
本季事件:23 条
事件分布:
E1 决策记录 ████████████ 12 条
E2 架构变更 ████ 4 条
E3 技术选型 ████ 4 条
E4 踩坑记录 ██ 2 条
E5 灵感注入 █ 1 条
本季里程碑
2026-04-15 · v1.0 内部测试版上线
2026-05-20 · 首批 6 个 Skill 完成开发
2026-06-30 · Skill Hub 用户数突破 50
本季最大决策
EV-0028:确定 Skill 的存储和分发架构(文件系统 + JSON manifest)
影响:后续所有 Skill 的加载逻辑都基于此架构
本季最痛的坑
EV-0035:跨平台路径兼容性问题——Windows 反斜杠导致插件加载失败
耗时:4 小时排查,2 行代码修复
展望 Q3
待决策:Skill 市场是否需要 OAuth 统一认证?
待优化:EV-0035 暴露的跨平台兼容性需要系统化测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
§R 核心铁律
- 记录"为什么",不只"做了什么":git 已经记录了代码变更。进化日志存在的全部价值在于记录 git 记录不了的东西——决策的理由、放弃的选项、当时的上下文。没有"为什么"的记录是废条目。
- 即时的价值 > 完美的格式:5 秒记一句「Redis 的 TTL 设了 3 分钟,因为仪表盘数据刷新频率是 2 分钟」比三天后花 30 分钟补一篇完美的决策记录有价值十倍。允许一句话条目。
- 宁缺毋滥:不是每个 commit 都要记。只记"将来回头看会觉得有价值"的事件。如果一条记录在三个月后你读起来会想「这有什么好记的」,那它就不该被记。反过滤规则见 §4。
- 关联而非孤立:事件之间用
related_events串联。一个架构变更可能由某个踩坑触发,一个技术选型可能因为某个决策而改变。孤立的条目是死数据,关联形成进化树。 - 可以更新,不能删除:一条进化事件一旦记录,不应被删除(因为它是历史)。如果当初的决策后来被推翻了,不删旧记录,而是新增一条 E1 决策记录:「推翻 EV-0041:Redis 换成本地缓存,因为后来发现不需要跨实例共享」。
- 追问式触发,不骚扰:AI 检测到你正在做决策时,最多问一次「要记录吗」。你说「不用」就不再追问本轮。不说话就不自动记录。自动检测的精确规则见 §5.1——必须同时命中信号词和决策感才触发询问。整轮对话累计询问不超过 3 次。违反任一条件,不自作主张问。
- 演化而非堆砌:项目日志的长期价值取决于有没有事件之间的演变脉络。定期(每月/每季度)做回顾时,AI 不仅要列出事件,要尝试讲出"这个项目是如何一步一步变成今天的样子的"这个叙事。
- 信息不足时不猜测:AI 无法从对话中提取足够的决策理由、放弃的选项、影响范围时,不编造。触发 §5.2 兜底流程——三个选项让用户决定投入多少精力。即使选择"直接生成草稿",缺失字段留空标注"待补充",不填假数据。
- 反过滤优先于触发:自动检测命中信号词后,先过 §4 反过滤规则。属于反过滤场景的,不触发询问,不记录——即使用户手动要求记录,也只温和提示一次。
§A 结构化异常处理
| 异常场景 | 处理方式 |
|---|---|
| 你说了「记录」但没说什么内容 | 追问:「好的,这条记录想记什么?简单说一句就行。」不替用户编造内容 |
| 对话中同时触发了多种事件类型 | 拆分为多条独立记录,用 related_events 串联。别合并——合并后无法按类型查询 |
| 你想记录的内容属于多个项目 | 逐一确认归属。同一个决策可能同时影响主项目和子项目 |
| 进化日志文件损坏或丢失 | 告知用户文件异常,尝试从备份恢复。如无法恢复,建议重建项目清单 |
| 你要求删除某条记录 | 解释铁律第 5 条:进化日志只增不改不删。如果决策确实被推翻,建议新增一条"推翻"记录 |
| 查询时间范围内无记录 | 如实告知,并提示"可能是这段时间没有记录,也可能是还没有开始使用进化日志" |
| 你在做决策但不想被打断 | 说「先别记录」即可,AI 本轮不再询问 |
| AI 无法从对话中提取足够信息来生成记录 | 不猜测缺失字段。触发 §5.2 兜底流程——三个选项(直接生成草稿 / 追问补充 / 先跳过)让用户选 |
| 用户说的内容在 §4 反过滤规则中 | 不触发询问,不在对话中提及。如果用户手动要求记录且属于反过滤场景,温和提示:"这条可能三个月后回看价值不大——但如果你确认要记,我就记" |
| 一句话极简记录缺少关键字段 | 接受。标注"基于单句推断",用推断值填充其余字段。不要求用户补全——极简记录的优先级高于格式完整性 |
§B 常见错误与纠正
| 常见错误 | 纠正 |
|---|---|
| 把 git commit message 复制进来 | 不要再描述代码变更(git 已经记了)。写决策的理由和上下文 |
| 记录太抽象,三个月后看不懂 | 写具体数字、具体名称、具体理由。少写"优化性能",多写"Redis 缓存命中率从 42% 提升到 89%" |
| 只记成功,不记失败 | 踩坑记录(E4)可能是最有价值的条目。一个踩坑记录能让三个月后的你避免重蹈覆辙 |
| 事件之间没有关联 | 用了 related_events 才能形成进化树。每个新事件至少关联一个已有事件(如果合理) |
| 过度自动化,把每个技术讨论都记录 | 自动检测是辅助,不是全部。宁可漏记 10 条,也不灌水 100 条 |
| 项目切换后不小心记到了旧项目 | 记录前确认当前项目。如果用户说「切换到 xxx」后没有主动触发 event,不自动切 |
好的记录 vs 差的记录(对比表)
| 维度 | ❌ 差的记录 | ✅ 好的记录 |
|---|---|---|
| 决策理由 | "决定用 Redis 做缓存" | "决定用 Redis 做缓存,因为需要跨实例共享缓存状态,本地内存缓存做不到。选择 Cache-Aside 模式,热点数据 TTL 3 分钟——这是基于仪表盘 2 分钟刷新频率推算的" |
| 踩坑记录 | "Redis 主从同步延迟,修复了" | "Redis 大 key(user:session:12345,8.7MB)导致主从延迟 3 秒。根因是登录设备数无上限,300+ 设备挤在一个 HGETALL。拆分为 device 粒度 + 加 TTL + 上限 50。加了监控告警(key > 1MB 触发通知)" |
| 架构变更 | "微服务重构完成" | "支付模块从单体拆为独立服务。迁移策略:先双写 → 数据校验 → 灰度切流(5%→30%→100%)→ 稳定 2 周后删旧表。支付回调中断率从 1.2% 降到 0%" |
| 里程碑 | "发布了 v2.0" | "v2.0 发布。日活 200→1000,好评率 78%→92%。核心交付:实时推送(SSE)、Redis 缓存层、支付独立部署。遗留:移动端适配(v2.1)" |
| 格式 | 没有放弃的选项 | "放弃的选项:① WebSocket(双向能力用不上,徒增复杂度);② 轮询(延迟太高,不适合实时场景)" |
| 关联 | 孤立条目,无 related_events | "相关事件:EV-0028(仪表盘需求评审)→ EV-0030(实时方案调研)→ EV-0032(选择 SSE)" |
一句话口诀:写了"为什么"而不是光写"做了什么" + 有数字 + 有放弃的选项 + 有关联事件 = 一条好记录。
§C 能力边界
| 做不到的事 | 说明 |
|---|---|
| 不能自动从 git 导入历史 | 进化日志不是 git log 的可视化层。git 里的 commit 没有上下文和理由,无法自动提取 |
| 不能替你回忆你已经忘了的决策理由 | 进化日志只能记录你告诉它的、它能从对话中提取的内容。如果你三个月前自己做了决策、没有告诉任何人,进化日志里不会有 |
| 不能判断决策是否正确 | 进化日志是记录者,不是评判者。它不会告诉你"当初这个决策是错的"——但它会让你看到这个决策后来有没有被推翻 |
| 不能跨项目自动关联 | 两个独立项目的进化事件不会自动关联,除非你手动指定关联 |
§D 常见问题与快速排错
使用类
Q1:和 git log 有什么区别?
git log 记录代码变了什么。进化日志记录为什么变。两者互补——git 告诉你「这行代码是 6 月 1 日改的」,进化日志告诉你「6 月 1 日改这行代码是因为 Redis 大 key 导致超时」。
Q2:和 Memory Entry Panel 有什么区别?
记忆词条记录的是你的个人偏好和长期规则——"你这个人喜欢什么风格"。进化日志记录的是项目的决策历史——"这个项目经历过什么"。一个是关于你,一个是关于项目。
Q3:和 AI 无限进化引擎有什么区别?
无限进化跟踪 AI 自身的成长——偏好提取、规则固化、能力迭代。进化日志跟踪你正在做的项目的成长——技术选型、架构变迁、踩坑经验。进化引擎的自省对象是 AI,进化日志的记录对象是你的项目。
Q4:我一个人开发,需要进化日志吗?
更需要。团队项目有 PR、设计文档、会议纪要作为"为什么"的痕迹。个人项目只有你自己知道当时怎么想的——三个月后的你等于一个新加入的成员。
Q5:每天记多少条算正常?
活跃开发阶段:每周 3-5 条(几条决策 + 偶尔的踩坑或灵感)。稳定维护阶段:每月 2-3 条。如果每天都记、每条都写满——你在写日记,不是在记进化日志。
Q6:能导出吗?
可以。说「导出进化日志」即可生成 Markdown / JSON 两种格式。
Q7:AI 老是打断我,问我要不要记录,很烦怎么办?
三种方式:① 说「先别记录」——本轮对话 AI 不再询问;② 在频繁编码阶段说「关闭自动检测」——全局关闭自动触发,只保留手动触发(「记录一下」);③ 说「恢复自动检测」重新开启。自动检测默认开启。
Q8:我记录的决策后来被推翻了怎么办?
不删旧记录。新增一条 E1 决策记录,标题写「推翻 EV-00XX:[新决策]」,在理由里写清为什么推翻。这样三个月后你不仅知道当初怎么想的,也知道后来为什么变了。
Q9:一条记录应该写多长?
没有硬性规定。三句话搞定最好:做什么 → 为什么 → 影响。但如果一句话能说清楚,一句话也行(见 §5.6 极简记录)。关键是"为什么"写清楚。
Q10:我不确定该用哪种事件类型?
先看 §1 的表格找最接近的。实在不确定时:涉及"选哪个"用 E1 决策;涉及"怎么拆/怎么组"用 E2 架构;涉及"用什么工具/库"用 E3 选型;涉及"出问题了"用 E4 踩坑;涉及"突然想到"用 E5 灵感;涉及"到了某个标志性节点"用 E6 里程碑。
排错类
Q11:记录后发现写错了怎么办?
说「修改 EV-00XX」并告诉我要改什么字段。只有记录者标识之前的字段可以修改——事件 id、时间戳、类型不可改。
Q12:进化日志文件在哪?
当前项目的 evolution-log.json。说「打开进化日志文件」即可定位。
Q13:自动检测为什么没触发?
检查:① 你的话同时命中了"信号词"和"决策感"吗?(见 §5.1 精确触发规则表)② 本轮对话累计询问是否已达 3 次上限?③ 该事件类型本轮是否已被你拒绝过?④ 是否说过「关闭自动检测」?如果都不是,直接说「记录一下」手动触发即可——自动检测是辅助,漏了一两条不影响核心价值。
Q14:JSON 文件打开是乱码?
进化日志的 JSON 是 UTF-8 编码。如果记事本打开乱码,用 VS Code 或说「导出进化日志为 Markdown」获取可读版本。
§E 最佳实践
三句话写好一条进化事件
一句话写做了什么,一句话写为什么,一句话写影响。
> ❌ 太抽象:「优化了数据库性能」
>
> ✅ 三句话:「给 users 表加了复合索引(做了什么),因为登录接口需要同时查 email 和 status 字段(为什么),P99 响应时间从 800ms 降到 120ms(影响)」
每月做一次 5 分钟回顾
月末说「生成这个月的进化报告」。花 5 分钟扫一眼——你会看到本月走了多远、做了什么大决策、踩了什么坑。这个过程本身就是最有价值的复盘。
踩坑记录写全四要素
现象 → 根因 → 修复 → 避免方案。四样缺一个,三个月后别人(包括你自己)还是不知道下次怎么避免。
里程碑带数字
「v2.0 上线」是废条目。「v2.0 上线,日活从 200 涨到 1000,用户反馈好评率 92%」是有价值的里程碑。
§F 与其他 Skill 联动
| 关联 Skill | 联动方式 |
|---|---|
| 记忆词条 Memory Entry | 进化事件中沉淀的技术决策,如果反复出现形成模式,提议创建词条——从项目级经验升级为个人级原则 |
| 深度复核 Deep Review | 复核报告中可以引用进化事件,作为"这部分为什么这样设计"的背景说明 |
| AI 无限进化 Evolution Engine | 进化日志中的踩坑记录,如果同一类问题反复出现,触发进化引擎的"退化预警" |
| 灵感捕手 Idea Snatcher | 进化事件中 E5 灵感注入触发时,同步推送一条到灵感捕手,确保灵感不会沉在日志中 |
| 纠结粉碎机 Decision Breaker | 当你面临技术选型纠结时,纠结粉碎机帮你分析选项,进化日志帮你记录最终决策及理由——分析+记录闭环 |
| 幻觉捕手 Hallucination Bug Catcher | 技术方案中引用的数据、benchmark 等,可以用幻觉捕手先做置信度扫描,确保记入日志的是可靠信息 |
§G 版本历史
| 版本 | 日期 | 变更说明 |
|---|---|---|
| 1.0.0 | 2026-07-13 | 初始版本。六种进化事件类型(E1 决策/E2 架构/E3 选型/E4 踩坑/E5 灵感/E6 里程碑),标准化事件格式,四种触发方式(对话检测/主动记录/手动编写/批量导入),五维查询(时间线/类型/标签/关键词/关联),多项目支持,进化报告生成,JSON 存储。 |
| 1.1.0 | 2026-07-13 | 可靠性+适用性+有效性迭代。新增:§2.1 六种事件类型完整填写示例;§4 反过滤规则(7 种不值得记录的场景+判断标准);§5 触发规则精确化(信号词+决策感双重匹配表、询问次数上限、兜底流程、一句话极简记录);§B 好记录 vs 差记录对比表;§D FAQ 从 6 条扩充至 14 条(含排错类);§A 增补 3 条异常处理(无法提取信息、反过滤命中、极简缺字段);§R 新增第 8/9 条铁律(不猜测+反过滤优先)。 |
| (内容由AI生成,仅供参考) | ||
| (内容由AI生成,仅供参考) |