Skip to content

feat(spec,runtime,metadata-protocol,client)!: 统一能力词表 —— 封闭声明,两个 discovery 生产者全量发 (#5672) - #5857

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-5672-unified-capabilities
Aug 6, 2026
Merged

feat(spec,runtime,metadata-protocol,client)!: 统一能力词表 —— 封闭声明,两个 discovery 生产者全量发 (#5672)#5857
os-zhuang merged 4 commits into
mainfrom
claude/issue-5672-unified-capabilities

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #5672

按维护者 2026-08-06 裁定 A 实施:spec 声明封闭词表,两个 discovery 生产者必须全量发,缺能力 = enabled: false 而非缺键,WellKnownCapabilities 类型随之成真,闸门沿用 #5682 建、#5743 扩到 routes 层的三包 conformance 门并顺延加全量性判据。

前提复核(基于 origin/main,含 #5743)

issue 的前提成立且未过期。在 fc5f536a1 上实测两个生产者:

生产者 capabilities 的键
getDiscovery()(packages/metadata-protocol/src/protocol.ts) comments automation cron search export chunkedUpload transactionalBatch
getDiscoveryInfo()(packages/runtime/src/http-dispatcher.ts) search websockets files analytics ai notifications i18n

只有 search 重合;DiscoverySchema.capabilities 是开放 z.record,两种形状都合法。第三处生产点(packages/rest/src/rest-server.ts:3100)先扫后改:它不是独立生产者,而是在 getDiscovery() 之上合成 —— 只重写 capabilities.transactionalBatch 一个条目(与自身 api.enableBatch 相与),因此词表经它到达浏览器,同规则自动覆盖,无需第四套逻辑。

逐键消费者测量表

跨三仓实测(objectstack / objectui / cloud,均为当日 HEAD)。「消费者」指真的读这个 discovery 能力位的代码,不含同名的 widget / permission / datasource / hook-body capabilities。

原属 objectui cloud framework 处置
transactionalBatch protocol packages/data-objectstack/src/index.ts readTransactionalBatchCapability(),connect 时读、决定是否放弃非原子回退 0 packages/client getter 保留
search 两边都有 0 0 生产者 保留
comments automation cron export chunkedUpload protocol 0 0 生产者 + packages/client 测试 保留
websockets files analytics ai notifications i18n dispatcher 0 0 生产者 保留

取舍与证据:零消费者的键一律保留并集,不做删减。理由三条 ——(1)裁定只授权统一词表,删键属 ADR-0049 另一单;(2)没有一个键是「刚出生、任何面都没兑现过」的:dispatcher 那六个自 #4828 起就是线上真实答案,protocol 那六个由 protocol-discovery.test.ts 逐键钉着;(3)transactionalBatch 恰好证明「今天零消费者」不等于「没用」—— 它在 objectui 有真实读者,而其余键的零读数只说明 objectui 尚未做能力自适应 UI。

一处值得单独记的语义重叠:fileschunkedUpload 都落在 file-storage slot 上,在今天的宿主上答案恒等(唯一发货的存储面两者都提供)。这不是复制粘贴而是宿主事实,已在两处 emit 点写明;若日后要合并成一个键,那是 ADR-0049 的另一单。

两生产者作答依据表

每个键的依据都写进了代码注释。裁定第 3 条的 false 只用在确实不交付的面上,能算出来的一律实测。

getDiscovery() getDiscoveryInfo()(dispatcher)
comments registry 里的 sys_comment(ADR-0052 §5) 实测:经 getObjectQLService(kernel) 读同一 registry —— 它本就为自己的 /data 域解析这个引擎,而 /data/sys_comment 正是 comments 的服务方式
automation registeredServices.has('automation') hasAutomation(可服务性,与 routes.automation 同一判据)
cron has('job') hasJob(存在即能力:job 是无 HTTP 面的内核内契约,#4318)
search has('search') hasSearch
export has('automation') || has('queue') hasAutomation || hasQueue(同一析取)
chunkedUpload capabilityServed('file-storage')(本 PR 收紧,见下) hasFiles
transactionalBatch typeof engine.transaction === 'function' false —— 该面不交付。原子 /batch@objectstack/restregisterBatchEndpoints 挂载;该 dispatcher 完全没有 batch 分支(domains/data.ts 只把 query 路由为自定义 action)。改答 engine.transaction 会替一个本宿主不服务的端点广告原子性 —— 正是该标志位当初(#3298/#1604)要消除的谎
websockets false false —— 两边同因:realtime 是进程内 pub/sub 总线,无人挂载 WS/SSE 面(ADR-0076 D12, #2462),这也正是 routes.realtime 永不广告的原因
files capabilityServed('file-storage') hasFiles
analytics ai notifications i18n capabilityServed(...) hasAnalytics / hasAi / hasNotification / hasI18n

其中 capabilityServed(name) = registeredServices.has(name) && !unserveable(name),复用该 builder 本就用于决定是否广告路由的判据;dispatcher 侧的 isServiceServeable 语义等价。广告什么与声称什么因此不可能不一致。

一处越出「只加键」的收紧,请着重看

getDiscovery()chunkedUploadregisteredServices.has('file-storage') 改为 capabilityServed('file-storage')(单独一个 commit)。不这么改会有两个后果,第二个是决定性的:

  1. 自声明 stub 的存储实现会被广告出 chunkedUpload: true —— 而同一 builder 本就不给它广告 routes.storage;
  2. dispatcher 对同一键答的是可服务性,两个生产者会对同一宿主的同一键给出相反答案 —— 在本单要消除方言的地方新造一种方言。

若维护者认为这仍属越界,单独 revert 该 commit 即可,其余不受影响。

契约改动

packages/spec/src/api/discovery.zod.ts:

  • WellKnownCapabilitiesSchema 成为唯一词表,收编原属 dispatcher 的六键。为让 DiscoverySchema 能从它派生,该 schema 连同新增的 CapabilityDescriptorSchema 一起上移到 DiscoverySchema 之前 —— 这不是排版:lazySchemaOS_EAGER_SCHEMAS=1(文档记载的应急回滚开关)下会在模块加载期立即求值,前向引用会踩 TDZ。
  • DiscoverySchema.capabilities:开放 record → 封闭对象,且 optional → required,键集由 WellKnownCapabilitiesSchema.shape 派生(不是第二份手写清单),每个键的 .describe() 继承自对应标志位。
  • 必填的依据是 scoping 先例反过来读:scoping 之所以 optional,是因为只有 REST 一个生产者能诚实回答;capabilities 三个生产者都能答,而 optional 会把消费者退回「每个标志位都是 undefined」—— 恰是裁定要消除的 两个 discovery 生产者都在线上返回 schema 未声明的顶层字段(scoping / features / endpoints),且 REST 形状永远无法通过 DiscoverySchema #4828 前状态。
  • 新导出:WELL_KNOWN_CAPABILITY_KEYS(键表,派生自 schema)、CapabilityDescriptorSchema / CapabilityDescriptor

packages/client/src/index.ts —— 断言删除:getter 不再复制服务器的键集再断言,而是遍历 WELL_KNOWN_CAPABILITY_KEYS 构造,返回值因此按构造就是完整的 WellKnownCapabilities,as unknown as 没有东西可断言了。两条明写的读取规则:服务器缺键读作 false(fail-closed,与线上规则同义);非布尔值不做强制转换(off-spec 值在机器可读面上不该被消费者容忍成能力主张,PD #12)。

先证红

预测在先:metadata-protocol 缺 dispatcher 的 6 键、dispatcher 缺 WellKnown 的 6 键,两边都应红;方向为「加判据 → 红 → 修生产者 → 绿」。实测两处都如预测,其中第一处比预期更强 —— 红在编译期而非测试期:

src/protocol.ts(2776,15): error TS2740: Type '{ comments: boolean; automation: boolean; cron: boolean;
  search: boolean; export: boolean; chunkedUpload: boolean; transactionalBatch: boolean; }' is missing
  the following properties from type '{ ... }': websockets, files, analytics, ai, and 2 more.

src/protocol.ts(2620,11): error TS2416: Property 'getDiscovery' … Types of property 'capabilities'
  are incompatible. Type 'Record[string, { enabled: boolean; description?: string }]' is missing the
  following properties …: search, cron, automation, analytics, and 9 more.

wellKnown 上的 WellKnownCapabilities 标注让「词表加键 ⇒ 该生产者不答就编译不过」成为结构性事实,而非只靠一条测试。dispatcher 侧的 capabilities 字面量位于无标注的返回对象里,tsc 看不见,由闸门捕获:

Test Files  1 failed (1)
     Tests  9 failed | 6 passed (15)

× emits EVERY declared capability key — undelivered means `enabled: false`, never absent
× anti-vacuity: … AssertionError: capabilities.comments: expected undefined to be defined
× satisfies the canonical DiscoverySchema / NODE_ENV=… advertises …
    AssertionError: expected false to be true   (DiscoverySchema.safeParse)

修生产者后:runtime 15/15、metadata-protocol 11/11、rest 14/14 全绿。

SDK 类型谎言的编译期探针

新增 packages/client/src/capabilities-vocabulary.test.ts这里要如实说明模板的一个预设不成立:谎言藏在类型断言里,所以 pnpm typecheck 修前修后都是绿的 —— 编译器无法证伪一个 cast。因此探针写成「静态承诺 + 运行时事实」的配对:const promisedBoolean: boolean = caps.transactionalBatch; 这行只因声明类型承诺 boolean 才编译得过,紧跟着的 expect(typeof promisedBoolean).toBe('boolean') 才是证伪者。把 getter 还原成旧实现、拿修前 dispatcher 的真实载荷喂进去:

× the probe: `transactionalBatch` is a real boolean against a dispatcher-shaped payload
    AssertionError: expected 'undefined' to be 'boolean'
× every flag the type declares is present and boolean
    AssertionError: expected [ 'comments', 'automation', …(4) ] to deeply equal []
× reads a key the server omits as `false`        AssertionError: expected undefined to be false
× does NOT coerce an off-spec value              AssertionError: expected true to be false
× exposes exactly the vocabulary                 AssertionError: expected [ …, 'feed', …(5) ] to deeply equal […(11)]

Tests  5 failed | 2 passed (7)

expected 'undefined' to be 'boolean' 就是 issue 描述的那句谎,逐字落在断言里。方向与预测一致(红)。

闸门:全量性判据

三包 conformance 门各加一组,allowance 由 WELL_KNOWN_CAPABILITY_KEYS 推导、绝不手写(与 #5743declaredRouteKeys() 同一纪律)。三条判据是故意分开的三个问题:

  1. 词表键全在 —— 本单的分裂;
  2. 每个 enabled 都是真布尔;
  3. 无词表外键 —— 这条 safeParse 答不了,因为 zod object 默认 strip 未知键(routes.mcp 是 REST /discovery 发出、objectui 真实消费、但 ApiRoutesSchema 从未声明的键(#4828 同族,低一层) #5679 的教训),只有键集检查看得见。

反空洞各配一条:metadata-protocol 断言词表真的跨了两个历史半区;dispatcher 断言那六个它从不发的键真的有答案 —— 其中 comments 在该 suite 的 kernel 下应为 true(其 registry stub 对任何名字都返回对象),这一条正是区分「实测」与「盖章 false」的关键,并另配一个不含 sys_comment 的 registry 断言 false,两个方向都钉住。

夹具三态处置

  • 补声明:packages/spec/src/api/discovery.test.ts 17 处夹具补 capabilities: allCapabilitiesOff(由词表派生),含拒收类夹具 —— 让它们只因自己那处植入的缺陷而红,而不是顺带多一个缺键。
  • 整体替换:should allow capabilities to be omitted 钉的正是被删掉的那条腿。它若只被改写会为空洞的理由继续绿(对着无人生产的键断言 toBeUndefined(),契约说 optional 还是说「忘了发」都一样绿),故换成四条:拒收整块缺失、拒收半个词表(直接用两个生产者修前的真实半区当输入)、词表与 WellKnownCapabilities 同集、每条目符合 CapabilityDescriptor
  • 整体替换:packages/spec/src/api/protocol.test.ts 那条夹具以 feed: { enabled: true } 打头并断言它往返 —— 开放 record 下,一个无人生产、无人消费的键长得和真键一模一样。改为显式钉住封闭后的两个事实(feed 不会进入解析结果;缺半个词表被拒),而不是静默删掉。
  • WellKnownCapabilitiesSchema 的「缺字段即拒」由钉死单键改为遍历词表逐键剔除,新键无法漏测。

按规则的消费半径扫查

不按「改了哪个包」扫,按 DiscoverySchema / WellKnownCapabilities 的调用方扫,列全为:packages/{spec,client,metadata-protocol,runtime,rest}packages/objectql/src/protocol-discovery.test.ts,以及 packages/spec/json-schema/api/{Discovery,GetDiscoveryResponse}.json(生成物)。objectui / cloud 侧逐键 grep 见上表。

验证

合入当日 origin/main(9a1544677)后重跑,全部真实输出:

spec               321 files / 8202 tests passed
metadata-protocol   47 files /  455 tests passed
objectql           125 files / 2065 tests passed
client              19 files /  236 tests passed
rest                58 files /  824 tests passed
runtime            101 files / 1463 tests passed

typecheck: spec / objectql / runtime / client — Done(rest、metadata-protocol 无 typecheck 脚本,
           由 tsup 的 DTS 步骤覆盖:四包 DTS Build success)
check:generated: ✓ All 10 generated artifacts are up to date.
check-nul-bytes: OK (5667 files);改动文件另做控制字符自扫 —— 无

生成物走 os-regen 四步(build → check → --fix → 复检),重生成 api-surface.json / content/docs/references/** / strictness ledger。authorable-surface.base.json重锚漂移照 #5358 剔除 —— 该 diff 全是别人的键(ApiRoutes:mcpDiscovery:scoping$icontains …)被锚点前移顺带捎上的,与本单无关;剔除后闸门仍绿并给出 trails the merge base by 8 key(s) — expected 的提示。api-surface.json 相对 main 的净 delta 恰为本单三个新导出,无多无少。

changeset

.changeset/unified-capability-vocabulary.md —— @objectstack/spec minor(词表封闭 + 六个新键)、@objectstack/runtime@objectstack/metadata-protocol minor(两者的线上可见键集都实增六个)、@objectstack/client patch(类型面诚实化,无行为承诺变化)。正文按消费者视角写:此前有哪些标志位取决于宿主类型、且可能整个缺席;此后恒有布尔。

界外发现


Generated by Claude Code

claude added 4 commits August 6, 2026 07:35
…ocabulary, emitted whole by every discovery producer (#5672)

#4828 收敛了两个 discovery 生产者的「拼写」分裂(都发 `capabilities`),
但更深的一层没动:两者填的键集互不相交,只有 `search` 重合。
`DiscoverySchema.capabilities` 是开放 record,所以两种形状都合法、没有闸门
看得见分裂;而 SDK 的 getter 把结果断言成 `WellKnownCapabilities` ——
面对 dispatcher 宿主,`client.capabilities.transactionalBatch` 静态是
`boolean`、运行时是 `undefined`,类型在撒谎。

按维护者 2026-08-06 裁定 A 统一能力词表:

- spec:`WellKnownCapabilitiesSchema` 成为唯一词表,收编原属 dispatcher 的
  六个键(websockets/files/analytics/ai/notifications/i18n —— 都是早已在线
  上的真实答案,这里是补声明而非发明);`DiscoverySchema.capabilities`
  由「可选开放 record」改为「必填封闭对象」,键集从词表推导。新导出
  `WELL_KNOWN_CAPABILITY_KEYS` 与 `CapabilityDescriptorSchema`。
- 两个生产者全量发,每个键的作答依据写进代码注释。dispatcher 的 `comments`
  改为从它本就为 `/data` 域解析的 registry 实测 `sys_comment`;唯一诚实的
  `false` 是 `transactionalBatch` —— 原子 `/batch` 由 @objectstack/rest 挂载,
  该 dispatcher 完全没有 batch 分支。
- client:getter 不再断言,改为遍历 spec 的键表构造,类型因此成真;
  旧服务器缺键读作 `false`(fail-closed),非布尔值不做强制转换。
- 三包 conformance 门顺延加全量性判据(键全在、值全为 boolean、无词表外键),
  allowance 从 schema 推导。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D
同一 slot(file-storage)的两个词表键此前判据不同:files 走可服务性、
chunkedUpload 只看注册存在。后果有二:自声明 stub 的存储实现会被广告出
chunkedUpload: true —— 而该 builder 本就不给它广告 routes.storage;更要紧的
是 runtime dispatcher 对同一键答的是 hasFiles(可服务性),两个生产者会对同
一宿主的同一键给出相反答案 —— 正是本单要消除的方言。

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

vercel Bot commented Aug 6, 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 6, 2026 8:46am

Request Review

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 4 package(s): @objectstack/client, @objectstack/metadata-protocol, @objectstack/runtime, @objectstack/spec.

119 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 packages/client, @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/client, packages/runtime, @objectstack/spec)
  • content/docs/api/data-flow.mdx (via @objectstack/client)
  • content/docs/api/environment-routing.mdx (via @objectstack/client, @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/client, @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/runtime, @objectstack/spec)
  • content/docs/api/wire-format.mdx (via @objectstack/runtime)
  • 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 @objectstack/runtime, 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/metadata-protocol, @objectstack/runtime, packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/runtime, @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 @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/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/runtime)
  • content/docs/deployment/single-project-mode.mdx (via @objectstack/runtime)
  • 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/runtime)
  • 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/client, @objectstack/runtime, @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/runtime, @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 packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via packages/client)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/client, packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/metadata-protocol, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/client, @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via packages/runtime, @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/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/client, @objectstack/runtime, @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/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/client)
  • 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 @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/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/client, @objectstack/runtime, @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/client, @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/client, @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/metadata-protocol, @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.

@github-actions github-actions Bot added size/xl documentation Improvements or additions to documentation tests tooling labels Aug 6, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 6, 2026 09:17
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 6, 2026
Merged via the queue into main with commit aac90a5 Aug 6, 2026
25 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-5672-unified-capabilities branch August 6, 2026 09:29
os-zhuang pushed a commit that referenced this pull request Aug 6, 2026
…ble-surface)

#5861 被合并队列踢出,签名是 `strictness-ledger-doc.test.ts > is checked in current`。
归因:#5849 / #5857 在入队前合入 main(#5857 给 `api/` 新增了一个 z.object 站点),
本分支的 counts.md 是在旧树上渲染的,合并树上不再等于现渲染 —— 单体生成物的串行税
(#5837 正在治的病),不是实现回归。

在合并树上重跑 os-regen:`api/` 站点数 395 → 396(main 的 +1 与本单 `projectionApplied`
嵌套对象的 +1),docs 与 authorable-surface 一并重渲。相对 origin/main 的净增量仍只有
本单四个键。`authorable-surface.base.json` 本轮无重锚漂移(已核对与 main 一致)。

Co-Authored-By: Claude <noreply@anthropic.com>
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 size/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SDK 的 client.capabilities 声明为 WellKnownCapabilities,但两个 discovery 生产者填的是互不相交的键集

2 participants