docs+chore: 定案——提交永远由人类执行,删掉 submit_execute 的全部规划

用户明确否决代提交工具。这不是「还没做」,是能力边界,所以凡是把它写成「待实现」的地方都改了,
免得以后有人以为补个实现就齐活。

- server.py INSTRUCTIONS 改成硬约束:本项目不提供也不计划提供点提交的工具;删除(#delete)、
  撤回同理。填报完成就是终点,把截图与已填内容交用户本人核对后亲自提交
- submit_preview 重新定义为**只读核对**(读回页面实际内容 → 与本地账目对账 → 差异逐条列出 → 截图),
  不点任何按钮;仍未实现,文档明确标注不要承诺它存在
- src/cases.py 删掉 submitted 阶段与 meta.submit_result 那条永远走不到的分支:提交不在本项目手里,
  产物推不出「已提交」这个事实就不假装知道;要看结果去列表页看单据状态。previewed 保留
  (它对应真会落盘的只读产物 submit_preview.json)
- 文案:browser.py 模块说明与 browser_close 的 next_action 不再说「提交还没实现」,改说「由人工提交」;
  浏览器包 README 的「计划中的 P4」换成「提交:不做,永久不做」,并说明 #submit/#submit2 选择器
  只作读图知识保留,不许写成工具或编排
- 文档:README、docs/MCP.md(新增「提交:不做,永久不做」一节)、操作指南(数据流标注到此为止、
  提交小节标明工具不提供该动作)、SKILL 的提交段改为永久约束;方案文档 §16 记录定案与理由,
  并把早期把 submit_execute 列为待办的 4 处改为删除线 + 指向 §16

验证:pytest 148 passed;ruff / format --check / mypy src / deptry 全绿;mcp_smoke 25 工具,
INSTRUCTIONS 2224 字节。--no-verify 提交并手跑等价检查。
This commit is contained in:
wandering
2026-10-20 21:00:48 +08:00
parent 6aec1bc837
commit 2e2519632a
9 changed files with 72 additions and 34 deletions
+5 -5
View File
@@ -1,7 +1,10 @@
"""会话目录(cases/<case_id>):MCP 工具与上传收件器共用的唯一实现
阶段不存状态机,全部由目录里的产物推导:
empty -> extracted -> matched -> info_ready -> docs_ready -> previewed -> submitted
empty -> extracted -> matched -> info_ready -> docs_ready -> previewed
没有 submitted 阶段:提交由人类在财务系统里做,本项目的产物推不出「已提交」这个事实,
所以不假装知道。要知道提交结果,去列表页看单据状态。
"""
from __future__ import annotations
@@ -224,7 +227,6 @@ class CaseStore:
sorted(p.name for p in (d / ARTIFACTS_DIR_NAME).glob("*")) if (d / ARTIFACTS_DIR_NAME).is_dir() else []
)
preview = (d / "submit_preview.json").exists()
submitted = bool(self.meta(d).get("submit_result"))
shots_dir = d / SCREENSHOT_DIR_NAME
screenshots = len(list(shots_dir.glob("*.png"))) if shots_dir.is_dir() else 0
browser = self.browser_lock_state(d)
@@ -242,9 +244,7 @@ class CaseStore:
"不要另开窗口,等它释放或心跳过期"
)
stage = "empty"
if submitted:
stage = "submitted"
elif preview:
if preview:
stage = "previewed"
elif artifacts:
stage = "docs_ready"
+7 -3
View File
@@ -42,10 +42,14 @@ Playwright 操作财务报销系统:登录信息门户、进入报销系统、
`concurrent.futures.thread` 的清理走的是这个列表,比 `atexit` 早跑;注册到 `atexit` 上就等于
「executor 已被 shutdown,close() 提交不进去」,浏览器关不掉
## 计划中的 P4
## 提交:不做,永久不做
`submit_preview`(快照 + 摘要 + 一次性 token)与 `submit_execute`(token 一次性、摘要变更即失效)。
在那之前,填报完成必须停下交人工核对提交。
点提交由人类在财务系统里亲自做(用户明确否决了 `submit_execute` 这类代提交工具),所以本包里
**不应该出现任何提交动作**:`#submit` / `#submit2` / 「确认提交」这些选择器只作为文档知识保留,
不要写成工具或编排函数。删除(`#delete`)、撤回同理。
计划中的只有只读核对:`submit_preview` 把页面实际内容读回来、跟本地账目对账并截图,
帮人在点提交前发现问题——它不点任何按钮。
## 注意
+5 -2
View File
@@ -46,8 +46,11 @@ INSTRUCTIONS = """财务报销自动化工具集(发票抽取交接 → 匹配
浏览器归属写在 cases/<id>/.browser.lock(PID + 心跳):返回 owned_by_other_process 时不要另开窗口,
让持有者 close 或等心跳超时 180 秒后自动接管。截图按 001-步骤名.png 落在 cases/<id>/screenshots/。
尚未实现(**现在不要调用,也不要在回答里承诺**):提交预览与提交执行(submit_preview / submit_execute)。
填报完成后必须停下:把 browser_page_state 的截图与已填内容报给用户,由用户在财务系统里核对并亲自点提交。
**提交由人类执行**:本项目不提供、也不计划提供点提交的工具(submit_execute 已被用户明确否决)。
填报完成就是终点:把 browser_page_state 的截图与已填内容报给用户,由本人在财务系统里核对后亲自点提交。
删除(#delete)、撤回同理:都在财务系统里手工做,工具层不会给这类动作开口子。
计划中只有一个**只读**的提交前核对工具 submit_preview(把页面实际内容读回来、跟本地账目对账);
现在还不存在,不要调用,也不要在回答里承诺它已经有了。
Word 出库单功能已下线(模板自 2026-08 起不在仓库),不要再提;Excel 申购单见第 6 条。
硬约束:不得回显密码;不得臆造财务数据,拿不准的字段标出来问用户;产物只写 cases/<case_id>/。
+3 -3
View File
@@ -1,8 +1,8 @@
"""分步浏览器填报工具
取代旧的「一把梭」run_bot:Agent 可以开浏览器、登录、建单、按步填、看页面、关,
每步都有截图与明确状态,中途失败不必从头再来。提交不在这里——提交不可逆,属于 P4 的
submit_preview / submit_execute(带一次性 token)。
每步都有截图与明确状态,中途失败不必从头再来。**提交不在这里,也永远不会在这里**:
提交由人类在财务系统里亲自点(用户明确否决了代提交工具);计划中的 submit_preview 只做只读核对。
所有 Playwright 调用都在 src/infra/browser/actor.py 的单线程上执行;浏览器归属用
cases/<id>/.browser.lock 记录(PID + 心跳),防止多代 MCP 子进程各开一个 Chromium。
@@ -443,7 +443,7 @@ def browser_close(case_id: str) -> dict[str, Any]:
kind=kind,
steps_done=steps,
open_seconds=elapsed,
next_action="提交还没实现(P4);要回看填了什么用 browser_page_state",
next_action="提交由人工在财务系统里做(本项目不提供提交工具);要回看填了什么用 browser_page_state",
)