MediaKind 穷尽性守卫 + 文档「第四态」计数纠正 #111

Merged
Yushu merged 1 commit from feat/100-mediakind-exhaustiveness-guard into main 2026-08-11 01:16:09 +00:00
Member

Closes #100

两件独立、不依赖 MediaKind.file 任何未决设计的小事。

一、MediaKind 穷尽性守卫

_PLACEHOLDER_LABEL/_NATIVE_BLOCK_BUILDERSdict[MediaKind, ...] 字面量——
basedpyright 不对字典字面量做穷尽检查,往 MediaKind 加一个取值却忘了给这两张表补
key,类型检查不报错、现有测试全绿,只在运行时 KeyError。补上同本仓
GateVerdict/TriggerPath 既有先例形状的守卫:
assert set(表) == set(get_args(MediaKind))

_TRANSPORT_ALIAS 未纳入(dict[str, str],只装 sticker→image 这一条,不是按
MediaKind 穷举的表)。

二、纠正「第四态/封闭四态」——这是算错了个数,不是滞后一步

MediaKind 实际取值是 image/video/audio/sticker(issue #70,ADR-0024)。
ADR-0028 2026-07-10 那节写的"扩展为封闭四态,新增 file"与 CONTEXT.md/design.md 的
"file(第四态)",两套名单从来没重叠过——sticker 早占了第四态,file 若落地是第五态。

ADR-0028 按纪律追加更新节,不改写既有决策原文;CONTEXT.md/design.md 就地修订;
docs/research/ 底稿未动。不对 file 本体是否落地表态(独立事项)。docs 分支两次
本地提交,按规则不推送。

验证

  • 全量 1546 passed(新增 2),ruff check 干净。
  • 2 项变异全红:两张表各删一个 key,对应守卫分别按预期变红。还原后 md5 一致。
  • 本票不新增任何 MediaKind 取值,不碰 multimodal 路由逻辑——git diff main...HEAD
    src/ 唯一改动是两个模块的 docstring(不涉及逻辑)。

未跑两轴 code review:这票是纯加测试 + 纯文档纠正,没有行为分叉可供 Standards/Spec 两轴
挑,用量也有限,判断不值得再起一轮工作流。

🤖 Generated with Claude Code

Closes #100 两件独立、不依赖 `MediaKind.file` 任何未决设计的小事。 ## 一、`MediaKind` 穷尽性守卫 `_PLACEHOLDER_LABEL`/`_NATIVE_BLOCK_BUILDERS` 是 `dict[MediaKind, ...]` 字面量—— basedpyright 不对字典字面量做穷尽检查,往 `MediaKind` 加一个取值却忘了给这两张表补 key,类型检查不报错、现有测试全绿,只在运行时 `KeyError`。补上同本仓 `GateVerdict`/`TriggerPath` 既有先例形状的守卫: `assert set(表) == set(get_args(MediaKind))`。 `_TRANSPORT_ALIAS` 未纳入(`dict[str, str]`,只装 `sticker→image` 这一条,不是按 `MediaKind` 穷举的表)。 ## 二、纠正「第四态/封闭四态」——这是算错了个数,不是滞后一步 `MediaKind` 实际取值是 `image`/`video`/`audio`/**`sticker`**(issue #70,ADR-0024)。 ADR-0028 2026-07-10 那节写的"扩展为封闭四态,新增 file"与 CONTEXT.md/design.md 的 "file(第四态)",两套名单从来没重叠过——`sticker` 早占了第四态,`file` 若落地是第五态。 ADR-0028 按纪律追加更新节,不改写既有决策原文;CONTEXT.md/design.md 就地修订; `docs/research/` 底稿未动。不对 `file` 本体是否落地表态(独立事项)。docs 分支两次 本地提交,按规则不推送。 ## 验证 - 全量 **1546 passed**(新增 2),`ruff check` 干净。 - **2 项变异全红**:两张表各删一个 key,对应守卫分别按预期变红。还原后 md5 一致。 - 本票不新增任何 `MediaKind` 取值,不碰 `multimodal` 路由逻辑——`git diff main...HEAD` 对 `src/` 唯一改动是两个模块的 docstring(不涉及逻辑)。 未跑两轴 code review:这票是纯加测试 + 纯文档纠正,没有行为分叉可供 Standards/Spec 两轴 挑,用量也有限,判断不值得再起一轮工作流。 🤖 Generated with [Claude Code](https://claude.com/claude-code)
_PLACEHOLDER_LABEL 与 _NATIVE_BLOCK_BUILDERS 是 dict[MediaKind, ...] 字面量,
basedpyright 不对字典字面量做穷尽检查——往 MediaKind 加一个取值却忘了给这两张
表补 key,类型检查不报错、现有测试全绿,只在运行时 KeyError。同本仓
GateVerdict/TriggerPath 既有先例的形状:assert set(表) == set(get_args(Literal))。

_TRANSPORT_ALIAS 不纳入(dict[str, str],只装 sticker→image 这一条,不是按
MediaKind 穷举的表)。两项变异(各表删一个 key)均按预期变红。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Yushu merged commit 23aa13df49 into main 2026-08-11 01:16:09 +00:00
Yushu deleted branch feat/100-mediakind-exhaustiveness-guard 2026-08-11 01:16:09 +00:00
Sign in to join this conversation.
No description provided.