SYB 订单号回填:会话检测、失败原因落库与会话类失败自动重试 #330

Open
opened 2026-09-21 15:51:37 +08:00 by ila · 3 comments
Owner

原始需求

用户 2026-09-21:「260918B9AYC6Y 同个商品不同颜色,采购成功,但回填单号不成功」。经分析后确认:回填 PDD 订单号到 SYB 时因 SYB 会话不可用而失败,且失败后无自动恢复。用户选定「方案 ②」:会话检测 + 会话类失败自动延迟重试。

事实(2026-09-21 生产库与代码核验)

订单 260918B9AYC6YT(SYB 明细 1686016865,6 个颜色)对应采购任务 414419:

环节 结果
PDD 下单 6/6 order_created
订单号 6/6 均已取得(各不相同)
应付金额 6/6 均已取得
回写 SYB(purchase_order_writeback) 6/6 failed / SYB_SESSION_UNAVAILABLE

全表分布:succeeded 66、failed 10,失败全部是同一错误码,且集中在 2026-09-20 11:15~11:23 这 8 分钟内。回写逻辑本身没有问题。

订单号已取得,只是回写 SYB 这一步失败。

对比档口入库码 / 商品同步(均走 sybimport.Connect:读缓存 → CheckSession 主动探测 → 明确失效才删除并 OCR 重登 → 保存),回填走的 restoreOrderWritebackClient 只做 Load + ImportCookiesJSON 就返回,不检查会话是否仍有效,读不到即直接失败。

每小时同步任务(GoAutoSYBHourlySync,每小时 :05)全天真实运行(每次 2~8 分钟),近 20 余次运行没有任何一条登录失败,其错误均为 /am/stock/list 网络类。syb_session 仅 1 行,updated_at=2026-09-21 13:05:04、expires_at=2026-09-22 13:05:04,与该任务触发点吻合,说明会话由它刷新。

回填失败的真实原因没有被记录:

client, err := w.Factory(callCtx, db)
if err != nil {
    return true, finish("failed", "SYB_SESSION_UNAVAILABLE", "SYB会话不可用,请恢复登录后重试")  // err 被丢弃
}

restoreOrderWritebackClient 可能返回四类错误(无会话记录 / 已过期 / cookie 导入失败 / 地址配置错误),全部折叠成同一句固定文案。因此无法据现有数据断言 9/20 那次就是会话过期——库里只保留最新一次会话,当时状态无法还原。

重试安全性(幂等):write_started 在 order_writeback_worker.go 第 187 行才置为 true,而会话获取在第 115 行,会话类失败一定发生在任何 SYB 写入开始之前,自动重试不会造成重复写入。

目标

  1. 回填失败时能看见真实原因;
  2. 会话类失败不再需要人工介入,等会话恢复后自动完成回写。

非目标

  • 不让回填自行重登、不触发 OCR 验证码识别(保持 AGENTS.md 中该例外仅覆盖既有路径,不新增自动触发点);
  • 不搬迁或修改 sybimport.Connect,不改档口入库码、商品同步、店铺发现;
  • 不处理生产上已有的 10 个 failed 存量(另行人工重试)。

方案

  1. 会话主动探测:restoreOrderWritebackClient 在导入 cookie 后调用 client.CheckSession(ctx, session.UserID, cfg.Username)(sybclient 已被本包 import,无新增依赖、无循环)。ErrSessionInvalid 表示明确失效;其他错误表示网络/格式问题,不代表未登录(沿用 Connect 的既有区分,不因网络抖动误判)。
  2. 失败原因落库:finish() 的 error_message 写入真实原因类别(无会话 / 已失效 / 网络类 / 配置缺失),不再只写固定文案。error_code 保持 SYB_SESSION_UNAVAILABLE 以兼容现有前端与筛选。
  3. 会话类失败自动延迟重试:仅对 SYB_SESSION_UNAVAILABLE 生效;回到可认领状态并在下一次同步刷新会话之后再被 worker 认领。重试次数与间隔有上限,超限后转为需人工处理的 failed,不无限重试。

