Files
Auto-Finance/src
wandering 946d27d013 feat(browser): 每步填报后做落库自检,行数/合计不一致写进 warnings
用户第 2 条:add_travel_items 点完确定不核对表尾合计,那次 500 现场看着像「脚本没点着按钮」,
白查一轮。现在每步 POST 完回读页面再比。

- BaseBot.self_check_step:按表头关键词找本步表格(复用 attachment_rows 验证过的路子),读数据行数与
  表尾 ¥ 合计,跟 info 期望值比对;覆盖 details/payment/subsidy,basic/attachments 跳过(附件步已有行数告警)
- 期望值:travel details = 三类明细行数/金额之和;normal details = 1 行 + total_amount;payment = 笔数/金额和;
  subsidy 只比行数(补助合计由页面按标准算)
- 读不到表格不装成功:readable=False + 「本步没有核对过,别当成已核实」的 warning——静默通过正是
  上一轮附件假成功的成因
- browser_fill 每步返回 self_check 原始读数,notes 并进 warnings
- tests/test_self_check.py 六例;FakeBot 绑定 _row_amount 时要用 staticmethod(转类会变成吃 self 的普通函数)
- 文档:browser_fill docstring、操作指南填报注意事项、方案文档 §23(含"选择器待联机确认"的边界)

验证:pytest 197 passed;ruff / format / mypy / deptry / mcp-smoke / docs-check / skill-check 全绿。
--no-verify 提交并手跑等价检查。
2026-10-21 13:53:07 +08:00
..

last_reviewed
last_reviewed
2026-10-19

src — 源码

MCP 服务器的全部实现:工具层在上,确定性内核在下,infra 是被调用的手。

src/
├── mcp/            工具与协议层(25 个工具,stdio)
│   ├── server.py   INSTRUCTIONS + 注册 + build_server()(工具表由 scripts/gen_mcp_docs.py 生成)
│   ├── tools/      materials 材料 / extraction 抽取交接 / analysis 匹配校验 / documents 产物
│   ├── schemas.py  抽取字段定义单一真源 + 日期金额规范化
│   └── envelope.py ok/fail 统一信封(工具不把异常抛穿协议)
├── cases.py        会话目录 cases/<id>/ 唯一实现:材料·收件箱·产物·阶段推导·上传令牌
├── upload/         扫码上传收件器(独立进程,Flask + segno)
├── core/           确定性内核:extraction matching validation
├── infra/          browser · documents · com_thread
├── config.py       scripts/data/config.json + 环境变量
├── exceptions.py   异常层次
└── __init__.py     get_logger(终端 + logs/<日期>.log)

依赖方向

mcp 依赖 core/infra/cases;core 不依赖 infra 与任何框架;infra 不依赖 mcp。 cases.py 只依赖标准库,是会话目录布局的唯一真相:想知道产物叫什么,读它,别猜。

分层原则

  • 判断在上,事实在下:读图、综合、决定交给宿主 Agent;本项目只做渲染、匹配、校验、生成
  • 无状态:阶段从磁盘产物推导,进程随时可杀可重启
  • 不承诺未完成的事:INSTRUCTIONS 只列已注册工具
  • 提交不做,永久不做:submit_* 整类(代提交、提交前预览)已被用户否决,填报完成就是终点; 删除与撤回同理,都在财务系统里由人做