Files
deep_research/PLAN.md
T

549 lines
31 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Deep Research 系统方案(OpenCode 实现)
> 本文件是整套方案的**单一真实源**,中断后续接时从此文件恢复上下文。
> 最后更新:2026-04-24
> 实施阶段:v0.10 — Codex native adapter(独立于 OpenCode)建设中
---
## 0. 背景与目标
### 0.1 用户画像
- 主业:生物医药行业的研发、工艺、管理、投资研究(非 coding)
- 痛点:此前在 OpenClaw / Hermes 做 Deep Research 时 token 消耗大但效果差
- 预期:以麦肯锡、德勤等顶尖机构的方法论输出专业报告
### 0.2 质量标准(硬性)
- **字数**:综述类 ≥ 10,000 字;研究类 ≥ 30,000 字
- **证据**:每条结论至少 2 个独立 Tier 1-2 信源佐证,否则标注"观点待验证"
- **结构**8-15 章,每章下分 section / sub-section;每个标题即一个观点
- **信源**:优先论文、专利、权威研究报告;排除劣质纯新闻、自媒体
- **交付**PDFReportLab+ DOCXPandoc),格式专业、中文排版规范
---
## 1. 关键决策(已与用户确认)
| 维度 | 决策 |
|---|---|
| LLM 接入 | **zenmux 中转**(多模型混合) |
| 项目位置 | **仅项目级** `.opencode/`,项目根目录为 `deep_research/` |
| 搜索 API | **Tavily / Brave / Exa 走 MCP Server**;生物医药专业信源走 skill+bash |
| PDF 方案 | **ReportLab**(中文字体一次注册,样式集中 StyleSheet |
| DOCX 方案 | **Pandoc + reference-doc** |
| 字数落实 | 框架阶段分配配额 + 终稿校验双保险 |
| 交互节奏 | Phase 1 末、Phase 3 末强制确认 |
| 并发 subagent | 3-4 个(稳,避免 API 限流) |
| 中文字体 | **思源宋体 + 思源黑体 + 霞鹜文楷**,通过 `download-fonts.sh` 自动拉取 |
---
## 2. 模型分配(zenmux 双 provider 架构)
详细 slug、cache 机制、升级流程见 `AGENTS.md` §6。关键要点:
- **Claude 系列走 `zenmux-anthropic/...`(无 `anthropic/` 前缀的裸 slug**,以便 prompt cache 原生生效
- 其他模型走 `zenmux/<vendor>/<slug>`,隐式缓存自动生效
- 真实可用模型清单通过 `curl zenmux /api/v1/models` 随时查询;不要依赖 zenmux 文档里的过期示例
| 角色 | 模型 | 完整 model 字段 | 上下文 | 温度 | top_p |
|---|---|---|---|---|---|
| dr-plan(框架规划) | Claude Opus 4.7 | `zenmux-anthropic/claude-opus-4.7` | 1M | **0.7** | **0.9** |
| dr-pm(项目经理/调度) | Claude Sonnet 4.6 | `zenmux-anthropic/claude-sonnet-4.6` | 1M | 0.2 | 默认 |
| dr-chief-editor(总编/终审) | Gemini 3.1 Pro Preview | `zenmux/google/gemini-3.1-pro-preview` | 1M | 0.3 | 默认 |
| dr-searcher(轻量检索) | Claude Haiku 4.5 | `zenmux-anthropic/claude-haiku-4.5` | 200K | 0.1 | 默认 |
| dr-analyst(章节深研) | Claude Sonnet 4.6 | `zenmux-anthropic/claude-sonnet-4.6` | 1M | 0.3 | 默认 |
| dr-verifier(反方验证) | GPT-5.4 Pro(首选)/ Qwen3.6-Plus / MiniMax M2.7 | `zenmux/openai/gpt-5.4-pro` 等 | 1.05M | 0.2 | 默认 |
| dr-polisher(去AI味+润色) | Claude Sonnet 4.6 | `zenmux-anthropic/claude-sonnet-4.6` | 1M | 0.4 | 默认 |
| dr-reporter(出稿) | Claude Sonnet 4.6 | `zenmux-anthropic/claude-sonnet-4.6` | 1M | 0.1 | 默认 |
**Cache 行为**Claude 走 `@ai-sdk/anthropic` 会自动打 `cache_control` 断点,zenmux 的 Anthropic 端点完整支持 4 种 cache 模式。Opus 4.7 cache read 价格仅 0.5 USD/M tokens(对比输入价 25 USD/M,节省 98%)。验证方法见 `AGENTS.md` §6.5。
---
## 3. 完整架构
```
┌─────────────────────────────────────────────────────────────────┐
│ 用户 (TUI 入口) │
└─────────────────────┬───────────────────────────────────────────┘
│ Tab 切换主 agent
┌───────────┼────────────┐
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌──────────┐
│ dr- │ │ dr- │ │ dr-chief │ (Primary)
│ plan │ │ pm │ │ -editor │
│ (Opus)│ │(Sonnet)│ │ (Gemini) │
└───┬───┘ └───┬────┘ └─────┬────┘
│ │ Task 工具委派│
│ ▼ │
│ ┌─────────────┐ │
│ │ Subagents │ │ (并行 3-4 个)
│ ├─────────────┤ │
│ │ dr-searcher │ │ Haiku 轻检索
│ │ dr-analyst │ │ Sonnet 深研
│ │ dr-verifier │ │ GPT-5/Qwen 交叉
│ │ dr-polisher │ │ Sonnet 润色
│ │ dr-reporter │ │ Sonnet 出稿
│ └─────────────┘ │
│ │
调用 Skills ───────────────────┘
调用 MCP Servers
```
---
## 4. 目录结构
```
deep_research/
├── PLAN.md # 本文件 — 方案真实源
├── AGENTS.md # 研究方法论与规则(OpenCode 自动读)
├── README.md # 使用指南
├── .gitignore
├── secrets.env.example # 密钥模板
├── secrets.env # 实际密钥(不入 git)
├── .opencode/
│ ├── opencode.json # MCP + 权限 + 默认模型
│ ├── agents/
│ │ ├── dr-plan.md # [MVP] Primary:框架规划 Opus temp 0.7
│ │ ├── dr-pm.md # [MVP] PrimaryPM/调度 Sonnet temp 0.2
│ │ ├── dr-chief-editor.md # [待补] Primary:总编 Gemini
│ │ ├── dr-searcher.md # [待补] Subagent:轻检索 Haiku
│ │ ├── dr-analyst.md # [待补] Subagent:深研 Sonnet
│ │ ├── dr-verifier.md # [待补] Subagent:交叉验证 GPT-5/Qwen
│ │ ├── dr-polisher.md # [待补] Subagent:润色 Sonnet
│ │ └── dr-reporter.md # [待补] Subagent:出稿 Sonnet
│ ├── skills/
│ │ ├── search-strategy/SKILL.md # [MVP] 检索策略总纲
│ │ ├── source-quality/SKILL.md # [MVP] 信源评级与黑名单
│ │ ├── length-budget/SKILL.md # [MVP] 字数预算
│ │ ├── pdf-reportlab/SKILL.md # [MVP] ReportLab 中文模板
│ │ ├── biomed-pubmed/SKILL.md # [待补]
│ │ ├── biomed-clinicaltrials/SKILL.md # [待补]
│ │ ├── biomed-openfda/SKILL.md # [待补]
│ │ ├── biomed-patents/SKILL.md # [待补]
│ │ ├── biomed-finance/SKILL.md # [待补]
│ │ ├── docx-pandoc/SKILL.md # [待补]
│ │ ├── citation-manager/SKILL.md # [待补]
│ │ ├── evidence-table/SKILL.md # [待补]
│ │ ├── mckinsey-method/SKILL.md # [待补]
│ │ └── report-template/SKILL.md # [待补]
│ ├── commands/
│ │ ├── dr-init.md # [MVP] /dr-init <topic>
│ │ ├── dr-frame.md # [MVP] /dr-frame
│ │ ├── dr-research.md # [待补] /dr-research
│ │ ├── dr-review.md # [待补] /dr-review
│ │ ├── dr-finalize.md # [待补] /dr-finalize
│ │ └── dr-status.md # [待补] /dr-status
│ └── templates/
│ ├── report-template.py # [MVP] ReportLab PDF 模板
│ ├── report-template.docx # [待补] Pandoc reference-doc
│ ├── report-template.md # [待补] Markdown 骨架
│ └── fonts/
│ ├── download-fonts.sh # [MVP] 字体自动下载
│ ├── README.md # 字体来源说明
│ ├── SourceHanSerifSC-Regular.otf (git 忽略)
│ ├── SourceHanSerifSC-Bold.otf (git 忽略)
│ ├── SourceHanSansSC-Light.otf (git 忽略)
│ ├── SourceHanSansSC-Medium.otf (git 忽略)
│ ├── SourceHanSansSC-Bold.otf (git 忽略)
│ ├── SourceHanSansSC-Heavy.otf (git 忽略)
│ └── LXGWWenKai-Regular.ttf (git 忽略)
├── projects/ # 每个研究主题一个子目录
│ └── <topic-slug>/
│ ├── manifest.json # 元信息
│ ├── phase1/
│ │ ├── initial-scan.md
│ │ ├── framework.md
│ │ └── interview.md
│ ├── phase2/
│ │ ├── evidence/
│ │ ├── sources.jsonl
│ │ └── drafts/
│ ├── phase3/
│ │ ├── critique.md
│ │ └── revisions/
│ └── phase4/
│ ├── final.md
│ ├── final.pdf
│ ├── final.docx
│ └── citations.bib
└── archive/ # 历史研究归档
```
---
## 5. 字体方案(方案 A:思源 + 霞鹜文楷)
| 用途 | 字体 | 字号 | 行高 |
|---|---|---|---|
| 正文 | 思源宋体 Regular | 10.5pt | 16pt |
| 正文粗体/术语 | 思源宋体 Bold | 10.5pt | 16pt |
| 一级标题(章) | 思源黑体 Bold | 18pt | 28pt |
| 二级标题(section | 思源黑体 Bold | 14pt | 22pt |
| 三级标题(subsection | 思源黑体 Medium | 12pt | 18pt |
| 摘要/引文/批注 | 霞鹜文楷 Regular | 10.5pt | 16pt |
| 图表标题 | 思源黑体 Medium | 9pt | 13pt |
| 脚注/参考文献 | 思源宋体 Regular | 9pt | 13pt |
| 页眉页脚 | 思源黑体 Light | 8pt | 12pt |
| 封面主标题 | 思源黑体 Heavy | 32pt | 42pt |
所有字体均为 **SIL OFL** 许可,可自由商用、嵌入 PDF 分发。
**字体下载来源(download-fonts.sh**
- 思源宋体:`https://github.com/adobe-fonts/source-han-serif/releases`
- 思源黑体:`https://github.com/adobe-fonts/source-han-sans/releases`
- 霞鹜文楷:`https://github.com/lxgw/LxgwWenKai/releases`
---
## 6. 工作流(四阶段)
### Phase 1:框架规划(dr-plan 主导)
1. `/dr-init <topic>` 创建项目目录 + manifest.json,进行初轮对话访谈
2. `/dr-frame` 触发:
- dr-plan 用 `skill:search-strategy` 指挥 3 个 dr-searcher 并行初扫
- 生成 8-15 章大纲 + 每章研究思路 + 字数配额(依据 `skill:length-budget`
- **【停】等用户确认** — 可迭代
### Phase 2:深度研究(dr-pm 主导)
1. `/dr-research` 触发:
- dr-pm 按章节分批并行调度 dr-analyst
- 每章完成后自动调度 dr-verifier 做反方验证
- 每条结论自动填入 `evidence/chXX-evidence.md` 的"观点-证据-来源-置信度"表
- `skill:length-budget` 自检,不足则继续挖掘
### Phase 3:总编审校(dr-chief-editor 主导)
1. `/dr-review` 触发:
- Gemini 3.1 Pro 通读全部 drafts
- 产出 `critique.md`:逻辑漏洞、证据不足、观点雷同、金字塔违反
- **【停】等用户决策**
- a) 直接修正 → 进入 finalize
- b) 特定章节回炉 phase2
- c) 整体重来 → 回 phase1
### Phase 4:成稿(dr-chief-editor 调度)
1. `/dr-finalize` 触发:
- dr-polisher 去 AI 味、中文表达、术语统一
- dr-reporter 执行:
- `python .opencode/templates/report-template.py final.md → final.pdf`
- `pandoc final.md --reference-doc=... → final.docx`
---
## 7. 如何避免"多 agent 实际是一个主模型跑到底"
OpenCode 的坑:如果只是在主会话里装样子地写"让 X agent 做",实际还是主模型在跑,token 花了但没分工。
**三道保险**
1. **命令级强制**:所有命令 frontmatter 设 `subtask: true`,强制走 Task 工具,真起子会话
2. **Agent 强绑模型**:每个 subagent 的 `model` 字段写死到具体模型,OpenCode 会真正起独立会话用那个模型
3. **任务权限白名单**dr-pm 的 `permission.task` 精确限定只能调用 subagent,不能跨级调度
4. **可验证**TUI 里 `<Leader>+Right` 切入子会话,能看到真实在跑的模型名
---
## 8. 完整实施清单(v0.4 全部完成)
### 基础设施
- [x] 目录结构
- [x] PLAN.md / AGENTS.md / README.md / .gitignore
- [x] .opencode/opencode.json(双 provider + MCP + 权限)
- [x] secrets.env.example
- [x] scripts/setup.sh / activate.sh / verify-zenmux.sh
- [x] requirements.txt / pyproject.tomluv
### Agents8 个)
- [x] dr-planOpus 4-7temp 0.7
- [x] dr-pmSonnet 4-6temp 0.2
- [x] dr-searcherHaiku 4-5temp 0.1
- [x] dr-analystSonnet 4-6temp 0.3
- [x] dr-verifierGPT-5.4-protemp 0.2
- [x] dr-chief-editorGemini 3.1 Pro Previewtemp 0.3
- [x] dr-polisherSonnet 4-6temp 0.4
- [x] dr-reporterSonnet 4-6temp 0.1
### Commands6 个)
- [x] /dr-init
- [x] /dr-frame
- [x] /dr-research
- [x] /dr-review
- [x] /dr-finalize
- [x] /dr-status
### Skills7 个)
- [x] search-strategy
- [x] source-quality
- [x] length-budget
- [x] pdf-reportlab
- [x] evidence-table
- [x] citation-manager
- [x] mckinsey-method
### 报告模板
- [x] report-template.pyReportLab PDF
- [x] fonts/download-fonts.sh
### 待补(后续优化)
- [ ] docx-pandoc skillPandoc reference-doc 模板)
- [ ] 生物医药专业信源 skillPubMed / ClinicalTrials / openFDA / 专利 / 金融)
- [ ] dr-reporter 的 DOCX 样式优化
---
## 9. 后续路径
### 优化项(实施阶段 5
### 优化项(实施阶段 4
- 把稳定的 bash skill 封装成 MCP server
- 引入 Exa /neural search 提升专业文献召回
- 支持图表自动生成(matplotlib 模板库)
---
## 10. 用户待办
1. [x] ~~模型 slug 映射~~v0.3 已完成,基于 zenmux `/api/v1/models` 实时数据)
2. [ ] 准备 API keys`secrets.env` 填写):
- ZENMUX_API_KEY(必填,格式 `sk-ai-v1-xxx`
- TAVILY_API_KEY / EXA_API_KEY / BRAVE_API_KEY
- NCBI_API_KEY(可选,高频查 PubMed 时需要)
3. [ ] 环境初始化(跨 macOS/Debian,用 uv):
```bash
bash scripts/setup.sh
```
会自动:装 uv(如缺失)→ `uv sync` 建 `.venv/` + 装依赖 → 检查系统二进制。
4. [ ] 系统二进制(setup.sh 会检测但不自动装):
- `pandoc`DOCX 出稿阶段必须)
- `opencode`TUI 主程序)
5. [ ] 首次使用前:
```bash
source scripts/activate.sh # 激活 venv + 载入 secrets
bash .opencode/templates/fonts/download-fonts.sh # 下载字体
bash scripts/verify-zenmux.sh # 验证端点与 cache
```
6. [ ] 用一个小主题跑通 MVP 流水线,验证:
- subagent 是否真正被独立调度(TUI 可见子会话)
- 字数配额是否正确落到 framework.md
- 信源过滤是否生效(Tier 4 不会进 sources.jsonl
- zenmux 后台 Logs 能看到 `cache_read_input_tokens > 0`
---
## 11. 风险与缓解
| 风险 | 缓解 |
|---|---|
| zenmux 模型 slug 命名变动 | AGENTS.md §6 单点维护映射表,全部 agent 引用此表 |
| Claude prompt cache 未生效 → 成本暴涨 | Claude 系列强制走 `zenmux-anthropic``@ai-sdk/anthropic` 通道),zenmux 后台 Logs 验证 `cache_creation_input_tokens` 字段 |
| MCP server 首次启动慢 | 用 `opencode serve` 常驻;subagent 设合理 timeout |
| 搜索 API 限流 | search-strategy 里规定每批 ≤3 个 searcher;失败重试 3 次带退避 |
| Opus 成本高 | dr-plan 用 steps 限制迭代次数(见 length-budget |
| ReportLab 中文渲染慢 | matplotlib 预渲染 PNGStyleSheet 缓存 |
| 中断恢复 | 所有状态写 manifest.json + phase 文件,本 PLAN.md 是元控制文件 |
---
## 12. 变更记录
- 2026-04-20 v0.1:初版方案确定,MVP 路径 2 开始实施
- 2026-04-20 v0.2**双 provider 架构**上线,解决 zenmux Claude prompt cache 问题
- 新增 `zenmux-anthropic` 自定义 provider`@ai-sdk/anthropic` + `https://zenmux.ai/api/anthropic`
- Claude 系列迁移到裸 slug
- 非 Claude 系列保留 `zenmux/<vendor>/<slug>` 走 OpenAI 兼容端点
- AGENTS.md §6 重写:cache 机制、验证锚点、最低 token、升级流程
- 2026-04-20 v0.3**修正 v0.2 错误 + 切换到 uv**
- **模型修正**v0.2 用了 zenmux 文档里过期的模型列表(被用户指正),重新通过 `curl zenmux /api/v1/models` 拉真实清单
- Claude 恢复实际最新版:Opus **4.7** / Sonnet **4.6** / Haiku 4.5Opus/Sonnet 都是 1M 上下文)
- dr-chief-editor 升级为 Gemini **3.1 Pro Preview**1M
- dr-verifier 恢复 GPT-5.4 Pro1.05M/ Qwen 3.6 Plus / MiniMax M2.7 / Kimi K2.5
- 新增 AGENTS.md §6.7 "模型升级流程"**原则:模型 slug 以 zenmux `/api/v1/models` 实时返回为准**
- **Python 环境切换到 uv**v0.2 是 pip+venv,跨平台体验差)
- 新增 `pyproject.toml` 作为依赖真源
- `scripts/setup.sh` 改为调 `uv sync`(自动装 uv、装 Python、建 venv、装依赖)
- `scripts/activate.sh` 激活时自动找 uv 路径
- `requirements.txt` 降级为备用清单(无 uv 的沙盒环境兜底)
- 2026-04-20 v0.4**全流程完成**
- 修复 zenmux-anthropic baseURL 缺 `/v1` 导致返回 HTML 页面的问题
- 修复 Anthropic 端点模型名用点号(`4.7`)应改为连字符(`4-7`
- 新增全部 subagentdr-searcher / dr-analyst / dr-verifier / dr-chief-editor / dr-polisher / dr-reporter
- 新增 Phase 2-4 命令:/dr-research / /dr-review / /dr-finalize / /dr-status
- 新增 skillsevidence-table / citation-manager / mckinsey-method
- Phase 1 已成功跑通(O-糖苷酶立项报告测试主题)
- 2026-04-21 v0.5**深度质量改造**P0+P1+P2 一次到位)
**根因诊断**:v0.4 跑通后发现 6 类质量问题:
1. 并行派发退化(Batch 3 后只派 1 个 subagent
2. 全文 AI 味重(humanizer 能识别的 28 种 AI 模式大量出现)
3. Phase 2 草稿(Sonnet)与 Final.mdGemini 重写)风格断裂
4. 标题用了用户原始问题而非正式报告命名
5. 每章首节都强制套 SCQA 显式标注(机械套路)
6. 正文混入"章节定位/字数配额/研究员 dr-analyst/生成时间"等调度元数据
7. PDF 分页散乱,标题孤行
8. 参考文献只留占位符 `[由 dr-reporter 自动生成]`
**工作流重构**:切换为"英文工作 + 最终翻译"
- Phase 1:中文访谈 + 双语 framework(中文大纲 + 英文研究思路)
- Phase 2dr-analyst/dr-verifier 全英文产出
- Phase 3dr-chief-editorGemini)英文只读审校
- Phase 4:全新链路 dr-editor-in-chief → dr-translator → dr-polisher → dr-reporter
**Agent 调整**
- dr-chief-editorGemini 3.1 Pro):收窄为 Phase 3 只读审校,不参与 Phase 4 写作
- **新增** dr-editor-in-chiefOpus 4-7):Phase 4 主体,负责合并英文稿、写 Executive Summary / Abstract / Glossary
- **新增** dr-translatorSonnet 4-6):英译中专家
- dr-polisherSonnet 4-6):强化加载 humanizer-cn + output-hygiene
- dr-reporterSonnet 4-6):强制回填 citations + 卫生检查
- dr-analyst / dr-verifier / dr-pm:切换为英文工作语言
- dr-pm:批次间 context 压缩(通过 manifest.batches_summary
**Skills 新增/升级**
- `mckinsey-method` 重写:SCQA 仅限 Executive Summary + 各章引入段,禁止显式标注 S/C/Q/A;金字塔原理优先
- `length-budget` 升级:4 种字数模式(auto/concise/detailed/deep+ 英中换算率 1:1.4
- **新增** `humanizer-cn`:基于 blader/humanizer + 中文特化(CN-1 到 CN-10
- **新增** `output-hygiene`:禁止词黑名单(章节定位/P0/研究员/占位符/SCQA 标注等 50+ 项)
- **新增** `en-zh-translation`:生物医药英译中规范
- `pdf-reportlab` 升级:widows/orphans/keepWithNext/splitByRow 分页规则,3 级颜色层次,封面保密标识
**Commands 升级**
- `/dr-init`:访谈增至 8 步,末尾由 dr-plan 提议 3 个报告标题让用户选
- `/dr-frame`:生成双语 framework(章节标题中英对照,研究思路英文为主)
- `/dr-finalize`:新链路 dr-editor-in-chief 入口,4 步串行调度
**模板升级**
- `report-template.py` 重写:颜色层次(h1 深蓝 / h2 蓝 / h3 深灰)、封面保密标识红色、widows=2 orphans=2、表格 splitByRow、禁止孤行寡行
**manifest.json 新字段**
- `report_title` / `report_subtitle`:与 `topic` 分离,由用户在 /dr-init 选定
- `confidentiality`:封面保密标识
- `word_budget_mode`auto/concise/detailed/deep
- `target_words_en` / `min_words_en`:英文词数目标
- `work_language` / `output_language`:工作和输出语言
- `phase2.batches_summary`:批次间 context 压缩的进度摘要
**v0.4 的"/dr-status" 命令保持**(未改动)
备份:v0.4 状态打 tag `v0.4-final`v0.4 的 project 产物归档到 `archive/o-glycosidase-feasibility-2026-v0.4/`
- 2026-04-22 v0.6**Phase 4 Python 化 + 术语事实核查**
**根因**v0.5.2 的 dr-translator 反复在 output token 超限处卡死。本质原因:单 agent 处理 19k+ 词整文超 Sonnet 4.6 的 ~32k output token 上限,任何 prompt 级的分块追加协议都依赖 LLM 遵从性,实测不稳。
**决策**:把 Phase 4 的翻译/润色/出稿从 LLM agent 降级为 **Python 脚本 + LLM 调用**。Python 负责"做多少"(切块、循环、重试、断点),LLM 只负责"做什么"(翻译/润色这一小段)。
**新增 Python 基础设施**(全部独立于 opencode):
- `scripts/lib/zenmux_client.py` — HTTP 客户端,指数退避重试、token 统计、JSONL 日志、secrets.env 自动加载
- `scripts/lib/markdown_chunker.py` — 按 H1/H2 切块,稳定 anchor IDorder + title sha1),合并工具
- `scripts/lib/search_client.py` — 通用搜索门面(Exa > Tavily),`trust_env=False` 关键修复系统 socks 代理 TLS EOF 问题
- `scripts/prompts/{translate,polish,glossary}_system.txt` — 三个核心 prompt,用自定义 `<<<TAG>>>` 分隔符格式(规避 Markdown-in-JSON 的引号/换行转义问题)
**新增 Python 脚本**
- `scripts/translate.py` — 章节级切块循环翻译 + 术语表累积
- `scripts/polish.py` — 按 H2 section 循环润色,记模型自标异常到 polish_notes.jsonl
- `scripts/build_glossary.py` — **术语表事实核查**:用 Haiku + Exa 并发验证每个术语的中文译名和英文拼写,发现拼写错误与误译
- `scripts/apply_glossary.py` — 把 glossary 发现的明确错误直接字面替换进 final_zh.md;保守策略(只改公司/机构/产品类专有名词,不碰 PDE/ASGPR 等有歧义的缩写)
- `scripts/build_report.py` — 统一出稿入口,按 manifest.report_title 命名 PDF/DOCX,自动发现 sources.jsonl
**report-template.py 深度修复**
- 字体注册支持 `fonts/ttf/` 子目录(OTF 的 PostScript outlines 与 ReportLab 不兼容)
- 删除 build_disclaimer 的 manifest 重复调用(免责声明从 Markdown 读,不再重复)
- 自动跳过正文首个 H1 + 封面元信息段(与封面避免重复)
- 识别"目录将在最终渲染时自动生成"占位符 → 自动生成 TOC
- 识别"完整编号参考文献列表…"占位符 → 从 `phase2/sources.jsonl` 生成 GB/T 7714 格式引文
- src 上标正则扩展:支持 src_A14 / src_B-18 等字母+数字组合(原只支持 src_\\d+)
- Unicode 上/下标转 `<super>/<sub>` 标签(思源字体子集不含上标字形,否则渲染方框)
- 中英/数字混排自动加半角空格(CJK ↔ ASCII 边界)
- 表格样式重做:table-header 水平居中、短 cell 居中、长 cell 左对齐、所有 cell 垂直居中、长文字 CJK 自动换行
- TOC 末尾 PageBreak(目录独占整页)
**Agent 调整**
- dr-translator / dr-polisher 标记 `[DEPRECATED v0.6]`,权限全部 deny,保留文件仅供历史参考
- dr-editor-in-chief 重构为"只做创作 + bash 调脚本"模式,新增 `uv run *` / `bash scripts/*` 权限
- `/dr-finalize` command 重写为 9 步流程:合并英文 → translate.py → build_glossary → apply_glossary → polish → build_report
**实测结果(dual-target-rnai-pipeline-2026 项目)**
- translate.py63 块全成功,17 分钟,$1.7033,441 中文字(膨胀 1.89×)
- polish.py60 块全成功,10.7 分钟,$1.20,字数 -0.2%
- build_glossary201/310 术语核查成功(失败 106 条是代理 TLS EOF,降并发后可补齐),发现关键事实错误:
- Maywavee 实为 **Mabwell(迈威生物)** 的拼写错误
- Beyotime 中文误译为 '碧云天',实应为 '必贝特医药'
- Aurigene 误译 '天津奥利法',应为 '天津奥瑞芙生物医药'
- apply_glossary:自动修正 3 处关键错误
- build_report:生成《双靶点 RNAi 药物工艺图谱与上游供应链机会研究.pdf》55 页 + 同名 DOCX
**已知限制**
- dr-analyst 在 Phase 2 可能编造信源 ID(本次正文 101 个 src_id vs sources.jsonl 只 44 条),build_references 会列出缺失项供人工核对
- build_glossary 对"通用缩写"判定仍依赖 LLM,存在歧义风险(已加 _AMBIGUOUS_ABBREVS 黑名单防止误伤)
- 反方证据段落格式不统一(小节标题/加粗段混用)仍未解决,需改 skill:evidence-table 或 mckinsey-method
**尚未处理的用户反馈(留待 v0.6.1)**:
- 反驳证据段标题规范化(建议从"反方证据/Counter-Evidence"改为观点化标题如"另一种声音")
- build_glossary 默认放到 Phase 2 阶段运行,在源头拦截错误
- 提示 dr-analyst 加强对公司名/机构名的搜索验证流程
- 2026-04-24 v0.9**Phase 4 并发提速 + 模型/搜索攻略本 + Codex 兼容**
**目标**:在不破坏 OpenCode 主流程的前提下,把 v0.6 Python 化 Phase 4 进一步提速,并补齐跨平台使用说明。OpenCode 仍是主适配器;Codex 第一阶段只复用 `AGENTS.md` 与 Python 脚本,不复刻 OpenCode subagent。
**Phase 4 并发化**
- `scripts/translate.py` 新增 `--workers`,默认 4;设为 1 时回退串行。
- 翻译阶段改为"稳定术语表快照 + 并发 chunk 翻译 + 事后统一合并 glossary patch",避免多线程同时写 `glossary.json`。
- `scripts/polish.py` 新增 `--workers`,默认 4;润色块彼此独立,按完成顺序写 chunk,最终按原始 order 合并。
- `scripts/lib/zenmux_client.py` 增加日志与 usage 聚合锁,避免并发 JSONL 日志交错或 token 统计竞争。
**流程修正**
- 修正 `apply_glossary.py` 默认输入,从 `phase4/final_zh_polished.md` 改为 `phase4/final_zh.md`。
- `/dr-finalize` 明确默认顺序:`translate.py → build_glossary.py → apply_glossary.py --input phase4/final_zh.md → polish.py → build_report.py`。
- 保留二次修正选项:润色后可手动对 `final_zh_polished.md` 再跑一次 `apply_glossary.py --input phase4/final_zh_polished.md --dry-run`。
**模型与搜索攻略本**
- 新增 `docs/model-playbook.md`:定义 premium / balanced / budget / cn-heavy / verifier 五套模型策略。
- 新增 `docs/search-playbook.md`:说明 Tavily / Exa / Brave / Serper / PubMed / ClinicalTrials / FDA/EMA/NMPA / Patents 的使用边界。
- 新增 `configs/model_profiles.yaml` 与 `configs/search_profiles.yaml`,作为跨平台、人类和 agent 共用的策略配置参考;当前不强制重构 `.opencode/agents` 自动读取。
**Codex 兼容**
- 新增 `docs/codex-usage.md`,说明 Codex 下如何遵循 `AGENTS.md`、运行 Phase 4 Python 流水线、检查 git staging,避免误提交 `projects/**` 研究产物。
- Codex v1 定位为"审阅/规划/修补/执行脚本";确定性编排继续放在 Python 脚本,OpenCode subagent 调度暂不移植。
**Git 管理要求**
- 本轮迭代应在独立分支推送到 Gitea。
- 提交范围仅限系统文件和文档:`README.md`、`PLAN.md`、`scripts/**`、`docs/**`、`configs/**`、必要的 `.opencode/commands/**`。
- 不提交 `projects/**`、生成的 PDF/DOCX/TXT、一次性研究产物或本地临时脚本。
- 2026-04-24 v0.10**Codex native adapter(独立复刻版)**
**目标**:把 Codex 从"辅助 OpenCode 跑脚本"升级为并列 adapter。OpenCode 继续使用 `.opencode/**`Codex 使用 `.codex/config.toml`、`.codex/agents/*.toml`、`.codex/commands/*.md`、`.agents/skills/**` 和共享 `scripts/**`。
**已落地的共享层**
- 新增 `scripts/dr.py` 平台无关 CLI:支持 `status`、`prompt`、`glossary`、`finalize`。
- 新增 `scripts/install_codex_adapter.py`:从 `codex_adapter_templates/codex/**` 安装 `.codex/**`,并把 `.opencode/skills/**` 复制到 `.agents/skills/**`。
- 新增 `scripts/deploy_check.py`:新环境部署自检;必要时用 `--repair --force` 从模板重建 `.codex/**` 并同步 `.agents/skills/**`。
- 新增 `codex_adapter_templates/codex/**`:包含 Codex 项目配置、8 个 custom agents 和命令模板;`dr-run` 是主入口,用 Codex 主线程承担 PM 调度,阶段命令只作为调试和人工接管入口。
- `configs/model_profiles.yaml` 新增 `codex_native` profile,使用 OpenAI 原生 `gpt-5.4` / `gpt-5.4-mini` 角色映射。
- `docs/codex-usage.md` 重写为 Codex native adapter 使用说明。
**设计约定**
- Codex 默认走 OpenAI 原生模型,不依赖 ZenMux provider。
- Codex 不会因 custom agent 文件存在而自动启动 subagent;`dr-run` prompt 必须明确要求主线程 spawn / wait / consolidate。
- Phase 1-3 由 `dr-run` 主线程调度 Codex custom agents 执行;Phase 4 由 `scripts/dr.py finalize` 调确定性 Python 流水线。
- `.opencode/**` 不改不删,避免破坏 OpenCode 已可用流程。
- `.opencode/skills` 将复制到 `.agents/skills`,而非软链接,以保证 Git 与跨机器可移植。
**安装方式**
- 在本机运行 `uv run python scripts/install_codex_adapter.py --force`。
- 安装后运行 `/debug-config` 确认 `.codex/config.toml` 被 Codex 加载。
- 自动化研究默认权限:`sandbox_mode = "workspace-write"`、`approval_policy = "never"`、`web_search = "live"`、`sandbox_workspace_write.network_access = true`。
- Tavily / Brave / Exa MCP server 在模板中默认 `enabled = true` 且 `required = false`;确认本机 key、npm 与网络可用可直接使用,某个服务异常时再单独关闭。