> 完整主菜单与全局铁律见 `kb/kb.md`。以下为本菜单的执行细节（按需加载）。

> 📌 本菜单涉及文档抽取（A–F 循环），执行前请先读取 `kb/extraction.md` 获取 A–F 具体操作。

### 菜单 4 — 🔄 重新重点处理某一文档

> 用户觉得某个文档 AI 处理得不够好时，单独深入重新处理，弥补遗漏。
> 🔴 **只选一个文档**，聚焦精力重点处理。
>
> 🔴🔴 **抽取模式（B0）不适用本菜单（★ 设计性豁免）**：B0「顺序 vs 并行」二选一仅面向批量自动处理。本菜单只重处理**单个**文档（Step 3 已明确「所有批次由主 AI 亲自完成，禁止使用子代理」），不存在多文档并发场景，并行子代理无收益且与"聚焦单文档、严格遵守用户嘱咐"的目标冲突。因此本菜单**锁定为顺序单线程、不呈现 B0 二选一**——属设计性豁免而非遗漏，与菜单 3 同理。

#### Step 1 — 展示已处理文档列表

```bash
python {skill_dir}/kb/scripts/ahkb.py list-processed
```

展示所有已处理文档及其当前知识元数、chunk 数：

```
📋 知识库中已有以下文档：
  1. xxx.pptx → 原始文件/分类/  知识元: 15个
  2. yyy.docx → 原始文件/分类/  知识元: 3个
  ...
  0. ↩️ 返回主菜单

请选择要重点处理的文档（输入数字，只能选一个）：
```

> 🔴 **必须等待用户选择**，不可默认选第一个。

#### Step 1.5 — 抽取要求确认（★ 2026-08-14 升级：本菜单的"询问用户嘱咐"即公共「抽取要求确认」环节，位于选中文档之后、开始重新分析 chunk 之前）

用户选择文档后，**主动询问用户对本次抽取是否还有其他要求**（🔴 自由文本输入，不是数字选项；严禁图形/卡片式选择菜单）：

```
你选择了：xxx.pptx
除默认参数（cGranularity / cTextAmount）外，你对这个文档的知识元抽取还有其他要求吗？
可说明（任选或全部）：
  · 抽取原则 —— 如"宁缺毋滥，只抽真正独立的概念"、"人物一律单独成元"
  · 颗粒度 —— 如"偏粗，按章节主题合并"、"偏细，把每个定义都拆开"
  · 总体数量 —— 如"这个文档控制在 30 个知识元左右"
  · 知识元内部文字数量 —— 如"每个知识元正文 100~200 字"、"只写要点"
  · 上次漏掉了某个章节请重点看
  · 其他任何对抽取的要求

没有额外要求请直接回复 0；有则直接输入你的要求：
```

> 🔴 用户输入了具体要求 → 执行：
> ```bash
> python {skill_dir}/kb/scripts/ahkb.py set-extraction-requirements "<用户输入的要求>" --workspace <工作空间绝对路径>
> ```
> 用户回复 0 / "没有" / "无" → 执行清空：`set-extraction-requirements 0 --workspace <工作空间绝对路径>`。
> 🔴 用户说了什么，AI 必须在重新分析时严格遵守（优先级最高）。
> 🔴 如果用户没有特别要求，按当前正常参数处理。

#### Step 2 — 清除旧知识元（保留 chunks 和资源）

```bash
python {skill_dir}/kb/scripts/ahkb.py clear-units-for-file "<相对路径>"
```

此命令仅做三件事：
1. 删除 `知识元/` 中 `source` 匹配该文件的所有 `.md` 知识元文件
2. 从 `_processed_docs.json` 中移除该文件的已处理标记
3. **不动** `chunks/` 下已有的分块数据和 `图片及其他资源/` 下的 .ctx/媒体文件

#### Step 3 — AI 重新分析（重点处理）

AI **读取已有的 chunks**（不再重复 extract），结合用户的嘱咐**逐段深入分析**：

```
🔄 正在重点处理：xxx.pptx
  使用已有的 N 个 chunks（复用提取结果），逐段重新分析...

  [1/M] 分析 chunk 1~25 → 生成知识元...
  [2/M] 分析 chunk 26~50 → 加载概念索引 → 去重后创建...
  ...
✅ 共生成 X 个知识元（上次仅 Y 个）
```

> 🔴 **逐段分析，不许跳过任何 chunk。** 分析前先加载概念索引，避免与已有知识元重复。
> 🔴 所有批次由主 AI 亲自完成，**禁止使用子代理**。
> 🔴 严格遵守用户的嘱咐。

遵循当前的 `cGranularity`/`cTextAmount` 参数设定，按正常标准生成知识元。

#### Step 4 — 验证、更新索引、标记

```bash
python {skill_dir}/kb/scripts/ahkb.py verify-units "<相对路径>"
python {skill_dir}/kb/scripts/ahkb.py update-concept-index
python {skill_dir}/kb/scripts/ahkb.py mark-processed "<相对路径>"
```

> 🔴 因旧知识元已清除、新知识元已写入，`mark-processed` 硬关卡可通过。

#### Step 5 — 询问是否刷新关联

```
文档已重新重点处理完成。是否刷新知识关联（知识元链接、资源挂接）？（🔴 输入数字 1 或 2，严禁图形/卡片式选择菜单，包括 AskUserQuestion 工具）
1. ✅ 是，立即运行 maintain（推荐）
2. ➡️ 否，稍后通过菜单 6 自行处理
```

选 1 则执行：

```bash
python {skill_dir}/kb/scripts/ahkb.py maintain --detached --workspace <工作空间绝对路径>
```
   > 此命令 1 秒内返回，GUI 窗口在独立进程中运行。
   🔴🔴 **LLM 每回合运行以下命令检查一次，直到 `status: "complete"` 才能继续后续流程：**

   ```bash
   python {skill_dir}/kb/scripts/ahkb.py check-maintain-status --workspace <工作空间绝对路径>
   ```

   🔴🔴 **每轮检查后必须把 `_display` 原文输出展示给用户：**
   - `status: "complete"` → 汇总后进入下一步
   - `status: "cancelled"` → 返回主菜单
   - `status: "running"` / `"starting"` → 展示 `_display` 原文，约 10 秒后再次轮询
   - 🔴🔴 **其他状态 → 展示 `_display` 原文，等约 10 秒后再次轮询。禁止只内部检查不输出。**

完成后返回模块主菜单。

