Skip to content

docs: 完善 Webhook 事件与交易运维文档 - #387

Open
rcsh1 wants to merge 1 commit into
CoboGlobal:masterfrom
rcsh1:playbook/job-24-primary
Open

docs: 完善 Webhook 事件与交易运维文档#387
rcsh1 wants to merge 1 commit into
CoboGlobal:masterfrom
rcsh1:playbook/job-24-primary

Conversation

@rcsh1

@rcsh1 rcsh1 commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

关联来源

意图

本次变更针对 T96128 汇总的高频 Webhook、Callback 与交易字段问题,补齐 Transaction 和 MPC TSS request 事件的完整结构、触发语义与示例。文档同时明确交易入账判断、字段对账方式、投递与重试边界,并提供按场景订阅和失败恢复流程。所有公开结论均以现有代码证据为边界,未确认的下游重试隔离和保留时长不作为事实发布。

变更摘要

  • docs.json:在中英文导航中注册新增的事件、运维和交易字段页面,确保页面可发现。
  • v2/guides/transactions/status.mdx:明确区块链充值的入账条件以及 ConfirmingCompletedwallets.transaction.succeeded 的关系。
  • v2/guides/transactions/transaction-fields.mdx:新增交易字段对账字典,说明标识符、方向、RBF 和 cobo_category 的用途与条件。
  • v2/guides/webhooks-callbacks/mpc-tss-request-events.mdx:新增 MPC TSS request 事件结构、触发条件和完整示例。
  • v2/guides/webhooks-callbacks/set-up-endpoint.mdx:区分 Webhook 与 Callback 投递规则,补充 Callback 字段可空性、多 Endpoint 排查和幂等处理。
  • v2/guides/webhooks-callbacks/transaction-events.mdx:新增 Transaction 事件结构、四类事件触发语义和跨链示例。
  • v2/guides/webhooks-callbacks/webhook-event-type.mdx:将事件表改为索引并补充已确认的事件类型与新页面链接。
  • v2/guides/webhooks-callbacks/webhook-operations.mdx:新增场景订阅矩阵、失败恢复流程、WEBHOOK RESEND 权限前提和历史过期后的对账建议。
  • v2_cn/guides/transactions/status.mdx:同步区块链充值入账条件和状态关系。
  • v2_cn/guides/transactions/transaction-fields.mdx:同步交易字段对账字典并保留字段和枚举标识符。
  • v2_cn/guides/webhooks-callbacks/mpc-tss-request-events.mdx:同步 MPC TSS request 事件结构、条件和示例。
  • v2_cn/guides/webhooks-callbacks/set-up-endpoint.mdx:同步投递规则、字段可空性、多 Endpoint 排查和幂等处理。
  • v2_cn/guides/webhooks-callbacks/transaction-events.mdx:同步 Transaction 事件结构、触发语义和跨链示例。
  • v2_cn/guides/webhooks-callbacks/webhook-event-type.mdx:同步事件索引、已确认事件类型和新页面链接。
  • v2_cn/guides/webhooks-callbacks/webhook-operations.mdx:同步场景订阅、失败恢复、WEBHOOK RESEND 权限前提和历史过期对账流程。

需要在其他仓库改动

  • product-manual/snippets/webhook-events-en.mdxproduct-manual/snippets/webhook-events-cn.mdx 不在本工作区;需要在 product-manual 仓库补充 Portal Retry 权限、投递日志排查及历史过期后的 Developer Hub 对账链接。

