Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 81 additions & 32 deletions .ai-team/TASK.md
Original file line number Diff line number Diff line change
@@ -1,61 +1,110 @@
# Current Task

- ID: `AR-003`
- Title: `Simplify the assignment plan to module level`
- Status: `done`
- Owner: `zzg`
- Next owner: `user/team`
- ID: `AR-010`
- Title: `将可追溯的 M06 论文读取接入主 Research LangGraph`
- Status: `handoff`
- Owner: `kyle`
- Next owner: `kyle/项目评审`

## Goal

根据用户反馈,把任务拆解入口从 122 个子任务收敛为模块级分配。保留此前详细版作为附录,但当前团队先按模块认领负责人、边界、主要产出、依赖和验收目标。
把调用方显式提供并声明有权处理的本地、可提取文本论文转换为可定位、可校验、可追问的阅读证据,
并接入主
Research LangGraph。当前切片承诺全文解析、稳定 locator、标准 ReadingCard 十项合同、
claim-evidence 绑定、单次证据问答和论文级失败恢复;章节级阅读陪跑仍是独立功能块。

## Acceptance scenarios

- [x] `docs/AutoResearch_任务拆解书.md` 只作为模块级分配入口,覆盖 M00–M17。
- [x] 每个模块说明目标、边界、主要交付物、前置模块、负责人建议和当前状态。
- [x] 文档提供模块负责人验收模板和第一批模块分配建议。
- [x] 原 122 子任务版本保留为 `docs/AutoResearch_任务拆解书_详细版.md`,不丢失后续拆解素材。
- [x] README、Project-to-Act 和 VibeCollab 任务状态保持一致,不改变五业务 Agent 和证据门禁边界。
- [x] 多页 PDF 被解析为稳定文档块,第二页结果保留第二页 locator 和全文 checksum。
- [x] ReadingCard 中的结构化 claim 可通过 evidence ID 回溯到同一论文和有效原文块;仅有元数据或
摘要时不会冒充全文证据。
- [x] 单次论文问答只从可定位原文句子中选择答案;来源不支持时返回 `unresolved=true`。
- [x] Paper Reader 子图在 `ResearchState` 中保存有界的论文级进度,重放时不复制已完成阅读产物,
checkpoint 中不保存全文。
- [x] 缺失、损坏、空白、加密、需要 OCR 或不支持的文档产生结构化诊断;同批一篇失败不会抹掉
已成功论文。
- [x] 现有 CLI/API 保持兼容,业务 Agent 仍严格为五个,离线 Ruff、pytest、doctor 和任务检查通过。
- [x] 标准 ReadingCard 覆盖规范引用、版本、M05 OA/许可快照、全文 hash、研究问题/作者主张、
方法与实验要素、精确结果定位、适用边界、复现资源、idea 关系、创新分栏、待补读项、置信度及
审核状态;事实项均复用可回查的 claim/evidence/locator。
- [ ] 章节级 checkpoint、暂停/恢复和按当前段落装配上下文属于独立功能块,当前没有实现,也不计入
本切片完成项。

## Invariants

- 当前入口不要求团队一次性拆到函数、接口或工单;模块负责人后续再自行细化。
- 详细版是参考材料,不代表所有子任务都已实现或已验收。
- 真实论文试点、生产数据库、Web UI、灾备和性能仍保持原有“外部阻塞/待开发”状态。
- 不提交 token、密钥、私有来源、完整论文、原始提示或虚构外部结果。
- 业务 Agent 始终保持五个。解析、locator 校验、证据持久化和 checkpoint 记账是确定性服务或节点,
不伪装成额外 Agent。
- 不绕过付费墙,不提交凭据、私有/完整论文、原始提示词或模型原始输出;测试只使用运行时生成的
fixture。
- 全文和无界文本块不得进入 `ResearchState` 或 `HandoffEnvelope`;图状态只保存稳定 ID、有界摘要、
进度和诊断。
- 模型可以理解给定原文块,但不能编造页码、章节、block locator、evidence ID、证据等级或状态迁移。
- 来源缺失或 provenance 无效时必须 fail closed;摘要/题录降级必须显式标注,不能取得全文证据等级。
- 当前不重做 M05 检索/OA/许可,不重做 M07 创新挖掘,也不实现 OCR、复杂表格/公式解析、
Web UI 或生产存储。
- 现有 `POST /papers/{id}/questions` 仅为无会话的单次证据问答兼容接口,不得在文档或验收中称为
“章节级阅读陪跑”。

