diff --git a/research-wiki/designs/2026-07-29-settings-invariant-guards-design.md b/research-wiki/designs/2026-07-29-settings-invariant-guards-design.md index 30cf2f7..0b4de43 100644 --- a/research-wiki/designs/2026-07-29-settings-invariant-guards-design.md +++ b/research-wiki/designs/2026-07-29-settings-invariant-guards-design.md @@ -102,7 +102,7 @@ | 三条守卫各自:`dataclasses.replace` 构造出违反组合 | 抛 `ValueError`,消息含对应字段名 | | 三条守卫各自:边界值恰好相等(`timeout_s == lease_ttl_s` 等) | **构造成功**——守卫收紧的是错的那些,不是所有直接构造 | | `sources=()` | 抛 `ValueError`,消息点明"至少一个源",**且不是 `max() arg is an empty sequence`** | -| `GatewayClient.from_settings(非法 settings)` | 抛 `ValueError`(真实动机路径,PR#1 只做了手工复现未落成测试) | +| `GatewayClient.from_settings(非法 settings)` | 抛 `ValueError`。**注意抛点**:方案 A 之下非法实例根本无法存在,异常发生在实参求值(构造 settings)那一刻,不在工厂内部——这正是构造期把关换来的性质,测试 docstring 须写明,以免后人误读为工厂自带校验 | | `OcrSettings` / `EmbeddingSettings` 直接构造包着非法 gateway | 抛 `ValueError`(证明三条 client 线一并覆盖) | | 既有 447 passed / 34 skipped | 全绿,零回归 |