「下次重试时间」当前表中没有对应字段(已有 AttemptCount、LeaseExpiresAt、WriteStarted)。实施时优先复用 LeaseExpiresAt 作为退避到期时间;若复用不可行,需新增迁移,迁移属高风险,须先取得授权,不得擅自实施。

已知局限(须如实记录)

  • 本方案不能让回填立刻恢复,恢复时机取决于会话何时被刷新。依赖的前提是「每小时同步任务会刷新会话」,但已核实的只有 9/21 13:05 这一次;Connect 的逻辑是会话仍有效则复用、不写库,因此会话是在真正失效之后的下一个 :05 才被刷新,等待时长为「失效时刻到下一个整点」,最长约 1 小时。
  • 若会话失效同时同步任务也登录失败(如 OCR 无法识别验证码),自动重试用尽后仍需人工。
  • 立即恢复的方案(回填改用 Connect 自行重登)已评估并明确不在本单范围,理由是会新增「回填自动触发 OCR」这一安全边界变化,需另行评估授权。

验收

  • 用例:会话记录存在但 CheckSession 返回 ErrSessionInvalid → 回填不写 SYB、error_message 含「已失效」,并进入自动重试;
  • 用例:CheckSession 返回网络类错误 → 不判定为已失效,error_message 区分为网络类;
  • 用例:自动重试后会话恢复 → 回写成功且 write_started 只置一次(无重复写入);
  • 用例:重试达到上限 → 转为需人工处理的 failed,不再重试;
  • 用例:会话有效时行为与现在完全一致(回归)。
  • 既有 order_writeback 相关测试不改动通过。
  • 不执行真实 SYB 写入;生产回读使用只读查询。

风险与回退

  • 属服务端 + 认证会话相关,AGENTS.md 将权限、安全、并发列为高风险,实施前需人工确认。
  • 自动重试涉及并发:worker 使用单例租约串行处理,重试不得绕过该租约。
  • 回退即恢复 restoreOrderWritebackClient 与 finish() 原样,并移除重试逻辑。

文档影响

回填失败原因与自动重试行为属长期业务规则变化,需更新 docs/03-business-rules-and-glossary.md;若新增迁移则同步 docs/13-deployment-and-operations.md。