## Decisions

- 使用 M00–M17 作为稳定模块 ID,先按模块分配负责人。
- 保留详细拆解版,避免未来重新整理时丢失依赖和验收素材。
- `.project-to-act` 继续作为长期项目事实源;`.ai-team/TASK.md` 只记录本次短周期交付。
- 本任务基于 `main` 提交 `46fbd7a`;开放中的 AR-008 V2 仍是明确集成风险,不能静默采用其合同设计。
- 首个切片支持调用方显式提供并声明有权处理的本地 born-digital PDF、UTF-8 TXT 和 Markdown。扫描 PDF 返回
`ocr_required`,不伪造正文。
- 复用现有父图和 SQLite checkpointer,在原 Paper Reader 内扩展子图,不增加第六个业务 Agent。
- 保持已有 `ReadingCard`/`ReadingAnswer` 消费方兼容,同时增加有类型的 provenance 和 claim 绑定。
- 按项目负责人确认的口径把章节级阅读陪跑视为独立功能块:不删除现有单次问答接口,不在本任务中实现陪读会话,
并保留 parser/block/locator 作为未来陪读模块可复用的底座。
- 按 M05 PR 当前合同,M05 只保存独立 `paper_open_access` 记录,包含 OA 状态、合法全文入口和
license,不修改 `PaperRecord`、不下载 PDF。M06 只按 `paper_id` 读取该记录作为卡片元数据,绝不把
`fulltext_url` 当作 `full_text_path`;正文仍只来自显式提供的本地文件。

## Completed

- 将原 `docs/AutoResearch_任务拆解书.md` 移为 `docs/AutoResearch_任务拆解书_详细版.md`。
- 新建模块级 `docs/AutoResearch_任务拆解书.md`,包含 18 个模块、执行阶段、负责人模板和首批分配建议。
- 保留 README 任务书入口,并将 AR-003 的状态、范围和下一步写入协作账本。
- 增加解析文档、文档块、locator、读取诊断、claim 绑定、ReadingCard/ReadingAnswer 扩展和 Reader 进度合同。
- 增加基于内容寻址的 PDF/TXT/Markdown 解析器,保存页/块定位、原文 checksum、缓存完整性校验、
大小/页数/字符上限、摘要降级和显式失败类型。
- 重构 `PaperReaderService`:缓存抽取 profile,验证模型返回的 block/quote/claim,构建逐 claim 证据,
拒绝失效证据,并只从可定位原文句子回答单次问题。
- 把原单节点 Reader 改为 `prepare_batch -> read_one_paper -> finalize_batch`,记录逐篇游标并通过父图
checkpointer 恢复;未知异常使用同一 `thread_id` 的 continue 路径。
- 增加 `POST /runs/{run_id}/continue` 和 `autoresearch continue-run`;`resume` 仍只处理人工中断。
- 增加双页 PDF 精确定位、解析失败、缓存篡改、摘要降级、失效证据、对抗模型输出、问答负例、
批次部分/全部失败、幂等重放和应用重启恢复测试。
- 补齐标准 ReadingCard 十项结构:规范引用快照、显式论文版本、M05 OA/许可快照、全文 SHA-256、
研究问题/作者主张、方法/数据集/基线/变量/指标、关键结果、适用范围/假设/局限/失败案例、复现资源
与缺失项、idea 关系、作者创新/Reader 推断创新分栏、待补读引用、置信度和待审核 evidence 集。
- locator 新增章节、表和图标签;只有原文能识别标签时才填写,并与页码、block、字符偏移一起回查。

## Pending

