Skip to content

feat(spec)!: HookContext.api 从 z.unknown() 收窄为最小 IScopedContext (#5945) - #6311

Merged
qq9340100 merged 1 commit into
mainfrom
claude/issue-5945-hook-context-api-typed
Aug 7, 2026
Merged

feat(spec)!: HookContext.api 从 z.unknown() 收窄为最小 IScopedContext (#5945)#6311
qq9340100 merged 1 commit into
mainfrom
claude/issue-5945-hook-context-api-typed

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Fixes #5945

落地 2026-08-07 维护者裁决 C:HookContext.api 停止 z.unknown(),声明语料库实际教的最小 IScopedContext

问题

HookContext.api 是文档教的主数据通道,类型却是 unknown。于是所有文档、技能、示例里那个标准写法一行都编译不过 —— 包括 hook.zod.tsapi 这个键自己 JSDoc 上的示例:

error TS18046: 'ctx.api' is of type 'unknown'.      // ctx.api.object('x')

唯一进了 os:check 的那块(content/docs/kernel/runtime-services/examples.mdx)只能靠在示例里自建 type CrossObjectApi = …ctx.api as CrossObjectApi 才编得过 —— 每个消费方各 cast 一遍、形状无人校验,正是 contract-first 要终结的方向。

声明面 —— 证据表(逐条 file:line)

判据(写进了模块头,可复现):一个成员在语料库里存在对 hook ctx.api 的调用时才声明 —— 调用才是要过编译器的东西。表格是散文,它不过编译器。

声明(8)

成员 调用点 证据
object(name) 全部 进入 repository 的唯一入口
transaction(cb) 2 api/error-handling-server.mdx:382;data-hooks.md:447(api.transaction 能力行)
findOne 10 data-hooks.md:402,421,422,423,480,524;rules/hooks.md:72;data-service.mdx:26;runtime-services/examples.mdx;hook.zod.ts JSDoc
find 4 data-hooks.md:403,405,425
count 3 data-hooks.md:404,832;hook-bodies.mdx:84
insert 4 data-hooks.md:756,920;automation/hooks.mdx:187;error-handling-server.mdx:391(tx 回调内)
update 9 data-hooks.md:491,527,977;rules/hooks.md:74;hook-bodies.mdx:163,210,223,298;error-handling-server.mdx:395
updateById 2 error-handling-server.mdx:289;hook-bodies.mdx:197

update 两种形态都要:update({ id, ...fields })update(data, { where, multi: true })

不声明(测量过,不是漏了)

成员 调用点 为什么不
upsert 0 只在方法表/能力表:data-hooks.md:395,446
delete 0 只在表格:data-hooks.md:446hook-bodies.mdx:101,315。另有 packages/lint 测试里的 body-source 字符串 fixture,那是 lint 规则的输入,同样不过编译器
aggregate 0 只在表格:hook-bodies.mdx:100,314
create 0 只在表格 + 同上的 lint fixture 字符串
deleteById / execute 0
sudo() 3 个调用方 唯一有真实调用方却仍被排除的,故单独论证:plugin-audit 的 persistAuditTrailRow / captureBefore 都调它,但三处全部把值持成 any(api: any(ctx as any).api)—— 没有一个是本次声明能解锁的类型化消费方;且 sudo()提权,把它放进第一个 hook 的文档面等于把「绕过记录级权限」写进入门词汇,没有任何文档这么教,裁决也没授权。要不要声明是维护者的判断,不是一次测量
beginTransaction / commit / rollback 三件套 为 sandbox runner 而存在(跨 host event-loop turn 显式穿 handle,ALS 活不过去),不是给 hook 作者的
userId / tenantId / spaceId / roles / isSystem / transactionHandle getter hook 读调用方走 ctx.session(已声明、已类型化、带 ADR-0090 D3 词汇);在这里再开一套拼写就是同一事实的第二种方言,而 roles 这个拼法 ADR-0090 D3 直接禁

IDataEngine(#4251)确立的「有证据才声明」同款纪律。裁决里的选项 A(整个 repo 方法面)按同一条规则以后再长。

三个刻意的偏离,附论证

1. transaction 的签名给全,不只 cb 一参。

transaction< T >(
  callback: (trxCtx: IScopedContext, info: EngineTransactionInfo) => Promise< T >,
  opts?: EngineTransactionOptions,
): Promise< T >;

证据门槛管的是哪些成员存在,不是允许对一个已声明成员的签名说假话。回调的参数表描述的是生产方递进去什么,而生产方无条件递两个(ScopedContext.transaction,#5696);只声明一参既是假陈述,又会让 async (tx, info) => … 这段能跑的代码编译报错。逆变保证语料库真正写的零参/一参回调照样满足两参声明 —— 所以真实的签名同时也是更宽松的那个opts 同理:ADR-0119 D1 + #5696 明确裁定这个面是 IObjectQLEngine.transaction 的第二个实现、绝不是第二种方言(opts.require 的 fail-closed 在这里一模一样地兑现),契约里省掉它等于在声明层把实现刚关掉的方言重新打开。两个类型都复用 #6165 刚落的 EngineTransactionInfo / EngineTransactionOptions,没有新词汇。

代价已测量:scoped-context.ts 因此 import ./objectql-engine.js,check:skill-refsobjectstack-data 传递依赖索引多了 4 条(flow-function.zod / driver.zod / query.zod / enums.zod)。这是生成器如实测出来的,不是噪声;若维护者更认可「最小 = 一参」,回退是 3 行。

2. 查询参数不用 EngineQueryOptions,是开放对象。

repository 把 query 原样 spread 给 IDataEngine,所以顺手会想用 spec 自己的 EngineQueryOptions那是假收窄:引擎读 query 前先折叠文档化的别名拼写(filterwheretoplimit,RPC_QUERY_ALIAS_SLOTS,在 find/findOne/update 三处生效),data-hooks.md 明确教 filter 是被容忍的对象值别名并且有活的示例(:832)。EngineQueryOptions 没有 filter,对象字面量会被 excess-property check 拒掉 —— 对一个运行时接受、文档教的调用报编译错。选项词汇EngineQueryOptions 所有、归引擎强制(#4371 起拒绝未声明选项键);本接口的职责是方法面legal-filter-alias 探针把这条钉住了。

3. Zod 侧仍是 z.unknown() + 静态 cast,不是 z.custom< IScopedContext >()

z.custom 是显然的拼法,而且是错的:custom 在 JSON Schema 里不可表达,gen:schema 直接不再产出 json-schema/data/HookContext.json —— 构建原地报 "1 previously published schema disappeared",而这会在下次 gen:docs 抹掉 references/data/hook.mdx 那一页(#2978)。实测出来的,不是推测。改用 object.zod.tsObjectCapabilities.apiMethods 的同一惯用法:

api: (z.unknown().optional() as unknown as z.ZodOptional< z.ZodType< IScopedContext, IScopedContext > >)
  .describe('…'),

于是接受的值、JSON Schema、生成的参考页行逐字节不变,只有 .describe() 文案动了(那是那一页说明这个值到底是什么的唯一通道)。

漂移由编译器盯着

packages/objectqlScopedContext / ObjectRepository 声明了 implements。实测:把 ObjectRepository.updateById 改个名,objectql 的 tscimplements和五个 hook 派发点(api: this.buildHookApi(...))同时报错 —— 契约与引擎真正绑定的那个对象再也不能各说各话。

反向验证 —— 方向先声明,然后实测,而实测推翻了一半预测

预测:还原 api: z.unknown(),legal-* 全红报 TS18046,rejects-* 会绿得没意义。跑了。实际:

探针 写法 还原后的诊断
no-chain ctx.api.object('x') TS18046: 'ctx.api' is of type 'unknown'.
chain-legal ctx.api?.object('x') TS2339: Property 'object' does not exist on type '{}'.
rejects-upsert ctx.api?.object(…).upsert(…) TS2339: … on type '{}'.
rejects-sudo ctx.api?.sudo() TS2339: … on type '{}'.

TS18046 是 issue 报的症状,逐字复现 —— 但只在不带可选链时。?.unknown 去掉 null | undefined 后剩 {},所以语料库真正的写法(api 是可选的)报的是 TS2339。于是只断言错误码不够:rejects-* 在还原前后都报 TS2339,toContain('TS2339') 在被还原的契约上照样通过 —— 一个 phantom check,只有真去跑反向验证才抓得到。改成断言诊断里点名归属类型(IScopedContext / IScopedObjectRepository),'{}' 再也满足不了。再跑一次还原:失败从 2 个测试涨到 3 个,rejects-* 如期变红。

测试

  • 新增 packages/spec/src/contracts/scoped-context.test.ts:编译探针(ts.createProgram + 真实诊断码),11 条 legal-* 全绿、6 条 rejects-* 报 TS2339 且点名类型、每组都带 harness 自检对照(解析失败会零诊断,看起来跟成功一样);hook.zod.ts 的 JSDoc 示例从源文件读出来逐字编译(headline 抱怨的就是它编译不过),带反空洞断言。
  • hook.test.ts 新增 #5945 块:parse 仍接受活引擎对象且返回同一个实例(不 clone —— clone 出来的 repository 闭包指向错的执行上下文,形状检查看不见)、api 仍可选、z.unknown() 接受的值一个不少、文档教的写法 tsc 过、.describe() 措辞。该块诚实地标注为回归护栏而非落地证据:还原后它全绿(z.custom/z.unknown 接受的值相同,这正是选它的原因)。
  • check:generated 十门全绿(重生成 skill-refs / api-surface / docs 三件);六项源审计(liveness / empty-state / skill-examples / variant-docs / exported-any / dual-source-exports)全绿 —— check:skill-examples 208 例通过,含改过的 examples.mdx:124
  • @objectstack/spec 332 文件 / 8439 测试通过;typecheck 通过。@objectstack/objectql 135 文件 / 2214 测试通过,typecheck + build 通过。消费半径:runtime / plugin-audit typecheck 通过(两者对 ctx.api 的读取都持 any,不受影响)。
  • check:engine-double-contract:两个新 fake 被判为 engine double —— 它们其实是 IScopedObjectRepository类型符合性见证,scoped repository 是该门 engine/driver 二分法没有的第三种(它的写动词是 update(data, options?),对象名根本不是参数)。按 data-engine.test.ts 已有的两条同类先例记 EXEMPT:spec 无法 import objectql/metadata-core(依赖反转)。dormancy 用 stderr 探针实测(check:engine-double-contract 看不见「delete 少于两个形参」的假引擎 —— 实测 150 个 double 里 91 个(49 个文件)因此不在扫描面内 #5629 的方法,而上面两条 update 条目自己说它们没做):被测的 update 全程静默,同一次运行里注入到会被调用的 updateById 的对照标记打印了 —— 静默因此是证据而不是坏探针。

Generated by Claude Code

)

维护者裁决 C:`HookContext.api` 不再是 `z.unknown()`,改为指向
`packages/spec/src/contracts/scoped-context.ts` 里新增的 `IScopedContext` /
`IScopedObjectRepository`(与 IDataEngine / IObjectQLEngine 同层同风格,含
evidence-bar 模块头)。

声明面 = 语料库实测的调用点,不多不少:
  IScopedContext        object(name) + transaction(cb, opts?)
  IScopedObjectRepository  find / findOne / count / insert / update / updateById

upsert / delete / aggregate / create 只出现在文档的方法表与能力表里、没有任何
调用点(表格不过编译器);sudo() 的三个调用方全部把值持成 any 且它是提权动作。
一律不声明,等到有调用点再按同一条规则加 —— 与 IDataEngine (#4251) 同款纪律。

运行时零变化:Zod 侧仍是 z.unknown(),收窄是静态 cast(与 object.zod.ts 的
ObjectCapabilities.apiMethods 同一惯用法)。z.custom 试过,它让 HookContext 在
JSON Schema 里不可表达 —— gen:schema 直接不再产出 json-schema/data/HookContext.json,
会在下次 gen:docs 抹掉参考页(#2978),故不用。接受的值、JSON Schema、生成的参考页
行全部不变,只有 .describe() 文案改了。

漂移由编译器盯着:objectql 的 ScopedContext / ObjectRepository 声明 implements。
实测把 updateById 改名,objectql 的 tsc 在 implements 处 + 五个 hook 派发点同时报错。

content/docs/kernel/runtime-services/examples.mdx 里那段 os:check 块删掉了自建的
`type CrossObjectApi` + `ctx.api as CrossObjectApi`,改为直接读契约。

scripts/engine-double-contract.baseline.json 新增两条 EXEMPT:两个新 fake 是
IScopedObjectRepository 的类型符合性见证,不是 engine double(scoped repository 是
该门二分法没有的第三种);spec 也无法 import objectql/metadata-core(依赖反转)。
dormancy 已用 stderr 探针实测(对照组会打印,被测的 update 全程静默)。

Fixes #5945

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
@vercel

vercel Bot commented Aug 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 7, 2026 1:36pm

Request Review

@github-actions github-actions Bot added the size/l label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/objectql, @objectstack/spec.

115 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/objectql, packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via packages/objectql, @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/migration-from-objectql.mdx (via @objectstack/objectql)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/objectql)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via packages/objectql, @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/objectql)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via packages/objectql, @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

Copy link
Copy Markdown
Collaborator Author

ACCEPT(spec 车道 PM 验收,session_011M7UwH25Unfi73UHim7ajY)

逐 job 结论亲读:24 checks 全 completed,23 success + 1 预期 skipped(Console Pin Gate),ESLint / TypeScript / Check Changeset 均 success。验收面核对:

  1. 裁 C 如实执行:契约新增在 contracts/(evidence-bar 模块头)、声明面=语料实测调用点;运行时零变化(z.unknown() + 静态 cast 惯用法,z.custom 路线因 JSON Schema 不可表达被实测否决 —— 正确);漂移由 objectql implements 编译器盯防,反向验证两肢均按预告变红(且第一肢的实测推翻了预测的一半并因此把断言从错误码升级到点名类型 —— phantom check 被主动消灭,加分);
  2. major 定级成立(MetadataEventType 是 13 类型的封闭枚举,但可注册的 metadata 类型远多于此——枚举外类型的 realtime 事件合同缺位,需裁决覆盖面 #4627 先例:签名真收窄的包吃 major);
  3. engine-double-contract 曾红已按 check:engine-double-contract 看不见「delete 少于两个形参」的假引擎 —— 实测 150 个 double 里 91 个(49 个文件)因此不在扫描面内 #5629 方法实测 dormancy 后 EXEMPT,底层判据缺口已立 check-engine-double-contract 的 engine/driver 二分法没有 scoped-repository 这一支:IScopedObjectRepository 的类型符合性见证一律被判成 engine double #6327(finding,未认领);
  4. 两条开放问题接受 dev 推荐 A 案,均落在既有裁决内 —— transaction 完整签名(ADR-0119 D1 + [spec] engine.transaction 契约收紧:opts.require fail-closed、跨驱动拒绝、owned-vs-joined 信号(#4619 的契约半边,维护者已批 P2) #5696:已声明成员的签名必须对实现为真;B 案会把 [spec] engine.transaction 契约收紧:opts.require fail-closed、跨驱动拒绝、owned-vs-joined 信号(#4619 的契约半边,维护者已批 P2) #5696 刚保留的 owned/require 在契约层重新藏起来)、sudo 不声明([spec] HookContext.api 声明为 z.unknown() —— 按 (ctx: HookContext) 标类型的 hook 无法调用 ctx.api.object(…),而文档/技能全在这么教 #5945 裁决只授权 object+transaction;提权面另裁)。维护者否决窗:两处回退均为小改(3 行 / 1 行),不同意请说一声。
  5. [spec] check:skill-examples 应拒绝 os:check 块内把入参标 any —— 标记了却零覆盖的空门 #5943 解锁:两条知会点(ctx.api?. 可选链、filter: 别名刻意放行)已在报告中,移交 spec-tooling 座位时转达。

已翻 ready + auto-merge。


Generated by Claude Code

Merged via the queue into main with commit 59b794f Aug 7, 2026
25 checks passed
@qq9340100
qq9340100 deleted the claude/issue-5945-hook-context-api-typed branch August 7, 2026 14:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/l tests tooling

Projects

None yet

2 participants