B3 完成报告(阶段 1 · API 契约)— 2026-08-14

执行窗口 ⑥(窗口 B 内)· B3:三入口 pydantic 校验 + 错误码体系 + audit_decision 必填 paradigm + human_overrides 范围校验 + 契约文档 + 契约测试。 依据:refactor-plan-v1.1 B1/B2、audit-report A5/A7/A15、execution-plan-v1 §六.五(B3 清单,已冻结)。 验收:B3 验收清单 7 项全部通过(见下逐项打勾);golden 回归 0 差异。

一、产出清单

src/bioaudit/errors.py                 # ★ 错误码体系(5 码 + BioAuditError + pydantic 归一化)
src/bioaudit/api/contract.py           # ★ 请求 schema 与校验(TrajectoryPayload /
                                       #   AuditDecisionRequest / validate_human_overrides /
                                       #   validate_paradigm)
src/bioaudit/api/audit.py              # ★ 三入口改造(校验前置 + error_code + rule-not-found)
src/bioaudit/api/__init__.py           # 再导出 BioAuditError / ErrorCode
src/bioaudit/models/decision.py        # Decision extra="forbid"(A15:未知字段显式报错)
src/bioaudit/models/trajectory.py      # v2 schema + validate_trajectory(B4 共用,见 B4 报告)
src/bioaudit/report/schema.py          # schema 常量再导出(B4 验收项 1)
src/bioaudit/storage/event_store.py    # log_dir 初始化时读 BIOAUDIT_LOG_DIR(事件可测/可重定向)
src/bioaudit/cli.py                    # audit-decision --act 必填;错误码 JSON 输出;stdout UTF-8
ui/pages/02_audit.py                   # BioAuditError 显式展示(错误码)
docs/api-contract.md                   # ★ 契约文档(三入口 schema + 错误码 + 示例)
tests/test_api_contract.py             # ★ 契约测试(非法输入/错误码/paradigm 消歧/事件/守卫)
tests/test_engine.py                   # audit_decision 调用改为 paradigm= 关键字

二、B3 验收清单逐项打勾(execution-plan-v1 §六.五)

三、验证记录

验证 结果
python scripts/golden_replay.py ✅ 0 差异(20 轨迹 137 决策)
python -m pytest -q ✅ 75 passed(含新增 37 项)
python scripts/check_no_cwd_paths.py ✅ 未发现相对 cwd 路径
CLI bio-audit audit-decision --act 必填 ✅ 缺参 argparse 报错;错误 JSON 含 code
CLI bio-audit run 非法输入 ✅ 输出 {"error": {"code": ...}},退出码 1

四、遗留项