## 原始需求 用户 2026-09-21:「260918B9AYC6Y 同个商品不同颜色,采购成功,但回填单号不成功」。经分析后确认:回填 PDD 订单号到 SYB 时因 SYB 会话不可用而失败,且失败后无自动恢复。用户选定「方案 ②」:会话检测 + 会话类失败自动延迟重试。 ## 事实(2026-09-21 生产库与代码核验) **订单 260918B9AYC6YT**(SYB 明细 16860~16865,6 个颜色)对应采购任务 414~419: | 环节 | 结果 | |---|---| | PDD 下单 | 6/6 `order_created` | | 订单号 | 6/6 均已取得(各不相同) | | 应付金额 | 6/6 均已取得 | | 回写 SYB(`purchase_order_writeback`) | **6/6 `failed` / `SYB_SESSION_UNAVAILABLE`** | 全表分布:`succeeded 66`、`failed 10`,失败**全部**是同一错误码,且集中在 2026-09-20 11:15~11:23 这 8 分钟内。回写逻辑本身没有问题。 **订单号已取得,只是回写 SYB 这一步失败。** **对比档口入库码 / 商品同步**(均走 `sybimport.Connect`:读缓存 → `CheckSession` 主动探测 → 明确失效才删除并 OCR 重登 → 保存),回填走的 `restoreOrderWritebackClient` 只做 `Load` + `ImportCookiesJSON` 就返回,**不检查会话是否仍有效,读不到即直接失败**。 **每小时同步任务**(`GoAutoSYBHourlySync`,每小时 :05)全天真实运行(每次 2~8 分钟),近 20 余次运行**没有任何一条登录失败**,其错误均为 `/am/stock/list` 网络类。`syb_session` 仅 1 行,`updated_at=2026-09-21 13:05:04`、`expires_at=2026-09-22 13:05:04`,与该任务触发点吻合,说明会话由它刷新。 **回填失败的真实原因没有被记录**: ```go client, err := w.Factory(callCtx, db) if err != nil { return true, finish("failed", "SYB_SESSION_UNAVAILABLE", "SYB会话不可用,请恢复登录后重试") // err 被丢弃 } ``` `restoreOrderWritebackClient` 可能返回四类错误(无会话记录 / 已过期 / cookie 导入失败 / 地址配置错误),全部折叠成同一句固定文案。**因此无法据现有数据断言 9/20 那次就是会话过期**——库里只保留最新一次会话,当时状态无法还原。 **重试安全性(幂等)**:`write_started` 在 `order_writeback_worker.go` 第 187 行才置为 true,而会话获取在第 115 行,**会话类失败一定发生在任何 SYB 写入开始之前**,自动重试不会造成重复写入。 ## 目标 1. 回填失败时能看见真实原因; 2. 会话类失败不再需要人工介入,等会话恢复后自动完成回写。 ## 非目标 - **不**让回填自行重登、**不**触发 OCR 验证码识别(保持 `AGENTS.md` 中该例外仅覆盖既有路径,不新增自动触发点); - **不**搬迁或修改 `sybimport.Connect`,**不**改档口入库码、商品同步、店铺发现; - **不**处理生产上已有的 10 个 `failed` 存量(另行人工重试)。 ## 方案 1. **会话主动探测**:`restoreOrderWritebackClient` 在导入 cookie 后调用 `client.CheckSession(ctx, session.UserID, cfg.Username)`(`sybclient` 已被本包 import,无新增依赖、无循环)。`ErrSessionInvalid` 表示明确失效;其他错误表示网络/格式问题,**不代表未登录**(沿用 `Connect` 的既有区分,不因网络抖动误判)。 2. **失败原因落库**:`finish()` 的 `error_message` 写入真实原因类别(无会话 / 已失效 / 网络类 / 配置缺失),不再只写固定文案。`error_code` 保持 `SYB_SESSION_UNAVAILABLE` 以兼容现有前端与筛选。 3. **会话类失败自动延迟重试**:仅对 `SYB_SESSION_UNAVAILABLE` 生效;回到可认领状态并在下一次同步刷新会话之后再被 worker 认领。重试次数与间隔有上限,超限后转为需人工处理的 `failed`,不无限重试。 > 「下次重试时间」当前表中**没有对应字段**(已有 `AttemptCount`、`LeaseExpiresAt`、`WriteStarted`)。实施时优先复用 `LeaseExpiresAt` 作为退避到期时间;若复用不可行,需新增迁移,**迁移属高风险,须先取得授权,不得擅自实施**。 ## 已知局限(须如实记录) - 本方案**不能**让回填立刻恢复,恢复时机取决于会话何时被刷新。依赖的前提是「每小时同步任务会刷新会话」,但已核实的只有 9/21 13:05 这一次;`Connect` 的逻辑是会话仍有效则复用、不写库,因此会话是在**真正失效之后的下一个 :05** 才被刷新,等待时长为「失效时刻到下一个整点」,最长约 1 小时。 - 若会话失效同时同步任务也登录失败(如 OCR 无法识别验证码),自动重试用尽后仍需人工。 - 立即恢复的方案(回填改用 `Connect` 自行重登)已评估并**明确不在本单范围**,理由是会新增「回填自动触发 OCR」这一安全边界变化,需另行评估授权。 ## 验收 - 用例:会话记录存在但 `CheckSession` 返回 `ErrSessionInvalid` → 回填不写 SYB、`error_message` 含「已失效」,并进入自动重试; - 用例:`CheckSession` 返回网络类错误 → 不判定为已失效,`error_message` 区分为网络类; - 用例:自动重试后会话恢复 → 回写成功且 `write_started` 只置一次(无重复写入); - 用例:重试达到上限 → 转为需人工处理的 `failed`,不再重试; - 用例:会话有效时行为与现在完全一致(回归)。 - 既有 `order_writeback` 相关测试不改动通过。 - 不执行真实 SYB 写入;生产回读使用只读查询。 ## 风险与回退 - 属服务端 + 认证会话相关,`AGENTS.md` 将权限、安全、并发列为高风险,实施前需人工确认。 - 自动重试涉及并发:worker 使用单例租约串行处理,重试不得绕过该租约。 - 回退即恢复 `restoreOrderWritebackClient` 与 `finish()` 原样,并移除重试逻辑。 ## 文档影响 回填失败原因与自动重试行为属长期业务规则变化,需更新 `docs/03-business-rules-and-glossary.md`;若新增迁移则同步 `docs/13-deployment-and-operations.md`。
Author
Owner