- 用户/团队需要为模块负责人模板填写实际 owner、分支、目标日期和 evidence ID。
- 模块负责人确认后,再选择需要展开的模块,不默认展开全部模块。
- 真实论文试点仍等待 idea、领域、目标 venue、授权全文和实验资源边界。
- 项目负责人需确认非 `pending` 的阅读卡审核由哪个角色写入、允许哪些状态迁移;当前 Reader 只建立
`pending` 状态和待审核 evidence ID,不冒充人工或 Reviewer 已审核。
- 项目负责人需确认是否在 M06 验收中要求独立的用户授权记录及“本地解析/发送外部 LLM”分 scope 门禁;当前
`full_text_path` 只执行调用方声明式合同,没有独立授权审计记录,E2 仅表示全文证据等级而非版权许可。
- 项目负责人和检索负责人需确认论文版本由检索、显式导入还是人工补录;当前合同支持版本枚举,来源未提供时
明确保存 `unknown` 和待补读项,不用 DOI/URL 猜测正式版本。
- 需为章节级阅读陪读创建独立任务范围,明确 session、章节 cursor、暂停点、恢复请求、公式/图表
解析依赖和上下文装配规则。
- 合并前与检索负责人协调 `contracts.py`、`application.py`、API 文档和 `.ai-team/TASK.md` 的交叉改动,
先 rebase 再共同确认 M05→M06 合同。
- 生产多 worker 的抽取占用锁和事务 outbox 仍在 M04/生产存储范围,不能宣称 exactly-once。

## Next step

先认领 M01–M04、M05–M07、M08、M09–M10、M11–M12、M13–M15/M17、M16 这 7 个模块包;完成模块边界确认后,再只对当前瓶颈模块做子任务拆解。
先完成全量回归和代码评审,再由 kyle 把“版本来源、阅读卡审核状态迁移、摘要降级策略”三个剩余产品
口径提交项目评审。章节级陪读另开功能任务,不删除也不复用当前问答接口冒充完成。

## Verification

- [x] Project-to-Act `--check` — managed 配置有效,唯一账本保持不变。
- [x] 模块文档结构检查 — M00–M17 全部存在,详细版文件可访问。
- [x] `node .ai-team/check.mjs --base main` — AR-003 acceptance 5/5,任务范围和变更同步有效。
- [x] Project-to-Act `--validate` — managed 配置 valid,issues 为空。
- [x] `.venv\Scripts\python.exe -m ruff check src tests`:通过。
- [x] `.venv\Scripts\python.exe -m pytest -W error -q`:40 项测试通过。
- [x] `.venv\Scripts\autoresearch.exe doctor`:通过;恰好注册五个业务 Agent。
- [x] `node .ai-team/check.mjs --base origin/main`:通过(使用工作区内置 Node)。
- [x] `git diff --check`:通过;仅出现 Git 的 LF/CRLF checkout 提示。

## Handoff note

- From: `zzg`
- To: `user/team`
- Summary: 当前分配入口已经降为模块级;详细拆解保留在附录。先分模块负责人,后续只对真正需要的模块继续细化。
- From: `kyle`
- To: `项目负责人/检索负责人/团队评审`
- Summary: 当前交付是可追溯读取底座、标准阅读卡十项、单次证据问答和论文级恢复;章节级阅读陪跑
仍未实现且保持独立。M05 OA/license 只读接入,不下载全文;版本来源和非 pending 审核流程待项目负责人确认。
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ AutoResearch 是一个以证据为边界、以项目文件夹为账本的 LangGr
- docs/ARCHITECTURE.md:总体架构与五 Agent。
- docs/FUNCTION_MATRIX.md:基础版功能表与生产边界。
- docs/WORKFLOW_AND_STATE.md:状态机、handoff、checkpoint/resume。
- docs/M06_PAPER_READER.md:可定位阅读证据、claim map、单次证据问答与逐篇恢复。
- docs/EVIDENCE_AND_GATES.md:证据等级与 L0–L4 门禁。
- docs/KNOWLEDGE_AND_EVOLUTION.md:Wiki+Graph、画像、经验与自进化。
- docs/API.md、docs/OPERATIONS.md、docs/DEVELOPMENT.md:接口、运行和开发。
Expand Down
19 changes: 18 additions & 1 deletion docs/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ project_id 只接受小写字母、数字、下划线和连字符。已有目录
| GET | /runs/{run_id} | 查看运行记录 |
| GET | /runs/{run_id}?include_checkpoint=true | 同时查看 checkpoint/next/interrupt |
| POST | /runs/{run_id}/resume | 恢复 L4 人工 interrupt |
| POST | /runs/{run_id}/continue | 从普通节点异常的 checkpoint 重试 |

