---
name: self-review-checklist
purpose: Agent 每次交付前必须跑一遍的自检清单（在呈现给人类前跑）
blocking: true
---

# 🤖 Agent 自检清单（交付前强制）

> **使用时机**：Agent 完成任一 Phase 的产物生成后，**在发送给用户前**，必须在内部过一遍本清单。  
> **阻塞规则**：任一项不通过，必须回到生成环节补齐或回到用户发问，**禁止带"已知缺陷"交付**。

---

## A. 信息完整性（对应"禁止脑补"原则）

- [ ] **A1** 方案中是否有任何未经用户确认的"假设"？
  - 如有 → 必须用【假设】或【通用惯例，待你确认】前缀明确标注
  - 不允许以陈述句形式给出未确认的客户特定信息

- [ ] **A2** 是否用我的通用知识填补了客户特定信息？
  - 客户特定信息包括：CDN 厂商、负载均衡类型、K8s 版本、审批人、SAN 清单、合规要求、预算
  - 如有 → 删除并改为在文档顶部列出"信息缺口清单"

- [ ] **A3** 所有 `{{占位符}}` 是否都标注了含义和获取方法？
  - 禁止出现无解释的 `{{}}`
  - 格式要求：`{{变量名 · 说明 · 获取方式}}`

- [ ] **A4** 是否在文档顶部或显著位置列出了"本次交付依赖但未获得的信息"？
  - 让用户能一眼看清还缺什么

---

## B. 产物安全性（对应"高危操作"约束）

- [ ] **B1** 所有脚本头部是否都有「安全等级」标注？
  - 🟢 READ-ONLY / 🟡 LOW-IMPACT / 🔴 HIGH-RISK 三选一
  - 无标注 → 不合格

- [ ] **B2** 所有 🔴 高危脚本是否配套提供了 rollback 脚本？
  - 例外：cleanup / 删除类脚本可以"不可回滚"，但必须在注释里显式声明

- [ ] **B3** 所有脚本是否明确"由人工执行"？
  - 不应出现任何"Agent 自动调用"、"CI 自动触发"的措辞
  - 本 Skill 的定位：Agent 生成 + 人工审核 + 人工执行

- [ ] **B4** 是否有任何脚本硬编码了生产环境的值？
  - 域名、IP、证书路径、账号、Token —— 都必须通过环境变量注入
  - 检查项：`grep -E "example\.com|/etc/nginx|AKID|xxx\.com"` 不应命中实值

- [ ] **B5** 脚本中是否有危险模式？
  - `curl ... | bash` ❌
  - 未过滤的 `rm -rf` ❌
  - `kubectl apply` 没有 `--dry-run` 前置 ❌
  - `set -e` / `set -u` / `set -o pipefail` 缺失 ❌
  - 未设置 `umask` 的证书/私钥写入 ❌

- [ ] **B6** 输出中是否可能泄露敏感信息？
  - 日志 / 错误信息不应打印完整证书内容、私钥、Token
  - 若必须打印，使用 `head -c N` 或指纹哈希

---

## C. Review 友好性（对应"减轻人类负担"目标）

- [ ] **C1** 每个脚本行数是否达标？
  - 只读脚本 ≤ 50 行
  - 变更脚本 ≤ 80 行
  - 超过必须拆分

- [ ] **C2** 每个脚本是否标注了「Review 关注点」？
  - ≤ 3 条
  - 每条带具体行号
  - 每条一句话说清楚"关注什么"

- [ ] **C3** 每个脚本是否标注了「可跳过 Review 的行」？
  - 纯展示 / 格式化逻辑应标出来
  - 目的：减少运维 70% 的阅读量

- [ ] **C4** 三层 Review 产物是否都生成了？
  - L3-decision-review ✅
  - L2-strategy-review ✅
  - L1-execution-review ✅
  - 缺一不可（除非明确是单阶段补丁）

- [ ] **C5** 三层产物的预计 review 时间合计是否 ≤ 50 min？
  - L3 ≤ 5 min
  - L2 ≤ 15 min
  - L1 ≤ 30 min
  - 超过 → 拆分交付

- [ ] **C6** L3 文档是否**不含**技术细节？
  - 不应出现 openssl 命令、yaml 片段、代码块
  - L3 只谈决策，不谈实现

---

