Skip to content

feat(spec)!: object 内层块拒绝未知键 —— 13 站点收紧,2 个站点依据实测保留 (#4001 批 19/20) - #5250

Merged
xuyushun441-sys merged 7 commits into
mainfrom
claude/issue-4001-batch19-20
Aug 4, 2026
Merged

feat(spec)!: object 内层块拒绝未知键 —— 13 站点收紧,2 个站点依据实测保留 (#4001 批 19/20)#5250
xuyushun441-sys merged 7 commits into
mainfrom
claude/issue-4001-batch19-20

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

#4001 战役的最后两个 authorable strip 组。引用 #4001,不关闭它。

逐站点判定

文件站点判定依据
data/object.zod.tsObjectAccessConfigSchemaclosedcarrier access;BFS direct;探针:今天静默 strip
data/object.zod.tsLifecycleSchemaclosedcarrier lifecycle;direct;静默 strip
data/object.zod.tsLifecycleSchema.retentionclosed同上,逐路径探针
data/object.zod.tsLifecycleSchema.ttlclosed同上
data/object.zod.tsLifecycleSchema.storageclosed同上
data/object.zod.tsLifecycleSchema.archiveclosed同上
data/object.zod.tsObjectFieldGroupSchemaclosedcarrier fieldGroups[];direct;静默 strip
data/object.zod.tsObjectExternalBindingSchemaclosedcarrier external;direct;静默 strip
data/object.zod.tsObjectSchemaBase.userActionsclosed内联 carrier;静默 strip
data/object.zod.tsObjectSchemaBase.systemFieldsclosed联合的对象分支;静默 strip(⚠️#5014 摊平,见下)
data/object.zod.tsObjectSchemaBase.activityMilestones[]closed内联数组 carrier;静默 strip
data/object.zod.tsObjectSchemaBase.publicSharingclosed内联 carrier;静默 strip
data/object.zod.tsObjectExtensionSchemaclosedcarrier objectExtensions[] + defineObjectExtension;静默 strip
data/object.zod.tsIndexSchemaheld(no posture change)真实的门,但 console 自带的手抄 schema 用 where,spec 声明 partial —— 收紧会 422 console 自己渲染的控件(#5114 类)。#5247 / #5248
ui/app.zod.tsBaseNavItemSchemano posture change成员 spread ...shape 而非 .extend(),九个分支各自已 .strict(),基底模块私有且零 parse —— 关掉是保证的 no-op(#4583)。Class 词汇缺口:#5249

data/object.zod.ts 14 → 1 strip;ui/app.zod.ts 保持 1。全局 authorable strip 29 → 16

测量方法(不是读代码读出来的)

可达性:从 24 个元数据类型根加 ObjectStackSchema 做 BFS(4810 节点 / 25 根),六个具名 schema 全部按身份判定 direct(重叠 1.00),没有一个依赖 #5056 发现的 derived-clone 桥。同一次运行里正负控制都在:ObjectSchema / PageSchemadirect,批 14 的 EmbedConfigSchemaunreachable(重叠 0.00)。

parse 门:单独探针、逐路径验证。今天 ObjectSchema.safeParse顶层 REJECT,而 13 条嵌套路径全部静默 STRIP —— 所以每一次收紧转化的都是实测到的静默丢弃。门本身也断言了:saveMetaItem 的 422(getMetadataTypeSchema('object'))、ObjectSchema.create()defineObjectExtension()

语料网:仓内 102 个 *.object.ts 里 101 个导入通过(唯一失败的是 create-objectstack 模板,依赖解析问题,非校验失败)。ObjectSchema.create() 在模块加载时就跑完整 .parse(),所以这是一次真实语料的全量验证。

批 20 的发现:一个在发布之前抓到的 #5114 类缺陷

IndexSchema 有意保留,这个"不动"是本批的主要产出。

console 为这个形状自带一份手抄 JSON-Schema(objectui metadata-admin/EmbeddedItemEditor.tsxFALLBACK_SCHEMAS.index)——理由正当:index 是内嵌专用子类型,框架没有槽位发布它的 schema。但这份抄件已经漂移:它用 where 表示部分索引谓词,spec 声明的是 partial(枚举里还多了 brin)。

编辑器把表单结果拼回 object.indexes[] 再 PUT 整个对象,saveMetaItem 逐字保留 body 并校验 —— 所以收紧这一个形状会让 console 自己渲染的控件 422。

#5073allowAddTab 不同,这个能力两个方向上都已经死了:driver-sqlsyncDeclaredIndexes 只读 name/fields/unique(ADR-0120 合并后的 DeclaredIndexInput 也是这四个字段),wherepartial 都到不了任何 DDL。这正是"先修生产者"还不够的原因:今天把作者指向 partial,是一条声称超出平台实际交付的 guidance —— 台账 finding 18 记录的正是本战役已经发过的四条假 guidance。所以收紧被门在两件事上:objectui 改名(#5247)+ type/partial 的 ADR-0049 结论(#5248)。

方法上值得记一笔:找到它靠的是逐块 grep 兄弟仓的生产者、再跟着那些会 PUT 回 saveMetaItem 的路径走。#5114 是在 main 上活着被发现的,差别只是这一步机械动作。

批 19:verify 检查结论为否

台账假定成员 .extend() 基底(finding 16 的陷阱)。实际它们 spread ...BaseNavItemSchema.shape,而这是不同的机制 —— 双向实测,因为"关基底会连带关成员"和"关基底是 no-op"互斥:

strictBase.extend({ b }).safeParse({a: 'x',zzz: 1}).success// false —— 继承z.object({ ...strictBase.shape, b }).safeParse({a: 'x',zzz: 1}).success// true —— 不继承z.object({ ...openBase.shape, b }).strict().safeParse({a: 'x',zzz: 1})// false —— 姿态是新对象自己的

九个分支各自已 .strict()(逐分支通过真实的门 AppSchema.navigation 断言,正控制 = 基底贡献的每个键都被接受,含没有任何分支自己声明的 requiresService;负控制 = 未声明键被拒),基底模块私有且零 parse。关掉它是保证的 no-op,而 #4583 明确指出 no-op 收紧并非中性。

Class 单元格未改动,这是刻意的:它是机读的,而八个既有判定词对"既不是门也不是死物"的形状没有一个诚实 —— no door 规定的 ADR-0049 退役在这里是破坏性的(九个分支共享这套键)。加第九个词属于改机读契约,已归档为 #5249 请维护者决策。verify 是唯一对结论不发表主张的既有值,小计因此停在原处。

curation

每条 alias/guidance 都是对 schema 的断言(finding 18),因此逐条锚定到具名的兄弟契约并在测试中断言其正确性(包括"被指向的写法确实能 parse")。

本文件最主要的真实错误是摊平,所以 lifecycle 向下指进拥有该键的子块(maxAgeretentionexpireAfter/fieldttlstrategy/shards/unitstorageafter/to/keeparchive)。这条不只是整洁问题:摊平的 maxAgeretention 缺席,于是 ADR-0057 §3.5 转而以"无界"拒绝该对象 —— 报的是完全不相干的键。

其余 wrong-layer:userActions.sort/search/filter/editInline 指向 ui/view.zod.ts 同名但词汇完全不相交的块;userActions.clone 指向 enable;systemFields.owner 指向 ownership(该块自己的字段文档提到这个键,而 shape 从未声明);external.allowWrites 说明 ADR-0015 的双重 opt-in,并与 datasource.zod.ts 自己的 writable → allowWrites 别名互为镜像;fieldGroups[].fields 说明成员关系的方向(声明在 FIELD 上);objectExtensions[].actions/hooks/listViews 直说 merge 没有槽位。

fieldGroups[] 三个已弃用的 collapse 别名保持接受 —— 收紧一个形状不该把有文档的弃用变成拒绝。

已知并如实钉住的一处

systemFieldsfalse | {…} 联合,拒绝信息是 invalid_union 的裸 "Invalid input"(#5014 摊平),curated 的处方在 issue.errors[1][0].message 里。批 18 的 discriminatedUnion 解法在这里不可用(一个分支是字面量,没有判别键)。没有在收紧批里现发明机制,而是按批 18 的先例如实钉住。本文件其余站点都是普通对象,处方直接出现在顶层信息里。

顺带修复

metadata-authoring-lint.test.ts 的三个 fixture 用 userActions 作为"静默 strip"的样本,收紧后失去主体 —— 这是该文件自己记录过两次的模式。按其惯例更新:两处改断言交接(键不是没被报告,而是被 REJECT),并恢复了那条按位置索引的断言 —— 该测试在 6d 失去主体时留下过指令"若再出现带嵌套数组的 strip 面,恢复这里,别让它第二次失测",object.indexes[] 正好是它。

验证

  • pnpm --filter @objectstack/spec test308 文件 / 7919 测试通过
  • pnpm --filter @objectstack/spec typecheck — 通过
  • pnpm --filter @objectstack/spec check:generated9/9 生成物 up to date
  • pnpm --filter @objectstack/spec check:strictness-ledger — 通过(483 站点,authorable strip 剩 16)
  • pnpm --filter @objectstack/objectql test — 115 文件 / 1839 测试通过
  • pnpm --filter @objectstack/metadata-protocol test — 39 文件 / 348 测试通过
  • 语料:101/102 个 *.object.ts 导入通过

已合并 origin/main(未 rebase),计数按 merge=os-regen 从合并后的树重算(merge 带入 #5221 的 chart 站点,482 → 483)。

三处记录

每个判定都写在三个地方:schema 自身的 JSDoc、pin 测试(object-strictness-batch20.test.ts / app-strictness-batch19.test.ts)、以及台账散文行。两个保留站点的 pin 尤其重要 —— 一个只在散文里解释的"有意打开",和一个没人做完的站点,reverse pin 分辨不出。

Refs #4001. 衍生 issue:#5247#5248#5249


Generated by Claude Code

…19/20)
`data/object.zod.ts` 的顶层自 #1535/#4519/#4522 起就会拒绝未知键,而它下面
的内层块一直是 zod 默认的 `.strip`。这个不对称正是本批的价值所在:一个已经
见过顶层拒绝拼写错误的作者,完全有理由把 `lifecycle: { maxAge: '30d' }` 的
干净解析读作"接受"。object 是本仓作者写入量最大的元数据类型。
批 20 —— 14 个站点关掉 13 个:
- `access`(ADR-0066 D2)、`lifecycle` 及其四个子块(retention/ttl/storage/
archive)、`fieldGroups[]`(ADR-0085)、`external`(ADR-0015)、
`userActions`、`systemFields`、`activityMilestones[]`、`publicSharing`、
`objectExtensions[]`。
- 可达性是实测而非假定:从 24 个元数据类型根加 `ObjectStackSchema` 做 BFS
(4810 节点 / 25 根),每一个都按**身份**判定 `direct`,没有一个依赖
#5056 发现的 `derived-clone` 桥;同一次运行里 `ObjectSchema`/`PageSchema`
为正控制,批 14 的 `EmbedConfigSchema` 为负控制(unreachable,重叠 0.00)。
- parse 门单独探针、逐路径验证:今天顶层 REJECT、13 条嵌套路径全部静默
STRIP,所以每一次收紧转化的都是实测到的静默丢弃,而不是猜测。
⚠️ `IndexSchema` 有意保留,这个"不动"才是本批的发现(#5114 类,这次是在
发布**之前**抓到而不是之后)。console 为这个形状自带了一份手抄 JSON-Schema
(objectui `metadata-admin/EmbeddedItemEditor.tsx`)—— 因为 `index` 是框架
不发布 schema 的内嵌子类型 —— 而这份抄件已经漂移:它用 `where` 表示部分索引
谓词,spec 声明的是 `partial`。编辑器把表单结果拼回 `object.indexes[]` 后
PUT 整个对象,`saveMetaItem` 逐字保留 body 并做校验,所以单独关掉这个形状会
让 console 自己渲染的控件 422。该能力两个方向上其实都已经死了 ——
`driver-sql` 的 `syncDeclaredIndexes` 只读 `name`/`fields`/`unique` ——
这恰恰是必须先修生产者、并给 `type`/`partial` 一个 ADR-0049 结论的原因:
今天把作者指向 `partial`,是一条声称超出平台实际交付的 guidance(finding 18)。
批 19 —— `ui/app.zod.ts` 的 `BaseNavItemSchema`:`verify` 检查结论为否,
不改姿态。台账假定成员 `.extend()` 该基底(finding 16 的陷阱),实际它们
spread `...shape`;两者机制不同,并且双向实测过。九个分支各自已经 `.strict()`,
基底是模块私有且从不 parse,关掉它是保证的 no-op —— 而 #4583 明确指出
no-op 收紧并非中性。`Class` 单元格未改动:它是机读的,而八个既有判定词
没有一个对"既不是门也不是死物"的形状是诚实的,加第九个属于改机读契约。
每条 alias/guidance 都是对 schema 的断言(finding 18),因此逐条锚定到具名
的兄弟契约并在测试中断言;`fieldGroups[]` 三个已弃用的 collapse 别名保持
**接受** —— 收紧一个形状不该把有文档的弃用变成拒绝。
已知并如实钉住的一处:`systemFields` 是 `false | {…}` 联合,拒绝信息是
`invalid_union` 的裸 "Invalid input"(#5014 摊平);批 18 的
`discriminatedUnion` 解法在这里不可用(一个分支是字面量,没有判别键)。
三处记录齐备:schema JSDoc + `object-strictness-batch20.test.ts` /
`app-strictness-batch19.test.ts` + 台账散文行;计数由 os-regen 重新生成。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
merge 带入 #5221 的 chart 站点(482 → 483),计数文件按 merge=os-regen 的
约定从合并后的树重新生成,而不是任何一边的算术。authorable 仍为 16。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
IndexSchema 的保留(生产者漂移 + ADR-0049)与 BaseNavItemSchema 的 Class
词汇缺口都已单独归档,台账行与 schema JSDoc 现在指向 issue,而不是只说
'交给维护者'——一条指不出去的判定,下一个人只能重新测一遍。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
@vercel

vercelBot commented Aug 4, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 4, 2026 12:50pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

107 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 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 @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/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx(via @objectstack/spec)
  • 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 packages/spec)
  • content/docs/kernel/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx(via packages/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 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/spec)
  • content/docs/kernel/services.mdx(via @objectstack/spec)
  • 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/spec)
  • content/docs/plugins/packages.mdx(via @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/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 @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/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/create-vs-edit-form.mdx(via @objectstack/spec)
  • content/docs/ui/dashboards.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.

@xuyushun441-sys
xuyushun441-sys marked this pull request as ready for review August 4, 2026 12:24
@xuyushun441-sys
xuyushun441-sys added this pull request to the merge queueAug 4, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to a conflict with the base branch Aug 4, 2026
…-1) → 15
合并队列以 MERGE_CONFLICT 踢出后重新同步 origin/main(merge,非 rebase)。
#5237(#5073 allowAddTab)与本批从两个不同目录改这份台账,散文行不重叠,
git 干净合并;数字零手改,counts.md 按 merge=os-regen 从合并后的树整体重生成。
重算结果 15 = `ui/` 7 → 6(#5237)+ `data/` 22 → 9(批 20),两边分支都没写过
这个数——正是 #5107 拆分要达到的效果。这一条也补进 data/ 段落:它是第十二次
实例,也是第一次没让任何人付出代价。
#5237 对 `ui/app.zod.ts` 的改动(`apis` 墓碑文案)与本批的 BaseNavItemSchema
判定互不相干,两侧都在;它对 scripts/strictness-ledger.test.ts 的 view 计数
5 也是它自己的领地。
门:spec 308 文件 / 7929 测试通过;typecheck 通过;check:generated 9/9;
check:strictness-ledger 通过(484 站点,authorable 剩 15)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:dataprotocol:uisize/xlteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@xuyushun441-sys@claude