# 写入可靠性:问题、修复与交付 2026-10-05,按“入口/生命周期 → 执行证据 → 幂等/并发 → 回归展示”实施。 保持手写 loop、SQLite、20 个工具。实施清单见 [计划](plans/2026-10-05-write-reliability.md),事务决策见 [ADR-0007](adr/0007-write-reliability.md)。 ## 改变了什么 | 触发情形 | 原问题 | 当前行为与证据 | |---|---|---| | CLI/API 启用写工具 | 提示词仍宣称不能写 | 按实际 Tool.risk 选择提示词;入口 HTTP mock 回归 | | 决策、取消、断连 | waiter / 并行任务残留 | 释放审批、关闭下层生成器、回退未完成会话;AnyIO 取消回归 | | 审批请求失效或网络失败 | 前端可能认为提交成功 | 校验 HTTP/ok,防重复提交,显示错误并允许重试 | | 模型说“执行成功”但业务报错 | 名字/文本检查仍可能过 | 保存参数和工具结果,查成功次数与准确业务状态 | | 写评测共享数据库 | 上条修改污染下条 | 每条临时 seed,拒绝路径四张业务表不变 | | 写提交后响应丢失 | 自动重试重复变更 | 持久化 token 与结果,同次执行重放首次结果 | | 并发库存增减或建单 | 丢更新、超卖、序号冲突 | BEGIN IMMEDIATE 在读取前加写锁;独立连接并发测试 | | 低库存/畅销榜/日销量成功查询 | 返回 list 与 dict 输出声明冲突 | items/returned 对象返回;真实 MCP 调用回归 | 最后一项由真实模型全量评测暴露。诊断运行在修复前中止,相关 trace 留在 `traces/evals/`;不能把其中工具报错后的 PASS 当作有效成功率。修复后重新跑 统一 35 条,checkpoint 保留所有失败、尚未执行项与估算成本。 ## 如何复核 - `uv run pytest`:离线测试,默认不调用真实模型。 - `uv run ruff check .`:Python 静态检查。 - `apps/web` 下 `npm test` / `npm run build`:审批提交契约与生产构建;CI 同步执行。 - `uv run python scripts/demo.py`:独立临时库四场景,trace 与 summary 在 `traces/demo/`。 - `uv run python scripts/demo.py --serve`:生产前端 + 真实 API/MCP/审批,模型脚本化。 - `uv run python -m evals --budget 0.1 --timeout 30`:真实模型 35 条,共享预算、固定范围。 本次离线四场景实测:A1001 报价不变更库存;批准 130→135;拒绝 130→130; 库存不足后查库存恢复,130→130。全部状态断言通过。这些是确定性工程链路证据, 不能替代真实模型行为评测。 真实模型完整基线:[20261005-142553-dcc830](../reports/evals/20261005-142553-dcc830.md): 35 条全执行、34 通过;写拒绝与审批 6/6,估算成本 ¥0.0308,耗时 1255 秒。 只读任务第一条有两次重试,计量不完整 1 条。运行期间源码未改变;开始时为 未提交工作区,报告保留原 HEAD 与源码哈希,随后按阶段提交。 唯一失败 edge-08:模型在工具调用前列出合法状态,随后自行把“已退货”近似为 “已退款”查询;最终文本只有退款清单,现检查判为失败。检查只看最终轮文本, 其枚举子串列表还未包含合法“已退款”,因此不把这次失败简单归为工具错误或 模型完全未解释。原失败保留,下一次需明确“不得擅自替换筛选条件”和分步解释 的判分口径,再校准标注;不能用补一个子串的方式追求 100%。 这份报告对应本轮运行的工程实现,不是所有回答数字准确的人工验收;程序化 检查仍有局限。此后只补了 CI 默认配置和注释/文档澄清,未改变运行逻辑。 ## 仍需要开发的下一阶段 1. 先持久化任务、审批、调用 token 与工具结果。验收:在审批前/提交后/回答前 分别重启,不丢状态、不重复写;旧审批链接失效行为明确。 2. 定义断连恢复:已批准但业务提交结果不明时按 token 查询结果,再继续回答。 会话历史回退不能撤销已提交操作,这一边界必须在恢复 UI 中解释清楚。 3. 上线前补身份认证、会话/审批归属和 TTL、审计记录,再做部署与故障演练。 当前计划是单用户 demo,这一步需更新范围 ADR 后实施。 4. 再评估 LangGraph / PostgreSQL 是否能减少手写恢复复杂度,并以同一验收集 比较。先补恢复能力,避免用换框架代替可靠性证据。 报价/库存/订单可复核、拒绝有零变更证据、写重试有数据库语义,是本轮的项目 价值;持久化恢复和生产访问控制还未完成,不把工程原型称为生产就绪。