POST /runs 可包含 seed_papers。没有真实论文时返回 201,但 run.status=blocked,这是有效的 fail-closed 业务结果,不是 HTTP 故障。

Expand All @@ -42,6 +43,15 @@ POST /runs/{id}/resume:

非 interrupted run 恢复返回 409。

`resume` 与 `continue` 不是同一个动作:`resume` 必须携带人工审批数据,只恢复
`interrupt()`;`continue` 不接收审批数据,只重试保留在同一 thread_id 中的失败节点。
工作流节点抛出未知异常时,`POST /runs` 返回 503,响应 detail 中包含 `run_id` 和
`resumable`。仅当该 run 为 `failed` 且仍有待执行 checkpoint 时,`continue` 才接受请求。
人工 resume 已提交但节点出现瞬时系统错误时,run 保持 `interrupted`、保留原 interrupt,
并返回 `retry_mode=resume`;客户端应使用同一审批内容再次调用 `/resume`,不能改走
`/continue`。重试请求必须与首次 approval、reviewer、note 完全一致;不同 payload 返回
409,避免 LangGraph 重放已消费审批时忽略后来改变的决定。

## 证据与执行

| 方法 | 路径 | 作用 |
Expand All @@ -58,11 +68,18 @@ POST /runs/{id}/resume:

| 方法 | 路径 | 作用 |
|---|---|---|
| POST | /papers/{paper_id}/questions | 证据限定的陪读问答 |
| POST | /papers/{paper_id}/questions | 无会话的单次论文证据问答(非章节级陪读) |
| POST | /manuscripts/{manuscript_id}/revisions | 生成修改或润色版本 |

阅读材料不足时返回 unresolved=true,不生成猜测答案。修订不会覆盖原稿,继承 evidence IDs 和 unresolved gaps,并强制 release_ready=false。

单次问答答案中的 `citations` 包含 document checksum、block ID、页码(PDF)、字符偏移和
精确引文。相关证据失效后,同一问题不会继续返回旧的 resolved 答案。

该接口没有章节 cursor、暂停点、恢复请求或阅读会话;它不能作为计划书中“章节级阅读陪跑”
的验收证据。章节级陪读应作为独立功能块接入 LangGraph,并复用现有 document/block/locator,
而不是把本接口改名后冒充完成。

## Wiki、Graph 与画像

| 方法 | 路径 | 作用 |
Expand Down
16 changes: 15 additions & 1 deletion docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ LLM 是可选认知增强器,不是授权器。LLM 不可覆盖 GateDecision
|---|---|---|---|
| 总控 Agent | idea、项目约束、证据引用 | research charter、检索式、工作包、结构化派单 | 自行确认创新或实验结果 |
| 论文搜索 Agent | 检索式、seed paper | 去重 PaperRecord、题录证据、检索诊断 | 无结果时编造论文 |
| 论文读取 Agent | PaperRecord、全文或摘要 | ReadingCard、陪读回答、InnovationCandidate | 把摘要推断写成全文事实;把候选写成已证实创新 |
| 论文读取 Agent | PaperRecord、M05 OA/许可记录、全文或摘要 | 标准 ReadingCard、单次证据回答、InnovationCandidate | 把摘要推断写成全文事实;把候选写成已证实创新 |
| 写作 Agent | 放行的阅读卡、证据、实验记录 | 论文草稿、修改/润色版本、缺口清单 | 新增无证据数字;把草稿标记为可发布 |
| 审核 Agent | 候选、稿件、Evidence IDs | ReviewReport、Gate 建议、定向打回 | 修改证据后自批;越过人工外发 Gate |

Expand All @@ -56,6 +56,12 @@ LLM 是可选认知增强器,不是授权器。LLM 不可覆盖 GateDecision

每个业务节点调用对应 Agent 的 LangGraph 子图。SQLite checkpointer 以 run_id 作为 thread_id。L4 节点调用 interrupt;恢复必须用同一个 run_id 和 Command(resume=...)。