代码证据

  • custody/waas2/webhooks/managers/wallet_event_by_source.py:25:证明 Success 产生 wallets.transaction.succeededFailedRejectedCanceled 产生 wallets.transaction.failed
  • custody/waas2/webhooks/managers/wallet_event_by_source.py:51:证明 Transaction Webhook 使用公开 Transaction 详情序列化结果。
  • custody/waas2/webhooks/managers/wallet_event_by_source.py:116:证明 created 有条件触发、updated 始终尝试触发,终态事件会额外触发。
  • custody/waas2/webhooks/managers/wallet_event.py:114:证明充值和退款方向为 Inbound,其他交易类型为 Outbound
  • custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:21:证明 MPC TSS 事件前缀为 wallets.mpc.tss_request
  • custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:29:证明 MPC TSS Webhook 适用于 Portal 密钥生成和重分享请求。
  • custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:41:证明请求状态决定 createdupdatedsucceededfailed 事件。
  • custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:130:证明公开 MPC 字段及条件性 source_group 的序列化方式。
  • custody/waas2/developers/managers/callback_message.py:177:证明 Callback 的 data 使用当前公开 Transaction 结构。
  • custody/waas2/developers/managers/callback_message.py:239:证明 Callback 确认要求 HTTP 200/201 和准确的 ok/deny 响应体。
  • custody/waas2/transactions/dev/bo/transaction_query/transaction.py:364:证明 Transaction 字段及 cobo_idasset_idresultreplacementcobo_category 的可空性。
  • custody/waas2/coins/managers.py:587:证明 token_idchain_idasset_id 的公开映射来源。
  • custody/waas2/transactions/mongo/manager/write/fields/cobo_category.py:22:证明 AutoSweepcobo_category 的具体分类。
  • custody/custody/handler/blockchain_handler.py:1186:证明 confirmed_number >= confirming_threshold 后才进入链上已确认转换。
  • custody/waas2/transactions/dev/enums/transaction.py:220:证明内部 Success 映射为公开 Completed
  • custody/waas2/webhooks/client/client.py:261:证明事件列表支持 Endpoint、状态、类型、方向筛选和游标分页。
  • custody/waas2/webhooks/client/client.py:302:证明投递日志按 Endpoint 和事件查询并支持游标分页。
  • custody/waas2/webhooks/client/client.py:325:证明下游服务提供事件重试接口。
  • custody/waas2/webhooks/views/event_retries.py:19:证明公开重发需要 WEBHOOK RESEND 权限和组织范围。
  • custody-2.0-website/src/pages/Developers/Webhooks/AddOrWebhooksModal/index.tsx:202:证明 Portal 注册 Endpoint 时必须选择订阅事件。
  • custody-2.0-website/src/pages/Developers/Webhooks/AddOrWebhooksModal/index.tsx:215:证明 Portal 注册 Endpoint 时必须选择钱包范围。
  • custody-2.0-website/src/pages/Developers/Events/Detail/index.tsx:26:证明 Portal 手动重发受权限控制。

⚠️ 待确认事项

  • 待人工确认:下游 Webhook 服务未出现在当前代码证据中,需要确认同一事件投递到多个 Endpoint 时,成功 Endpoint 与失败 Endpoint 的重试状态是否完全隔离;本次文档仅要求分别检查 Endpoint 级事件和日志。
  • 待人工确认:当前只确认 custody 本地提交前 outbox 的七天清理边界,不能据此推断公开事件和投递日志的保留时长;需要下游 Webhook 服务负责人确认 TTL、归档和租户差异。
  • 待人工确认docs.json 的导航注册没有运行时代码证据,已通过 mintlify validate 验证页面和导航构建。
  • 待人工确认product-manual 仓库未包含在本工作区,尚未修改 snippets/webhook-events-en.mdxsnippets/webhook-events-cn.mdx;需要在该仓库核实并补充 Portal 恢复流程和历史过期说明。

@rcsh1

rcsh1 commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator Author

关联 product-manual PR:CoboGlobal/product-manual#755

@rcsh1

rcsh1 commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator Author

运行过程记录(自动生成)

本评论记录本次 doc 运行的内部过程,便于审查每个结论的来源。

1. 意图(确认后)

