diff --git a/agents/PROMPT_TEMPLATE.md b/agents/PROMPT_TEMPLATE.md index eae79bf..457c1df 100644 --- a/agents/PROMPT_TEMPLATE.md +++ b/agents/PROMPT_TEMPLATE.md @@ -38,6 +38,7 @@ 1. <文件路径>: <具体改动内容> — 验收: <可观测的通过条件> 2. <文件路径>: <具体改动内容> — 验收: <可观测的通过条件> 3. `agents//profile.md`: performance_log 追加 W. — 验收: 新条目出现在文件中 +- **Finding 关联**(如有):Fixes: F-- **验证步骤**: cmake --build build --config Release && ctest --test-dir build -C Release @@ -118,6 +119,18 @@ cmake --build build --config Release && ctest --test-dir build -C Release "可做"是子代理的自由发挥区,"不做"是硬边界。 ``` +### 反模式 7: 缺少 Finding 关联 + +``` +❌ 案例: W14.3 曹武的修复任务修复了 F-13.5-1 (network_plugin TLS 证书验证), + 但 prompt 和报告均未标注 Fixes: F-13.5-1, + 导致 findings-registry 无法追踪修复进度,发现状态停留在 OPEN。 + +✅ 修复: 所有修复审计发现的任务必须在 prompt 交付清单中标注 + Fixes: F--(对应 findings-registry.md 中的发现 ID)。 + 示例:W14.3 曹武的修复任务应标注 `Fixes: F-13.5-1`。 +``` + --- ## 正模式示例: W9.4 林深 (回写) diff --git a/agents/WORKFLOW.md b/agents/WORKFLOW.md index 70791a5..8f19438 100644 --- a/agents/WORKFLOW.md +++ b/agents/WORKFLOW.md @@ -45,6 +45,7 @@ - **每波结束**:跑一次完整 `cmake --build build --config Release` + `ctest -R smoke` - **预存 bug**:发现编译错时先 `git stash` 试 master 是否干净——区分"子代理引入"和"预存 bug"。预存 bug CEO 自己改不甩锅 - **stale obj 问题**:clang-cl 增量构建偶尔不识别源文件修改(lsp_plugin/tools_plugin 踩过坑),症状是编译报告的行号源码内容与磁盘不符。解法:`rm -f build/**/.cpp.obj` 强制重编 +- **元数据完整性**:每波开始前运行 `python scripts/check_agents_metadata.py` 验证 agents/ 元数据完整性(YAML / rating / 引用一致性),0 error 才能进入执行阶段 - **CEO 验收通过后立刻 commit + push**(用户硬规则:"别忘了每次通过ceo验收的提交git并推送") ## 6. 关键技术约束(已踩坑,全员必读) @@ -195,7 +196,7 @@ ### 11.2.1 EXPRESS 快跳路径 -快跳(EXPRESS)是将 PROPOSE→VOTE→OPTIMIZE→INTEGRATE 压缩为 PROPOSE→EXECUTE 的合法短路径。快跳适用条件为以下 **全部 6 条** 同时满足: +快跳(EXPRESS)是将 PROPOSE→VOTE→OPTIMIZE→INTEGRATE 压缩为 PROPOSE→EXECUTE 的合法短路径。快跳适用条件为以下 **全部 7 条** 同时满足: | # | 条件 | 验证方式 | |---|------|----------| @@ -205,8 +206,9 @@ | E4 | 不新增公共 API 面:无新 `dstalk_` 前缀函数声明、无新插件接口结构体 | diff 中公共头文件无新增函数声明 | | E5 | 不涉及跨模块依赖变更:改动文件涉及 ≤ 2 个顶层目录(如 `dstalk-core/`、单个 `plugins//`) | `git diff --dirstat HEAD` 目录数 ≤ 2 | | E6 | CEO 在 WORKFLOW.md §7 任务条目中显式标注 `[EXPRESS]` | 人工核对 §7 | +| E7 | 无 OPEN 状态的 CRITICAL 发现(见 §14.3 CRITICAL 阻塞规则) | `grep "CRITICAL.*OPEN" agents/audits/findings-registry.md` 输出为空 | -满足全部 E1-E6 → CEO 可声明 EXPRESS 快跳,任务直接进入 EXECUTE(跳过 VOTE / OPTIMIZE / INTEGRATE),对应转换规则 **T17**。 +满足全部 E1-E7 → CEO 可声明 EXPRESS 快跳,任务直接进入 EXECUTE(跳过 VOTE / OPTIMIZE / INTEGRATE),对应转换规则 **T17**。 **EXPRESS 升级**:若执行者在 EXECUTE 阶段发现任务实际超出 EXPRESS 条件(E1-E5 任一条不再成立),须立即报告 CEO。CEO 核实后移除 `[EXPRESS]` 标签并替换为 `[ESCALATED]`,任务从 EXECUTE 退回 VOTE 走完整治理路径,对应转换规则 **T18**。 @@ -224,13 +226,13 @@ | T8 | EXECUTE | INSPECT | 所有指派的执行者子代理均已返回 done 报告(含 cmake build 0 error + ctest 100% pass 自述) | 自动(全员 done) | | T9 | EXECUTE | ROLLBACK | 任一执行者报告以下任一情况且 CEO 判定不可原地修复:段错误 / ABI 破坏 / CMake 无法 configure / 数据文件损坏 | CEO | | T10 | EXECUTE | ABORT | CEO 判定需求不再成立 OR 外部依赖不可用 | CEO | -| T11 | INSPECT | SUCCESS | §12 验收清单全部通过:cmake configure 0 error AND cmake build 0 error 0 warning(改动文件) AND ctest 100% pass AND 测试目标数 ≥ 上一波 AND profile.md 已更新 AND 无未跟踪临时文件 AND git diff 无无关改动 | CEO | +| T11 | INSPECT | SUCCESS | §12 验收清单 + §14.4 A1-A4 全部通过:cmake configure 0 error AND cmake build 0 error 0 warning(改动文件) AND ctest 100% pass AND 测试目标数 ≥ 上一波 AND profile.md 已更新 AND 无未跟踪临时文件 AND git diff 无无关改动 | CEO | | T12 | INSPECT | EXECUTE | 验收失败但满足全部:根因可定位到具体文件+行号 AND ≤2 个文件 AND ≤30 行改动 AND 不需重新设计 | CEO | | T13 | INSPECT | OPTIMIZE | 验收暴露以下任一设计问题:接口不兼容(编译通过但运行时错)/ 性能偏差 >50% / 架构假设被证伪(如单线程假设在多线程场景崩溃) | CEO | | T14 | INSPECT | ROLLBACK | 验收发现不可逆副作用:文件错误删除或覆盖 / 二进制损坏 / .git 目录状态异常 | CEO | | T15 | INSPECT | ABORT | CEO 判定继续修复成本 > 重新执行成本(需改 >5 个文件且涉及多个执行者重新协调) | CEO | | T16 | ANY | ABORT | 用户明确指令中止 OR 触发安全红线(凭证泄露、未加密敏感数据落盘) | CEO | -| T17 | PROPOSE | EXECUTE | EXPRESS 快跳:同时满足 E1-E6(见 §11.2.1 EXPRESS 条件表)AND CEO 在 §7 任务条目标注 `[EXPRESS]` | CEO | +| T17 | PROPOSE | EXECUTE | EXPRESS 快跳:同时满足 E1-E7(见 §11.2.1 EXPRESS 条件表)AND CEO 在 §7 任务条目标注 `[EXPRESS]` | CEO | | T18 | EXECUTE | VOTE | EXPRESS 升级:执行者报告任务实际范围超出 EXPRESS 条件(E1-E5 任一条不再成立)AND CEO 核实后将 `[EXPRESS]` 改为 `[ESCALATED]` | CEO | ### 11.4 状态进入/退出动作 @@ -439,6 +441,8 @@ CRITICAL 阻塞规则: - 如果进入 EXECUTE 阶段时仍有 OPEN 状态的 CRITICAL 发现,CEO 必须明确决策:(a) 本波优先修 CRITICAL,或 (b) 标记 WONTFIX(附理由),或 (c) 降级为 HIGH(附降级理由) - 不允许带着 OPEN CRITICAL 发现进入 SUCCESS +**历史发现时限计算**:对于在本机制建立之前已存在的审计发现(如 F-11.x 系列),时限从 findings-registry.md 初始化日期(2026-05-27)开始计算,而非从原始审计日期计算。即 F-11.1-1 (HIGH) 的修复期限为 2026-05-27 + 2 Wave = W17 前。 + ### 14.4 CEO 审查协议(新增验收项) 在 §12 验收清单基础上,INSPECT 阶段追加以下检查项: @@ -468,6 +472,7 @@ CRITICAL 阻塞规则: | INSPECT | 1. 执行 §14.4 A1-A4 检查 2. 通过的发现 FIXED → VERIFIED → CLOSED 3. 失败的发现退回 ASSIGNED(REOPEN) | CEO | | SUCCESS | 1. 本波 CLOSED 的发现从 Open 分区移到 Closed 分区 2. 记录关闭日期和 Fix Wave | CEO | | ABORT | 本波 ASSIGNED 的发现回退到 OPEN(修复未发生) | CEO | +| (T18) | 本波 ASSIGNED 的 finding 保留 ASSIGNED 状态,不回退 OPEN(升级不是中止) | CEO | ### 14.6 审计人职责 @@ -479,6 +484,8 @@ CRITICAL 阻塞规则: 审计人完成登记后通知 CEO 或 QA 组长进行 triage。 +**存量审计报告**:`agents/audits/` 中已有的审计报告(W11.1-W13.6)缺少 Findings Summary 小节。QA 组长应在每个存量报告被引用时补充该小节,优先级为 MEDIUM,不阻塞当前工作。 + ### 14.7 关联文档 - [findings-registry.md](audits/findings-registry.md) — 发现注册表(单一事实来源) diff --git a/agents/architect-yang/profile.md b/agents/architect-yang/profile.md index 5673240..bedd57a 100644 --- a/agents/architect-yang/profile.md +++ b/agents/architect-yang/profile.md @@ -29,5 +29,11 @@ performance_log: - date: 2026-05-27 event: "W15.1: 为 WORKFLOW.md §11 协作状态机设计 EXPRESS 快跳路径。定义 E1-E6 六项客观准入条件,新增 T17(快跳入口) + T18(升级回退) 两条转换规则,§11.2 图增加快跳边标注,新增 §11.2.1 完整说明。建议将 EXPRESS 作为正式快跳标签(非新增状态,避免状态爆炸)" rating: completed + - date: 2026-05-27 + event: "W15.4: 交叉审查 §11 EXPRESS 快跳与 §14 审计闭环集成。发现 2 处程序性遗漏(EXPRESS 准入缺 §14.3 CRITICAL 阻断检查、T18 升级缺少 ASSIGNED finding 状态处置)和 1 处措辞不一致(T11 未引用 §14.4 A1-A4)。结论 PASS-WITH-NOTES,建议追加 E7 条件 + §14.5 补充 T18 行 + 修正 T11 措辞" + rating: completed + - date: 2026-05-27 + event: "W15.7: 根据 W15.4 审查发现修复 WORKFLOW.md 3 处交叉引用。Fix1: §11.2.1 新增 E7 条件(CRITICAL 发现清零) + 正文 6→7 条 + E1-E6→E1-E7 + T17 同步更新。Fix2: §11.3 T11 验收标准追加 §14.4 A1-A4。Fix3: §14.5 集成点表新增 (T18) 行(ASSIGNED finding 不回退 OPEN)。无源代码修改,无 §13 变动" + rating: completed current_groups: [] --- diff --git a/agents/audits/findings-registry.md b/agents/audits/findings-registry.md index 1769679..a85a043 100644 --- a/agents/audits/findings-registry.md +++ b/agents/audits/findings-registry.md @@ -25,7 +25,9 @@ ## Closed Findings -| ID | Severity | Source | Title | Closed Date | Fix Wave | Verified By | +> Closed Findings 表必须包含 Close Date 字段(格式 YYYY-MM-DD),记录发现关闭日期。字段定义见 WORKFLOW.md §14.1。 + +| ID | Severity | Source | Title | Close Date | Fix Wave | Verified By | |----|----------|--------|-------|-------------|----------|-------------| | — | — | — | 暂无已关闭发现 | — | — | — | diff --git a/agents/devops-hu/profile.md b/agents/devops-hu/profile.md index 0cbd4b9..564d4ef 100644 --- a/agents/devops-hu/profile.md +++ b/agents/devops-hu/profile.md @@ -42,6 +42,23 @@ performance_log: ${CMAKE_BINARY_DIR}/bin 作为防御性显式声明;删除陈旧 build/dstalk-cli/dstalk-cli.exe。 验证: clean rebuild 后仅 build/bin/dstalk-cli.exe 存在,ctest 4/4 pass。 rating: done + - date: 2026-05-27 + event: "W15.6: 验证 check_agents_metadata.py 运行结果 + 集成分析 + YAML 解析确认" + detail: > + 运行结果: default/json 模式 0 error 1 warning (audits/ 目录无 profile.md, 假阳性); + --strict 模式 exit code 2 (warning 升格为 error)。 + YAML 验证: engineer-sun + security-cao 的 profile.md 均被 yaml.safe_load 正确解析。 + 集成建议: refresh_status.py 可 import 调用 check 函数作为前置门禁, 发现 error 时拒绝生成 STATUS.md。 + WORKFLOW.md §5 缺少元数据自查项, 建议新增 "每波开始前运行 check_agents_metadata.py"。 + rating: done + - date: 2026-05-27 + event: "W15.9: 修复 check_agents_metadata.py 假阳性 warning + 更新 WORKFLOW.md §5" + detail: > + Fix 1: check_agents_metadata.py 目录扫描跳过 agents/audits/ (非 agent 目录),将所有 + `child.name == 'groups'` 改为 `child.name in ('groups', 'audits')`。 + Fix 2: WORKFLOW.md §5 新增 "元数据完整性" 条目,要求每波开始前运行 check_agents_metadata.py 验证。 + Fix 3: 修复后运行 0 errors 0 warnings,5 checks passed。 + rating: done - date: 2026-05-27 event: "W15.3: 设计 agents/ 目录元数据自检机制 (scripts/check_agents_metadata.py)" detail: > diff --git a/agents/qa-wang/profile.md b/agents/qa-wang/profile.md index 1a5389b..097ea7b 100644 --- a/agents/qa-wang/profile.md +++ b/agents/qa-wang/profile.md @@ -39,6 +39,12 @@ performance_log: - date: 2026-05-27 event: "W15.2: 设计审计→修复闭环机制。定义 findings-registry.md 格式 + OPEN→ASSIGNED→FIXED→VERIFIED→CLOSED 状态生命周期 + 4级严重度自动转化规则 + WORKFLOW.md §14 完整草案。从 W11.1/W11.7 提取 10 条历史发现初始化注册表" rating: A + - date: 2026-05-27 + event: "W15.5: §14 审计闭环内部一致性检查。发现 5 项不一致:Closed Date 未定义/C3 历史发现时限歧义/8 份审计报告缺 Findings Summary/PROMPT_TEMPLATE 缺 Fixes 标注/findings-registry L4 引用偏差。结论 PASS-WITH-NOTES,4 项修复建议已提交。" + rating: A + - date: 2026-05-27 + event: "W15.8: 根据 W15.5 审查发现修复 §14 内部问题 + PROMPT_TEMPLATE 缺失标注。Fix1: findings-registry.md Closed Date→Close Date + 字段定义补注。Fix2: WORKFLOW.md §14.3 新增历史发现时限计算说明。Fix3: WORKFLOW.md §14.6 新增存量审计报告缺失 Findings Summary 处理指南。Fix4: PROMPT_TEMPLATE.md 交付清单新增 Finding 关联行 + 反模式7。4项全部完成。" + rating: A current_groups: - grp-quality-core (组长) --- diff --git a/scripts/check_agents_metadata.py b/scripts/check_agents_metadata.py index e95406f..5f68651 100644 --- a/scripts/check_agents_metadata.py +++ b/scripts/check_agents_metadata.py @@ -116,7 +116,7 @@ def check_yaml_parse(agents_dir): # Profile files for child in sorted(agents_dir.iterdir()): - if not child.is_dir() or child.name.startswith('.') or child.name == 'groups': + if not child.is_dir() or child.name.startswith('.') or child.name in ('groups', 'audits'): continue pf = child / 'profile.md' if not pf.is_file(): @@ -158,7 +158,7 @@ def check_rating_range(agents_dir): findings = [] for child in sorted(agents_dir.iterdir()): - if not child.is_dir() or child.name.startswith('.') or child.name == 'groups': + if not child.is_dir() or child.name.startswith('.') or child.name in ('groups', 'audits'): continue pf = child / 'profile.md' if not pf.is_file(): @@ -206,7 +206,7 @@ def check_group_refs(agents_dir): valid_groups.add(str(gid).strip()) for child in sorted(agents_dir.iterdir()): - if not child.is_dir() or child.name.startswith('.') or child.name == 'groups': + if not child.is_dir() or child.name.startswith('.') or child.name in ('groups', 'audits'): continue pf = child / 'profile.md' if not pf.is_file(): @@ -243,7 +243,7 @@ def check_member_refs(agents_dir): # Collect valid agent_ids valid_agents = set() for child in sorted(agents_dir.iterdir()): - if not child.is_dir() or child.name.startswith('.') or child.name == 'groups': + if not child.is_dir() or child.name.startswith('.') or child.name in ('groups', 'audits'): continue if (child / 'profile.md').is_file(): valid_agents.add(child.name) @@ -286,7 +286,7 @@ def check_duplicate_ids(agents_dir): agent_ids = {} for child in sorted(agents_dir.iterdir()): - if not child.is_dir() or child.name.startswith('.') or child.name == 'groups': + if not child.is_dir() or child.name.startswith('.') or child.name in ('groups', 'audits'): continue pf = child / 'profile.md' if not pf.is_file(): @@ -306,7 +306,7 @@ def check_duplicate_ids(agents_dir): # Also verify dir name matches agent_id for child in sorted(agents_dir.iterdir()): - if not child.is_dir() or child.name.startswith('.') or child.name == 'groups': + if not child.is_dir() or child.name.startswith('.') or child.name in ('groups', 'audits'): continue pf = child / 'profile.md' if not pf.is_file():