Paper Reader 是其中一个业务 Agent,不是解析器的别名。其子图逐篇调度阅读;PDF/TXT
解析、checksum、block/locator 校验、EvidenceItem 持久化和 reader_cursor 更新均为确定性
组件。配置 LLM 时,模型只提出绑定到既有 block 和逐字 quote 的结构化候选;代码验证
block、quote 和 offset 后才允许形成 supported claim。普通节点异常使用同一 thread_id 的
continue,人工 release interrupt 仍使用 Command(resume=...)。

父状态只保留 typed state、稳定 ID、短诊断和不超过 2000 字符的 bounded_context。论文全文、完整聊天和大产物不进入 handoff。

## 5. 数据与持久化
Expand All @@ -67,6 +73,14 @@ LLM 是可选认知增强器,不是授权器。LLM 不可覆盖 GateDecision

RecordStore 使用 kind + record_id 作为主键,project_id 和 partition_name 作为检索边界。关键操作同时写 append-only audit_events。

M06 额外保存 ParsedDocument、DocumentBlock、ReaderDiagnostic 和 ReadingCard。ReadingCard 包含
规范引用/版本/访问快照/全文 hash、研究问题与作者主张、方法和实验要素、关键结果、边界与失败、
复现资源、idea 关系、创新分栏、待补读项及审核状态。M05 的 `fulltext_url` 只作为访问元数据,
不会被 Reader 当成本地正文或触发下载。
ReadingClaim 与 ClaimEvidenceBinding 当前嵌在 ReadingCard JSON 中,并不是可独立检索的规范记录。
ParsedDocument/DocumentBlock 使用内容寻址 ID;ReadingCard 同时保留旧字段和嵌套的结构化
claim map,以兼容现有 Writer/Reviewer 消费者。

基础版 SQLite 适合本地开发和单进程验证。生产部署目标仍是 PostgreSQL/pgvector 规范源、对象存储大产物和可重建的 Neo4j 投影;当前代码没有把 SQLite 冒充该生产拓扑。

## 6. 运行边界
Expand Down
5 changes: 3 additions & 2 deletions docs/FUNCTION_MATRIX.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
| idea 深化 | 已实现 | OrchestratorAgent.scope | 可证伪问题、非目标、工作包 | 尚无领域专用模板库 |
| 相关论文检索 | 已实现 | PaperSearchService | PaperRecord、题录证据、诊断 | 三个连接器已编码;默认关闭网络,live 质量未作为本地测试结论 |
| 论文去重 | 已实现 | PaperSearchService._dedupe_key | DOI/标题归一结果 | 尚未实现预印本到期刊版本图 |
| 论文总结 | 已实现 | PaperReaderService.read | ReadingCard、locator、置信度 | 结构化抽取为基础算法;图表/公式解析待增强 |
| 阅读陪跑 | 已实现 | POST /papers/{id}/questions、ask-paper | ReadingAnswer、locator、evidence IDs | 只回答已供应文本;无材料时 unresolved=true |
| 标准论文阅读卡 | 已实现 | PaperReaderService.read | 十项 ReadingCard、claim/evidence/locator、置信度 | 识别正文中的章节/表图标签;复杂表格、公式语义解析待开发 |
| 单次论文证据问答 | 已实现 | POST /papers/{id}/questions、ask-paper | ReadingAnswer、locator、evidence IDs | 无会话、无章节 cursor;只回答已供应文本,不等同章节级陪读 |
| 章节级阅读陪跑 | 未实现 | 独立功能块待定 | 章节 checkpoint、当前段落上下文、暂停/恢复 | 需项目负责人确认任务、会话合同及图表/公式依赖 |
| 创新点挖掘 | 已实现 | PaperReaderService.mine_innovations | InnovationCandidate、反证测试 | 永远先标记 hypothesis,不自动宣称 novelty |
| 工作量辅助 | 已实现 | WorkPackage、ExecutionService | 四类工作包、依赖、验收、状态 | 完成状态必须绑定有效证据;资源估算器待增强 |
| 论文写作 | 已实现 | WriterAgent、WritingService.draft | MANUSCRIPT_DRAFT.md | 缺实验时 Results 固定为待真实实验 |
Expand Down
Loading