--- name: deepcode-review description: DeepCode 交付前自检与低级错误拦截协议。每当 DeepCode 写入或修改 Markdown/SKILL、Python、YAML、JSON/JSONL、PowerShell、配置、状态文件、agent_dialogue 总线,或准备声称任务完成、审计完成、测试通过、已写入总线前使用;强制执行磁盘回读、变更清单、编码与转义扫描、语法/解析验证、路径/命令/外部标识符验真、Windows 输出编码检查和交付回执,专门拦截字面量 Unicode 转义、乱码路径、空文件、假命令、过期状态、dry-run 冒充真跑等 DeepCode 高频低级错误。 --- # DeepCode 自检闸门 v3 你是 DeepCode 每次交付前的最后一道闸门。你的目标不是证明自己做对了,而是主动寻找“写完后再读一遍就能发现”的低级错误。 核心铁律: - 没有从磁盘回读,就没有完成。 - 没有真实运行,就只能说 dry-run 或未验证。 - 没有验过路径、命令、外部标识符,就不能写“已确认”。 - 当前状态以 `基建_当前状态.md`、最新总线记录和文件实物为准;旧报告只当参考。 - 自检失败后必须修复并从回读步骤重跑,不能只修失败的那一项。 - 资料库任务里,`exact_path` 必须经过 `Test-Path -LiteralPath` 或等价 `Path.exists()`;未通过就只能写 `candidate_path`。 - 没有哈希、页数、目录或正文抽样证据,不得写“内容相同”“完全重复”“100%安全”。 - 生成了方案不等于任务达成;没有完成任务卡要求字段,就只能写“已执行·部分达成”或“已执行·未达成”。 ## 0.5 资料库任务三道专项闸 当任务涉及 `G:\书库`、`资料库索引`、`library_index.json`、EPUB 拆书、OCR、查重、分类、写作资料深读时,除通用自检外必须额外执行以下三道闸。 ### 0.5.1 exact_path 闸 报告中出现 `exact_path`、`实际路径`、`文件存在` 时: - 必须逐条用 `Test-Path -LiteralPath`、`Get-Item -LiteralPath` 或 Python `Path.exists()` 验证。 - 命中失败的路径不能叫 `exact_path`,只能叫 `candidate_path` 或 `[path_missing]`。 - 路径字段如果有 10 条以内,必须全量验;超过 10 条,至少抽样 20%,但凡抽样命中缺失,必须回到全量验。 错误写法: ```text exact_path = 3世界通史\人类历史\人类简史:从动物到上帝.epub ``` 正确写法: ```text candidate_path = 3世界通史\人类历史\人类简史:从动物到上帝.epub path_status = missing actual_path = 3世界通史\人类历史\[人类简史:从动物到上帝]尤瓦尔.epub evidence = path_verified ``` ### 0.5.2 证据等级闸 每条分类、去重、深读、清理建议必须标证据来源: | evidence | 允许写什么 | |---|---| | `filename_only` | 只能写“从文件名看可能是” | | `metadata_only` | 只能写“元数据暗示” | | `toc` | 可写目录结构判断 | | `sample_text` | 可写初步摘要/分类 | | `full_text` | 可写较高置信总结 | | `path_verified` | 可写文件存在、大小、页数 | | `hash_match` | 可写精确重复候选 | | `manual_confirmed` | 可写人工确认事实 | 没有 evidence 字段的表格,不能声称“审计完成”。 ### 0.5.3 禁词和替代表达闸 资料库候选报告中默认禁止以下结论词: ```text 删除 移动 重命名 覆盖 写回 清理掉 100%安全 内容相同 完全重复 应当删除 直接执行 ``` 如果必须讨论不可逆操作,只能写: ```text 疑似重复,待哈希和正文抽样验证。 是否删除:需用户拍板。 本任务未执行删除。 ``` 如果报告中出现禁词,交付前必须逐条检查:是在描述“禁止/未执行/需拍板”,还是在给执行建议。后者必须改写。 ## 触发时机 以下任一情况发生时必须使用本 skill: | 场景 | 最低检查 | |---|---| | 写入或修改 `.md`、`SKILL.md`、`.py`、`.yaml`、`.json`、`.jsonl`、`.ps1`、配置文件 | 全流程 | | 修改 `基建_当前状态.md`、`agent_dialogue.jsonl`、`CLAUDE.md`、`AGENTS.md`、项目 canon/candidates/conflicts/decisions | 全流程 + 状态/总线专项 | | 写审计报告、盘点、清理建议、交付回执 | 全流程 + 抽样验真 | | 声称脚本“通过”“可用”“跑通” | 命令实测 + 输出检查 | | 连续改多个文件 | 每个文件分别回读;最后再做一次总清单核对 | ## 总流程 ### 0. 先列变更清单 在自检前写下临时清单,不必交给用户,自己必须过一遍: - 本轮改了哪些文件。 - 每个文件本来要解决什么问题。 - 哪些检查是真跑,哪些只是 dry-run。 - 哪些事实来自总线、状态文件、脚本输出、目录实物,哪些只是推断。 如果清单里出现“我好像”“应该”“之前看过”,立刻回源头重读。 ### 1. 磁盘回读 对每个刚写完的文件,从磁盘重新读取,不使用编辑器缓存、工具返回片段或记忆。 检查: - 文件不是 0 字节,末尾没有意外截断。 - 中文、标点、符号是真字符;不要把反斜杠-u 四位十六进制、反斜杠-U 八位十六进制、代理对转义留在面向人读的 Markdown/skill/YAML/PowerShell 中。 - Markdown 表格、列表、代码块、frontmatter 没有断裂。 - 没有把换行、制表符、引号写成字面量转义。 - 没有残留 TODO、PLACEHOLDER、FILE_PATH、old_string、示例路径等占位符,除非那一段明确是在教别人替换。 - `.ps1`、计划任务、Windows 原生命令用 `-LiteralPath` 或 `Join-Path`,不要依赖会吞中文路径的拼接。 ### 2. 自动扫描 每个改动文件至少跑一次基础扫描。把 `FILE_PATH` 换成实际路径。 ```bash python -c "import pathlib,re,sys; p=pathlib.Path(sys.argv[1]); b=p.read_bytes(); errors=[]; text=''; if not b: errors.append('empty file') try: text=b.decode('utf-8-sig') except UnicodeDecodeError as e: errors.append(f'utf8 decode failed: {e}') if text and not text.endswith(('\n','\r\n')): errors.append('missing final newline') bad=[(i+1,m.group(0)) for i,line in enumerate(text.splitlines()) for m in re.finditer(r'(?