第 18 章 设计哲学
定位:本章把散在前十七章里的设计选择收拢成五条原则——它们解释了这个 工具为什么长这样。前置依赖:通读第一、二部分任意深度。基于 agent-spec 1.0.0。
一、审查点位移
人类时间最贵的用法不是读 Agent 写的代码,而是定义“什么是正确“。整个工具链 围绕这一点组织:合同是人写的(50-80 行自然语言),验证是机器做的(四层确定性 管线),人类最后只回答“合同对吗、验证全过了吗“。
二、确定性优先,AI 在边缘
graph TD
DET["确定性核心<br/>lint·结构·边界·测试·符号<br/>零 token·无假阴性·可重放"] --> AI["AI 只在边缘<br/>intake 起草(人审)·caller 验证(标注 Inferential)"]
style DET fill:#16321f
style AI fill:#2a2440,stroke-dasharray:4
每个新增检查都是传感器(lint/report/audit),从不静默改变 pass/fail 语义。
AI 证据与机械证据在 matrix 里 provenance 分明——Inferential 永远不会被
默默当作 Computational。
三、skip ≠ pass(诚实的五值逻辑)
“没验证“与“验证通过“是两件事。五种 verdict 各司其职,is_passing 只认
“跑了且全过”。同族的诚实还有:required provider 不可用不是 pass;技能
回执不是验收证据;lint-ack 豁免计入台账而非消音;draft-specs 的占位
选择器本来就该失败。工具宁可红着,不给虚假的绿。
四、derived, never stored(派生值从不落盘)
liveness 每次询问都重算;traceability 是纯读投影;代码绑定随时可从图重生成; wiki 的陈旧标记来自当下的源码对照。任何会腐烂的答案都不允许缓存成“真相“。 反过来,被持久化的只有事实:需求文档、trace 记录、编译清单——以及它们的 blake3 摘要。
五、编排器中立(ADR-001)
agent-spec 提供确定性编译产物、稳定机器格式、digest 和重放能力;任何编排器 都可以在命令之间插入审批,但审批身份、权威和工作流永远不进入编译器核心。
CLI 无法可信证明“谁批准了“,所以它不假装能:JSON 输出带文档摘要,外部系统把
审批绑定到摘要上。依赖方向是单向的——编排器依赖 agent-spec 的冻结表面,
agent-spec 不知道任何编排器的存在。schema 里没有 actor/authority/approval/
policy 字段,这条纪律本身有机械测试守着。被否掉的备选方案(审批协议入核、
编排器命名的命令、双 canonical 所有权)连同否决理由记录在
knowledge/decisions/adr-001-orchestrator-neutral-core.md——用它自己要求的
forcing functions 格式写成。
这些原则的代价(诚实清单)
确定性优先意味着 NFR(性能/可靠性)只能给 uncertain;测试选择器改名会让
合同 skip(溯源宁断勿假的代价);编排器中立意味着没有开箱即用的审批 UI;
以及最根本的一条——lifecycle 全绿只证明合同被满足,不证明合同本身全面,
所以周期性的人工与 AI 架构评审仍然必要(audit 自动化了其中一部分)。
工具把这些代价写在 README 的 “What agent-spec doesn’t solve” 里,而不是藏起来。