## D. Harness 原则落地

- [ ] **D1** HP-3 幂等：每个变更脚本是否有 state marker 机制？
  - `.done` 文件 / RUN_ID 目录 / 去重键
  - 重跑一次不会产生副作用

- [ ] **D2** HP-4 小步可回滚：是否定义了观察期与自动回滚条件？
  - 灰度比例 / 时长 / 触发阈值都是量化值
  - 旧证书保留 ≥ 14 天

- [ ] **D3** HP-5 分档：是否明确每个脚本对应的自动化层级？
  - 不允许"全自动 或 全手动"二元选择
  - 必须对齐 L1/L2/L3

- [ ] **D4** HP-6 版本化：所有产物是否带版本号 + 生成时间？
  - 文档首行 `版本: vN · 生成时间: ISO8601`
  - 便于后续回溯

- [ ] **D5** HP-7 人类预算：是否明确了本次变更的人类时间预算？
  - 目标 ≤ 8h
  - 若预估超出，降低自动化级别或引入更多角色

---

## G. 七问闭环 + 决策追溯 + 复杂度分流自检

> 本类的目的是防止七问某项在 Phase 0-6 中被永久遗忘，和 Agent 替客户做的默认值决策无迹可循。

- [ ] **G1** Layer 0 七问闭环：HP-1 → HP-7 **是否每项都有结果**（已答 / 已占位 / 已升级为任务单）？
  - 针对 "暂待补" 的项，是否在交付物顶部的 "信息缺口清单" 明示？
  - 禁止任何一项默默跳过，七问漏一项 = 骨架漏死

- [ ] **G2** 复杂度分流判定是否已完成？
  - 交付物顶部是否写明 "本次走 Fast / Standard / Full Path"？
  - 若 Fast 或 Standard，是否自检过准入条件 / 触发条件是否真的满足（防止"为了省事而错选档位"）？
  - 若中途关键信息更新，是否已触发升档判定？

- [ ] **G3** 裁剪留痕：若走 Fast Path 裁剪了某些 Phase，交付物顶部是否明示：
  - "Fast Path 已裁剪以下阶段：…"
  - 和裁剪的依据（对应 SKILL.md §3.4 裁剪规则表某行）

- [ ] **G4** 委托决策日志：Agent 替客户拍板的默认值（§ 3.x 委托模式）是否集中展示在交付物一个地方？
  - 标准格式：
    ```
    ## 本次 Agent 代拍板的技术策略（3 天异议期）
    - 密钥算法 = ECDSA P-256
    - 有效期 = 1 年
    - ...
    若有异议，请在 {{日期}} 前告知。
    ```

- [ ] **G5** 提议-复议状态机完整性：若 Intake §4.4 使用了"提议-复议"状态标记：
  - 所有 `proposed` 状态是否最终迁移到 `accepted` / `rejected` / `amended`？
  - 还在 `proposed` 的项，是否在交付物中用占位符（而非实值）？

- [ ] **G6** 对库拒绝推荐的优雅降级：若客户拒绝了 Agent 的某项推荐：
  - 是否承认了客户依据并停止游说？
  - 是否在 L2 交付物里留下程序内重审留痕？（例："推荐 X 被客户以 Y 为由拒绝 → 下次续签时再提一次"）

- [ ] **G7** 事实校准红线：交付物是否**无意中**触发了已知的事实错误？（理论上这类错误已因知识库而避免，本项为兼顶）
  - .cn 后缀 ≫ 国密？✅ 已退避
  - 多域证书 SAN = 多个确定 FQDN？✅ 已不混淆为多通配符
  - 其他事实类断言是否有数据支撑或客户确认？

- [ ] **G8** 治理越权自检（对应 SKILL.md §5 技术-治理边界 α 严格版）：
  - 交付物中是否**主动询问**了客户内部治理节奏字段（采购审批周期、法务审核时长、OA 流程、跨团队协调节奏、预算金额）？
    - 若有 → 必须删除，改为"等客户声明后触发"
  - 完成缓冲是否使用了 §2 完成缓冲分档默认值（而非强制问客户）？
    - 若主动问了 → 删除该问题，改用默认值并在交付物中注明"默认 X 天缓冲，如有内部 SLA 要求请告知"
  - 部署规模是否通过 DNS/CT 推断（而非裸问客户"你有几台机器"）？
    - 若裸问了 → 改为先跑公开数据踩点，推断后以 🟢 假设式呈现

