概念
覆盖健康度
为什么每个响应都告诉你我们看不看得见,以及为什么「没有匹配」和「我们现在看不见」在你的代码里绝不能塌缩成同一个值。
一个空结果集有两种截然不同的成因:没事,或者我们现在看不见。分不清这两者的监控产品比没有监控更糟,因为它把一个盲区转换成了一个让人安心的答复。
所以覆盖健康度不是这套 API 的可选特性,它出现在每一条路径上。
它出现在三个地方
| 位置 | 形式 |
|---|---|
GET /v1/exposure | 每个响应体里的 coverage_health 数组,与 matches 并列。 |
GET /v1/coverage | 同一个数组,可单独查询,按你的账户切分作用域。 |
POST /v1/screen/address、POST /v1/decide/deposit | Foreshock-Coverage-Health: ok | degraded 响应头。 |
响应头是指针,不是报告。为 degraded 时,转 GET /v1/coverage 取逐权威的明细。之所以用响应头而不是响应体字段,是为了让覆盖健康度不缺席于任何一个响应,同时不改动响应形状。
一条条目说明什么
每个 CoverageHealthEntry 描述你账户作用域内的一个执法权威。
| 字段 | 是什么 |
|---|---|
authority_id | 该权威在你的覆盖中呈现出的不透明、稳定标识符。 |
observable | 该权威当前对 Foreshock 是否可观测。 |
verified_at | 该权威的注册条目上次与链上核对的时间。 |
collector_lag_s | 链上状态与我们对该权威的视图之间当前的滞后秒数。 |
observable: false、verified_at 超出窗口、collector_lag_s 异常——这三者都读作盲区。没有一个是「全清」。
作用域按客户切分
已认证的调用方看到的是与其已登记资产和地址相关的那些权威,不是 Foreshock 注册表的全集。
某条条目不存在,意味着该权威不在你账户的作用域内。它不是关于我们注册表整体的陈述,也不得被这样解读。
权威、发行方与链的实时集合作为数据返回给已认证客户。它不在公开 schema 里枚举,也不向未认证方发布——这正是契约里 chain、asset、authority_id 是普通字符串而不是封闭枚举的原因。
可观测性不是我们提供的能力
一次执法动作在执行前是否可观测,是发行方如何治理自己的属性。这不是 Foreshock 加上去的,发行方改变执行方式时它可以毫无预告地消失。
这是诚实的说法,也是可操作的说法:请按「你依赖的某个权威明天就不再可观测」来设计你的回退。coverage.health_changed webhook 就是用来在这件事发生时通知你的。