第二十三节 — 架构决策索引
这一节回答:本架构文档涉及的所有架构决策记录(ADR)的全景索引。每条 ADR 在哪、谁触发、状态如何、影响哪些章节。
ADR 体系约定
| 字段 | 说明 |
|---|---|
| 编号 | ADR-NNN(三位数字),全局唯一,不重用 |
| 位置 | governance/workstreams/finbayes-arch-rewrite/decisions/ADR-NNN-*.md |
| 状态 | proposed(待评审)/ accepted(已确认)/ superseded(已被新 ADR 替代)/ deprecated(已废弃但未替代) |
| 触发章节 | 哪个 CHAP 的设计需要这个决策 |
| 影响章节 | 决策一旦确认后影响哪些章节的描述 |
ADR 是独立成档的(详见 ADR-002),不在主架构文档中展开决策对比 —— 主文档只引用结论。
已 accepted 的 ADR
| 编号 | 主题 | 文件 | 触发 | 影响 |
|---|---|---|---|---|
| ADR-001 | 工程范式:Harness Workflow + 里程碑切片 + 走通骨架试点 | decisions/ADR-001-工程范式.md | 工作流启动 | 全篇(特别是 CHAP-25 / CHAP-27) |
| ADR-002 | 架构文档结构:分层章节 + C4 画图 + 决策独立成档 + 业务建模思路 | decisions/ADR-002-架构文档结构.md | 工作流启动 | 全篇(文档结构本身) |
| ADR-003 | 工程实施栈与协作模式:OpenSpec + Archon + Claude Code 主理 + Codex 实现 | decisions/ADR-003-工程实施栈与协作.md | 工作流启动 | CHAP-25 / CHAP-27 |
| ADR-004 | 自然语言到任务的识别策略:LLM Function Calling 主导 | decisions/ADR-004-任务识别策略.md | CHAP-04 / CHAP-09 | CHAP-04 / CHAP-09 / CHAP-10 / CHAP-21 |
| ADR-008 | LLM Provider 接口抽象:统一 OpenAI-compatible | decisions/ADR-008-LLM-Provider-接口抽象.md | CHAP-09 | CHAP-09 / CHAP-13 / CHAP-15 |
| ADR-010 | 输出端凭证过滤位置:综合层语义级 + Output Pipeline 格式级 双处 | decisions/ADR-010-输出端凭证过滤位置.md | CHAP-17 | CHAP-09 / CHAP-17 / CHAP-20 |
待写的 ADR(M1+ 实施初期补)
以下决策已在主架构文档草稿中提出初步倾向,但尚未独立成 ADR 完整论证。M0 启动不阻塞(M0 实施 Agent 按当前倾向执行 + 在工程实施仓 PR 描述中标注采用了该倾向)。
| 编号 | 主题 | 触发章节 | 当前倾向 | 优先级 |
|---|---|---|---|---|
| ADR-005 | 内部并发原语选择:asyncio / 多线程 / 多进程 | CHAP-12 | Python asyncio.TaskGroup(结构化并发) | 中 |
| ADR-006 | 部署形态优先级:本地优先 / 远程优先 / 混合 | CHAP-14 | 本地优先单机为第一阶段 ✅;远程托管远期 | 中 |
| ADR-007 | 状态写入"候选 → 已确认"两步设计 | CHAP-11 | 主动状态全部走两步 + 显式拒收 / 编辑路径 | 中 |
| ADR-009 | Prompt 是代码还是数据 / 版本化策略 | CHAP-19 | 混合:关键 Prompt 进代码仓 + 实验性 Prompt 走 YAML | 中 |
优先级判定
- 高:第一阶段实施前必须有 ADR 才能起代码(涉及主干架构 / 战略边界)
- 中:可在第一阶段实施初期一周内补 ADR
- 低:第一阶段不阻塞,演化中再补
编号变迁说明
工作流早期 ADR-004 候选为"多 Skill 命中同一任务时的优先级规则",深度调研后该议题与"自然语言到任务的识别策略"合并 —— 后者更高优先级且涵盖前者。ADR-004 重命名为"任务识别策略",原"多 Skill 优先级"作为该 ADR 的子议题处理。
如未来"多 Skill 优先级"需独立成 ADR,会按下一可用编号(如 ADR-012)分配,不复用 ADR-004 编号。
拒绝概念的处理(无需独立 ADR)
战略层已禁入的概念清单(详见 CHAP-02 / CHAP-17)不需要独立 ADR —— 它们是战略级硬约束而非工程级决策。
| 拒绝概念 | 拒绝来源 | 工程承接 |
|---|---|---|
| 11 条字段级强约束 | 战略白皮书构建期否决 | 综合层 schema 不引入这 11 条字段 |
| 默认 vs 行动准备双模式 | 同上 | CHAP-06 关键场景不区分双模式 |
| 升格为关系定义的"认知协作伙伴" | 同上 | 全篇正文不使用该词 |
| L3 长期状态四承诺 | 同上 | CHAP-15 / CHAP-19 用户主权五维度替代 |
| 零状态前提 | 同上 | CHAP-14 / CHAP-15 显式状态管理 |
| 情绪桥 / 信任债承诺 | 同上 | 综合层输出契约不含此类元素 |
| 行动准备 / 行动判断 / 行动方案 | 同上 | 任务类型清单用"交易准备 / 交易决策 / 交易行动"代替 |
工程层的承接通过:
verify-kb.mjs的自动 grep 检查(CI 必跑)- PR Review gate 的人工语义复核(防同义改写)
- 章节级的 Review 历史保留
ADR 间的关系
这张图表达什么:ADR 之间的逻辑依赖关系。ADR-001/002/003 是工作流基础;ADR-004(任务识别策略)是认知架构核心,影响 ADR-005/008/009;ADR-006 部署形态依赖 ADR-007/008 的接口稳定。
这张图特意不表达什么:ADR 的写作顺序(按工程优先级,不按依赖严格拓扑)。
ADR 编写规范(来自 ADR-002)
每条 ADR 至少含:
| 段落 | 内容 |
|---|---|
| Context | 背景:为什么需要这个决策 |
| Decision | 决策:选了什么方案 |
| Rationale | 理由:为什么这样选(不展开未选方案的详细评分,只说结论) |
| Consequences | 后果:决策带来的好处 / 坏处 / 影响范围 |
| Status | 状态:proposed / accepted / superseded / deprecated |
| References | 关联:影响的 CHAP / 关联的其他 ADR / 关联的战略文档 |
关键约束:
- ADR 不变更(accepted 后追加 superseded 关系,不直接改原文)
- ADR 不超过 80 行(紧凑 + 聚焦 + 不堆方法论)
- ADR 文件名缩短(不含日期 / 长描述)
ADR 与主架构文档的关系
| 主架构文档(CHAP-NN) | ADR |
|---|---|
| 说"是什么 / 做什么 / 怎么做" | 说"为什么选这个、不选那个" |
| 引用结论 | 展开权衡 |
| 篇幅长 | 篇幅短(≤80 行) |
| 每章覆盖多个决策 | 每条覆盖单个决策 |
主架构文档不重复 ADR 的内容 —— 引用 ADR 编号即可。
主架构文档之外的决策痕迹
部分小决策不独立成 ADR,但在工程实施仓的 commit / PR 描述中留痕:
| 决策类型 | 留痕位置 |
|---|---|
| 工具版本选型(如选 Pydantic v2 而非 v1) | 工程实施仓的依赖文件 + 引入 commit |
| 字段命名 / API 路径细节 | OpenAPI schema + PR 描述 |
| Bug 修复中的次要设计选择 | PR 描述 |
判定标准:
- 决策影响多个章节 → 独立 ADR
- 决策影响单一模块 → 工程实施仓留痕
- 决策反映战略边界 → 战略层而非 ADR
已识别但暂不分配编号的潜在 ADR
下列议题可能在演化中变成 ADR,但当前不分配编号(避免编号膨胀):
- 多 Skill / 多工具优先级规则(被 ADR-004 涵盖)
- Cache TTL 策略(按数据敏感度分类,工程实施细节)
- 审计 trail 归档策略(按时间分片,工程实施细节)
- Provider Readiness 探测间隔(运维参数,工程实施细节)
这些都不到 "影响多个章节"的门槛,留在工程实施仓决策。
与其他章节的关系
- ADR 编写规范来源 → ADR-002 架构文档结构
- 拒绝概念清单的来源 → CHAP-02 上位继承与不变量
- 战略未决问题映射 → CHAP-22 第一阶段缺口
- ADR 与风险的对应 → CHAP-24 风险登记
- ADR 如何驱动里程碑 → CHAP-25 与里程碑/任务的对应