- [ ] **G9** 证书时代背景自检（对应 SKILL.md §2 证书有效期时代背景）：
  - 交付物中是否出现了"1 年证书"、"3 年证书"、"多年期证书"等**已过时**的表述？
    - 若有 → 改为"≤ 200 天（2026-03-15 起）"或"多年期订阅（multi-year subscription）"
  - 方案中的续签节奏是否按**当前实际有效期上限**计算（2026 年起 ≤ 200 天）？
    - 若仍按"1 年续签一次"计算 → 必须修正为"≥ 2 次/年"
  - 若客户当前证书有效期 ≤ 200 天，是否已在方案中提示**引入 ACME 自动化的必要性**？
    - 200 天：强烈建议；100 天：必须；47 天：不自动化即不可运维

- [ ] **G10** 交付产物落盘自检（对应 SKILL.md §6 交付产物落盘原则）：
  - 交付产物是否**仅以对话内嵌的代码块/Markdown 形式**存在，没有作为独立文件写入磁盘？
    - 若是 → **G10 失败**，必须立即使用 `edit_file` 或 `replace_in_file` 工具把交付物落盘到独立文件（`.md` / `.sh` / `.conf` 等）
    - 紧急场景下用户**来不及复制粘贴 + 新建文件 + chmod +x**，对话内嵌 = 变相增加执行摩擦
  - L3 / L2 / L1 三份 Review 是否各自是**独立的 `.md` 文件**（而非全部贴在一条对话里）？
    - 若贴在对话里 → 失败，必须拆成 3 个独立文件，便于分角色并行 review / 打印 / 归档
  - 所有 `.sh` 脚本是否作为**可执行文件**（`chmod +x`）落盘在 `scripts/` 子目录，且配套 rollback 脚本与原脚本同级？
    - 若仅作为代码块存在 → 失败，必须落盘
    - 若未 chmod +x → 失败，用 `terminal` 工具补齐权限
  - 交付目录是否有**顶层 `README.md`** 作为总入口，说明：产物结构 / 执行时序 / 状态跟踪 / 谁做什么？
    - 若没有 → 失败，紧急场景下 README 是用户的"唯一入口"
  - 交付完成后是否向用户**明示落盘位置的绝对路径**（而非相对路径或"在对话上面"）？
    - 若没有 → 失败，用户找不到文件等于没交付

- [ ] **G11** CSR 生成策略三档选项自检（对应 SKILL.md §8.3 与 references/csr-persona-talks.md）：
  - 交付物中是否**同时提供了 A/B/C 三档的执行入口**？
    - A · 本地 openssl 生成（默认脚本）
    - B · 云厂商在线生成（操作指引文档）
    - C · 复用旧 CSR（带风险警示 banner 的脚本）
    - 若只给 A 档 → **G11 失败**，运维可能因为不熟 CLI 放弃整个方案
  - ADR-006（或等价 ADR）是否客观描述了三档利弊，**未贬低 B/C 档**？
    - 是否包含对常见错误合规断言的修正（"等保二级禁止云厂商生成"等）？
    - 是否明确 B 档的云厂商 KMS / HSM 加密存储 + 等保三级认证事实？
    - 是否为 C 档提供了**风险清单**（累积泄露、无前向安全、审计扣分），而不只是一句"不推荐"？
  - 客户明示选 B/C 后，是否**立即采纳**并切换到对应脚本/指引，**未反复游说回 A**？
    - 反复游说 = 违反 §2.1 推荐协议硬边界

- [ ] **G13** 多选项中性化自检：
  - 交付物中的多选项决策（CA 选型 / CSR 生成策略 / 密钥算法等）是否在选项语言中**暗藏偏好词**？
    - ❌ 禁止出现：「默认/允许/兜底」「首选/次选」「推荐/可选」等暗示性词汇（除非明确走四段式推荐协议）
    - ✅ 应使用：「场景驱动推荐」——每个选项附带「适用场景」而非「推荐等级」
  - 若必须给推荐，是否同时给出「反向场景」（即在什么情况下应该选另一个）？
    - 若没有反向场景 → **G13 失败**，补充后再交付