方案修订(2026-09-21,经用户确认按 1–3 点修订)

复核代码基线:origin/main 4261a54。

修订 1:主修复与辅助修复重新定位

  • 9/20 失败码是 SYB_SESSION_UNAVAILABLE,失败点在 Factory(Load/New/ImportCookiesJSON),不是远端 cookie 失效(远端失效时 Load 成功,会在 read() 失败并记为 SYB_READ_FAILED)。
  • 因此:会话类失败的有界自动重试是本单主修复;CheckSession 是辅助,作用是把远端失效提前识别为会话类失败并纳入重试,而不是落成 SYB_READ_FAILED。
  • CheckSession 返回非 ErrSessionInvalid 错误(网络、5xx、格式)时也按会话类可重试处理,error_message 记录类别。
  • 回填 worker 不得调用 SessionStore.Delete,不写 syb_session,不登录、不触发 OCR(沿用非目标)。
  • 实施前核实:UserID == 0 的会话(如手工登录路径写入)是否存在;若存在,CheckSession 会误判为失效,须在该情况下跳过检查或按不可用处理并记录,不得误删。

修订 2:不影响手工"重新回填"按钮

  • 现状 order_writeback.go:111:CanSubmit 要求 LeaseExpiresAt 为空或已过期。
  • 若复用 LeaseExpiresAt 作退避到期时间,退避期内按钮会被隐藏。采用方案 (b):CanSubmit 对会话类失败(status=failed 且 error_code=SYB_SESSION_UNAVAILABLE)不受 LeaseExpiresAt 限制。
  • 手工提交时(order_writeback.go:200 已清空 lease)照常进入 pending,与自动重试不冲突(worker 以行锁 + lease_owner 领取)。
  • 不做数据库迁移,不新增 next_attempt_at。

修订 3:重试与状态规则

  • worker 领取条件(order_writeback_worker.go:81)增加:status='failed' AND error_code='SYB_SESSION_UNAVAILABLE' AND lease_expires_at <= now AND attempt_count < 上限。其他失败码(SYB_READ_FAILED、SYB_WRITE_REJECTED、TASK_UNAVAILABLE 等)行为不变。
  • 会话类失败时 finish 写 lease_expires_at = now + 退避(有界退避,上限与间隔在实施时定为常量并写入工单回写),达到上限后 lease_expires_at = nil,保持 failed 等人工处理。
  • 计数:手工重新提交时将 attempt_count 置 0,避免历史手工重试耗尽自动重试额度。
  • 这是回填状态机的变化,须同步更新业务规则 / SYB 接口相关 Wiki 页面。

