Skip to content

feat(feishuadapter): 落地严格审批状态机(单一真相/严格回调/LIFO)#657

Merged
Yumiue merged 6 commits into
mainfrom
feat/feishu-approval-strict-fsm
May 18, 2026
Merged

feat(feishuadapter): 落地严格审批状态机(单一真相/严格回调/LIFO)#657
Yumiue merged 6 commits into
mainfrom
feat/feishu-approval-strict-fsm

Conversation

@Cai-Tang-www
Copy link
Copy Markdown
Collaborator

@Cai-Tang-www Cai-Tang-www commented May 18, 2026

背景

主要改动

  • 引入 ApprovalFSMState 作为审批单一真相(run 级)。
  • 状态迁移锁内提交,锁内生成 outbox,锁外仅执行网络副作用。
  • 回调改为严格匹配:run_key/card_id + request_id + active_request_id + displaying_pending
  • 队列改为 pending_stack(LIFO),resolve active 后立即 promote 栈顶 pending。
  • untrackRun 全量清理 FSM 与索引,旧 outbox 通过 generation/version 不匹配失效。
  • sessionBinding.ApprovalRecords 降级为派生渲染数据。

本轮 Review Fix

  • 修复 confirmApprovalOutbox 与状态迁移并发读写 fsm.Version 的 data race。
  • 增加 outbox 发送前 preflight 栅栏(先校验 generation/version,旧操作直接丢弃,不再发网络请求)。
  • 强化 request_id -> run 解析:优先校验 scoped 索引与 FSM 一致性,回退扫描 scoped 索引避免跨 run request_id 误判。
  • 修复文本审批反馈语义:严格回调未命中时返回“已忽略”,不再误报“已提交”。

测试

  • 已通过:
    • go test ./internal/feishuadapter -run TestPermission -count=1
    • go test ./internal/feishuadapter -count=1
    • go test ./internal/feishuadapter -race -run TestPermission -count=1
    • go test ./internal/feishuadapter -race -count=1
  • 新增/更新关键回归覆盖:
    • TestPermissionQueueSwitchPrefersNewestPendingAfterResolve
    • 严格回调拒绝非 active / 非 displaying_pending / card-run 不匹配
    • stale callback 严格忽略(无 fallback remap)
    • TestApprovalOutboxPreflightDropsStaleOperation
    • TestTryHandleTextPermissionRepliesIgnoredWhenRequestNotActive

@Cai-Tang-www Cai-Tang-www marked this pull request as ready for review May 18, 2026 04:57
@chatgpt-codex-connector
Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Credits must be used to enable repository wide code reviews.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 18, 2026

Codecov Report

❌ Patch coverage is 83.07985% with 89 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
internal/feishuadapter/adapter.go 83.07% 54 Missing and 35 partials ⚠️

📢 Thoughts on this report? Let us know!

Copy link
Copy Markdown

@fennoai fennoai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found 1 correctness issue in the new strict approval FSM/outbox flow.

Comment thread internal/feishuadapter/adapter.go
Copy link
Copy Markdown
Collaborator Author

已修复这条高优先级 review:SendPermissionCard 发送成功但版本已推进时,现在会立即执行补偿删除,避免游离审批卡泄漏。

本次改动:

  • executeApprovalOutboxapprovalOutboxSendPermissionCard 分支新增发送后失配回收逻辑:
    • generation/version 不再匹配,不挂载 card_id,并立即 DeleteMessage(card_id) 清理游离卡。
  • 新增回归测试 TestApprovalOutboxSendCardCleanupWhenVersionAdvancedDuringSend,在发送钩子中主动推进 fsm.Version 复现竞态窗口,断言:
    • 已发送卡会被删除;
    • fsm.CardID 不会被污染;
    • approvalCardRunIndex 不残留索引。

验证:

  • go test ./internal/feishuadapter -count=1
  • go test ./internal/feishuadapter -race -count=1
    均已通过。

@Cai-Tang-www
Copy link
Copy Markdown
Collaborator Author

Cai-Tang-www commented May 18, 2026

/code 提升测试覆盖率,90以上,完成后推送到我的分支

@fennoai
Copy link
Copy Markdown

fennoai Bot commented May 18, 2026

完成

已补充 feishuadapter 的一组覆盖率回归测试,重点覆盖了审批状态派生、run 清理、文本问答解析、outbox 版本栅栏、卡片回退路径,以及 gateway_client / messenger / webhook_ingress 的低覆盖包装层分支。

验证结果:

  • go test ./internal/feishuadapter -count=1
  • go test ./internal/feishuadapter -race -count=1
  • go tool cover -func=/tmp/feishu.cover | tail -n 1 -> total: (statements) 90.2%

已提交并推送到当前 PR 分支:d1e1043a (test(feishuadapter): raise package coverage above 90%)。

View job run

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Cai-Tang-www <106404101+Cai-Tang-www@users.noreply.github.com>
@fennoai
Copy link
Copy Markdown

fennoai Bot commented May 18, 2026

完成情况

已补充 internal/feishuadapter 的测试并推送到当前 PR 分支,提交为 0c1e5cf4

本次补测

  • webhook_ingress_test.go:补了 webhook URL 校验、忽略非目标事件、handler 失败回包、卡片回调成功/忽略/失败等分支。
  • adapter_test.go:补了通知摘要/提示回退、done/error 文本提取、终态映射、readBool/isPermissionRequestNotFoundError 等纯函数分支。

校验结果

  • go test ./internal/feishuadapter -count=1
  • go test ./internal/feishuadapter -cover -count=1 -> 90.1%
  • go test ./internal/feishuadapter -coverprofile=/tmp/feishu.cover -count=1
  • go tool cover -func=/tmp/feishu.cover -> total: 90.6%

View job run

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Cai-Tang-www <106404101+Cai-Tang-www@users.noreply.github.com>
@Yumiue Yumiue merged commit c613cdc into main May 18, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feishu 审批严格状态机改造(修复旧队列顶新卡、乱序回写与 stale 回调误伤)

3 participants