- [ ] **G14** 基础设施拓扑识别 + 通配符证书子域名盘点自检（对应 references/topology-detection.md + references/wildcard-inventory.md）：

  **【拓扑识别部分】**
  - Phase 1 盘点中，是否对 **CLB / CVM EIP / CDN / WAF** 等基础设施拓扑做出了判断？
    - 若做出判断 → 判断依据是否来自以下**可靠来源之一**：
      - ✅ 云厂商只读 API（`DescribeLoadBalancers` / `DescribeInstances` 等）
      - ✅ 客户明示确认
      - ❌ **禁止**仅凭以下公开探测结果做拓扑判断（已知不可靠）：
        - DNS TTL 值（CLB/CVM EIP 都可配任意 TTL，无区分意义）
        - `Server: nginx/版本号`（CLB 七层模式会透传后端 Server 头）
        - `nc` 端口探测 OPEN（CLB 安全组/端口映射可导致误报，OPEN ≠ 服务存在）
        - TLS ALPN 协商结果（CLB 配置差异可导致不同结果，不稳定）
    - 若判断依据不可靠 → **G14 失败**，必须：
      - 降级为 🟢 假设式呈现（`【假设】... 【依据】... 【如有错请纠正】`）
      - 或升级为 🔴 必问项（`请问 X.X.X.X 是 CLB VIP 还是 CVM EIP？`）
      - 或主动询问客户是否可提供只读云 API 凭证（SecretID/Key）
  - Phase 1 开场是否**主动询问**客户「是否可提供只读云 API 凭证」？
    - 有凭证 → 走分支 A（API 直接确认，零歧义）
    - 无凭证 → 走分支 B（公开探测 + 🔴 必问拓扑字段）
    - 若既未询问凭证、又用不可靠探测做了拓扑判断 → **G14 失败**
  - `nc` 端口探测 OPEN 是否被误读为「服务存在」？
    - ❌ `nc OPEN` ≠ 服务存在，必须用 `curl` / `openssl s_client` 二次验证
    - 若直接把 `nc OPEN` 当证据写入资产清单 → **G14 失败**

  **【通配符证书子域名盘点部分】**
  - 发现通配符证书（`*.example.com`）后，是否**禁止了猜测/枚举子域名**的探测方式？
    - ❌ 禁止路径：猜 `www / api / m / app / login` 等常见子域名 → 逐个 dig → 以"有 A 记录"判断绑定点
    - 原因：猜测集合严重不完整，会漏掉业务自定义子域名（如 `n1 / pre / w` 等）；不同子域名可能走完全不同线路
    - 若走了猜测路径 → **G14 失败**
  - 是否执行了正确的子域名盘点路径？
    - ✅ Step A：WHOIS 查权威 NS（`whois <apex-domain>` → `Name Server` 字段）
    - ✅ Step B：判断 DNS 平台类型，引导客户提供完整 Zone 记录
      - 公共 DNS 平台（DNSPod / 阿里云 / Cloudflare 等）→ 引导客户导出 Zone 或提供只读 API Token
      - 自建 NS（企业内部 BIND 等）→ 引导客户提供 AXFR 权限或 Zone 文件
    - ✅ Step C：基于完整 DNS Zone 记录盘点，按线路分组（国内 CDN / 海外直连 / 源站等）
    - 若跳过 WHOIS + DNS Zone 直接用 CT 日志 / 猜测子域名作为盘点依据 → **G14 失败**
  - CT 日志是否被误用为「当前绑定点权威来源」？
    - CT 日志 = 辅助参考（历史曾签发过哪些子域名）
    - DNS Zone = 权威来源（当前实际有哪些子域名在用）
    - 若把 CT 日志当作完整子域名清单直接使用 → **G14 失败**
  - 是否询问了客户**海外线路**情况？
    - 本机在国内时 dig 结果仅为国内视角，海外可能走不同 CNAME / IP / CDN
    - 若未询问且方案中假设国内外走同一线路 → **G14 失败**

- [ ] **G15** 证书链完整性与多客户端兼容性自检（对应 references/cert-chain-verification.md）：
  - Phase 5 / Phase 6 交付物的 L1 协议层验证是否**包含 D1-D5 全部 5 项**（按 cert_role 裁剪后）？
    - D1 服务器下发链完整性（`openssl s_client -showcerts` 核对证书数量 ≥ 2）
    - D2 链条顺序正确性（叶子在前、中间在后，每级 `i:` = 下一级 `s:`）
    - D3 中间证书有效期（`notAfter` ≥ 叶子有效期 + 30 天缓冲）
    - D4 链条可达公信 Root（`Verification: OK` / `verify return: 1`）
    - D5 多客户端兼容性（SSL Labs 全客户端矩阵评级 ≥ A）
    - 若仅查 D1（叶子指纹对比）或只跑本机 `openssl verify` → **G15 失败**，必须补齐
  - 是否把"叶子证书指纹相同"当作"已完成更新"的**充分证据**？
    - ❌ 指纹对比查不出：中间证书缺失 / 中间证书过期 / 链条顺序颠倒 / Root 不在某客户端信任库
    - 若以指纹对比为单一判据 → **G15 失败**，改为 D1-D5 五维核查
  - 是否把本机 `Verification: OK` 等同于"所有主流客户端信任"？
    - ❌ 本机 OK ≠ Android 7.1 / iOS < 13 / 微信低版 WebView / 老 IE / IoT 设备信任
    - 若有此等价推断 → **G15 失败**，必须在 L3 交付物显式声明验证的作用域边界
  - 换 CA 或中间证书品牌变化时，是否**主动提醒客户**"可能引发老客户端不信任"？
    - 若未提醒 → **G15 失败**（历史坑：Let's Encrypt DST Root X3 过期、Sectigo AddTrust 过期）
  - Phase 5 Dry-Run 采集的 `baseline/L1-tls-handshake.txt` 是否**包含 `-showcerts` 输出**（不只是叶子）？
    - 若只采集了叶子证书 → Phase 6 对比无法发现链条结构变化 → **G15 失败**
  - D5 多客户端矩阵因环境受限无法执行时，是否执行了**降级方案**之一（多信任库本机验证 / 客户端抽样 / 显式留痕未验证）？
    - 若直接跳过 D5 且未留痕 → **G15 失败**

- [ ] **G12** 合规话术边界自检：
  - 交付物中是否包含以下**事实错误话术**？
    - ❌ "等保二级禁止第三方 KMS 生成密钥"（事实：等保 2.0 不禁止，只要求可审计）
    - ❌ "PCI DSS 3.6 要求本地生成"（事实：要求 FIPS 140-2 Level 2+ 模块，云厂商 HSM 满足）
    - ❌ "CA/B Forum BR §6.1.1.3 禁止云厂商生成"（事实：禁止的是"CA 本身持有 subscriber 私钥"，不含云厂商 SSL 控制台场景）
    - ❌ 基于 `.cn` 后缀推断国密要求 [[memory:gpo12k8j]]
    - ❌ 基于行业（教育/医疗/金融）推断等保级别（需客户明示）
    - 若出现任一条 → **G12 失败**，必须修正为"客户未声明合规要求时默认按 ADR-006 A 档推进"
  - 对合规的陈述是否**仅基于客户明示声明**？
    - 客户未声明等保级别 / 国密 / 金融时，Agent 不得预设合规基线
    - 客户声明后才调整档位（如等保三级以上限制 B/C 档）

---

## F. 受托执行写 API 前的强制自检（对应 SKILL.md §4.2-§4.4 六闸门）

> 触发条件：本次交付**包含 Agent 代为执行写 API**（Import / Modify 档）。
> 如不涉及写 API，本节全部标 N/A；如涉及，**任一未勾不得执行**。

- [ ] **F0** 档位判定：本次是 `Import` 还是 `Modify`？已显式标注。
  - 若是 `Delete` / 默认含 `Delete` 的汇总 API（如 `BatchDelete`）→ **直接降级为脚本交人类执行**，Agent 不得代为调用

- [ ] **F1** 闸门 1：用户**显式**授权本次写操作？
  - 设备授权 / 默认授权 / 上次授权延用 ❌ 不算
  - 本次交互中是否有明确的“执行给我看看” / “正式执行吧”等用户指令？

- [ ] **F2** 闸门 2：**L3 决策层已通过**，且明确批准了“由 Agent 代为执行”？
  - 仅批准方案不等于批准执行人
  - 批准记录是否可追溯（批准人 / 时间 / 载体）？

- [ ] **F3** 闸门 3：**dry-run / 预检** 完成且输出已放入交付？
  - `kubectl apply --dry-run=server` / `--dry-run=client` 输出
  - Terraform `plan` 输出
  - 云 API 的 `--dry-run` 或等价预检接口
  - 若**目标 API 不支持 dry-run** → 必须显式说明并降级为脚本交人类执行

- [ ] **F4** 闸门 4：**幂等 + 对象级范围限定** 已落实？
  - 执行有幂等键 / run-id，重跑不产生副作用
  - 目标资源有明确 ID 或 tag 筛选，绝不走全量 / 模糊匹配
  - 操作记录会写入审计日志（位置已确认）

- [ ] **F5** 闸门 5：**灰度 + 观察期 + 回滚预案** 具备（仅 Modify 档适用，Import 档可黄）？
  - Canary 比例、观察时长、回滚触发阀值：都是**量化值**
  - 回滚执行者、回滚耗时目标：明确
  - 旧证书 / 旧配置 保留窗口 ≥ 14 天

- [ ] **F6** 闸门 6：**凭证**使用环境变量 / 临时 Token，**绝未落盘**？
  - 脚本或交付文档中 不存在 AKID / SK / Token / 私钥 文本（`grep -i "akid\|aksecret\|token\|begin\s*private\s*key"` 不命中）
  - 不产生新的 `.env` / 未加密的凭证文件
  - 不在 chat 历史中挂着凭证

- [ ] **F7** 交付给人类的文档是否显式声明：
  - 本次是 `Import` / `Modify` 哪一档
  - 已满足 F1~F6，或任一缺位的理由及降级措施

---

## E. 交付前沟通

- [ ] **E1** 交付前是否向用户说明了本次产出的边界？
  - 例："本次输出不包含 X，因为缺少 Y 信息"
  - 让用户清楚**还需要做什么**

- [ ] **E2** 是否明确标注了下一步的 "⛔ 等待用户动作"？
  - 本 Skill 每个 Phase 结束必须停下等人类
  - 不允许 Agent 自动推进多个 Phase

- [ ] **E3** 是否提供了**用户不满意时的反馈渠道**？
  - 例："如果这个 CA 选型与你们的采购约束冲突，请告诉我 XX，我重新出方案"

---

## 失败处理

| 失败项类型 | 处理方式 |
|-----------|---------|
| A 类失败（脑补信息）| 立即停止，改为发问 |
| B 类失败（安全问题）| 立即修改脚本，不能带病交付 |
| C 类失败（Review 不友好）| 回到拆分与重写 |
| D 类失败（Harness 原则）| 回到 Phase 0 七问验收 |
| **G 类失败（七问未闭环 / 分流错档 / 委托决策无留痕 / 治理越权 / 时代背景错误）** | **回到对应 Phase 补齐前才能交付** |
| **F 类失败（写 API 闸门未满足）** | **不得代为执行，降级为生成脚本交人类执行** |
| E 类失败（沟通）| 补充说明后再交付 |

---

## 自检通过后的标准化声明

Agent 在交付文档末尾**必须**带这段：

```
---
🤖 Agent 自检通过：{{YYYY-MM-DDTHH:MM+08:00}}
- 信息完整性 ✅ / ⚠️（缺口见顶部清单）
- 产物安全性 ✅
- Review 友好 ✅（L3 5min / L2 15min / L1 30min）
- Harness 原则 ✅
- 七问闭环 ✅（G 类）
- 治理越权自检 ✅（G8）
- 证书时代背景自检 ✅（G9）
- 交付产物落盘自检 ✅（G10）
- CSR 三档选项自检 ✅（G11）
- 合规话术边界自检 ✅（G12）
- 多选项中性化自检 ✅（G13）
- 基础设施拓扑识别自检 ✅（G14）
- 证书链完整性与多客户端兼容性自检 ✅（G15）
- 复杂度分流 ✅ 走 {{Fast / Standard / Full}} Path

⛔ 下一步等待：{{具体等谁做什么}}
```

人类看到这段声明，就知道 Agent 已经过一遍自检，可以放心进入 review。

> ❗️ 若本次交付**含写 API 代为执行**，还需额外添加：
> ```
> - 写 API 闸门自检 ✅（F0~F7 全通过，本次为 {{Import / Modify}} 档）
> ```
