Skip to content

[spec] check:skill-examples 应拒绝 os:check 块内把入参标 any —— 标记了却零覆盖的空门 #5943

Description

@os-zhuang

背景与授权

#5720 拆出。维护者 2026-08-06 已在 #5720 的裁决评论中预批本项立项(原文:「附带批准:os:check 块禁 ctx: any 的门禁约束立项(落 spec scripts,可同 PR 或由承接方拆单)」),#5720 的实现 PR 选择拆单交付,故本单只做门禁,不含文档改写。

未加 pm:* 标签,交分诊路由定级。

问题

{/* os:check */}(.mdx)/ <!-- os:check -->(skills/**)是作者的声明:「这段应当能编译」。packages/spec/scripts/check-skill-examples.ts 会把每个被标记的块真的丢给 tsc --noEmit 编译 —— 但块内一旦把入参标成 any,该参数上每一次属性访问都不再被检查,门是绿的,覆盖的却是零。

#5720 是这道空门的实测标本:两段被标记的 hook 示例写着 export async function beforeUpdate(ctx: any),读的 ctx.services 在 hook 上下文里根本不存在(引擎逐键构造九键、沙箱十键均不产),照抄的 hook 会因可选链短路无条件抛 PERMISSION_DENIED、拒掉每一次写入 —— 而 check:skill-examples 一直是绿的。把同一段函数体的 any 换成如实的 HookContext 再编译,立刻两处报同一条:

error TS2339: Property 'services' does not exist on type '{ object: string; event: …; input: Record< string, unknown >; … }'

同一个 any 同时掩盖了 #5605ctx.session?.positions(当时是 TS2339)和 #5720ctx.services。一个标了 os:check 又把入参标 any 的示例,等于声明「这段编译得过」却什么也没证明 —— 与该脚本已有的两道反空转断言(orphan marker、零块 fail())同一族,只是缺了这一条。

建议约束

packages/spec/scripts/check-skill-examples.ts 的提取阶段(extractFromFile 之后、写 build dir 之前)对被标记块加一条静态检查:参数标注为 any(含 Promise< any >Record< string, any > 之外的裸参数标注、(ctx: any) / (ctx: any, x: any) / function f(ctx: any) / 箭头函数同形)即失败,报到 页面:真实行号,并给出处方(标真实类型,或去掉 os:check 标记)。

待定的细节,建议由承接方按现状实测后定,不要预设:

验收

关联

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions