主题:实践部分 3. 项目宪法:首次规则公投
难度级别:中级
预计学习时间:6-8 小时(最小路径:2-3 小时;含公投的完整路径:+4-5 小时)
前置知识: 第一卷第 6 部分:理解 mission.md、tech-stack.md、roadmap.md 的结构
第一卷第 18 部分:SDD 流程安全基础
基本理解 YAML 语法
具备自动修复系统或事件管理经验
理解 CI/CD 和生产环境安全概念
学习目标: 将至少两个 immutable_principles 表述为禁令(而非建议),并制定一个包含六个必填字段(incident_type、pipeline_phase、permitted_actions、max_scope、ttl、rollback_condition)的 mutable_rule
创建可通过 check.py 脚本验证且结果为 PASS 的有效 constitution.md 文件
解释产品宪法(mission/tech-stack/roadmap)与安全自动化宪法(constitution.md)之间的区别
描述包含三个角色、法定人数、Safety 否决权及确定性平局裁决规则的 governance_protocol
将原则从本地案例 node_not_ready 迁移到考核案例 high_memory_usage,保持不变量的可迁移性
概述:本部分教授如何为自动修复创建版本化的安全契约文件——constitution.md,它将代理绝对无权执行的操作(immutable_principles)与可在限制条件下委托执行的操作(mutable_rules)区分开来。与第一卷中的产品文件(mission.md、tech-stack.md、roadmap.md)回答"我们在构建什么"不同,constitution.md 回答的是"即使代理非常想做,也不能对系统做什么"。关键创新在于可变规则的严格结构,包含六个必填字段,确保有限的生命周期、明确的影响半径以及退化时的自动回滚。对于学习路径,手动填写最小化的 constitution.md 即可;代理自动公投和外部仲裁属于完整生产路径。
核心概念: Immutable principles(不变原则):安全级别的禁令和义务,永远无法自动禁用。表述为不变量而非建议。示例:禁止在无验证备份的情况下重启生产数据库、禁止自动删除备份和审计日志、要求事件转为 resolved 前需连续两次确认通过。这些原则在压力下限制代理行为,当缩短 MTTR 的最短路径可能引发更大级联故障时尤为重要。
Mutable rules(可变规则):具有精确作用范围的可变更规范,可通过正式程序撤销或重写。每条规则必须包含六个字段:incident_type(事件类别)、pipeline_phase(响应阶段:triage、recovery 等)、permitted_actions(允许操作列表)、max_scope(影响半径限制,如 single_node)、ttl(规则有效期,到期后需重新审议)、rollback_condition(自动回滚条件)。缺少这些字段将导致修正案过于宽泛,与不变量产生冲突。
Max scope(最大范围):允许操作的最大影响半径(爆炸半径)。限制级联故障的关键参数。示例:single_node、single_pod、single_namespace。任何 max_scope 的扩展都需要单独的提案和公投。
Ttl(生存时间):可变规则的有效期限。ttl 到期后,规则自动失效或需通过公投明确续期。防止半年后无人审查的"遗忘"规则。典型值:hotfix 规则 12 小时,常规操作 14 天、30 天。
Rollback condition(回滚条件):可变规则自动回滚的条件,无需等待 ttl 到期。示例:repeat_incidents_same_node>=2、memory_percent>=90% after 2 windows、5xx_increase、Safety veto。确保对自动化意外副作用的快速响应。
Governance protocol(治理协议):修改宪法的投票程序。最低配置三个角色:Verifier(检查不变量违规)、Implementor(评估剧本适用性)、Safety(检查影响半径、隐私、回滚条件)。法定人数:2 票赞成 + 无 Safety 否决。平局裁决规则:safety-first。当 48 小时内同一 pattern_id 发生三次 unknown 事件时召集公投。
Proposal.md:宪法修正案表格,包含输入事件、当前 unknown 分类、假设风险、预期效果、取消条件。无来源(reason)和投票记录的修正案不被视为生产 SDD 的一部分。
Change log(变更日志):宪法变更的不可篡改记录,包含 version、parent_version、reason、按角色的 votes、decision_hash(用于验证的加密哈希)、incident_context、activation_time、diff 链接。将修订历史转化为证据链。
Decision hash(决策哈希):决策的加密哈希(如 sha256),可用于后续重新计算和验证投票。确保可复现性和防篡改保护。
Safety-first tie-breaker(安全优先平局裁决):平局裁决规则,Safety 的临界风险始终导致修正案被拒绝。确定性规则防止票数相同时系统挂起。
Constitution gateway(宪法网关):执行危险操作前的检查网关:本地脚本检查 immutable_principles 和 mutable_rules,然后 LLM 在规划模式下解释风险,之后执行者才获得许可。顺序至关重要:先检查后执行,而非事后检查。
练习题目: 标题:为 node_not_ready 创建最小化 constitution.md
问题:为 node_not_ready 场景创建 constitution.md 文件。要求:两个 immutable_principles,表述为禁令(非建议);一个包含六个必填字段的 mutable_rule;简短的 governance_protocol。用以下问题验证文件:"即使能降低 MTTR,代理也无法执行什么操作?"答案应位于 immutable_principles 中,而非对话中。
解答:步骤 1:将 immutable_principles 表述为禁令。示例:"无 audit_trace 不得执行自动修复"和"无确认备份不得触碰 stateful workload"。步骤 2:创建 mutable_rule:incident_type: node_not_ready,pipeline_phase: triage,permitted_actions: ["soft_restart_agent"],max_scope: "single_node",ttl: "30d",rollback_condition: "repeat_incidents_same_node>=2 or Safety veto"。步骤 3:描述 governance_protocol:Verifier/Implementor/Safety 角色,法定人数 2 票赞成 + 无 Safety 否决,平局裁决:safety-first。步骤 4:运行验证:cd book2/examples/constitution && python3 scripts/check.py --constitution specs/constitution.yaml --proposal proposals/valid_proposal.md。预期结果:verdict: PASS。步骤 5:用 proposals/missing_evidence.md 测试——verdict: BLOCK 并指明原因。
难度:初级
标题:将原则迁移至 high_memory_usage
问题:将结构从 node_not_ready 迁移至 high_memory_usage 案例。不要复制规则——找到可迁移的原则。为确认内存稳定制定 immutable_principle,并为 restart_pod 制定包含相应 max_scope、ttl 和 rollback_condition 的 mutable_rule。若无法表述原则字符串,请返回本地案例。
解答:步骤 1:不变量:"无确认 RSS 连续两次降至 80% 以下,不得关闭 high_memory_usage"(两次连续确认原则的迁移)。步骤 2:可变量:incident_type: high_memory_usage,pipeline_phase: recovery,permitted_actions: ["restart_pod"],max_scope: "single_pod",ttl: "14d",rollback_condition: "5xx_increase OR memory_percent>=90% after 2 windows"。步骤 3:治理:尝试将 restart_pod 扩展至 namespace 时 Safety 否决(半径限制原则的迁移)。步骤 4:验证六个字段均已填写。步骤 5:在 capstone/README.md 中记录一行规则出现原因。
难度:中级
标题:检查并修正典型错误
问题:给定包含典型错误的 constitution.md 草稿:immutable 规则表述为"尽可能避免";mutable_rule 缺少 rollback_condition;governance_protocol 未描述平局裁决;change_log 缺失。找出并修正所有错误,保持验证可复现。
解答:步骤 1:将"尽可能避免"转为严格禁令:"即使面临 MTTR 压力,也不得自动执行 X"。步骤 2:添加 rollback_condition:与可观测指标挂钩的具体自动回滚条件。步骤 3:添加平局裁决:safety-first_then_latest_matching_precedent。步骤 4:创建 change_log,至少包含一条记录,含 version、parent_version、reason、votes、decision_hash、activation_time。步骤 5:通过 Qwen Code 验证:请求检查草稿并返回不符项列表,不自动写入文件。步骤 6:重复可运行验证直至获得 PASS。
难度:中级
标题:模拟公投并填写 change_log
问题:36 小时内发生三起相同的 unknown 事件 NodeNotReady。编制 proposal.md,进行三角色公投,将结果记入 change_log。考虑场景:Verifier 和 Implementor 票数相同时 Safety 投否决票。验证平局裁决确定性运行。
解答:步骤 1:确认达到阈值:48 小时内 3 起 pattern_id 为 NodeNotReady 的 unknown 事件(36 小时 < 48 小时,阈值达成)。步骤 2:编制 proposal.md:输入事件(3 起带时间戳的事件)、当前 unknown 分类、假设风险(未准备节点上的 soft_restart_agent)、预期效果(MTTR 降低 40%)、取消条件(repeat_incidents_same_node>=2)。步骤 3:15 分钟内召集公投。步骤 4:投票:Verifier: approve,Implementor: approve,Safety: veto(critical_risk——节点包含无显式备份的 stateful workload)。步骤 5:应用通过规则:at_least_2_approve_and_no_safety_veto → Safety 否决阻止通过。平局裁决 safety-first 结果:BLOCK。步骤 6:记入 change_log:version 1.2.0,parent_version 1.1.0,reason,votes(verifier: approve,implementor: approve,safety: veto),decision_hash,activation_time: null(修正案未通过)。步骤 7:重复 Safety: abstain 场景——修正案通过,activation_time 填写。
难度:高级
案例研究: 标题:缺少 max_scope 导致的级联故障:云服务商事件
场景:大型云服务商在 Kubernetes 集群中针对 DiskPressure 事件实施自动修复。规则允许 drain 节点且无影响半径限制。存储大规模故障时,规则按顺序 drain 整个区域的节点,将局部事件转化为区域性不可用。
挑战:mutable_rule 缺少 max_scope 使代理能够级联扩展作用范围。无 ttl——规则永久有效。无 rollback_condition——故障范围扩大时系统未自动停止。团队发现问题时,47 分钟后区域 60% 节点已被 drain。
解决方案:事件后团队引入严格宪法:immutable_principle"未经 Safety 明确批准,不得对节点执行批量操作";DiskPressure 的 mutable_rule 含 max_scope: single_node,ttl: 4h,rollback_condition: "drain_rate>1_node_per_5min OR affected_pods>10"。governance_protocol 规定任何 max_scope 扩展需 Safety 否决。每次 drain 前自动网关检查宪法。
结果:孤立事件恢复时间从 4 小时缩短至 15 分钟。18 个月内未发生区域性级联故障。新规则公投平均通过时间:12 分钟。所有变更可通过 decision_hash 在 change_log 中追溯。
经验教训: max_scope 不是装饰性字段,而是防止级联故障的关键屏障;其缺失代价高于任何 MTTR 节省
ttl 强制规则重审,防止架构变更时"遗忘"的许可变为危险
rollback_condition 应绑定可观测指标而非抽象评估;drain_rate 和 affected_pods 可自动测量
Safety 对半径扩展的否决是快速公投的必要补偿;无此机制,2 票赞成的法定人数对关键决策不足
相关概念: max_scope
ttl
rollback_condition
safety-first tie-breaker
constitution gateway
标题:成功的 hotfix 工单洪峰:含明确 ttl 的有限规则
场景:支持平台因外部 API 集成故障遭遇工单洪峰。标准工单路由造成 4 小时队列,危及 SLA。团队考虑自动将所有工单无分类地转入通用队列。
挑战:完全自动化路由违反 immutable_principle"处理工单时不得丢失审计追踪",并产生 PII 泄露至错误队列的风险。人工处理无法应对体量。需要带保证回滚的临时规则。
解决方案:团队创建 mutable_rule hotfix_ticketing_flood:incident_type: api_integration_failure,pipeline_phase: triage,permitted_actions: ["simplified_routing"],max_scope: "single_api_endpoint",ttl: "12h",rollback_condition: "checkpoint_missing OR pii_exposure_detected"。Immutable_principle 保留审计禁令。Governance_protocol:Verifier 检查简化路由中无 PII,Implementor 确认 checkpoint 存在,Safety 检查影响半径。公投 8 分钟内召集,Safety: abstain 通过。
结果:2 小时内恢复 SLA。规则 12 小时后自动失效。Checkpoint 实现标准路由恢复且无数据丢失。审计追踪完整保存。Change_log 中的 decision_hash 记录作为未来 hotfix 规则的先例。
经验教训: Hotfix 规则的短 ttl(12 小时)优于"合理"的一周期限——强制明确决定续期或归档
checkpoint 作为 rollback_condition 的一部分确保技术回滚能力,而非仅政策许可
Safety: abstain 而非 approve 是风险极小时的可接受结果;veto 仍可能且在临界风险时阻止通过
Change_log 中的先例加速未来公投:平局裁决中的 latest_matching_precedent 引用已通过决策的哈希
相关概念: ttl
rollback_condition
change_log
decision_hash
immutable_principles
学习建议: 从手动填写开始,而非自动化:在文本编辑器中创建 constitution.md,肉眼检查,然后使用脚本。这培养自动化隐藏的结构直觉
用压力测试验证每条 immutable_principle:设计代理"非常想做"违规以降低 MTTR 的场景。若表述允许绕过——这是建议,非不变量
对 mutable_rules 使用"坏/好"成对比较:取无 ttl/max_scope/rollback_condition 的规则,想象一年后架构变更时的情景,然后补充缺失字段并重复思维实验
训练原则迁移而非规则复制:取本地案例 node_not_ready,提取抽象原则(如"resolved 前需确认稳定"),然后应用于完全不同的上下文(high_memory_usage、cpu_throttling、disk_pressure)
按模板与 Qwen Code 练习对话:提出三个分组问题,获取回答,检查草稿,然后请求找出典型错误。这模拟生产流程并为使用 LLM 助手做准备
为可运行验证创建自己的"坏"示例:取 proposals/missing_evidence.md 和 proposals/conflict_with_immutable.md,修改它们,预测 verdict,然后验证。脚本反馈强化对边界的理解
维护"宪法日记":为实践中的每个事件记录适用的 immutable_principle 和 mutable_rule、选择的 max_scope 和 rollback_condition。这将抽象概念转化为专业直觉
完整路径:与同事或角色扮演模拟公投。分配 Verifier/Implementor/Safety 角色,分发相同提案,比较投票。分歧将揭示 governance_protocol 中需消除的歧义
补充资源: Book2/examples/constitution/:宪法验证的可运行示例,含 check.py 脚本、constitution.yaml 和 proposal.md 模板、PASS 和 BLOCK 示例
Book2/examples/templates/proposal.md:公投必填章节的修正案表格模板
Book2/examples/spec-ci/readme.md:可运行网关类比:相同理念——行动前可验证的网关
第一卷第 6 部分(part-06-constitution.md):mission.md、tech-stack.md、roadmap.md 的来源——第一卷的产品宪法
第一卷第 18 部分(part-18-sdd-security.md):SDD 流程安全——理解生产环境错误代价的背景
第一卷第 13 部分(part-13-legacy-support.md):与运行中代码的交互——宪法与遗留系统的关联
第一卷第 16 部分(part-16-team-code-review.md):功能代码审查与危险操作审查的对比——为何单人审查不足
Qwen Code 计划模式文档:不自动写入文件的模式下检查宪法
Yaml 1.2 规范:constitution.md 数据格式的技术规范,深入理解数据结构
总结:项目宪法(constitution.md)是版本化的安全契约,将代理绝对无权执行的操作(immutable_principles 作为严格禁令)与可在限制条件下委托的操作(mutable_rules 含六个必填字段:incident_type、pipeline_phase、permitted_actions、max_scope、ttl、rollback_condition)区分开来。与第一卷产品文件不同,它回答"代理不能做什么"。学习最小路径是手动创建含两个禁令和一个可变规则的文件,通过脚本验证。完整路径增加含三角色、法定人数、Safety 否决和确定性平局裁决的 governance_protocol、代理公投和不可篡改的 change_log(含 decision_hash)。关键实践技能是案例间的原则迁移(node_not_ready → high_memory_usage),而非机械复制。宪法在危险操作前检查而非事后,将响应速度从风险转化为可控流程。