窗口 C 完成报告:阶段 2 采集 lint(M1/M3 交叉验证 + verdict 状态位 + MCP)

日期:2026-08-15 执行依据:docs/specs/2026-08-13-execution-plan-v1.md §六.六(C1-C6 验收清单,19 项冻结)


一、执行顺序与范围

按方案建议顺序执行:C2(M3 解析器)→ C3(交叉验证)→ C1(M1 hook)→ C4(MCP)→ C5(可观测)→ C6(回归)。 采集层全部为外围层:未改动任何评分路径(evaluator/matcher/aggregator/error_tracer/rule_registry/评分模型均未动),golden 0 差异为硬验收。

二、产出清单

C2 M3 产物解析器

| 文件 | 说明 | |——|——| | src/bioaudit/capture/models.py | CapturedDecision / DecisionProvenance / UncertainCandidate / ParseResult;三级可信源常量 + 禁猜规则注释 | | src/bioaudit/capture/signatures.yaml | 34 类型签名表(23 个有确定性签名;11 个纯上下文/一致性类型如实声明待补) | | src/bioaudit/capture/signatures.py | SignatureTable 加载/校验(类型∈本体、模式编译、choice 方式互斥) | | src/bioaudit/capture/m3_parser.py | M3Parser(signatures 驱动 + 三级可信源 + unverified + provenance + LLM 提名校验) |

C3 交叉验证器 + verdict 状态位

| 文件 | 说明 | |——|——| | src/bioaudit/capture/verdict.py | VerdictStatus(provisional/final/revoked)+ 转换表 + VerdictStore(JSONL 持久化) | | src/bioaudit/capture/cross_validator.py | 四类判定 + 对齐键 + 多实例建模 + 漏报自动补入 + final_trajectory(final-only) |

C1 M1 主动上报(CellVoyager hook)

| 文件 | 说明 | |——|——| | src/bioaudit/capture/session.py | SessionWhitelist(env 白名单 + 程序化注册) | | src/bioaudit/capture/wal.py | WAL 追加持久化 + 崩溃恢复(intent/result + interrupted 检测) | | src/bioaudit/capture/m1_reporter.py | M1Reporter(幂等键 + WAL + audit_decision 契约 + verdict provisional + 异常隔离) | | src/bioaudit/capture/cellvoyager_hook.py | CellVoyagerM1Hook(wrapper 优先,不 fork;run_last_cell/execute_cell/insert_execute_code_cell 前后钩子;NullM1Hook) | | scripts/run_cellvoyager_capture.py | 部署入口(缺 CellVoyager 优雅降级,明确报错不半吊子运行) |

C4 MCP server

| 文件 | 说明 | |——|——| | mcp/server.py | 最小 stdio JSON-RPC 2.0 MCP server(协议 2024-11-05;零额外依赖);tools = audit_decision / audit_trajectory / report | | docs/mcp-contract.md | MCP 契约文档(工具说明 + 请求/响应示例 + 错误码映射 + 握手) |

C5 可观测性

| 文件 | 说明 | |——|——| | src/bioaudit/storage/event_store.py | append 失败 → EventWriteError(不再静默丢写,F11) + write_failures/health() + H12 日志轮转(容量上限 + 分片 + 重放不丢) | | src/bioaudit/capture/engine_trace.py | trace_session / session_summary / render_trace(审计者也可审计) | | src/bioaudit/api/audit.py | _append_event 显式告警进 state/report;audit_decision 可选 session_id 事件记录 |

C6 回归

三、验收对照(§六.六 C1-C6,19 项逐项)

C1 M1 主动上报(CellVoyager hook)

C2 M3 产物解析器

C3 交叉验证器

C4 MCP server

C5 可观测性

C6 回归

四、回归证据

golden:   ok=True | n_diffs=0 | trajectories=20 | decisions=137
pytest:   148 passed
ruff:     新代码零错误(src/bioaudit/capture、mcp/、新测试)
MCP:      python -m mcp.server --selfcheck → PASS
CLI:      parse-notebook(8 候选/3 未定)/ cross-validate(1 一致/1 虚报/7 漏报/1 未验证)
          / trace(14 事件 7 节点)/ verdict(provisional/final/revoked 计数)端到端验证通过

五、遗留项(如实声明)

  1. CellVoyager 真实运行未实测:本机未安装 CellVoyager 依赖(openai/h5py/anndata), scripts/run_cellvoyager_capture.py 已验证优雅降级路径(缺包明确报错,exit 1); hook 逻辑经 FakeExecutor 等价测试覆盖(方法签名与 IdeaExecutor/ClaudeJupyterExecutor 对齐)。 接入真实 CellVoyager 时若执行器方法签名有出入,仅需扩展 _CODE_EXTRACTORS
  2. M2 调用旁路未实现(设计定稿:可选增强,不阻塞)。
  3. 34 类型中 11 个纯上下文/一致性类型无确定性签名(events_per_variable、ic50_sample_size、 independent_prognostic_claim、purity_confounding、一致性族等)——签名表已逐类注明”待声明回填”, capture-validate 统计 23/34 有签名;这些类型的决策由 M1 声明 + LLM 提名(过本体校验)承担, 符合”宁可 unverified 不伪造”。
  4. H12 归档周期(冷备/归档到外部存储)未做——轮转与保留上限已落地,归档留给运维窗口。
  5. verdict revoked 为终态(无 re-finalize):重新定案需人工重建记录(设计如此,文档已注明)。
  6. docs/specs/2026-08-14-fix-tracking.md 未新增条目(窗口 C 不在 78 条 audit-report 基线内)。

六、关键设计决策记录

决策 依据
signatures 放 capture 映射表而非本体 decision_types C2.5 允许”capture 映射表”;零触碰本体文件 → golden 风险最低
verdict/score_snapshot 冻结在采集层,不改 DecisionScore 模型 golden 逐字段 diff 守卫(模型新增字段会进 model_dump)
MCP 用最小 stdio JSON-RPC 实现(零额外依赖) pyproject 核心依赖只有 pydantic+pyyaml;H8 依赖锁定不扩
EventStore.append 改为抛出 EventWriteError + 管道捕获告警 C5.15”不再静默丢写”且不拖垮审计(F6 精神)
对齐键 = decision_type 主键 + step_id 辅助 + instance_index 多实例 B5 定义;文档在 cross_validator docstring
漏报补入 verdict 直接 final(M3 事实证据链) 与”provisional→final/revoked”生命周期共存:事实驱动终态