桌上

这一次

第 2 节 · 90 分钟

你点了关闭。
对面可能已经写上了。

客户端抛出 TimeoutError,只说明你没拿到回执。不说明工单还开着。

先讲

关工单是一次有副作用的写。同一笔生意要有一个从进门就固定的 operation_id。重试循环里 new 一个号,等于另开一笔生意。

超时有两侧。请求在提交前断了:库里还没有这一笔,可以沿同一个号再试。请求在提交后断了:库里可能已经关上,再发一次就会关两次。两侧的第一件事相同:拿原来的号去问。问完才决定要不要写。

审批绑的是参数摘要,不是心情。签的是「重复件,关闭」,发出前改成「误报,关闭」,摘要对不上,写工具一次都别叫。

例:同一号走完一次提交后超时
  1. 发出关闭,operation_id = op_close_2044
  2. 对面已提交,回执在路上丢了
  3. 客户端只看到 TimeoutError。状态:未知
  4. 拿 op_close_2044 去问,账本里有回执
  5. 不再写。把同一张回执给出去。提交次数仍是 1
若第 4 步换号再发,提交次数变成 2。客户只点了一次。

你来做

城市设施 · 重复投诉

CASE-2044

要做的事
关掉这张工单
已经签过
note = 重复件,关闭
这一次的号
op_close_2044

你发出关闭。客户端抛出 TimeoutError。

超时发生在哪一侧
工单OPEN
已提交0
客户端TimeoutError
回执

下一行代码做什么

    然后写 90 分钟

    从空文件夹写 FastAPI + Pydantic。钟在上面。AI 可以问,不要一次吐出整个仓库。

    1. 类型落地

      operation_id 进门时就有。多一个键就拒。

    2. GET 能跑,POST 过审批

      摘要对不上,写工具一次都别叫。

    3. 超时先问

      找到回执就结束。没写上,沿同一个号再试。

    4. 弄坏一次

      再加:只有 OPEN 才能关。

    先改这份会双写的 Closer。Ledger 是对的。测试是对的,刚拉下来三条红。

    cd v3/ai-agent/lab
    python3 -m venv .venv && source .venv/bin/activate
    python -m pip install -e '.[dev]'
    pytest -q

    实验说明

    留下:提交次数为 1 的测试,以及超时之后你走了哪一分支。下一节把同一条规则收进 Agent 的写口。