From bffbe92d7f789c77071335eb99233f7993c1c582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B4=B2=E5=98=89?= Date: Sun, 15 Mar 2026 20:30:15 +0800 Subject: [PATCH 1/2] update mem_scanner_sop.md --- memory/procmem_scanner_sop.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/memory/procmem_scanner_sop.md b/memory/procmem_scanner_sop.md index 39393fc..53256ed 100644 --- a/memory/procmem_scanner_sop.md +++ b/memory/procmem_scanner_sop.md @@ -1,5 +1,11 @@ # Memory Scanner SOP +## 0. 平台兼容性 +**支持平台**: Windows, Linux +**不支持**: macOS(缺少/proc/文件系统,无法枚举进程内存映射) + +验证日期: 2026-03-12 + ## 1. 快速开始 内存特征搜索工具,支持 Hex (CE 风格) 和 字符串匹配。特别提供 LLM 模式,方便大模型分析内存上下文。 From 19f8e41e0a3310ce3a5a9df6b5ce92ef2496bfaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B4=B2=E5=98=89?= Date: Wed, 15 Apr 2026 15:21:53 +0800 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20Plan=E6=A8=A1=E5=BC=8F=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 主要改动 ### ga.py - 新增 _is_in_plan_mode() 统一状态检测逻辑 - 新增 _check_plan_completion() 优化文件系统操作 - 新增 _exit_plan_mode() 统一状态清理 - 重构 do_no_tool 和 next_prompt_patcher 使用新方法 ### memory/plan_sop.md - 优化工作目录说明文案 ## 改进效果 - 消除状态检测逻辑不一致问题 - 移除递归文件搜索,改用固定路径,提升性能 - 代码可读性和可维护性提升 - 符合代码审查标准:局部可推理、逻辑收敛、无重复代码 --- ga.py | 50 ++++++- memory/plan_sop.md | 303 +++++++++++++++++++++++++++++++++++-------- memory/verify_sop.md | 106 +++++++++++++++ 3 files changed, 402 insertions(+), 57 deletions(-) create mode 100644 memory/verify_sop.md diff --git a/ga.py b/ga.py index d673405..abadd0f 100644 --- a/ga.py +++ b/ga.py @@ -271,6 +271,27 @@ def _get_abs_path(self, path): def _extract_code_block(self, response, code_type): matches = re.findall(rf"```{code_type}\n(.*?)\n```", response.content, re.DOTALL) return matches[-1].strip() if matches else None + + def _is_in_plan_mode(self): + """统一的plan模式检测逻辑""" + return self.working.get('in_plan_mode', False) or \ + ('plan_sop' in (self.working.get('related_sop') or '')) + + def _check_plan_completion(self): + """检查plan.md是否完成,返回剩余任务数。失败返回None""" + try: + plan_path = os.path.join(self.cwd, 'plan.md') + if not os.path.isfile(plan_path): + return None + with open(plan_path, 'r', encoding='utf-8') as f: + return len(re.findall(r'\[ \]', f.read())) + except Exception: + return None + + def _exit_plan_mode(self): + """退出plan模式,清理相关状态""" + self.working['in_plan_mode'] = False + self.working.pop('related_sop', None) def do_code_run(self, args, response): '''执行代码片段,有长度限制,不允许代码中放大量数据,如有需要应当通过文件读取进行。''' @@ -419,6 +440,10 @@ def do_update_working_checkpoint(self, args, response): related_sop = args.get("related_sop", "") if "key_info" in args: self.working['key_info'] = key_info if "related_sop" in args: self.working['related_sop'] = related_sop + # P0-1: plan模式一旦激活就持久化,不因related_sop变更而丢失 + if 'plan_sop' in related_sop: + self.working['in_plan_mode'] = True + self.max_turns = max(getattr(self, 'max_turns', 40), 80) # plan模式需要更多轮次 self.working['passed_sessions'] = 0 yield f"[Info] Updated key_info and related_sop.\n" next_prompt = self._get_anchor_prompt(skip=args.get('_index', 0) > 0) @@ -437,6 +462,11 @@ def do_no_tool(self, args, response): return StepOutcome({}, next_prompt="[System] Incomplete response. Regenerate and tooluse.") if 'max_tokens !!!]' in content[-100:]: return StepOutcome({}, next_prompt="[System] max_tokens limit reached. Use multi small steps to do it.") + # P0-2: plan模式下声称完成但未执行验证时,强制拦截 + if self._is_in_plan_mode() and any(kw in content for kw in ['任务完成', '全部完成', '已完成所有', '🏁']): + if 'VERDICT' not in content and '[VERIFY]' not in content and '验证subagent' not in content: + yield "[Warn] Plan模式完成声明拦截。\n" + return StepOutcome({}, next_prompt="⛔ [验证拦截] 检测到你在plan模式下声称完成,但未执行[VERIFY]验证步骤。请先按plan_sop §四启动验证subagent,获得VERDICT后才能声称完成。") # 2. 检测“包含较大代码块但未调用工具”的情况 # 这里通过三引号代码块 + 最少字符数的方式粗略判断“大段代码” code_block_pattern = r"```[a-zA-Z0-9_]*\n[\s\S]{300,}?```" @@ -460,7 +490,13 @@ def do_no_tool(self, args, response): "并明确是否还需要额外的实际操作。" ) return StepOutcome({}, next_prompt=next_prompt) - # 3. 正常情况:直接将回复返回给用户并结束循环 + # 3. plan模式退出检查:plan.md中0个[ ]残留时清除plan标志 + if self._is_in_plan_mode(): + remaining = self._check_plan_completion() + if remaining == 0: + self._exit_plan_mode() + yield "[Info] Plan完成:plan.md中0个[ ]残留,退出plan模式。\n" + # 4. 正常情况:直接将回复返回给用户并结束循环 yield "[Info] Final response to user.\n" return StepOutcome(response, next_prompt=None) @@ -504,11 +540,21 @@ def turn_end_callback(self, response, tool_calls, tool_results, turn, next_promp next_prompt += "\n[DANGER] 上一轮遗漏了,已根据物理动作自动补全。在下次回复中记得协议。" summary = smart_format(summary, max_str_len=100) self.history_info.append(f'[Agent] {summary}') - if turn % 35 == 0 and 'plan' not in str(self.working.get('related_sop')): + + def next_prompt_patcher(self, next_prompt, outcome, turn): + # 使用统一的plan模式检测 + _plan = self._is_in_plan_mode() + + if turn % 35 == 0 and not _plan: next_prompt += f"\n\n[DANGER] 已连续执行第 {turn} 轮。你必须总结情况进行ask_user,不允许继续重试。" elif turn % 7 == 0: next_prompt += f"\n\n[DANGER] 已连续执行第 {turn} 轮。禁止无效重试。若无有效进展,必须切换策略:1. 探测物理边界 2. 请求用户协助。如有需要,可调用 update_working_checkpoint 保存关键上下文。" elif turn % 10 == 0: next_prompt += get_global_memory() + + if _plan and turn >= 10 and turn % 5 == 0: + next_prompt = "[Plan提醒] 你正在计划模式。必须 file_read(plan.md) 确认当前步骤,回复开头引用:📌 当前步骤:...\n\n" + next_prompt + if _plan and turn >= 70: + next_prompt += f"\n\n[DANGER] Plan模式已运行 {turn} 轮,已达上限。必须 ask_user 汇报进度并确认是否继续。" injkeyinfo = consume_file(self.parent.task_dir, '_keyinfo') injprompt = consume_file(self.parent.task_dir, '_intervene') if injkeyinfo: self.working['key_info'] = self.working.get('key_info', '') + f"\n[MASTER] {injkeyinfo}" diff --git a/memory/plan_sop.md b/memory/plan_sop.md index bdfff2b..3903933 100644 --- a/memory/plan_sop.md +++ b/memory/plan_sop.md @@ -1,70 +1,263 @@ + + # Plan Mode SOP + **触发**:3步以上有依赖/多文件协同/条件分支/需并行 | **禁用**:1-2步简单任务直接做 -**工作目录**:`./plan_XXX/`(XXX=任务英文短名) -## 规划态(按序执行) -**步骤1:创建文件夹 + 存checkpoint** -``` -[任务] 产出 ./plan_XXX/plan.md | [需求] 一句话 | [约束] 关键限制 -[进度] 即将读领域SOP | ⚡写完plan后必须重读本SOP步骤3切换执行态 -``` -**步骤2:读领域SOP → 写plan骨架** -先读相关SOP,立即写骨架。允许"⚠待确认",禁止以"没调研清楚"推迟。 -**骨架格式**: -``` +任务开始前必须先创建工作目录 `./plan_XXX/`(XXX=任务英文短名) + +--- + +## 一、探索态(规划前置,必须执行) + +⛔ **硬性规则(先读再做)**: + +- **主agent禁止直接执行环境探测**(必须委托subagent,无例外) +- 主agent只做:创建目录、读SOP索引、启动subagent、读取结论 +- subagent只读探测,禁止修改任何文件、执行有副作用的操作 +- **探索subagent启动失败时:排查原因→重试,最多2次。禁止主agent回退为自己探测** + +**目标**:在写任何计划之前,搞清3件事: +① 环境现状(有什么、缺什么) ② 可用SOP ③ 关键不确定点 + +**为什么必须用subagent**:主agent上下文是最稀缺资源,探测长输出会挤占规划执行空间。 + +### 步骤1:创建目录(必做) + SOP匹配 + 设置plan标志(主agent直接做) + +1. 创建工作目录 `mkdir plan_XXX/` +2. 读 `sop_index.md` 匹配可用领域SOP +3. 更新checkpoint:`[任务] XXX | [需求] 一句话 | [约束] 关键限制 | [匹配SOP] ... | [进度] 探索态` + +### 步骤2:启动探索subagent(监察模式) + +按 subagent.md 启动探索subagent,**加 `--verbose`** 开启监察模式,input要点: + +- **任务**:探测环境信息,写入 `plan_XXX/exploration_findings.md` +- **探测项**(按任务类型选做,不是全做): + - 代码类 → 关键文件结构、依赖、入口点 + - 浏览器类 → 目标页面当前状态、可交互元素 + - 自动化类 → 环境检查(which/pip/路径/权限) + - 数据类 → 抽样数据(首5行+尾5行+总量) +- **输出格式**:`## 环境现状` / `## 关键发现` / `## 风险/不确定点` +- **约束**:只读探测,禁止修改文件,≤10次工具调用 +- **复杂度评估**:探测时注意记录数据规模(文件数、行数、页面数),写入findings供规划时判断委托 + +### 步骤3:监察等待 + 读取结论 + +主agent主动观察output.txt进度(`--verbose`输出含原始工具结果),而非无脑sleep轮询: + +1. **观察**:读output.txt,审查subagent的探测方向和原始数据 +2. **纠偏**(按需): + - 方向偏了 → 写 `_intervene` 追加指令纠正 + - 缺少关键上下文 → 写 `_keyinfo` 注入信息 + - 已获取足够信息 → 写 `_stop` 提前终止,节省轮次 +3. **收取**:等待 `[ROUND END]`,读取 `exploration_findings.md` + +**产出**:`exploration_findings.md`(结构化发现报告),主agent基于此进入规划态,写入plan.md头部的「探索发现」段。主agent在监察过程中获得的一手认知也可直接用于规划。 + +--- + +## 二、规划态(含审查门) + +### 步骤4:读领域SOP → 写plan.md + +先读探索态匹配到的SOP,然后写plan骨架。允许"⚠待确认",禁止以"没调研清楚"推迟。 + +**[D] 委托标注规则**:写每个步骤时,结合探索发现评估操作量,符合以下任一条件则标 `[D]`: + +- 需要读取大量代码/文件(预估 >3个文件或 >100行) +- 需要浏览网页并提取信息 +- 需要执行 3 次以上重复性操作 +- 需要运行测试/构建并分析输出 + +不标 `[D]` 的情况:读/更新 plan.md、单文件小幅修改、ask_user、简单一次性命令 + +**plan.md格式**: + +```markdown + # 任务标题 需求:一句话 | 约束:关键限制 + +## 探索发现 +- 发现1:XXX(来源:file_read/web_scan/code_run) +- 发现2:YYY +- 不确定点:ZZZ + +## 执行计划 1. [ ] 步骤1简述 -2. [P] 步骤2简述(并行,读subagent_sop.md执行Map模式) + SOP: xxx_sop.md +2. [D] 步骤2简述(委托subagent执行) + SOP: yyy_sop.md 依赖:1 -3. [?] 步骤3(条件分支) - 条件:X成功→3.1,否则→3.2 -``` -**标记**:`[ ]`待做 | `[✓]`完成 | `[✗]`失败 | `[P]`并行 | `[?]`条件分支 -**[P]标记条件**(全YES才可标): -□ 2+步骤可同时? □ 无数据依赖? □ 产出不同文件? □ 节省>20%时间? -**子任务目录**:subagent产出放 `./plan_XXX/subtask_name/` -**探索规则**:有⚠项→逐项探索,每轮更新plan+checkpoint | 连续3轮无进展→用当前最佳方案 -**⛔ 写完骨架后禁止执行。必须先完成步骤3。** - -**步骤3:转入执行态** -``` -CALL update_working_checkpoint( - key_info='[执行] plan.md | 当前:1.1 | ⚡有[P]标记必须读subagent_sop.md执行Map模式' -) +3. [P] 步骤3简述(并行,读subagent.md执行Map模式) + SOP: yyy_sop.md +4. [?] 步骤4(条件分支) + SOP: (无) ← 高风险 + 条件:X成功→4.1,否则→4.2 + +--- + +## 验证检查点 +N+1. [ ] **[VERIFY] 启动独立验证subagent** + SOP: verify_sop.md + 操作:准备verify_context.json → 启动验证subagent → 读取VERDICT → 按结果处理 + ⚠ 不可跳过,不可在未启动subagent的情况下标记[✓] + +--- ``` -## 执行态循环 -1. 读plan.md → 定位当前`[ ]`项 -2. **检查并行**: - ``` - IF has_mark('[P]'): - CALL file_read('subagent_sop.md') - # 按SOP创建context.json(含绝对路径)+ input.txt - # ⚠ subagent必须从context.json读取绝对路径写入文件 - ELSE: - 执行当前步骤 - ``` -3. 执行该项 -4. **收尾(必须执行,不可跳过)**: - ``` - # ⚠ 进度标记更新是强制要求,每步完成后必须执行 - file_patch(plan, '[ ] 当前步骤' → '[✓] 当前步骤') - file_read(plan) # 验证标记已更新 + 找下一步 - update_working_checkpoint('[进度] 步骤N已完成 | 下一步:...') - ``` -5. **Checkpoint验证(每3步或关键节点)**: - ``` - file_read(plan) # 检查:所有已执行步骤是否标[✓] - IF 有遗漏标记: - 立即补标 file_patch(...) - ``` -6. 全部完成 → 汇总结果 → 清理checkpoint -## 失败处理 + +### 步骤5:自检清单(主agent逐项检查) + +- □ 探索发现是否都反映在plan中?(没遗漏关键约束) +- □ 每步的SOP标注是否合理?(SOP真的能解决该步?) +- □ 步骤间依赖是否正确?(有没有隐含依赖没写出来) +- □ 高风险步骤(SOP:无/不可逆)有没有清晰的执行思路? +- □ 步骤粒度是否合适?(禁止"处理所有文件",必须展开具体条目) +- □ **复杂/繁琐步骤是否标注了[D]?**(读大量代码/网页/重复操作必须委托subagent) +- □ **是否包含"验证检查点"section,且有[VERIFY]步骤?(必须有,这是强制步骤)** + +### 步骤6:用户确认 + +ask_user 确认plan后才能转入执行态。**⛔ 用户未确认不得执行。** + +### 步骤7:转入执行态 + +更新checkpoint:`[执行] plan.md | 当前:步骤1 | ⚡有[P]标记必须读subagent.md执行Map模式` + +--- + +## 三、执行态循环 + +> **核心原则:连续执行,不停顿汇报。** 做完一步立即 file_read(plan.md) 找下一个 `[ ]`,直到全部完成。 + +### 每轮流程 + +1. **读plan** — `file_read(plan.md)` 定位第一个 `[ ]` 项 +2. **读SOP** — 该步标注了SOP → 先 file_read 该SOP +3. **检查标记** — `[D]`标记 → 必须委托subagent执行,主agent只收结果摘要;`[P]`标记 → 读 subagent_sop.md 执行Map模式;`[?]`条件 → 评估条件选分支,未选标[SKIP] +4. **执行** — 无特殊标记的步骤由主agent自己执行 +5. **Mini验证** — 快速确认产出存在且合理(file_read确认非空、检查exit code等) +6. **标记完成** — `file_patch` 标记 `[ ]` → `[✓ 简要结果]`(进度写入plan.md) +7. **继续** — 立即回到步骤1,file_read(plan.md) 执行下一个 `[ ]` + +### 终止检查(最后一步标记后,不可跳过) + +file_read(plan.md) 全文扫描,确认所有步骤(含[VERIFY])均为 `[✓]`/`[✗]`,0个 `[ ]` 残留。 +输出:`🏁 终止检查:[总步数]步全部完成,0个[ ]残留 → 任务结束` +若发现遗漏 → 继续执行,禁止声称完成。 + +### ⚠ 执行态禁令 + +- **禁止凭记忆执行**:每次做新步骤前必须 `file_read(plan.md)`,不可"我记得下一步是..." +- **禁止跳过验证步骤**:[VERIFY]步骤是强制的,不可以"任务都做完了"为由跳过 +- **禁止未经终止检查就结束**:最后一步标记后必须 file_read 全文扫描确认0个[ ]残留,输出🏁终止确认行 +- **禁止停下来输出纯文字汇报**:做完一步后必须立即 file_read(plan.md) 继续,不要输出进度总结 + +### 💡 动态委托原则 + +即使步骤未标 `[D]`,执行中发现以下情况时,主动委托 subagent 处理: + +- 需要读取大量代码/文件才能理解上下文(>3个文件或预估 >100行) +- 需要反复试错调试 +- 需要浏览网页提取信息 + +做法:起 subagent 完成具体操作,要求返回精简摘要,主 agent 基于摘要继续决策。保持主 agent 上下文干净是第一优先级。 + +--- + +## 四、验证态(subagent独立验证) + +> 全部步骤[✓]后进入。**强制**启动独立subagent做对抗性验证,避免上下文污染。 + +### 触发条件 + +- 所有执行步骤标记为 `[✓]` +- **所有plan模式任务必须经subagent验证**(主agent有确认偏误,易被表面成功迷惑) + +### 步骤8:准备验证上下文 + +在 `./plan_XXX/` 下创建 `verify_context.json`,包含: + +- task_description:原始任务描述(用户原话) +- plan_file:plan.md绝对路径 +- task_type:code|data|browser|file|system +- deliverables:交付物列表(type/path/expected) +- required_checks:必做检查列表(check/tool) + +**传什么**:任务描述、plan路径、交付物清单、必做检查。**不传**:执行过程、调试记录。 + +### 步骤9:启动验证subagent + +按 subagent.md 标准流程启动验证subagent,input要点: + +- **角色**:你是独立验证者,工作是对抗性验证(证明交付物不能用) +- **第一步强制**:file_read verify_sop.md 完整阅读验证SOP +- **按 verify_sop.md 第3节**选择对应task_type的验证策略执行 +- **每个检查必须有工具调用证据**(实际执行,不是叙述) +- **任务描述**:(填入原始任务描述) +- **交付物清单**:(填入deliverables列表) +- **输出**:在 result.md 中按 verify_sop.md 第6节格式输出,最后一行 `VERDICT: PASS / FAIL / PARTIAL` +- **约束**:3轮内完成,每轮至少1个实际工具调用 + +同时传入 verify_context.json 的路径,让subagent自行读取详细上下文。 + +### 步骤10:收集验证结果 + +轮询 output.txt 等待 `[ROUND END]`,然后读取 result.md: + +1. **找VERDICT行**:读取result.md最后几行,提取 `VERDICT: PASS/FAIL/PARTIAL` +2. **检查有效性**:如果所有PASS项都没有工具调用输出(只有叙述),视为验证无效,按FAIL处理 +3. **按结果处理**: + - **PASS** → 进入任务完成收尾 + - **FAIL** → 进入修复循环 + - **PARTIAL** → 主agent判断可接受则完成,否则修复 + - **无VERDICT行** → 从output.txt提取关键信息,主agent自行判断PASS/FAIL + +**任务完成收尾**(验证PASS后执行): + +1. 标记plan.md中 `[VERIFY]` 步骤为 `[✓]` +2. 更新checkpoint:`[完成] XXX任务 | [产出] ... | [经验] ...` +3. 向用户确认任务完成 + +**重要**:只有在验证PASS后,才能标记[VERIFY]为[✓]并声称任务完成。如果验证FAIL,需要进入修复循环。 + +**Fallback**:若subagent未产出result.md(turn耗尽),从output.txt提取VERDICT关键信息。 + +### 修复循环(FAIL后) + +FAIL → 提取具体失败项 → 回执行态修复(不重新规划) → 修复完成 → 再次启动验证subagent → 最多2轮FAIL-重试,超过 ask_user 介入 + +修复时: + +1. 将FAIL项作为新步骤追加到plan.md(标记为 `[FIX]`) +2. 只修复失败项,不重做已PASS的部分 +3. 修复完成后重新准备verify_context.json(只含失败项) + +### 特殊场景处理 + +浏览器/键鼠/定时任务等场景:主agent执行操作并导出证据(截图/录屏/日志)→ subagent验证证据文件。**禁止主agent自行判断PASS/FAIL**。 + +--- + +## 五、失败处理 + 1. **记录**:checkpoint中 `step_X: [FAILED] 原因 (retry: N/3)` 2. **重试**:网络超时→自动重试3次(2s/4s/8s) | 配置错误→询问用户 | 其他→标[✗]跳过 3. **subagent失败**:查stderr.log→明确错误主agent修正重启 | 未知错误重试1次 | 最多重启2次 4. **依赖传播**:步骤失败后,后续依赖项标[SKIP] +5. **plan有误**:回退到规划态修正plan.md,重新过审查门 + ## 强制约束 + - 每项必须有独立完成判据 - 禁止"处理所有文件",必须展开具体条目 - 一次只做一项;计划有误回规划态修正 -- 不可逆操作前多验证一步 \ No newline at end of file +- 不可逆操作前多验证一步 diff --git a/memory/verify_sop.md b/memory/verify_sop.md new file mode 100644 index 0000000..c166527 --- /dev/null +++ b/memory/verify_sop.md @@ -0,0 +1,106 @@ + + +## 铁律(违反任何一条 → VERDICT 无效) + +1. **必须运行产物**。读代码/文件不算验证——能跑的必须跑,能看的必须截图看。 +2. **必须有工具证据**。每个 PASS 必须附带工具调用的实际输出(stdout/截图/文件内容)。没有工具调用证据的 PASS 等于 SKIP。 +3. **独立验证**。不信任之前步骤的"成功"输出,用独立手段重新确认。 + +> **自检**:如果你在写解释而不是在调用工具,停下来。调用工具。 + +--- + +## 产物类型 → 必做验证动作 + +**写 VERDICT 前,必须根据产物类型完成对应动作。缺少任何一项则 VERDICT 无效。** + +| 产物类型 | 必做动作 | +| ------------------ | ------------------------------------------------------------ | +| 网页/HTML/前端 | ①浏览器打开 ②截图确认渲染 ③检查console错误 | +| Python/脚本 | ①实际执行 ②检查stdout+stderr+exit code ③边界输入再跑一次 | +| 数据文件(json/csv) | ①file_read抽查内容 ②验证格式合法 ③检查行数/条数 | +| API/服务 | ①实际调用endpoint ②检查响应状态码+body ③测试错误输入 | +| 配置/SOP/文档 | ①file_read确认完整内容 ②检查格式/语法 ③确认未破坏已有内容 | +| 自动化/定时任务 | ①确认注册成功 ②触发一次试运行 ③检查日志输出 | + +--- + +## 输出格式 + +**第一步:填写执行证据汇总表**(必须先填,空表 = 验证无效) + +``` +## 执行证据汇总 +| # | 验证动作 | 工具 | 关键输出摘要 | +|---|----------|------|--------------| +| 1 | (做了什么) | (用了什么工具) | (实际结果) | +| 2 | ... | ... | ... | +``` + +**第二步:逐项检查** + +``` +### Check: [验证什么] +**工具调用:** [实际执行的工具和参数] +**实际输出:** [工具返回的实际结果,复制粘贴不是转述] +**Result: PASS / FAIL / SKIP(原因)** +``` + +**第三步:最终裁定**(必须以下列之一结尾) + +- **VERDICT: PASS** — 所有关键检查通过 +- **VERDICT: FAIL** — 存在未解决的问题(列出) +- **VERDICT: PARTIAL** — 仅限工具/环境限制导致无法验证的部分(说明哪些没验证) + +--- + +## 触发时机 + +- 非平凡任务完成后(3+ 步操作、多文件、外部系统) +- 用户明确要求验证 +- 批量操作完成后(抽查) +- 不可逆操作前的预检 + +简单单步操作不需要走验证流程。 + +--- + +## 参考附录 + +
+分场景详细策略(展开查看) + +### 文件操作类 + +- `file_read` 确认内容正确(不只是存在) +- 检查文件大小(`ls -la`)、编码 +- 批量操作:抽查首/中/尾至少3个文件 +- 追加/修改:确认原有内容未被破坏 + +### 浏览器/网页操作类 + +- `web_scan` 确认页面状态是预期的 +- 截图 + OCR 交叉确认关键 UI 状态 +- 表单提交:确认响应/跳转/数据变化 +- SPA:确认 URL 和 DOM 都变了 + +### 脚本/代码执行类 + +- 代表性输入重新运行 +- 边界输入:空输入、超大输入、特殊字符 +- 产出文件:`file_read` 验证内容 + +### 数据采集类 + +- 验证采集数量 +- 抽查质量:字段完整性、编码、无乱码 +- 检查重复/遗漏 + +### 对抗性探测 + +- 空值/边界:空字符串、0、负数、超长文本、特殊字符 +- 幂等性:同一操作执行两次 +- 缺失依赖:前置文件/服务不存在会怎样 +- 部分失败:批量操作中间失败的状态一致性 + +