来源:T96128(https://pha.1cobo.com/T96128)。任务汇总了 126 条 H1 Webhook/event-type 反馈,其中 112 条来自 custody,约 70% 涉及应由文档回答的 payload、字段或状态语义。本次需要调查并修复以下 10 个文档问题:

  1. [webhook-payload-transaction]wallets.transaction.* 事件族缺少内容和示例。T96128 记录某 Vantage 客户连续四次询问“callback 的 payload 参考哪个 API 链接”后升级,完整 JSON 请求至少出现八次。需要核实 Webhook 事件注册表、序列化器和 Transaction API 模型,覆盖 createdupdatedsucceededfailed,充值与提现、EVM/UTXO/TRON 以及原生币与 Token 变体;同时调查“每个事件类型”是否意味着其他事件族也需要独立页面。

  2. [webhook-payload-mpc]wallets.mpc.* 事件族缺少内容和示例。T96128 要求每个事件类型有独立页面,并多次要求完整 JSON payload。需要核实实际 wallets.mpc.* 事件名、MPC/TSS payload 模型与序列化器、可空和条件字段,以及有代表性的 payload 变体。

  3. [callback-nullable-fields]:Callback 文档未说明第二阶段回调中哪些字段为 null。T96128 记录支持团队称 API 响应和第二次 Callback 共用结构,但“回调阶段部分字段没值”,并点名 cobo_idasset_idresult(TG Vantage -1003075369359#752)。需要核实 Callback handler、DTO、序列化条件和生命周期测试,形成权威的分阶段字段表。

  4. [transaction-field-dictionary]token_idasset_idsource/destinationrequest_idreplaced_by_transaction_hashcobo_category 的语义不完整。T96128 引用 Aladdin 工单 1128876036453798224 及至少五个方向问题。需要核实 Transaction 模型、链与 Token 标识符、充值/提现映射、请求 ID、RBF 和 cobo_category(含 AutoSweep),并给出 ETH_USDT/USDTTRON_USDT/USDTTRON/TRONETH/ETHBTC/BTC 映射。

  5. [transaction-crediting-decision]:缺少交易何时可以安全入账的明确指导。T96128 汇总了 DTGoCA、RFPay、Vantage、Portal AI 和 Mintlify 的重复问题,包括误解 CONFIRMED 是否代表提现完成。需要核实确认阈值、状态转换和 succeeded/updated 发布逻辑,明确 wallets.transaction.succeeded 是否意味着已达到确认阈值,以及 Confirming/updated 是否仅代表进度。

  6. [event-subscription-by-scenario]:缺少按场景选择订阅的指导。反馈涉及 TRC20-USDT 充值/提现、误用 updated 入账、KYT 顺序、AutoSweep、Portal 发起提现、Endpoint 范围和 Webhook/API 对账。需要核实事件发射、合规编排、状态到事件映射、Guard/审核拒绝、订阅范围及来源/类别过滤,并给出推荐和反模式组合。

  7. [webhook-retry-policy]:缺少投递成功和重试的运维事实。T96128 引用 Aladdin 工单 1126429538992722086,客户观察到 Rejected 提现后在一秒内收到五次推送,却不清楚停止原因。需要核实投递 worker 的确认规则、重试配置、调度、终态和测试,不得把客户观察值写成事实。

  8. [webhook-multi-endpoint-retry]:多 Endpoint 重试语义不明确。反馈中的 Endpoint A 成功、B 必然失败,客户不清楚后续重试 A+B 还是只重试 B。需要核实任务创建、Endpoint 级尝试持久化与去重、确认状态和调度。

  9. [webhook-recovery-after-retries]:重试耗尽后缺少恢复与对账流程。T96128 询问如何通过 Developer Console、List all webhook events、重发或周期性 List transactions 恢复遗漏事件。需要核实事件查询 API、Console 操作与授权、重发任务、分页和交易对账保证。

  10. [webhook-event-retention]:缺少 Webhook 事件保留策略。T96128 引用 Mintlify 问题“webhook 数据的保留时间是多久”。需要核实后端 TTL、归档/删除任务、Console/API 查询限制和租户或环境差异后,才可发布准确时长。

2. 探索发现(按仓库 × explorer)

由于完整 findings 超出 GitHub 单条评论限制,本节按规范截断为每个 explorer 的 handoff_brief,并保留关键 code_evidence;未静默省略。

developer-site × explorer A

现有 webhook-event-type.mdx 已列出多个事件族,因此问题本质是内容深度不足,而非注册表页面完全缺失。建议在 v2/v2_cn 中以 payload family 为页面粒度,并为每个 literal event 提供可定位小节和完整示例;docs.json 必须同步。Transaction 事件共用公开 Transaction 序列化器,created 有条件触发、updated 始终尝试触发,终态事件额外触发;MPC TSS 仅覆盖 Portal key generation 和 resharing。关键证据:custody/waas2/webhooks/managers/wallet_event_by_source.py:25,51,116custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:21,29,41,130

custody × explorer A

确认 Callback 使用 tx.to_json(),Transaction 的 cobo_idasset_idresult 等字段可空;确认 token_idchain_idasset_id 的映射来源和 cobo_category 枚举;确认 confirmed_number >= confirming_threshold 位于 Success/wallets.transaction.succeeded 上游。实际 Webhook 投递由下游服务处理,custody 本地仅有提交前 outbox,不能证明确认、重试、Endpoint 隔离或公开保留期。关键证据:custody/waas2/developers/managers/callback_message.py:177,239custody/waas2/transactions/dev/bo/transaction_query/transaction.py:364custody/custody/handler/blockchain_handler.py:1186custody/waas2/webhooks/managers/managers.py:105custody/waas2/webhooks/models.py:20

custody-2.0-website × explorer A

Portal 要求选择 subscribedEventswalletScopes,事件列表支持分页与筛选,详情展示 Endpoint URL、重试元数据和尝试日志,手动重发调用 POST /webhooks/events/{event_id}/retries 并受 Webhook Resend 权限控制。前端结构支持按 Endpoint 查看记录,但不足以证明调度层的 A/B 重试隔离;30 天筛选预设也不能证明 TTL。关键证据:custody-2.0-website/src/pages/Developers/Webhooks/AddOrWebhooksModal/index.tsx:202,215custody-2.0-website/src/services/developers/index.ts:162,175,181custody-2.0-website/src/pages/Developers/Events/Detail/index.tsx:26,100,125

custody-2.0-website × explorer B

Transaction 前端类型确认 requestIDcoboCategoryconfirmedNumconfirmingThresholdtokenIDsourcedestination 和 RBF replacement 字段,并区分 ConfirmingCompleted。Webhook event 前端 enum 较旧且命名不完整,不能作为事件注册表来源。恢复流程可依据 list/detail/log/retry UI 与 API 建设,Callback 阶段可空性和公开 retention 仍需后端证据。关键证据:custody-2.0-website/src/interfaces/transaction.ts:37,230,362custody-2.0-website/src/interfaces/developers.ts:461,676,945

developer-site-waas2 × explorer A

OpenAPI 枚举 55 个 literal event,并通过 event_data.yaml 映射到 24 个 payload family;Transaction 与 TSS 四个生命周期事件分别共用同一 schema。因此采用“一个 payload family 页面 + 每个 literal event 的 anchor/example”可以避免重复并满足逐事件覆盖。OpenAPI 中关于 2 秒、10 次和 30 天的文字不是实现证据;任何描述或示例变更必须进入 source YAML,不能编辑生成文件。关键证据:developer-site-waas2/v2/cobo_waas2_openapi_spec/components/schemas/webhooks/event_type.yaml:3,7,11,33event_data.yaml:1,27transaction_event_data.yaml:1tss_request_event_data.yaml:1paths/webhooks/events.yaml:6

developer-site-waas2 × explorer B

Spec 已定义 Transaction、TSSRequest、CallbackMessage、事件查询与重发接口,真正缺口主要位于 Developer Hub 指南。Transaction schema 证明 request_id、方向、链/Token 标识符、确认字段、交易哈希和 replacement 的结构;但 handler 级确认阈值、Callback 阶段名和下游重试仍不在 spec repo。建议保持 API spec 不变,把场景、示例、字段字典和恢复指导写入 developer-site。关键证据:components/schemas/transactions/transactions/transaction.yaml:23,27,41,67,77,88components/schemas/developers/callback_message.yaml:3paths/webhooks/retry_by_event_id.yaml:9,11

cobo-libs × explorer A

共享 WebhookEvent 只保存 organization/channel、opaque type、文本 data、时间戳及 Created/Submitted 状态,不定义业务 payload、投递终态或 retention。它证明 custody 将事件提交给外部 Webhook 服务,但不能解决确认规则、重试 cadence、Endpoint 持久化和 TTL。关键证据:cobo-libs/cobo_libs/webhook/models.py:19,20,24,25,26cobo-libs/cobo_libs/webhook/data/enums.py:5,6

cobo-libs × explorer B

代理 client 确认外部 Webhook 服务提供事件筛选分页、详情、日志、订阅 conditions 和 retry_event(),足以支撑恢复 runbook;实际 delivery worker 不在可访问仓库。关键证据:cobo_libs/webhook/configs.py:1cobo_libs/webhook/client/client.py:170,195,200,205,210cobo_libs/webhook/views/event_retries.py:6

3. 综合结论

result

问题最终被归类为文档深度和信息架构不足,而不是事件注册表缺失。现有事件参考已列出 Transaction、MPC TSS 等事件族,但主要停留在单行触发说明并跳转到通用 schema;客户真正需要的是完整 payload、条件字段语义、生命周期决策和运维流程。可扩展方案是每个 payload family 一个页面,每个 literal event 一个可定位小节和代表性完整 JSON;本轮优先处理 Transaction 与 MPC TSS。

任务 1–6 和任务 9 的大部分结论已有强代码证据:Transaction Webhook 使用公开 Transaction serializer;created 有条件触发、updated 始终尝试触发、终态事件额外触发;Success 对应 succeededFailed/Rejected/Canceled 对应 failed;充值/退款方向为 inbound;MPC TSS 事件限于 Portal key generation 与 resharing;Callback 使用当前 Transaction shape;确认阈值位于成功转换上游;Portal 和 API 均支持带权限的手动重发。

下游 Webhook 服务不在可访问仓库,因此没有发布新的确认 body、retry cadence/计数、A/B Endpoint 隔离或公开 retention 数值。现有数字仅作为原文保留,不宣称在本轮重新验证。公开文档仅加入已证实的 Endpoint 级查看、日志、修复后重发、幂等和 Transaction API 对账流程;历史过期时建议对账,但不承诺查询完整性。

confidence0.92

open_questions

  1. 下游 Webhook 服务实际采用什么 HTTP/body acknowledgement 规则、timeout、初始尝试计数、retry schedule/backoff、停止转换和手动重发重置行为?
  2. 下游服务是否为每个 Endpoint 持久化独立 event/delivery copy?A 成功而 B 失败时是否仅重新调度 B,事件 ID 与日志之间如何关联?
  3. 公开 event 与 delivery log 的查询/保留窗口、归档/删除行为及租户或环境差异是什么?custody 的七天 outbox 清理和 OpenAPI 的 30 天文字都不能回答该问题。
  4. Callback 的准确公开生命周期阶段名是什么,各阶段中 cobo_idasset_idresult 及其他条件字段何时为 null
  5. 尚未逐一对齐的 Payment、compliance、token-listing 等 event type 与 payload family 是否需要后续独立深挖页面?

汇总代码证据

  • custody/waas2/webhooks/managers/wallet_event_by_source.py:25Success 发出 wallets.transaction.succeededFailedRejectedCanceled 发出 wallets.transaction.failed
  • custody/waas2/webhooks/managers/wallet_event_by_source.py:51:Transaction Webhook data 使用公开 Transaction serializer,data_type=Transaction
  • custody/waas2/webhooks/managers/wallet_event_by_source.py:116created 有条件触发,updated 始终尝试触发,终态事件额外触发。
  • custody/waas2/webhooks/managers/wallet_event.py:42,114,134:同一构造生成 wallets/fee_station Transaction 事件;充值/退款为 inbound;updated 去重包含状态和确认数。
  • custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:21,29,41,130:确认 MPC TSS prefix、适用范围、状态触发和序列化字段。
  • custody/waas2/developers/managers/callback_message.py:177,239:Callback 发送 tx.to_json();Callback acknowledgement 要求 HTTP 200/201 与准确的 ok/deny body。
  • custody/waas2/transactions/dev/bo/transaction_query/transaction.py:364:确认公开 Transaction 的必填/可选字段和可空结构。
  • custody/waas2/transactions/mongo/manager/read/waas_transaction.py:180,197:未设置的 cobo_idasset_id 序列化为 None
  • custody/waas2/transactions/mongo/manager/write/fields/token.py:24custody/waas2/coins/managers.py:587:确认 Token、chain、asset 与确认阈值来源。
  • custody/waas2/transactions/mongo/manager/write/fields/cobo_category.py:22:确认 AutoSweepcobo_category
  • custody/waas2/transactions/dev/enums/transaction.py:220custody/custody/handler/blockchain_handler.py:1186:内部 Success 映射公开 Completed,确认数达到阈值后才进入已确认转换。
  • custody/waas2/webhooks/managers/managers.py:105custody/waas2/webhooks/models.py:20:custody 只提交给下游并保存 producer 状态,不持有公开 delivery 状态。
  • custody/waas2/webhooks/client/client.py:261,302,325:确认事件筛选分页、Endpoint/event 级日志和重试接口。
  • custody/waas2/webhooks/views/event_retries.py:19:公开重发要求 WEBHOOK RESEND 权限和 organization scope。
  • custody/waas2/webhooks/managers/wallet_event.py:153:七天清理仅适用于本地提交前 outbox,不能证明公开 retention。
  • custody/waas2/webhooks/managers/wallet_source_event.py:52vault_event.py:31balance_event.py:15wallet_chain_event.py:23wallet_token_event.py:35:确认补充到索引的 live event 名称。
  • custody-2.0-website/src/pages/Developers/Webhooks/AddOrWebhooksModal/index.tsx:202,215:Portal 注册 Endpoint 要求事件和钱包范围。
  • custody-2.0-website/src/pages/Developers/Events/Detail/index.tsx:26src/services/developers/index.ts:181:Portal 重发受权限控制并调用 retry API。
  • developer-site-waas2/v2/cobo_waas2_openapi_spec/components/schemas/webhooks/event_type.yaml:3,7,11,33:确认 spec 中 literal event 范围。
  • developer-site-waas2/v2/cobo_waas2_openapi_spec/components/schemas/webhooks/event_data.yaml:1,27:确认 event 到 payload family 的 discriminator 映射。
  • cobo-libs/cobo_libs/webhook/client/client.py:170,195,200,205:确认外部服务代理的 list/detail/log/retry 能力。
4. 编辑计划
[
  {"task_id":"transaction-payload-en","repo_alias":"primary","doc_file":"v2/guides/webhooks-callbacks/transaction-events.mdx","code_evidence":["custody/waas2/webhooks/managers/wallet_event_by_source.py:25","custody/waas2/webhooks/managers/wallet_event_by_source.py:51","custody/waas2/webhooks/managers/wallet_event_by_source.py:116","custody/waas2/webhooks/managers/wallet_event.py:114","custody/waas2/transactions/dev/bo/transaction_query/transaction.py:364"],"code_evidence_missing":false},
  {"task_id":"transaction-payload-cn","repo_alias":"primary","doc_file":"v2_cn/guides/webhooks-callbacks/transaction-events.mdx","code_evidence":["custody/waas2/webhooks/managers/wallet_event_by_source.py:25","custody/waas2/webhooks/managers/wallet_event_by_source.py:51","custody/waas2/webhooks/managers/wallet_event_by_source.py:116","custody/waas2/webhooks/managers/wallet_event.py:114"],"code_evidence_missing":false},
  {"task_id":"mpc-payload-en","repo_alias":"primary","doc_file":"v2/guides/webhooks-callbacks/mpc-tss-request-events.mdx","code_evidence":["custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:21","custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:29","custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:41","custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:130"],"code_evidence_missing":false},
  {"task_id":"mpc-payload-cn","repo_alias":"primary","doc_file":"v2_cn/guides/webhooks-callbacks/mpc-tss-request-events.mdx","code_evidence":["custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:21","custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:29","custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:41","custody/waas2/mpc/managers/dev/webhook_wallet_mpc.py:130"],"code_evidence_missing":false},
  {"task_id":"event-index-en","repo_alias":"primary","doc_file":"v2/guides/webhooks-callbacks/webhook-event-type.mdx","code_evidence":["custody/waas2/webhooks/managers/wallet_source_event.py:52","custody/waas2/webhooks/managers/vault_event.py:31","custody/waas2/webhooks/managers/balance_event.py:15","custody/waas2/webhooks/managers/wallet_chain_event.py:23","custody/waas2/webhooks/managers/wallet_token_event.py:35"],"code_evidence_missing":false},
  {"task_id":"event-index-cn","repo_alias":"primary","doc_file":"v2_cn/guides/webhooks-callbacks/webhook-event-type.mdx","code_evidence":["custody/waas2/webhooks/managers/wallet_source_event.py:52","custody/waas2/webhooks/managers/vault_event.py:31","custody/waas2/webhooks/managers/balance_event.py:15","custody/waas2/webhooks/managers/wallet_chain_event.py:23","custody/waas2/webhooks/managers/wallet_token_event.py:35"],"code_evidence_missing":false},
  {"task_id":"callback-fields-en","repo_alias":"primary","doc_file":"v2/guides/webhooks-callbacks/set-up-endpoint.mdx","code_evidence":["custody/waas2/developers/managers/callback_message.py:177","custody/waas2/transactions/dev/bo/transaction_query/transaction.py:364","custody/waas2/transactions/mongo/manager/read/waas_transaction.py:180","custody/waas2/transactions/mongo/manager/read/waas_transaction.py:197"],"code_evidence_missing":false},
  {"task_id":"callback-fields-cn","repo_alias":"primary","doc_file":"v2_cn/guides/webhooks-callbacks/set-up-endpoint.mdx","code_evidence":["custody/waas2/developers/managers/callback_message.py:177","custody/waas2/transactions/dev/bo/transaction_query/transaction.py:364","custody/waas2/transactions/mongo/manager/read/waas_transaction.py:180","custody/waas2/transactions/mongo/manager/read/waas_transaction.py:197"],"code_evidence_missing":false},
  {"task_id":"transaction-fields-en","repo_alias":"primary","doc_file":"v2/guides/transactions/transaction-fields.mdx","code_evidence":["custody/waas2/coins/managers.py:587","custody/waas2/transactions/mongo/manager/write/fields/token.py:24","custody/waas2/webhooks/managers/wallet_event.py:114","custody/waas2/transactions/dev/bo/transaction_query/transaction.py:364","custody/waas2/transactions/mongo/manager/write/fields/cobo_category.py:22"],"code_evidence_missing":false},
  {"task_id":"transaction-fields-cn","repo_alias":"primary","doc_file":"v2_cn/guides/transactions/transaction-fields.mdx","code_evidence":["custody/waas2/coins/managers.py:587","custody/waas2/transactions/mongo/manager/write/fields/token.py:24","custody/waas2/webhooks/managers/wallet_event.py:114","custody/waas2/transactions/mongo/manager/write/fields/cobo_category.py:22"],"code_evidence_missing":false},
  {"task_id":"crediting-en","repo_alias":"primary","doc_file":"v2/guides/transactions/status.mdx","code_evidence":["custody/custody/handler/blockchain_handler.py:1186","custody/waas2/transactions/dev/enums/transaction.py:220","custody/waas2/webhooks/managers/wallet_event_by_source.py:25","custody/waas2/webhooks/managers/wallet_event_by_source.py:116"],"code_evidence_missing":false},
  {"task_id":"crediting-cn","repo_alias":"primary","doc_file":"v2_cn/guides/transactions/status.mdx","code_evidence":["custody/custody/handler/blockchain_handler.py:1186","custody/waas2/transactions/dev/enums/transaction.py:220","custody/waas2/webhooks/managers/wallet_event_by_source.py:25","custody/waas2/webhooks/managers/wallet_event_by_source.py:116"],"code_evidence_missing":false},
  {"task_id":"scenarios-en","repo_alias":"primary","doc_file":"v2/guides/webhooks-callbacks/webhook-operations.mdx","code_evidence":["custody/waas2/webhooks/managers/wallet_event_by_source.py:25","custody/waas2/webhooks/managers/wallet_event_by_source.py:116","custody/waas2/transactions/mongo/manager/write/fields/cobo_category.py:22","custody-2.0-website/src/pages/Developers/Webhooks/AddOrWebhooksModal/index.tsx:202","custody-2.0-website/src/pages/Developers/Webhooks/AddOrWebhooksModal/index.tsx:215"],"code_evidence_missing":false},
  {"task_id":"scenarios-cn","repo_alias":"primary","doc_file":"v2_cn/guides/webhooks-callbacks/webhook-operations.mdx","code_evidence":["custody/waas2/webhooks/managers/wallet_event_by_source.py:25","custody/waas2/webhooks/managers/wallet_event_by_source.py:116","custody/waas2/transactions/mongo/manager/write/fields/cobo_category.py:22","custody-2.0-website/src/pages/Developers/Webhooks/AddOrWebhooksModal/index.tsx:202","custody-2.0-website/src/pages/Developers/Webhooks/AddOrWebhooksModal/index.tsx:215"],"code_evidence_missing":false},
  {"task_id":"retry-en","repo_alias":"primary","doc_file":"v2/guides/webhooks-callbacks/set-up-endpoint.mdx","code_evidence":["custody/waas2/developers/managers/callback_message.py:239","custody/waas2/webhooks/managers/managers.py:105","custody/waas2/webhooks/models.py:20","custody/waas2/webhooks/client/client.py:302","custody/waas2/webhooks/client/client.py:325"],"code_evidence_missing":false},
  {"task_id":"retry-cn","repo_alias":"primary","doc_file":"v2_cn/guides/webhooks-callbacks/set-up-endpoint.mdx","code_evidence":["custody/waas2/developers/managers/callback_message.py:239","custody/waas2/webhooks/managers/managers.py:105","custody/waas2/webhooks/models.py:20","custody/waas2/webhooks/client/client.py:302","custody/waas2/webhooks/client/client.py:325"],"code_evidence_missing":false},
  {"task_id":"multi-endpoint-en","repo_alias":"primary","doc_file":"v2/guides/webhooks-callbacks/set-up-endpoint.mdx","code_evidence":["custody/waas2/webhooks/client/client.py:261","custody/waas2/webhooks/client/client.py:302"],"code_evidence_missing":false},
  {"task_id":"multi-endpoint-cn","repo_alias":"primary","doc_file":"v2_cn/guides/webhooks-callbacks/set-up-endpoint.mdx","code_evidence":["custody/waas2/webhooks/client/client.py:261","custody/waas2/webhooks/client/client.py:302"],"code_evidence_missing":false},
  {"task_id":"recovery-en","repo_alias":"primary","doc_file":"v2/guides/webhooks-callbacks/webhook-operations.mdx","code_evidence":["custody/waas2/webhooks/client/client.py:261","custody/waas2/webhooks/client/client.py:302","custody/waas2/webhooks/client/client.py:325","custody/waas2/webhooks/views/event_retries.py:19"],"code_evidence_missing":false},
  {"task_id":"recovery-cn","repo_alias":"primary","doc_file":"v2_cn/guides/webhooks-callbacks/webhook-operations.mdx","code_evidence":["custody/waas2/webhooks/client/client.py:261","custody/waas2/webhooks/client/client.py:302","custody/waas2/webhooks/client/client.py:325","custody/waas2/webhooks/views/event_retries.py:19"],"code_evidence_missing":false},
  {"task_id":"portal-recovery-en","repo_alias":"alt-docs","doc_file":"snippets/webhook-events-en.mdx","code_evidence":["custody-2.0-website/src/pages/Developers/Events/Detail/index.tsx:26","custody-2.0-website/src/services/developers/index.ts:181","custody/waas2/webhooks/views/event_retries.py:19"],"code_evidence_missing":false},
  {"task_id":"portal-recovery-cn","repo_alias":"alt-docs","doc_file":"snippets/webhook-events-cn.mdx","code_evidence":["custody-2.0-website/src/pages/Developers/Events/Detail/index.tsx:26","custody-2.0-website/src/services/developers/index.ts:181","custody/waas2/webhooks/views/event_retries.py:19"],"code_evidence_missing":false},
  {"task_id":"retention-en","repo_alias":"primary","doc_file":"v2/guides/webhooks-callbacks/webhook-operations.mdx","code_evidence":["custody/waas2/webhooks/managers/wallet_event.py:153","custody/waas2/webhooks/models.py:20"],"code_evidence_missing":false},
  {"task_id":"retention-cn","repo_alias":"primary","doc_file":"v2_cn/guides/webhooks-callbacks/webhook-operations.mdx","code_evidence":["custody/waas2/webhooks/managers/wallet_event.py:153","custody/waas2/webhooks/models.py:20"],"code_evidence_missing":false},
  {"task_id":"portal-retention-en","repo_alias":"alt-docs","doc_file":"snippets/webhook-events-en.mdx","code_evidence":[],"code_evidence_missing":true},
  {"task_id":"portal-retention-cn","repo_alias":"alt-docs","doc_file":"snippets/webhook-events-cn.mdx","code_evidence":[],"code_evidence_missing":true},
  {"task_id":"navigation","repo_alias":"primary","doc_file":"docs.json","code_evidence":[],"code_evidence_missing":true}
]
5. 评审轮次

第 1 轮:未通过

Reviewer 指出 Transaction 完整 payload 表未把 block_inforaw_tx_inforeplacementfueling_infotimeline 等结构化字段展开一层;中英文需要同步补全。还要求为 wallets.transaction.createdupdatedsucceededfailed 按链族提供可定位的完整示例,补齐四个 MPC TSS request 生命周期示例及成功/失败状态字面量,并修正 request_id 可空性、TRON/TRON_USDT 标识符、中文 anchor 和旧 heading 的兼容 anchor。执行后再次提交评审。

第 2 轮:未通过

Reviewer 验证上述结构化字段、八组 Transaction 示例、四组 MPC 示例、字段修正、中文 anchor 和 legacy anchor 均已正确实现;未发现内部路径引用、未确认标记或被翻译的标识符。唯一遗漏是 webhook-operations.mdx 中恢复步骤 4 未说明手动重试所需的具体 Portal 权限。

最终修正

v2/guides/webhooks-callbacks/webhook-operations.mdxv2_cn/guides/webhooks-callbacks/webhook-operations.mdx 的恢复步骤 4 中,分别在 Retry/“重新发送”操作前加入 WEBHOOK RESEND 权限前提。随后 mintlify validate 通过,提交 4e96e2de38ba7b1d7819f3614e4b2f2d2a1b4c4d 并创建 primary PR。

6. 基线与同步
  • 编辑前 upstream 基线 commit:执行者未报告。
  • Primary doc edits:完成并提交为 4e96e2de38ba7b1d7819f3614e4b2f2d2a1b4c4d;最终 mintlify validate 通过。
  • API spec edits:无。
  • API spec sync:无。
  • alt-docs PR(product-manual):docs: 完善 Webhook 事件恢复指引 product-manual#755

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.

2 participants