AgoraIO-Extensions / AgoraIO-Extensions/agent-infra
feat(connection): execute reliable effects and revoke provider tokens
- 主要语言
- TypeScript
- 星标
- 0
- 派生
- 0
- 平均合并
- 8 小时 51 分钟
- 30 天内合并 PR
- 99
描述
## Problem
GitHub create-PR 没有 Provider 业务幂等键;Connection 必须在撤权竞态、响应丢失、进程重启和 Provider Token revoke 失败时保留真实结果且绝不自动重复副作用。
## Scope
- 在 Provider dispatch 前的数据库线性化点重验 Principal、Consumer/Instance、Actor、Grant/root、Connection/fence、CredentialVersion、declaration、ActionVersion 和 ProviderRelease。
- 原子持久化 `SUBMISSION_STARTED` 后才调用 Provider;之前撤权则本地拒绝,之后撤权保留 Provider 实际结果并阻止后续新调用。
- 对 WRITE Action 强制稳定业务 `Idempotency-Key`,持久绑定主体、Action、参数摘要和 Call;响应丢失进入 `RESULT_PENDING/UNCERTAIN`,不自动 POST。
- 区分已收到 Provider HTTP 响应与传输结果未知:GitHub 明确非成功响应必须终结为脱敏 `PROVIDER_FAILED` 并记录状态码/Provider request correlation;只有无法判断写入是否到达、成功响应后的终态落库失败或等价崩溃窗口才能进入 `RESULT_PENDING/UNCERTAIN`。
- 实现最多 24 小时退避对账、唯一候选确认、歧义转 `NEEDS_MANUAL_REVIEW`、管理员处理和七天终态 `UNRESOLVED`;原 key 永久绑定未知调用。
- disconnect 先本地 fence,再持久执行单 GitHub Token revoke attempt,记录成功、失败/待重试和 Provider 证据;不默认删除整个 OAuth App grant。
## Acceptance criteria
- [ ] **AC-1:** dispatch 线性化点在同一事务中完成全部 current authorization 检查和 `SUBMISSION_STARTED` 转换,撤权竞态有确定结果。
- [ ] **AC-2:** 相同 idempotency key/请求只产生一个 Call 和至多一次首次 Provider submission;同 key 不同请求稳定冲突。
- [ ] **AC-3:** Provider 明确 4xx/5xx 终结为脱敏 `PROVIDER_FAILED`;response-lost、成功结果持久化失败和进程重启的不可判定窗口才进入可恢复未知状态,任何自动流程都不会重新执行未知写操作。
- [ ] **AC-4:** 24 小时对账、管理员确认、七天 `UNRESOLVED`、审计和新 key 重试边界均有时间可控的测试。
- [ ] **AC-5:** 单 Token revoke 的本地 fence、持久 attempt、重试、GitHub 侧确认和失败可见状态通过测试,其他 Connection 不受影响。
## Validation
- 运行 PostgreSQL 并发/崩溃边界、idempotency、revocation race、known Provider rejection、response-lost、reconciliation lease、manual resolution 和 Provider revoke tests。
- 用 `add_issue_labels` 回归场景证明 GitHub 明确拒绝不会被扩大为 unknown,并验证日志与审计只保留脱敏状态码和 correlation,不包含 Provider 原始错误正文或凭证。
- 使用受控 GitHub 测试 Token 做 focused revoke/401 smoke;运行完整仓库验证序列。
## Blocked by
- #396
- #399
- #398
- #391
贡献指南
这个仓库没有索引到贡献指南
评估
这个 Issue 还没有评估数据。