## 背景 PR #38(视频号瞬态重试 + attempts 归因)在 5 轮 gate 循环后,把归因契约**收回为有界归因**(见该 PR 的「归因契约的边界」节)。理由:原声明「attempts 可归因」是无限域上的全称命题,每轮都能找到新的畸形形态,既不可被有限测试证明,也让循环没有不动点。 本 issue 承接**域外形态**的残余,作为 backlog,不作为「缺陷未修」对待。 ## 契约现状(域内 / 域外) - **输入域**:`tests/fixtures/wechat_channels/*.json` 记录的形态,以及 TikHub 文档化的 4xx/5xx JSON 错误包(body 无 `data` 节点,或带 `code`/`message`)。 - **域内承诺**:`retryable` 与 `parse_failed` 两类 attempts 条目都带 `reason ∈ {data_missing, object_type_mismatch, error_body}`;`error_body` 另带 int `http_status` 与上游 `message` 截断片段;`object_type` 只带 int 或长度 ≤32 且匹配 `[A-Za-z0-9_.:-]+` 的 str。 - **域外承诺**(仅三条):① 凭据不泄漏;② 不崩溃;③ 分类只出 `ok`/`retryable` 两态。**不承诺归因完备。** ## 已知域外形态与当前行为 | 形态 | 当前行为 | |---|---| | `object_type` 为容器 / 超长或含空白的文本 | 走非视频分支,归因里只留 `object_type_type: <类型名>`,不带值 | | `object_type` 为 `bool` / `float` / `"0"` | 不算合法视频节点(判据 `type(ot) is int and ot == 0`),走非视频分支 | | 非 2xx + JSON body,但 `classify` 判 `ok` 且解析不出可播放地址 | `parse_failed` 条目带 `error_body` + int `http_status`(PR #38 末轮已收口) | | 其它未观测形态 | 不承诺 | ## 增补条件(样本门槛) 本仓既有纪律是「无真实样本不臆造分支」(同 `_classify_kuaishou` 终态异常的处理)。要增补域外形态的归因精度,需先拿到**真实样本**: 1. 一条真实的「TikHub 4xx/5xx 且 body 含 `data` 节点」的响应样本(用于确认该形态真实存在,并据此定归因字段); 2. 或一条真实的畸形 `object_type`(非 int 非短安全 str)样本。 拿到样本后:加进 `tests/fixtures/wechat_channels/`,在 `describe_failure` / `_error_body_reason` 补对应归因,并按域内标准补跨边界脱敏断言。 ## 为什么现在不做 - 无样本时逐形态补分支 = 在无界域上做枚举,每加一格都会引入新状态,是 PR #38 那 5 轮循环的直接成因(该轮 finding 分布与机制分析见 PR #38 备注节)。 - 域外形态的真实触发概率与后果(仅少一条归因,不丢数据、不静默出错)都不满足本仓 `internal` 档 P1 两问。
Activity