验收补充

  • 单测:Factory 失败 → failed + 退避;到期被再次领取;达上限不再领取;CheckSession 返回 ErrSessionInvalid/网络错误均归入会话类且不删会话;退避期内 CanSubmit=true;手工提交重置计数;其他失败码不被自动重试。
  • 回归:档口入库码、商品同步、sybimport.Connect 零改动(diff 仅限 purchase 包与文档)。

风险

并发/状态机变化,属高风险,实施前仍需人工确认。

## 方案修订(2026-09-21,经用户确认按 1–3 点修订) 复核代码基线:origin/main `4261a54`。 ### 修订 1:主修复与辅助修复重新定位 - 9/20 失败码是 `SYB_SESSION_UNAVAILABLE`,失败点在 `Factory`(`Load`/`New`/`ImportCookiesJSON`),**不是**远端 cookie 失效(远端失效时 `Load` 成功,会在 `read()` 失败并记为 `SYB_READ_FAILED`)。 - 因此:**会话类失败的有界自动重试是本单主修复**;`CheckSession` 是辅助,作用是把远端失效提前识别为会话类失败并纳入重试,而不是落成 `SYB_READ_FAILED`。 - `CheckSession` 返回非 `ErrSessionInvalid` 错误(网络、5xx、格式)时也按会话类可重试处理,error_message 记录类别。 - 回填 worker **不得调用 `SessionStore.Delete`**,不写 syb_session,不登录、不触发 OCR(沿用非目标)。 - 实施前核实:`UserID == 0` 的会话(如手工登录路径写入)是否存在;若存在,`CheckSession` 会误判为失效,须在该情况下跳过检查或按不可用处理并记录,不得误删。 ### 修订 2:不影响手工"重新回填"按钮 - 现状 `order_writeback.go:111`:`CanSubmit` 要求 `LeaseExpiresAt` 为空或已过期。 - 若复用 `LeaseExpiresAt` 作退避到期时间,退避期内按钮会被隐藏。**采用方案 (b)**:`CanSubmit` 对会话类失败(`status=failed` 且 `error_code=SYB_SESSION_UNAVAILABLE`)不受 `LeaseExpiresAt` 限制。 - 手工提交时(`order_writeback.go:200` 已清空 lease)照常进入 pending,与自动重试不冲突(worker 以行锁 + lease_owner 领取)。 - **不做数据库迁移**,不新增 `next_attempt_at`。 ### 修订 3:重试与状态规则 - worker 领取条件(`order_writeback_worker.go:81`)增加:`status='failed' AND error_code='SYB_SESSION_UNAVAILABLE' AND lease_expires_at <= now AND attempt_count < 上限`。其他失败码(`SYB_READ_FAILED`、`SYB_WRITE_REJECTED`、`TASK_UNAVAILABLE` 等)行为不变。 - 会话类失败时 `finish` 写 `lease_expires_at = now + 退避`(有界退避,上限与间隔在实施时定为常量并写入工单回写),达到上限后 `lease_expires_at = nil`,保持 `failed` 等人工处理。 - 计数:**手工重新提交时将 `attempt_count` 置 0**,避免历史手工重试耗尽自动重试额度。 - 这是回填状态机的变化,须同步更新业务规则 / SYB 接口相关 Wiki 页面。 ### 验收补充 - 单测:Factory 失败 → failed + 退避;到期被再次领取;达上限不再领取;CheckSession 返回 ErrSessionInvalid/网络错误均归入会话类且不删会话;退避期内 `CanSubmit=true`;手工提交重置计数;其他失败码不被自动重试。 - 回归:档口入库码、商品同步、`sybimport.Connect` 零改动(diff 仅限 purchase 包与文档)。 ### 风险 并发/状态机变化,属高风险,实施前仍需人工确认。
Author
Owner

实施回写(2026-09-21)

提交:01510a8、08b7095(分支 fix/330-syb-writeback-session),已快进合并到 main(4261a54..08b7095)。未部署。

