executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
\n - 转成 Markdown 加粗行:`**发言人 1 00:33:09**`\n2. **段落间空行**:连续的非空行视为同一段(保留原始换行),段落之间补一个空行\n3. **不删除任何文字**:空行、空白、ASCII 装饰线(`---`、`===`)等全部保留\n4. **不识别 H3 / H4 标题层级**:只到 H2 层级——H2 标题在 Phase 4 Step 4.4 中按\"主题分章\"原则插入;不主动把某段升级为 `###`/`####`\n5. **不识别列表**:不把 `- xxx` 改成 markdown 列表——保持原样\n\n**输出**:\n- 中间产物:`{原文件 basename}_converted.md`,保留在 archive 子目录\n- 后续 Step 2.1~5.2 在 converted 副本上进行\n- 原始 `.txt` 文件保持不动\n\n**示例**:\n\n输入(`raw.txt`):\n\n```\n发言人 1 00:33:09\n我先说一下比较好的部分,就是整个最终的报告篇幅是比较充分的。\n然后大家在一开始不知道怎么样一个报告是比较完善的,也知道怎么样去借鉴他山之石。\n从这个阿尔法 gpt里面的这报告相当于蒸馏他的一个一个想法啊。\n这个这个在前期一开始搭基建的时候确实是很有必要的一个措施。\n\n发言人 1 00:33:57\n呃然后。我注意到咱们在最终生成法律服务意见书的时候...\n```\n\n输出(`raw_converted.md`):\n\n```markdown\n**发言人 1 00:33:09**\n我先说一下比较好的部分,就是整个最终的报告篇幅是比较充分的。\n然后大家在一开始不知道怎么样一个报告是比较完善的,也知道怎么样去借鉴他山之石。\n从这个阿尔法 gpt里面的这报告相当于蒸馏他的一个一个想法啊。\n这个这个在前期一开始搭基建的时候确实是很有必要的一个措施。\n\n**发言人 1 00:33:57**\n呃然后。我注意到咱们在最终生成法律服务意见书的时候...\n```\n\n**不识别的格式**(保持原文):\n- 没有时间戳的\"发言人 1:\"→ 保留为正文\n- \"Speaker A:\" → 保留为正文\n- 纯文本无发言人标记 → 整段视为正文\n\n---\n\n## Phase 2:识别\n\n### Step 2.1:识别文件结构\n\n通读 raw 稿,识别组织方式:\n\n- **按发言人 + 时间戳分块**(如 `**发言人 1 00:33:09**`)— 多数 ASR 输出\n- **自由段落**(无显式分块)\n- **混合**(标题 + 段落 + 引用)\n\n识别目的:决定 Phase 4 润色时是否合并同发言人连续发言。**不要改写分块结构**,保留原貌。\n\n### Step 2.2:通读识别高置信误转写\n\n**必须完整通读全文**,以 Agent 视角扫描。**不列静态错误表**——ASR 错误无穷无尽(大小写漂移、空格、漏词、错位、同音字、形近字、断词重连、音节吞并…),任何预设列表都会漏判。\n\n**核心原则**:\n> **仅在上下文明确指向某个词典术语时,才将近似误转写替换为该术语。**\n> **模糊或低置信场景保持原文,不做猜测式替换。**\n\n**启动扫描的高频易错类别**(不是错误表,是判断启动点):\n\n1. **人名**:律师、当事人、证人姓名是否首次出现 + 后续引用是否一致\n2. **英文产品/工具/平台名**:是否在工具使用、命令行、平台介绍等场景\n3. **机构/活动/品牌名**:律协、青训营、训练营、赛题\n4. **法律术语同音/形近**:代理 vs 带理、抵押 vs 抵压、知情 vs 至清\n5. **数字/单位/时间戳**:1/7、0/6、中英文逗号混用;**保守原则**\n\n**形式漂移识别**(参考但不穷举):\n\n- 大小写漂移(WorkBuddy vs workbuddy vs WORKBUDDY)\n- 空格漂移(work body / Work Buddy)\n- 连字符(Claude-code / Claude-Code)\n- 拆分被识别为中文(\"克劳德 code\")\n- 漏字残字(\"body\" 残留在\"让,如果 body帮我们\")\n- 同音/形近字(\"张律师 / 张老师 / 章律师\" 类推)\n- 断词重连(\"然后让\" 被拆成\"让,如果\")\n\n**禁止**:\n- 只用 grep/正则匹配清单(必然漏)—— 详见 §\"工作机制\"为什么按每处判断展开\n- 把\"我\"改成\"我们\"等无明确对照的\"风格化\"改写\n- 替换词典外的术语\n- 强行补全\"看上去缺字\"的句子——除非能确定是组合错误\n\n---\n\n## Phase 3:修正(默认开启)\n\n> Phase 3 三个 Step 改的是**三类不同对象**——Step 3.1 改字(语义)、Step 3.2 改空白(格式)、Step 3.3 删字(语言字符)。三类操作各自独立、可单独审计、单独计日志。\n\n### Step 3.1:词典统一替换\n\n对 Step 2.2 识别出的高置信误转写:\n\n1. **三重确认**:\n - 词典里有对应目标值\n - 上下文明确指向该目标值所代表的对象\n - 形式漂移证据成立(大小写/空格/连字符/漏字/同音/形近/断词)\n2. 三重任一不满足 → **不替换**,保持原文\n3. 替换完成后在 correction_log.md 记录:`{原文}` → `{改后}`,并标注行号和上下文片段\n4. **绝不修改原始文件**,所有输出写到 archive/ 下的新文件\n\n### Step 3.2:基础空白清理(默认开启,无损)\n\n**为什么独立于 Phase 4 润色**:基础空白清理是\"格式标准化\",不改变原文语义、不删减任何信息;与 Phase 4 发言人合并 / 标点规范 / 段落切分那种\"风格调整\"性质不同,所以默认开启(用户不需要为此做开关决策)。\n\n**清理动作清单**(仅做以下五类,不做任何超出此范围的事):\n\n| 类别 | 动作 | 触发条件 |\n|---|---|---|\n| 行首/行尾空白 | 删除 | 任意行 |\n| 连续空行 | 压缩为单个空行 | 任意位置 |\n| 全角/半角空格 | 统一为半角空格 | 出现在英文单词之间或英文标点旁 |\n| 专有名称内部断裂空格 | 合并 | 上下文明确指向词典中的专有名称(如\"Work Buddy\" → \"WorkBuddy\") |\n| 中文数字 + 空格 + 级/章/节 | 合并 | 模式:`[一二三四五六七八九十百千]+ +级/章/节` 合并为 `[一二...]+级/章/节`(如\"二 级\" → \"二级\") |\n\n**标点周围空白规则**:\n- 中文标点 `,。、;:?!\"\"''「」()` 前后不留空格(若出现则删除)\n- 英文标点 `, . ; : ? ! \" ' ( )` 后空一格(中文段落中保留)\n- 半角空格夹在中文之间 → 删除\n\n**安全执行(避免越段吞并)**:本步的\"中文标点前后多余空格\"清理有一个结构性陷阱——speaker 块的边界(`**说话人 N HH:MM:SS**` + 内容 + 空行 + 下一块标题)依赖\"内容末标点 → 换行 → 空行\"这一序列。如果清理正则用 `\\s+` 把标点之后的换行+空行也吃成单个空格,会跨块吞并,speaker 标题、H2 标题、speaker 块都会被合并成单行。执行时**按行处理、禁止跨行匹配 `\\s+`**,仅做\"行内\"动作(行尾空格、同句内的 `X, Y` → `X,Y`)。如必须做跨段清理,先单独诊断再决定。\n\n**严格不做**(避免越界):\n- 不删除任何文字、标点、字母、数字\n- 不改变段落结构(不合并段落、不切分段落——这是 Phase 4 范畴)\n- 不修改数字、时间戳、金额、日期\n- 不改发言人分块标记(如 `**发言人 1 00:33:09**`)\n- 不重排、重组、归纳\n\n**与 Step 3.1 的关系**:基础空白清理在 Step 3.1 词典替换之后执行;遇到\"Work Buddy\" → \"WorkBuddy\" 这类专有名称合并时,优先走 Step 3.1(词典替换路径),Step 3.2 仅做 Step 3.1 不覆盖的\"无词典目标的纯格式\"清理。\n\n**校对日志记录**:所有 Step 3.2 的清理动作也写到 `correction_log.md`,在\"基础空白清理\"小节集中记录(与 Step 3.1 高置信替换区分开),便于审计。\n\n### Step 3.3:口语词精简(默认开启,AI 上下文判断)\n\n**为什么独立于 Phase 4 润色**:与 Step 3.2 基础空白清理性质相同——属于\"读起来对\"的范畴,不改变原意(口语词不携带信息);与 Phase 4 发言人合并 / 标点规范 / 段落切分那种\"风格调整\"性质不同,所以默认开启(用户不需要为此做开关决策)。\n\n**白名单(可删的纯填充词)**——AI 通读时识别\"作为填充词 vs 作为实义\",仅删独立出现且无语义负担的:\n\n| 词 | 典型位置 | 删除条件 |\n|---|---|---|\n| 呃 | 段中独立 / 句首 | 认知停顿,不构成回答 |\n| 啊 | 段中独立 / 句末 | 感叹停顿 |\n| 哦 | 段中独立 | 过渡停顿(不作\"明白了\"回应) |\n| 哎 | 段中独立 | 过渡停顿 |\n| 那个 | 独立使用 | 纯指代填充(不指代具体名词) |\n| 就是说 | 独立使用 | 纯连接填充 |\n| 然后呢 | 段末 | 纯过渡填充 |\n| 对吧 | 段末 | 纯反问填充 |\n| 你知道吗 | 段中 | 纯引导填充 |\n| 怎么说呢 | 段中 | 纯思考填充 |\n| 这样子 | 独立使用 | 纯总结填充 |\n| 其实呢 | 段首 | 纯转折填充 |\n| 但是呢 | 段首 | 纯转折填充 |\n\n**保留规则**(不删):\n\n- **表态类**:\"嗯\"/\"对\"/\"是的\"/\"不是\"/\"好的\"/\"是\" 作肯定 / 否定 / 回应 → 保留(删了会丢失说话人态度)\n- **逻辑连接**:\"然后\"作逻辑连接词(\"先 A 然后 B\")→ 保留(删了破坏时序)\n- **认知停顿后接完整内容**:\"呃……这个怎么解释呢\" 整段保留——\"呃\"虽属白名单,但\"认知停顿 + 完整内容\"是说话人思考过程的真实记录,整段保留比逐字删更尊重原文\n- **段尾的语气停顿**(\"嗯\"/\"啊\"/\"呃\"出现在段末)——保留(标记说话节奏收束)\n- **紧邻关键名词 / 动词**——保留(可能是说话人强调)\n- **实义词**(名词 / 动词 / 形容词 / 副词)——一律不删\n\n**段首 vs 段尾 vs 段中 决策树**:\n\n| 位置 | 判定标准 | 处理(v2 激进版起)|\n|------|----------|---------------------|\n| **段首** | 紧跟 `**发言人 X HH:MM:SS**` 之后第一个非空行的第一个词 | **删除**(v2 起激进)|\n| **段中独立** | 句中位置、不是紧邻关键名词/动词 | **删除** |\n| **段中并列停顿 啊** | 两个名词/动名词之间 + 顿号/逗号 | **保留**(删除会破坏并列结构)|\n| **段尾** | 一段内容末尾的最后一个词 | **保留**(标记节奏收束)|\n\n详见 `references/correction_patterns.md` §11 段中并列停顿 啊 的识别模式。\n\n**判断原则**:\n- 与 Step 3.1 一样遵循\"通读全文 + 三重确认\"思路\n- 三重确认:① 该词在当前上下文是否属于白名单词类;② 在当前位置是否独立使用、是否承担实义;③ 删后不破坏说话人态度 / 时序 / 强调\n- 任一不满足 → **不删**,保留原文\n- 模糊或低置信场景一律保留原文\n\n**严格不做**(避免越界):\n- 不删整句、不删段落\n- 不删实义词(即使重复)\n- 不删关键信息(数字、人名、专有名、术语)\n- 不改写为书面语、不补全、不改语气\n- 不删\"呃 / 啊\"作认知停顿后接完整内容的版本\n- 不删\"段尾\"的关键节奏标记(v2 激进版起,段首节奏标记默认删除)\n\n**校对日志记录**:所有 Step 3.3 的精简动作写到 `correction_log.md` 的\"口语词精简\"小节,格式:\n\n```\n| 行号 | 原文片段 | 被删词 | 理由 |\n|------|----------|--------|------|\n| L207 | \"呃 这个怎么说呢,我们今天来\" | \"呃\" | 段首认知停顿,后接\"怎么说呢\"+完整内容,整段保留——本行不删(认知停顿后接完整内容的\"呃\"按 §3.3 保留规则例外)|\n| L312 | \"对,所以呢,我们\" | \"所以呢\" | \"所以呢\" 不在白名单,保留 |\n| L451 | \"然后呢我们看一下\" | \"然后呢\" | 段首过渡填充,可删 |\n```\n\n**与 Step 3.2 的关系**:Step 3.2 动空白字符,Step 3.3 动语言字符。两者都是\"读起来对\"操作,都默认开启,都在 correction_log.md 单独小节集中记录。\n\n**必检(防止漏跑整节)**:跑完必须 grep 自检(详见 `references/correction_patterns.md` §12):\n- `correction_log.md` 必须包含 `## 口语词精简` 小节\n- `correction_log.md` 必须包含 `## 高置信替换` / `## 基础空白清理` / `## 口语词精简` / `## 未处理` 四个小节\n- `meta.json` 必含 `summary` / `process_time` / `dictionary_source` / `polish_enabled` 字段\n- v1.0.2 漏跑 Step 3.3 整节无日志——本必检项是那次 bug 的复盘产物\n\n---\n\n## Phase 4:润色(可选,按 config 开关决定)\n\nPhase 4 下的所有 Step 由 `config/config.env` 配置文件中的开关决定是否启用。每个 Step 默认值的来源:\n- 缺失 `config.env`:用 `config.env.example` 的值(即默认值)\n- 缺失 `config.env.example`:用本节速查表的默认值\n\n| Step | 类别 | 动作 | 边界 | 配置开关 | 默认值 |\n|---|---|---|---|---|---|\n| Step 4.1 | 发言人合并 | 同一发言人连续多段、可合并为一段时,合并 | 仅去重分块,**不删任何原话** | `POLISH_MERGE_SPEAKERS` | true |\n| Step 4.2 | 标点规范 | 中英文标点统一、句末补全 | 不改语气词、不删\"呃/啊\"等自然语流标记 | `POLISH_PUNCTUATION` | true |\n| Step 4.3 | 段落切分 | 极长段(>500字)按语义边界切 | 不重组、不重排、不总结 | `POLISH_PARAGRAPH_SPLIT` | true |\n| Step 4.4 | 主题分章 + H2 标题 | 在明确的话题切换点插入 `## 一、标题` 行(带中文大写序号) | 仅在切换点插入,**不重组内容、不改写、不总结** | `POLISH_TOPIC_SECTION` | true |\n| Step 4.5 | 会议纪要 / 总结 | 每章\"本章摘要\"+\"关键洞察\"**就地嵌入对应 H2 标题下**;文首主标题 + 文末关键词各一行 | **不引入新事实、不重切 H2、不评价、不另设顶部聚合块** | `POLISH_SUMMARY` | true |\n\n### Step 4.4:主题分章 + H2 标题插入(默认开启)\n\n**触发条件**:话题发生明确切换(不同讨论对象 / 不同议程 / 不同主体焦点)时,插入 `## 一、标题` 行;同一话题内部的子切换**不**插入。\n\n**识别原则**:\n\n- **硬切换信号**:双方反复回到同一对象 → 突然讨论另一对象(如\"工具 → 律所管理\"、\"产品 → 客户关系\"、\"代码 → 知识库\")→ 插入 H2\n- **软切换信号**:仅是追问或深化(如\"工具 A → 工具 A 的细节\")→ 不插入\n- **不强行覆盖全文**:开头寒暄 / 中间过渡闲聊 / 结尾收束 → 不强制加 H2,让它归在第一个/最后一个 H2 之下\n\n**锚点定位流程(避免行号漂移)**:H2 锚点必须从 converted.md 上的结构标记(`**说话人 N HH:MM:SS**` 或杨卫薪行)的实际行号取,**不得从上游 raw 文件的早期阅读印象猜行号**——raw 与 converted 之间存在 metadata 块位移(Phase 1.2 包装前几行),且肉眼从 raw 数行号与脚本扫出来的真实行号常常差几行,把 H2 插错章节。**先写 5 行扫描脚本打印 converted.md 的全部 speaker 行真实行号,再据此填 H2 锚点表**;插完按\"## 标题行 + 后 5 行\"抽检,确认落在正确章节。\n\n**标题文本从何而来**:\n\n- **不**编造标题——agent 从该段上下文中提取 3-10 字主题词(如\"工具选择与日常使用\"、\"本地部署与脱敏\"、\"知识库维护\")\n- 标题文本应**不与发言人姓名、时间戳、专有名重复**——避免与原文混淆\n- 同一段内多次 H2 用相同主题词时,去重\n\n**编号规则**:\n\n- 全文 H2 标题按出现顺序加中文大写数字序号:`一、`、`二、`、`三、`...\n- 数字与标题文本之间用 `、` 顿号分隔(中文正式排版惯例):`## 一、工具选择与日常使用`\n- 序号连续编号,不跳号;中途若发现需要补插,agent 重新连续编号(不留断号)\n- 同一份 `corrected.md` 中序号唯一,不重复\n\n**严格不做**:\n\n- 不重组内容顺序\n- 不改写任何正文\n- 不总结或提炼(标题文本只是该段已说内容的提取,不引入新信息)\n- 不加 H3 / H4(本 skill 只到 H2 层级)\n- 不为单个话题切分加 H2(哪怕该话题横跨 1000 字)\n\n**校对日志记录**:所有 Step 4.4 的插入写到 `correction_log.md` 的\"主题分章\"小节(与 Step 4.1/4.2/4.3 区分),格式:\n\n```\n| 行号 | 标题文本 | 上下文锚点(前后 50 字)| 切换类型 |\n|------|----------|------------------------|----------|\n| L487 | ## 律所管理与本地部署 | \"...他就不会愿意去做这个事事情。\" | 硬切换 |\n```\n\n**与 Phase 4 其他 Step 的关系**:Step 4.1-4.3 是\"风格调整\",Step 4.4 是\"结构标注\"——前者改分块形式,后者只插入锚点,**不重排**。\n\n**为什么本 skill 做这个而不下游做**:原 §1.2 早期版本说\"下游做章节重组时再处理\",但下游 skill(如 course-generator)做的是\"基于转录稿生成课程\",与\"忠实标注原话结构\"是不同任务。H2 主题分章是\"忠实标注\",放在本 skill 更合身。\n\n### Step 4.5:会议纪要 / 总结生成(按 `POLISH_SUMMARY` 开关)\n\n**触发条件**:\n\n- 配置开关 `POLISH_SUMMARY=true`,或用户在调用时显式声明(\"生成纪要\" / \"总结\" / \"AI 洞察\")\n- 必须 Step 4.4 已先跑过——没有 H2 边界就没有\"按章节\"颗粒度\n\n**核心原则(v1.4 修订:摘要就地嵌入,不聚合到顶部)**:\n\n- 每个章节的\"本章摘要 + 关键洞察\"**直接写在对应 H2 标题之下、该章原话正文之前**——不另设顶部聚合块\n- 不使用 `\u003c!-- AI-SUMMARY -->` markers,不产生\"所有章节摘要汇聚在一起\"的独立区块\n- 全文级元信息(主标题、关键词)只各占一行,轻量置于文首 / 文末,不与逐章摘要混聚\n\n**输出位置**:\n\n- **修改 `corrected.md`**:① 文首 H1 下加一行主标题;② 每个 H2 标题下就地嵌入本章摘要 + 关键洞察;③ 文末加一行关键词\n- 不创建独立 `_summary.md`,不写 markers\n- 源文件目录镜像随 corrected.md 同步\n\n**就地嵌入格式**(每个 H2 之下):\n\n```markdown\n## 一、章节名(Step 4.4 标题,原样)\n\n**本章摘要**:50-100 字概括本章节核心内容(引用原话中的具体事实/数字/专有名,不引入新事实,不评价)\n\n**关键洞察**:\n- 洞察 1(15-30 字,横向观察本章节)\n- 洞察 2\n\n**发言人 1 00:02:09**\n(该章原话正文,全部保留,紧跟在摘要 / 洞察之后)\n...\n```\n\n**文首主标题 / 文末关键词**:\n\n- 文首:H1 标题之下、第一个 H2 之前,单行写主标题:`**主标题**:5-15 字概括全文核心议题`\n- 文末:最后一个 H2 章节原话之后,单行写关键词:`**关键词**:词1, 词2, ...(5-8 个,逗号分隔)`\n- 两者各占一行,不展开为区块,不与逐章摘要聚合\n\n**为什么改为就地嵌入(v1.4)**:\n\n- 顶部聚合块把所有章节摘要堆在一处,读者在正文某章想看概要时要回滚到顶部对照——摘要与正文分离\n- 就地嵌入让\"摘要 / 洞察\"紧贴它所概括的原话,一章自洽,阅读和后续复用(如抽成课程章节)都更顺\n- 主标题 / 关键词保留为单行全文元信息,不丢失,但不再聚合成块\n\n**生成原则**:\n\n1. **主标题**(文首单行):从全文最核心议题提取 5-15 字主题词\n2. **逐章摘要**:与 Step 4.4 的 H2 **一一对应**(**不重切话题**)\n - 长度:50-100 字\n - 引用原话中的具体事实/数字/专有名(不抽象化)\n - 不引入原话外的事实\n - 不评价(除非有原话支持)\n - 紧贴本章节原话概括,不跨章节\n3. **逐章关键洞察**:每章 2-3 条(段落短就 2 条)\n - 长度:每条 15-30 字\n - 来自本章节的横向归纳,不来自某一段\n - 不带\"应该\"\"必须\"\"建议\"等评价语气\n - 形如\"X 群体呈现 Y 趋势\"、\"X 与 Y 之间存在 Z 鸿沟\"\n4. **关键词**(文末单行):\n - 数量:5-8 个\n - 来源:原话中反复出现或具有区分性的名词/产品名/概念词\n - 格式:逗号分隔一行\n\n**严格不做**:\n\n- 不引入原话外的事实\n- 不重切 H2 边界(逐章摘要必须与原话 H2 一一对应)\n- 不评价(除非有原话明确支持)\n- 不另设顶部 `## AI 摘要` 聚合块、不写 `\u003c!-- AI-SUMMARY -->` markers\n- 不在 H2 下加 H3 / H4 包裹摘要(摘要 / 洞察用粗体标签行,不升级标题层级)\n- 不写\"行动项 / 决议 / 后续 TODO\"(除非原话明确提到)\n\n**与 Step 4.4 的边界**:\n\n| | Step 4.4 | Step 4.5 |\n|---|---|---|\n| 输出文件 | corrected.md(修改) | corrected.md(修改,就地嵌入)|\n| 操作 | 在原话章节前插入 H2 标记 | 每个 H2 标题下、原话前嵌入摘要 / 洞察;文首主标题、文末关键词各一行 |\n| 保留原话 | 全部保留 | 原话全部保留 + 摘要中引用片段 |\n| 引入新信息 | 不允许 | 不允许 |\n\n**幂等与验证**:\n\n- 再次跑批时,就地替换每个 H2 下的\"本章摘要 / 关键洞察\"块、文首主标题行、文末关键词行\n- 跑完后验证:① 每个 `^## ` 二级标题之下紧跟一个 `**本章摘要**` 行;② 全文无 `\u003c!-- AI-SUMMARY` 字样;③ 主标题 / 关键词各一行存在\n- 验证摘要总字节数 > 200(防止空摘要)\n\n**校对日志记录**:Step 4.5 的产出写到 `correction_log.md` 的\"会议纪要\"小节,格式:\n\n```\n| 字段 | 值 |\n|------|-----|\n| 主标题(文首单行)| 主标题文本 |\n| 章节数 | 8(与 Step 4.4 H2 一致)|\n| 总洞察数 | X 条 |\n| 摘要字数总计 | Y 字 |\n| 关键词(文末单行)| 词1, 词2, ... |\n| 嵌入方式 | 就地嵌入每个 H2 之下;无顶部聚合块;无 markers |\n```\n\n---\n\n**Phase 4 整体边界**(适用于 Step 4.1-4.4):\n\n- 改写为书面语\n- 总结、提炼、删除\"啰嗦\"内容(Step 4.5 是唯一例外——它明确做\"摘要 + 洞察\")\n- 补全或推测说话人意图\n- 改事实、改数字、改时间戳\n\n---\n\n## Phase 5:输出\n\n输出采用 **双写** 策略:主归档在 skill 内部,源文件目录同步一份易访问副本。原始文件保持不动。\n\n### Step 5.1:主归档(必出)\n\n输出位置:`{skill 目录}/archive/{YYYYMMDD_HHMMSS}_{原文件 basename}/`\n\n文件:\n- `{原文件}_corrected.md` — 纠错后的完整文本(保留原始分块结构)\n- `{原文件}_polished.md` — 仅在用户开启润色时生成\n- `correction_log.md` — 校对对照日志\n- `meta.json` — 处理时间、词典来源、是否润色、原始文件路径\n\n### Step 5.2:源文件目录镜像(必出)\n\n输出位置:原始文件所在目录(与原文件同目录)。\n\n文件:\n- `{原文件 basename}_corrected.md` — 与 5.1 内容完全一致,仅是易访问副本\n- 命名规则:原文件名后追加 `_corrected` 后缀,扩展名改为 `.md`(原文件是 `.md` 时,输出仍为 `.md`;原文件是 `.txt` 时,输出为 `.md`)\n\n**为什么双写**:\n- 主归档承担\"可追溯 + 校对日志 + 元数据\"的完整档案职责\n- 源文件目录副本让用户在日常文件管理器中能直接看到\"已校对版\",免去每次去 skill 内部目录翻找\n- 双写的内容是字节级一致的 `_corrected.md`(polished 副本与 log 不镜像——它们的主归档位置就在 skill 内部)\n\n**冲突处理**:\n- 源文件目录已存在同名 `_corrected.md` → 用时间戳后缀区分(`_corrected_20260608_153022.md`),避免覆盖历史校对结果\n- 源文件目录只读 / 不可写 → 静默跳过源文件目录镜像,仅输出主归档;在 `meta.json` 记录 `source_mirror: \"skipped\"`\n- 源文件路径无法解析(如 stdin 输入)→ 同样静默跳过源文件目录镜像\n\n**原始文件保持不动**——双写策略只生成\"新文件\",绝不就地修改原文件。\n\n### Step 5.3:稳定版标记(可选)\n\n当某次跑出的 `_corrected.md` 经用户确认无问题、视为该转录稿的\"稳定版\"时,在该 archive 子目录下加 `STABLE.md` 标记文件:\n\n```markdown\n# Stable Version Marker\n\n**v3 (2026-06-08 12:00) 标记为该转录稿的稳定版本。**\n\n## 为什么 v3 是 stable\n\n- v1.0.0 (2026-06-07 14:30) — 7 处,仅 Step 3\n- v1.0.2 (2026-06-08 00:41) — 42 处,Step 3 + 3.5,漏跑 Step 3.6\n- v2 (2026-06-08 11:00) — 170 处,补跑 Step 3.6(84 处)\n- v3 (2026-06-08 12:00) — 226 处,激进版段首删除(+52 处)\n\n## 锁定本版本\n\n- 后续不再对 `260606_AI技能创新大赛_corrected.md`(v3)做改动\n- 源文件目录三个版本并列保留供对比\n- 如发现新的误转写需要补判,新建 `archive/\u003c新时间戳>_*` 目录重跑,不就地修改 v3\n```\n\n**为什么需要 STABLE.md**:\n- archive 目录会累积多轮迭代产物(v1.0.0 / v1.0.2 / v2 / v3 ...),未来 agent / 用户 / 下游 skill 进来不知道哪个是终版\n- 源文件目录的镜像文件(`_corrected_v3_20260608_120000.md`)按时间戳命名,本身是\"稳定\"暗示,但 archive 内部 `260606_AI技能创新大赛_corrected.md` 没 STABLE 标记会被误认成\"最新版\"\n- STABLE.md 让\"哪个是终版\"显式可查\n\n**什么时候不写 STABLE.md**:\n- 一次性试跑、用户没确认 / 校对量少 / 转录稿本身还要后续处理——不必强行标记\n- 已经有更新的版本稳定了——避免给旧版加 STABLE 误导下游\n\n### Step 5.4:旧版本清理策略\n\narchive 目录会保留每次跑的全量产物(主归档 + correction_log + meta.json),不主动清理历史版本。但当 archive 下子目录数 ≥ 5 时,建议在 STABLE.md / DECISIONS.md 备注保留策略:\n\n- **保留**:每次的 `_corrected.md` / `correction_log.md` / `meta.json`(记录完整迭代轨迹)\n- **可清理**:当 archive 累积 ≥ 5 个目录时,旧的 `analysis_report.md` 等中间产物可手动归档\n- **禁止清理**:被 STABLE.md 标记的稳定版目录的 `_corrected.md`(用户可能要从源文件目录镜像之外的路径找回终版)\n\n### Step 5.5:结构性回归必检(Phase 5 交付前必须跑)\n\ngating the \"漏跑章节\"型 bug 的 grep 必检已写在 Step 3.3 末尾;这里加的是\"跑过但跑错\"的物理结构回归——Step 3.2 越段吞并(speaker 块、H2 标题被跨段正则粘连)与 Step 4.4 行号漂移(H2 插错章节)这两类失败模式已分别写入 Step 3.2「安全执行」段与 Step 4.4「锚点定位流程」段,本步只做落地抽检,把\"是否真发生了这两类回归\"显式锁住。\n\n**抽检项**(任一不过即视为本批未完成,不得打完成凭据):\n\n1. **speaker 块数量对得上**:校正后 `_corrected.md` 中 `^\\*\\*说话人 \\d+ \\d+:\\d+(?::\\d+)?\\*\\*` 与 `^杨卫薪 \\d+:\\d+(?::\\d+)?` 的 speaker 标记行总数,应等于或近似于 converted.md 中的总数(差 ≤ 1 因末尾 speaker 块合并属正常)。如果总数大幅缩小(如 96 块 → 60 块),说明 Step 3.2 越段吞并了内容。\n2. **每个 speaker 块首行非空且含可读内容**:从 `_corrected.md` 抽取每个 speaker 块的第 1 行非空文本,长度应 ≥ 5 个字符;如果变短(如「可以听到。」只有 4 字),说明上一块被吞并。\n3. **H2 锚点 5 行回看**:每个 `^## (一|二|三|四|五|六|七|八|九|十)、` 之下的紧跟 5 行内应出现 speaker 块首行(`**说话人**` / `杨卫薪`);找不到即为章节定位错位。\n4. **主标题与关键词一行存在**:`_corrected.md` 倒数行 ≤ 5 行内应有 `^\\*\\*关键词\\*\\*:...`,开头 metadata 块之后第一个 H2 之前应有 `^\\*\\*主标题\\*\\*:...`。\n\n执行建议:把以上写成 5-10 行脚本(脚本文件无需持久化),跑完打印四行 PASS/FAIL;任一 FAIL 就对照 Step 3.2 / Step 4.4 的边界段排查,不要靠目测放过。\n\n**为什么本步独立于已有 grep 必检**:Step 3.3 末尾的 grep 检查的是\"log 章节齐不齐\"——它查日志的存在,不查产物的物理形态。本步查的是产物本身有没有结构性破坏。两者覆盖正交失败模式,缺一不可。\n\n**patch / write_file 输入错必修(Type 1 失败模式)**:以上抽检是结构层\"跑过但跑错\"。还有一类**输入字面错**——`patch` 工具的 `old_string` / `new_string` 输入时手误(如把 `排障` 误输 `排排`),旧字串可能在文中多处命中或被部分匹配,diff 工具会显示\"成功替换\",但实际写入了错别字。**所有 `patch` 调用的 diff 输出必须逐字过一遍再贴回**——尤其是长文件、多字、含相似字词(如 `排排`/`排障`/`排序`/`排除`)的场景;`write_file` 整文件覆写时,对成品做\"复制 5 行片段回读\"核对写入内容与预期一致。两类失败都属\"未核对的成功\"。\n\n#### 校对对照日志格式(correction_log.md)\n\n```markdown\n# 校对对照日志\n\n- **原始文件**:/path/to/raw.md\n- **处理时间**:2026-06-07 14:30:22\n- **词典来源**:`config/user_dictionary.yaml`(含 18 项术语)\n- **润色开关**:关闭\n\n## 高置信替换\n\n| 原文 | 改后 | 出现次数 | 上下文示例 |\n|------|------|----------|------------|\n| workbody | WorkBuddy | 3 | \"通过第二版呢进行测试...\" |\n| work body | WorkBuddy | 2 | \"我们把这个实践中办案...\" |\n| claude-code | Claude Code | 1 | \"...重新调回那个 claude-code 里面...\" |\n\n## 未处理(保留原文)\n\n- \"智能件\" — 上下文不足以判断是否为\"智能体\"\n- \"代理\" — 同上\n\n## 润色变更(如开启)\n\n- 合并发言人 1 连续 3 段为 1 段\n- ...\n```\n\n## 适用场景 / 不适用\n\n见 [references/scope.md](references/scope.md)。\n\n## 配置示例 / 配置解耦原则\n\n见 [references/config-decoupling.md](references/config-decoupling.md)。\n\n## 参考文档\n\n- [references/scope.md](references/scope.md) — 概述 / 适用边界\n- [references/config-decoupling.md](references/config-decoupling.md) — 配置示例 / 配置解耦原则(评价规范相关)\n- [references/first_use.md](references/first_use.md) — 一次性配置引导(复制 example.yaml、跑试跑、多用户软链)\n- [references/correction_patterns.md](references/correction_patterns.md) — 工作流判断准则(误转写识别、口语词精简、并列停顿、必检清单、ASR 高频模式)\n- [config/user_dictionary.example.yaml](config/user_dictionary.example.yaml) — 词典公开模板\n","licenseDocuments":[]}}
transcription-corrector转录稿纠错与轻度优化。本技能应在用户需要按用户词典纠正 ASR 转录稿同音字与英文专有名称漂移时使用。不要用于:重写为课程章节、报告、总结,或完全空白的素材创作。
Independent GitHub snapshot · Automated classification · Original documentation governs
首次使用流程见 references/first_use.md。工作流中的判断准则见 references/correction_patterns.md。
把 raw 转录稿里"听得对但写不对"的同音/形近/拼写错误按用户词典统一改对,并按需做轻度润色。不做:改写、总结、删减、改事实、生成课程章节。
| 模式 | 触发 | 输出 |
|---|---|---|
| 纠错模式(默认) | 拿到 raw 转录稿,要先做"校对" | archive/.../{原文件}_corrected.md + 校对对照日志 |
| 纠错 + 轻度润色 | 还要顺手把发言人合并/标点整理 | 在纠错基础上再润色,输出到 archive/.../{原文件}_polished.md |
与下游处理工作的边界:
version + terms 列表)已成为本 skill 公开的接口约定;其他下游处理工作可以按需读取同一份词典文件。工作流按 5 个 Phase 组织,每个 Phase 含 1-3 个 Step。默认开启 Phase 1-3,Phase 4 默认关闭(需要用户明确开启)。
Phase 1 准备
Step 1.1 读取配置(词典)
Step 1.2 TXT → MD 转换(如需要)
Phase 2 识别
Step 2.1 识别文件结构
Step 2.2 通读识别高置信误转写
Phase 3 修正(默认开启)
Step 3.1 词典统一替换(改字)
Step 3.2 基础空白清理(改空白)
Step 3.3 口语词精简(删字)
Phase 4 润色(默认关闭)
Step 4.1 发言人合并
Step 4.2 标点规范
Step 4.3 段落切分
Phase 5 输出
Step 5.1 主归档(必出)
Step 5.2 源文件目录镜像(必出)
为什么这样分组:
转录稿修正的本质是"对每一处误转写做出独立判断"。这个判断的输入是上下文,输出是一处 Edit,三者必须由同一个 agent 在同一个上下文里完成。
为什么按"每处 Edit"展开
terms: ["WorkBuddy"] 告诉 agent "正确的写法是 WorkBuddy",但不告诉 agent "这处原文是否需要改"。由此推出自然的执行流:
Read 把源文件读进上下文(必须通读全文)Edit 把每一处的决策落盘Write 写出 correction_log.md / meta.json / 源目录镜像为什么这个流是自洽的
skill 各项润色开关由 config/config.env 控制。加载顺序:
key=value 覆盖config/config.env(本 skill 自带)config/config.env.example(默认值的"母本",缺失 step 2 时用)配置示例(config/config.env.example):
# Phase 4 润色开关(默认全开,按需关闭)
POLISH_MERGE_SPEAKERS=true # Step 4.1
POLISH_PUNCTUATION=true # Step 4.2
POLISH_PARAGRAPH_SPLIT=true # Step 4.3
POLISH_TOPIC_SECTION=true # Step 4.4
POLISH_SUMMARY=true # Step 4.5
# 输出策略
SOURCE_MIRROR=true # 源文件目录镜像
SOURCE_MIRROR_CONFLICT=timestamp # 冲突加时间戳
# 日志详细度
LOG_VERBOSITY=verbose # verbose | compact
缺失的键统一按本节表格的"默认值"列取值(不在文件中硬编码,每个 Step 自己的 § 段注明默认值)。
词典文件查找顺序(找到第一个存在的即用):
dictionary 路径config/user_dictionary.yaml(本 skill 自带)config/user_dictionary.example.yaml 为 config/user_dictionary.yaml词典 YAML 格式:
version: 1
terms:
- "WorkBuddy"
- "Claude Code"
- "Codex"
当输入是 .txt 文件时,先做格式转换再进入 Phase 2。
触发条件:输入文件扩展名是 .txt。
转换规则(保守——只做格式包装,不改内容):
发言人 1 00:33:09):
^(发言人|说话人|Speaker|S)\s*[\d一二三四五六七八九十]+[\.、]?\s*(\d{1,2}:\d{2}(?::\d{2})?)$**发言人 1 00:33:09**---、===)等全部保留###/####- xxx 改成 markdown 列表——保持原样输出:
{原文件 basename}_converted.md,保留在 archive 子目录.txt 文件保持不动示例:
输入(raw.txt):
发言人 1 00:33:09
我先说一下比较好的部分,就是整个最终的报告篇幅是比较充分的。
然后大家在一开始不知道怎么样一个报告是比较完善的,也知道怎么样去借鉴他山之石。
从这个阿尔法 gpt里面的这报告相当于蒸馏他的一个一个想法啊。
这个这个在前期一开始搭基建的时候确实是很有必要的一个措施。
发言人 1 00:33:57
呃然后。我注意到咱们在最终生成法律服务意见书的时候...
输出(raw_converted.md):
**发言人 1 00:33:09**
我先说一下比较好的部分,就是整个最终的报告篇幅是比较充分的。
然后大家在一开始不知道怎么样一个报告是比较完善的,也知道怎么样去借鉴他山之石。
从这个阿尔法 gpt里面的这报告相当于蒸馏他的一个一个想法啊。
这个这个在前期一开始搭基建的时候确实是很有必要的一个措施。
**发言人 1 00:33:57**
呃然后。我注意到咱们在最终生成法律服务意见书的时候...
不识别的格式(保持原文):
通读 raw 稿,识别组织方式:
**发言人 1 00:33:09**)— 多数 ASR 输出识别目的:决定 Phase 4 润色时是否合并同发言人连续发言。不要改写分块结构,保留原貌。
必须完整通读全文,以 Agent 视角扫描。不列静态错误表——ASR 错误无穷无尽(大小写漂移、空格、漏词、错位、同音字、形近字、断词重连、音节吞并…),任何预设列表都会漏判。
核心原则:
仅在上下文明确指向某个词典术语时,才将近似误转写替换为该术语。 模糊或低置信场景保持原文,不做猜测式替换。
启动扫描的高频易错类别(不是错误表,是判断启动点):
形式漂移识别(参考但不穷举):
禁止:
Phase 3 三个 Step 改的是三类不同对象——Step 3.1 改字(语义)、Step 3.2 改空白(格式)、Step 3.3 删字(语言字符)。三类操作各自独立、可单独审计、单独计日志。
对 Step 2.2 识别出的高置信误转写:
{原文} → {改后},并标注行号和上下文片段为什么独立于 Phase 4 润色:基础空白清理是"格式标准化",不改变原文语义、不删减任何信息;与 Phase 4 发言人合并 / 标点规范 / 段落切分那种"风格调整"性质不同,所以默认开启(用户不需要为此做开关决策)。
清理动作清单(仅做以下五类,不做任何超出此范围的事):
| 类别 | 动作 | 触发条件 |
|---|---|---|
| 行首/行尾空白 | 删除 | 任意行 |
| 连续空行 | 压缩为单个空行 | 任意位置 |
| 全角/半角空格 | 统一为半角空格 | 出现在英文单词之间或英文标点旁 |
| 专有名称内部断裂空格 | 合并 | 上下文明确指向词典中的专有名称(如"Work Buddy" → "WorkBuddy") |
| 中文数字 + 空格 + 级/章/节 | 合并 | 模式:[一二三四五六七八九十百千]+ +级/章/节 合并为 [一二...]+级/章/节(如"二 级" → "二级") |
标点周围空白规则:
,。、;:?!""''「」() 前后不留空格(若出现则删除), . ; : ? ! " ' ( ) 后空一格(中文段落中保留)安全执行(避免越段吞并):本步的"中文标点前后多余空格"清理有一个结构性陷阱——speaker 块的边界(**说话人 N HH:MM:SS** + 内容 + 空行 + 下一块标题)依赖"内容末标点 → 换行 → 空行"这一序列。如果清理正则用 \s+ 把标点之后的换行+空行也吃成单个空格,会跨块吞并,speaker 标题、H2 标题、speaker 块都会被合并成单行。执行时按行处理、禁止跨行匹配 \s+,仅做"行内"动作(行尾空格、同句内的 X, Y → X,Y)。如必须做跨段清理,先单独诊断再决定。
严格不做(避免越界):
**发言人 1 00:33:09**)与 Step 3.1 的关系:基础空白清理在 Step 3.1 词典替换之后执行;遇到"Work Buddy" → "WorkBuddy" 这类专有名称合并时,优先走 Step 3.1(词典替换路径),Step 3.2 仅做 Step 3.1 不覆盖的"无词典目标的纯格式"清理。
校对日志记录:所有 Step 3.2 的清理动作也写到 correction_log.md,在"基础空白清理"小节集中记录(与 Step 3.1 高置信替换区分开),便于审计。
为什么独立于 Phase 4 润色:与 Step 3.2 基础空白清理性质相同——属于"读起来对"的范畴,不改变原意(口语词不携带信息);与 Phase 4 发言人合并 / 标点规范 / 段落切分那种"风格调整"性质不同,所以默认开启(用户不需要为此做开关决策)。
白名单(可删的纯填充词)——AI 通读时识别"作为填充词 vs 作为实义",仅删独立出现且无语义负担的:
| 词 | 典型位置 | 删除条件 |
|---|---|---|
| 呃 | 段中独立 / 句首 | 认知停顿,不构成回答 |
| 啊 | 段中独立 / 句末 | 感叹停顿 |
| 哦 | 段中独立 | 过渡停顿(不作"明白了"回应) |
| 哎 | 段中独立 | 过渡停顿 |
| 那个 | 独立使用 | 纯指代填充(不指代具体名词) |
| 就是说 | 独立使用 | 纯连接填充 |
| 然后呢 | 段末 | 纯过渡填充 |
| 对吧 | 段末 | 纯反问填充 |
| 你知道吗 | 段中 | 纯引导填充 |
| 怎么说呢 | 段中 | 纯思考填充 |
| 这样子 | 独立使用 | 纯总结填充 |
| 其实呢 | 段首 | 纯转折填充 |
| 但是呢 | 段首 | 纯转折填充 |
保留规则(不删):
段首 vs 段尾 vs 段中 决策树:
| 位置 | 判定标准 | 处理(v2 激进版起) |
|---|---|---|
| 段首 | 紧跟 **发言人 X HH:MM:SS** 之后第一个非空行的第一个词 | 删除(v2 起激进) |
| 段中独立 | 句中位置、不是紧邻关键名词/动词 | 删除 |
| 段中并列停顿 啊 | 两个名词/动名词之间 + 顿号/逗号 | 保留(删除会破坏并列结构) |
| 段尾 | 一段内容末尾的最后一个词 | 保留(标记节奏收束) |
详见 references/correction_patterns.md §11 段中并列停顿 啊 的识别模式。
判断原则:
严格不做(避免越界):
校对日志记录:所有 Step 3.3 的精简动作写到 correction_log.md 的"口语词精简"小节,格式:
| 行号 | 原文片段 | 被删词 | 理由 |
|------|----------|--------|------|
| L207 | "呃 这个怎么说呢,我们今天来" | "呃" | 段首认知停顿,后接"怎么说呢"+完整内容,整段保留——本行不删(认知停顿后接完整内容的"呃"按 §3.3 保留规则例外)|
| L312 | "对,所以呢,我们" | "所以呢" | "所以呢" 不在白名单,保留 |
| L451 | "然后呢我们看一下" | "然后呢" | 段首过渡填充,可删 |
与 Step 3.2 的关系:Step 3.2 动空白字符,Step 3.3 动语言字符。两者都是"读起来对"操作,都默认开启,都在 correction_log.md 单独小节集中记录。
必检(防止漏跑整节):跑完必须 grep 自检(详见 references/correction_patterns.md §12):
correction_log.md 必须包含 ## 口语词精简 小节correction_log.md 必须包含 ## 高置信替换 / ## 基础空白清理 / ## 口语词精简 / ## 未处理 四个小节meta.json 必含 summary / process_time / dictionary_source / polish_enabled 字段Phase 4 下的所有 Step 由 config/config.env 配置文件中的开关决定是否启用。每个 Step 默认值的来源:
config.env:用 config.env.example 的值(即默认值)config.env.example:用本节速查表的默认值| Step | 类别 | 动作 | 边界 | 配置开关 | 默认值 |
|---|---|---|---|---|---|
| Step 4.1 | 发言人合并 | 同一发言人连续多段、可合并为一段时,合并 | 仅去重分块,不删任何原话 | POLISH_MERGE_SPEAKERS | true |
| Step 4.2 | 标点规范 | 中英文标点统一、句末补全 | 不改语气词、不删"呃/啊"等自然语流标记 | POLISH_PUNCTUATION | true |
| Step 4.3 | 段落切分 | 极长段(>500字)按语义边界切 | 不重组、不重排、不总结 | POLISH_PARAGRAPH_SPLIT | true |
| Step 4.4 | 主题分章 + H2 标题 | 在明确的话题切换点插入 ## 一、标题 行(带中文大写序号) | 仅在切换点插入,不重组内容、不改写、不总结 | POLISH_TOPIC_SECTION | true |
| Step 4.5 | 会议纪要 / 总结 | 每章"本章摘要"+"关键洞察"就地嵌入对应 H2 标题下;文首主标题 + 文末关键词各一行 | 不引入新事实、不重切 H2、不评价、不另设顶部聚合块 | POLISH_SUMMARY | true |
触发条件:话题发生明确切换(不同讨论对象 / 不同议程 / 不同主体焦点)时,插入 ## 一、标题 行;同一话题内部的子切换不插入。
识别原则:
锚点定位流程(避免行号漂移):H2 锚点必须从 converted.md 上的结构标记(**说话人 N HH:MM:SS** 或杨卫薪行)的实际行号取,不得从上游 raw 文件的早期阅读印象猜行号——raw 与 converted 之间存在 metadata 块位移(Phase 1.2 包装前几行),且肉眼从 raw 数行号与脚本扫出来的真实行号常常差几行,把 H2 插错章节。先写 5 行扫描脚本打印 converted.md 的全部 speaker 行真实行号,再据此填 H2 锚点表;插完按"## 标题行 + 后 5 行"抽检,确认落在正确章节。
标题文本从何而来:
编号规则:
一、、二、、三、...、 顿号分隔(中文正式排版惯例):## 一、工具选择与日常使用corrected.md 中序号唯一,不重复严格不做:
校对日志记录:所有 Step 4.4 的插入写到 correction_log.md 的"主题分章"小节(与 Step 4.1/4.2/4.3 区分),格式:
| 行号 | 标题文本 | 上下文锚点(前后 50 字)| 切换类型 |
|------|----------|------------------------|----------|
| L487 | ## 律所管理与本地部署 | "...他就不会愿意去做这个事事情。" | 硬切换 |
与 Phase 4 其他 Step 的关系:Step 4.1-4.3 是"风格调整",Step 4.4 是"结构标注"——前者改分块形式,后者只插入锚点,不重排。
为什么本 skill 做这个而不下游做:原 §1.2 早期版本说"下游做章节重组时再处理",但下游 skill(如 course-generator)做的是"基于转录稿生成课程",与"忠实标注原话结构"是不同任务。H2 主题分章是"忠实标注",放在本 skill 更合身。
POLISH_SUMMARY 开关)触发条件:
POLISH_SUMMARY=true,或用户在调用时显式声明("生成纪要" / "总结" / "AI 洞察")核心原则(v1.4 修订:摘要就地嵌入,不聚合到顶部):
<!-- AI-SUMMARY --> markers,不产生"所有章节摘要汇聚在一起"的独立区块输出位置:
corrected.md:① 文首 H1 下加一行主标题;② 每个 H2 标题下就地嵌入本章摘要 + 关键洞察;③ 文末加一行关键词_summary.md,不写 markers就地嵌入格式(每个 H2 之下):
## 一、章节名(Step 4.4 标题,原样)
**本章摘要**:50-100 字概括本章节核心内容(引用原话中的具体事实/数字/专有名,不引入新事实,不评价)
**关键洞察**:
- 洞察 1(15-30 字,横向观察本章节)
- 洞察 2
**发言人 1 00:02:09**
(该章原话正文,全部保留,紧跟在摘要 / 洞察之后)
...
文首主标题 / 文末关键词:
**主标题**:5-15 字概括全文核心议题**关键词**:词1, 词2, ...(5-8 个,逗号分隔)为什么改为就地嵌入(v1.4):
生成原则:
严格不做:
## AI 摘要 聚合块、不写 <!-- AI-SUMMARY --> markers与 Step 4.4 的边界:
| Step 4.4 | Step 4.5 | |
|---|---|---|
| 输出文件 | corrected.md(修改) | corrected.md(修改,就地嵌入) |
| 操作 | 在原话章节前插入 H2 标记 | 每个 H2 标题下、原话前嵌入摘要 / 洞察;文首主标题、文末关键词各一行 |
| 保留原话 | 全部保留 | 原话全部保留 + 摘要中引用片段 |
| 引入新信息 | 不允许 | 不允许 |
幂等与验证:
^## 二级标题之下紧跟一个 **本章摘要** 行;② 全文无 <!-- AI-SUMMARY 字样;③ 主标题 / 关键词各一行存在校对日志记录:Step 4.5 的产出写到 correction_log.md 的"会议纪要"小节,格式:
| 字段 | 值 |
|------|-----|
| 主标题(文首单行)| 主标题文本 |
| 章节数 | 8(与 Step 4.4 H2 一致)|
| 总洞察数 | X 条 |
| 摘要字数总计 | Y 字 |
| 关键词(文末单行)| 词1, 词2, ... |
| 嵌入方式 | 就地嵌入每个 H2 之下;无顶部聚合块;无 markers |
Phase 4 整体边界(适用于 Step 4.1-4.4):
输出采用 双写 策略:主归档在 skill 内部,源文件目录同步一份易访问副本。原始文件保持不动。
输出位置:{skill 目录}/archive/{YYYYMMDD_HHMMSS}_{原文件 basename}/
文件:
{原文件}_corrected.md — 纠错后的完整文本(保留原始分块结构){原文件}_polished.md — 仅在用户开启润色时生成correction_log.md — 校对对照日志meta.json — 处理时间、词典来源、是否润色、原始文件路径输出位置:原始文件所在目录(与原文件同目录)。
文件:
{原文件 basename}_corrected.md — 与 5.1 内容完全一致,仅是易访问副本_corrected 后缀,扩展名改为 .md(原文件是 .md 时,输出仍为 .md;原文件是 .txt 时,输出为 .md)为什么双写:
_corrected.md(polished 副本与 log 不镜像——它们的主归档位置就在 skill 内部)冲突处理:
_corrected.md → 用时间戳后缀区分(_corrected_20260608_153022.md),避免覆盖历史校对结果meta.json 记录 source_mirror: "skipped"原始文件保持不动——双写策略只生成"新文件",绝不就地修改原文件。
当某次跑出的 _corrected.md 经用户确认无问题、视为该转录稿的"稳定版"时,在该 archive 子目录下加 STABLE.md 标记文件:
# Stable Version Marker
**v3 (2026-06-08 12:00) 标记为该转录稿的稳定版本。**
## 为什么 v3 是 stable
- v1.0.0 (2026-06-07 14:30) — 7 处,仅 Step 3
- v1.0.2 (2026-06-08 00:41) — 42 处,Step 3 + 3.5,漏跑 Step 3.6
- v2 (2026-06-08 11:00) — 170 处,补跑 Step 3.6(84 处)
- v3 (2026-06-08 12:00) — 226 处,激进版段首删除(+52 处)
## 锁定本版本
- 后续不再对 `260606_AI技能创新大赛_corrected.md`(v3)做改动
- 源文件目录三个版本并列保留供对比
- 如发现新的误转写需要补判,新建 `archive/<新时间戳>_*` 目录重跑,不就地修改 v3
为什么需要 STABLE.md:
_corrected_v3_20260608_120000.md)按时间戳命名,本身是"稳定"暗示,但 archive 内部 260606_AI技能创新大赛_corrected.md 没 STABLE 标记会被误认成"最新版"什么时候不写 STABLE.md:
archive 目录会保留每次跑的全量产物(主归档 + correction_log + meta.json),不主动清理历史版本。但当 archive 下子目录数 ≥ 5 时,建议在 STABLE.md / DECISIONS.md 备注保留策略:
_corrected.md / correction_log.md / meta.json(记录完整迭代轨迹)analysis_report.md 等中间产物可手动归档_corrected.md(用户可能要从源文件目录镜像之外的路径找回终版)gating the "漏跑章节"型 bug 的 grep 必检已写在 Step 3.3 末尾;这里加的是"跑过但跑错"的物理结构回归——Step 3.2 越段吞并(speaker 块、H2 标题被跨段正则粘连)与 Step 4.4 行号漂移(H2 插错章节)这两类失败模式已分别写入 Step 3.2「安全执行」段与 Step 4.4「锚点定位流程」段,本步只做落地抽检,把"是否真发生了这两类回归"显式锁住。
抽检项(任一不过即视为本批未完成,不得打完成凭据):
_corrected.md 中 ^\*\*说话人 \d+ \d+:\d+(?::\d+)?\*\* 与 ^杨卫薪 \d+:\d+(?::\d+)? 的 speaker 标记行总数,应等于或近似于 converted.md 中的总数(差 ≤ 1 因末尾 speaker 块合并属正常)。如果总数大幅缩小(如 96 块 → 60 块),说明 Step 3.2 越段吞并了内容。_corrected.md 抽取每个 speaker 块的第 1 行非空文本,长度应 ≥ 5 个字符;如果变短(如「可以听到。」只有 4 字),说明上一块被吞并。^## (一|二|三|四|五|六|七|八|九|十)、 之下的紧跟 5 行内应出现 speaker 块首行(**说话人** / 杨卫薪);找不到即为章节定位错位。_corrected.md 倒数行 ≤ 5 行内应有 ^\*\*关键词\*\*:...,开头 metadata 块之后第一个 H2 之前应有 ^\*\*主标题\*\*:...。执行建议:把以上写成 5-10 行脚本(脚本文件无需持久化),跑完打印四行 PASS/FAIL;任一 FAIL 就对照 Step 3.2 / Step 4.4 的边界段排查,不要靠目测放过。
为什么本步独立于已有 grep 必检:Step 3.3 末尾的 grep 检查的是"log 章节齐不齐"——它查日志的存在,不查产物的物理形态。本步查的是产物本身有没有结构性破坏。两者覆盖正交失败模式,缺一不可。
patch / write_file 输入错必修(Type 1 失败模式):以上抽检是结构层"跑过但跑错"。还有一类输入字面错——patch 工具的 old_string / new_string 输入时手误(如把 排障 误输 排排),旧字串可能在文中多处命中或被部分匹配,diff 工具会显示"成功替换",但实际写入了错别字。所有 patch 调用的 diff 输出必须逐字过一遍再贴回——尤其是长文件、多字、含相似字词(如 排排/排障/排序/排除)的场景;write_file 整文件覆写时,对成品做"复制 5 行片段回读"核对写入内容与预期一致。两类失败都属"未核对的成功"。
# 校对对照日志
- **原始文件**:/path/to/raw.md
- **处理时间**:2026-06-07 14:30:22
- **词典来源**:`config/user_dictionary.yaml`(含 18 项术语)
- **润色开关**:关闭
## 高置信替换
| 原文 | 改后 | 出现次数 | 上下文示例 |
|------|------|----------|------------|
| workbody | WorkBuddy | 3 | "通过第二版呢进行测试..." |
| work body | WorkBuddy | 2 | "我们把这个实践中办案..." |
| claude-code | Claude Code | 1 | "...重新调回那个 claude-code 里面..." |
## 未处理(保留原文)
- "智能件" — 上下文不足以判断是否为"智能体"
- "代理" — 同上
## 润色变更(如开启)
- 合并发言人 1 连续 3 段为 1 段
- ...
见 references/config-decoupling.md。