架构决策记录(ADR)¶
ADR = Architecture Decision Record。每份 ADR 回答一个问题:我们当初为什么这么决定?
代码只告诉你"现在是怎样",ADR 告诉你"为什么不是别的样子"。半年后你(或任何协作者/AI)回来看,不用凭空猜测取舍原因,也不会把已经权衡过的方案再走一遍弯路。
格式¶
每份 ADR 头部以 YAML frontmatter 声明 type: adr(机器可读分类,详见 STYLE §6),其下为元信息与四个标准章节:
元信息块(文件开头)
状态:proposed/accepted/superseded by ADR-xxxx日期:采纳日期(YYYY-MM-DD)关联:相关的 ADR / 设计文档链接(可选)
正文四章节
- 背景(Context):当时面临什么问题、有什么约束
- 决策(Decision):最终选了什么
- 理由与代价(Consequences):得到什么、付出什么
- 备选方案(Alternatives):考虑过但没选的,以及为什么
状态¶
proposed(提议中)→ accepted(已采纳)→ superseded by ADR-xxxx(被取代)
已采纳的 ADR 不修改、不删除;改主意就写一份新的来取代它,保留决策的历史轨迹。
索引¶
| # | 标题 | 状态 |
|---|---|---|
| 0001 | 用 PostgreSQL 而非 SQLite | accepted |
| 0002 | 前后端拆成两个独立仓库 | accepted |
| 0003 | 前端用 Taro + React 一套三端 | accepted |
| 0004 | Skills 用"可带脚本的目录"而非硬编码函数 | accepted |
| 0005 | 长输入用分块流水线,由 Skill 自行决定 | accepted |
| 0006 | MVP 延后 LaTeX → PDF 编译 | superseded (by 0014) |
| 0007 | 项目命名为 Alfred,移除 claw 前缀 | accepted |
| 0008 | services 层作为唯一落库入口 | accepted |
| 0009 | 命名:job_posting+occupation,退役 position |
accepted |
| 0010 | Event(行为真相) 与 Fact(状态真相) 并列互补 | accepted |
| 0011 | 私有表带 user_id,共享实体/词表不带 | accepted |
| 0012 | 编排:LangGraph 编排 + Action 执行,不用 OpenAI SDK | accepted |
| 0013 | 上下文:常驻单 Session + AI 自动分段 + 人工干预 | accepted |
| 0014 | 简历溯源:软引用 + 渲染强制 footnote + 校验阻断无源 | accepted |
| 0015 | Location:location 实体 + location_alias 反查 |
accepted |
| 0016 | 领域无关内核 + 领域包边界 | accepted |
| 0017 | company 泛化为 organization(kind 枚举) |
accepted |
| 0018 | 引擎术语重构:Skill → Node / Graph / Action(消除一词双义) | accepted |
| 0019 | Graph 是代码不是配置(Graph-as-Code,YAML 只做 Node 配置) | accepted |
| 0020 | 四层分发 L0–L3(模态→声明式预筛→LLM 模糊回路→回流) | accepted |
| 0021 | 领域扩展:共享基座 + 领域 Graph 包(job/habit/media/progress+travel) | accepted |
| 0022 | 文档治理:PRD / Design / ADR 三类分类与生命周期 | accepted |
术语注解:ADR-0018 起,引擎单元改名 Node(原 "Skill" 目录);旧 ADR(0001–0017)正文里的 "Skill" 一律按 Node 理解。"skill"(小写,领域数据)仍指
skill能力词表。