实现(按评论 8419 修订方案)

  • restoreOrderWritebackClient:Load → ImportCookies → CheckSession;UserID<=0 显式判不可用(SessionStore.Save 已拒绝 UserID<=0,正常路径不可达,属防御)。回填路径不删除/不写 syb_session,不登录、不 OCR。
  • 会话类失败(SYB_SESSION_UNAVAILABLE)有界自动重试:最多 6 次,退避 5/10/15/30/30 分钟(合计约 90 分钟,大于一个整点同步周期),退避到期时间复用 lease_expires_at;达上限清空并保持 failed 等人工。其他失败码行为不变。
  • error_message 记录类别:会话缺失/已过期、会话记录异常、会话校验失效、会话恢复失败(网络/其他),模板“SYB会话不可用(类别),将自动重试;如持续失败请恢复登录后重试”,不含原始错误。
  • CanSubmit:会话类失败退避期内仍可手工重新回填;手工重新提交将 attempt_count 置 0 并清空租约。
  • 顺带修正:领取后内存中 AttemptCount 比数据库少 1。
  • 无迁移、无新字段;diff 仅 server/app/goauto/purchase/ 3 个文件,sybimport/sybinnercode/sybclient 零改动。

验证(审核人独立复跑)

  • go vet ./app/goauto/purchase/ 通过;go test -count=1 ./app/goauto/purchase/... 通过。
  • 新测试覆盖:退避调度/到期前不领取/到期再领取/达上限停止/退避总时长>1h;httptest 模拟 /am/user/get 跑真实 restoreOrderWritebackClient(有效、串号失效、500、超时)及 worker 端到端,均断言 syb_session 未被删除;退避期 CanSubmit;手工提交重置计数;其他失败码不自动重试。
  • sybimport 有 12 个既有失败,实施方报告与干净 main 一致,审核人未独立复核。

未验证 / 遗留

  • 未部署,未在生产验证会话失效后的自动恢复;部署后需观察下一次会话失效。
  • 已知小瑕疵:第 6 次失败后不再自动重试,但文案仍写“将自动重试”。
  • 生产存量 10 条 failed(lease 为空)不会被自动领取,仍需人工重试(本单非目标)。
  • Wiki 未更新(阻塞):线上 Wiki 在 753d035(2026-09-21 02:21Z,"docs: document purchaser device ownership (#328)")被删除了除 Business-Rules-and-Glossary 外的全部页面(Home、Architecture-and-Code-Map、API 契约等),harness.py sync --check 报 Home 不存在。需先恢复 Wiki 后再补 #330 的业务规则(#305 章节)与架构页(order_writeback_worker 条目)更新。

状态:待 Wiki 恢复并补文档后进入待验收。

## 实施回写(2026-09-21) **提交**:`01510a8`、`08b7095`(分支 `fix/330-syb-writeback-session`),已快进合并到 main(`4261a54..08b7095`)。**未部署**。 ### 实现(按评论 8419 修订方案) - `restoreOrderWritebackClient`:Load → ImportCookies → `CheckSession`;`UserID<=0` 显式判不可用(`SessionStore.Save` 已拒绝 UserID<=0,正常路径不可达,属防御)。回填路径不删除/不写 syb_session,不登录、不 OCR。 - 会话类失败(`SYB_SESSION_UNAVAILABLE`)有界自动重试:最多 6 次,退避 5/10/15/30/30 分钟(合计约 90 分钟,大于一个整点同步周期),退避到期时间复用 `lease_expires_at`;达上限清空并保持 `failed` 等人工。其他失败码行为不变。 - error_message 记录类别:会话缺失/已过期、会话记录异常、会话校验失效、会话恢复失败(网络/其他),模板“SYB会话不可用(类别),将自动重试;如持续失败请恢复登录后重试”,不含原始错误。 - `CanSubmit`:会话类失败退避期内仍可手工重新回填;手工重新提交将 `attempt_count` 置 0 并清空租约。 - 顺带修正:领取后内存中 `AttemptCount` 比数据库少 1。 - 无迁移、无新字段;diff 仅 `server/app/goauto/purchase/` 3 个文件,sybimport/sybinnercode/sybclient 零改动。 ### 验证(审核人独立复跑) - `go vet ./app/goauto/purchase/` 通过;`go test -count=1 ./app/goauto/purchase/...` 通过。 - 新测试覆盖:退避调度/到期前不领取/到期再领取/达上限停止/退避总时长>1h;httptest 模拟 `/am/user/get` 跑真实 `restoreOrderWritebackClient`(有效、串号失效、500、超时)及 worker 端到端,均断言 syb_session 未被删除;退避期 CanSubmit;手工提交重置计数;其他失败码不自动重试。 - `sybimport` 有 12 个既有失败,实施方报告与干净 main 一致,审核人未独立复核。 ### 未验证 / 遗留 - 未部署,未在生产验证会话失效后的自动恢复;部署后需观察下一次会话失效。 - 已知小瑕疵:第 6 次失败后不再自动重试,但文案仍写“将自动重试”。 - 生产存量 10 条 `failed`(lease 为空)不会被自动领取,仍需人工重试(本单非目标)。 - **Wiki 未更新(阻塞)**:线上 Wiki 在 `753d035`(2026-09-21 02:21Z,"docs: document purchaser device ownership (#328)")被删除了除 Business-Rules-and-Glossary 外的全部页面(Home、Architecture-and-Code-Map、API 契约等),`harness.py sync --check` 报 Home 不存在。需先恢复 Wiki 后再补 #330 的业务规则(#305 章节)与架构页(order_writeback_worker 条目)更新。 状态:待 Wiki 恢复并补文档后进入待验收。
Author
Owner

文档回写(2026-09-21)

  • Wiki 恢复:线上 Wiki 753d035(#328 文档提交)误删除了 Business-Rules-and-Glossary 以外的全部页面。经用户授权,以 753d035~1 的树为基础、保留 753d035 对 Business-Rules-and-Glossary 的 #328 改动,生成恢复提交 03ea269(64 个文件)。
  • #330 文档:Business-Rules-and-Glossary 在 #305 章节后新增“SYB 会话类失败的有界自动重试(#330)”,revision 6cb34c9;Architecture-and-Code-Map 新增“会话类失败自动重试(#330)”,revision 8e2cfa7。
  • 镜像:harness.py sync 与 sync --check 通过;镜像提交 5e0a9d1 已推送 main(17 个镜像文件,除 02/03 的 #330 段落外只更新了 revision 头)。

状态:待验收。未部署、未做生产验证;遗留问题见评论 8422(第 6 次失败的文案、10 条历史失败记录需人工重试)。

## 文档回写(2026-09-21) - **Wiki 恢复**:线上 Wiki `753d035`(#328 文档提交)误删除了 Business-Rules-and-Glossary 以外的全部页面。经用户授权,以 `753d035~1` 的树为基础、保留 `753d035` 对 Business-Rules-and-Glossary 的 #328 改动,生成恢复提交 `03ea269`(64 个文件)。 - **#330 文档**:Business-Rules-and-Glossary 在 #305 章节后新增“SYB 会话类失败的有界自动重试(#330)”,revision `6cb34c9`;Architecture-and-Code-Map 新增“会话类失败自动重试(#330)”,revision `8e2cfa7`。 - **镜像**:`harness.py sync` 与 `sync --check` 通过;镜像提交 `5e0a9d1` 已推送 main(17 个镜像文件,除 02/03 的 #330 段落外只更新了 revision 头)。 状态:**待验收**。未部署、未做生产验证;遗留问题见评论 8422(第 6 次失败的文案、10 条历史失败记录需人工重试)。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#330