Skip to content

feat(spec)!: reject unknown keys on control-flow + state-machine (#4001 批 10) - #4973

Merged
xuyushun441-sys merged 4 commits into
mainfrom
claude/issue-4001-automation-batch10
Aug 3, 2026
Merged

feat(spec)!: reject unknown keys on control-flow + state-machine (#4001 批 10)#4973
xuyushun441-sys merged 4 commits into
mainfrom
claude/issue-4001-automation-batch10

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Part of #4001 —— automation/ 主体第二波(批 9 = #4925 已落地)。

11 个 strip 站点关闭,两个文件:

文件 站点 schema
automation/control-flow.zod.ts 5 FlowRegion / Loop / ParallelBranch / Parallel / TryCatch
automation/state-machine.zod.ts 6 ActionRef / GuardRef / Transition / StateNode (+.meta)/ StateMachine

台账实测:45 open file(s) / 299 strip site(s)(合并 origin/main 前本分支单独读数 49/314;批 9 的 14 站点合并进来后 = 299)。


一、(p) 的解决 —— 不是形式,差点得出相反结论

两个文件都标 authorable (p),任务书特别点名 state-machine(p) 未解决。核下来这一条几乎翻盘

ADR-0020 把这个 XState 形状作为「记录生命周期声明」退役了 —— 顶层 workflow 元数据类型和 object.stateMachines 都已删除,记录的合法流转改由 state_machine 校验规则data/validation.zod.ts 的扁平 { from: [to] } 表,批 3b 已关)承载。若只有这两扇门,本文件就是死表面,按战役自己的规矩该改分类而不是收紧。

活下来的门只有一扇,而它确实是授权门:ai/agent.zod.tslifecycle 就是 StateMachineSchema,而 agent 是注册元数据类型 —— defineStack({ agents })POST /api/v1/meta/types/agent、Studio agent 表单三条路径全都经 AgentSchema.parse() 到达这里。

**不是读出来的,是 parse 出来的。**收紧前:

AgentSchema.parse({ …, lifecycle: {
  id: 'probe_machine', initial: 'draft', stats: { runs: 3 },
  states: { draft: { onn: { APPROVE: 'done' },
                     meta: { labell: 'Draft', owner: 'ops' } },
            done: { type: 'final' } } } })

成功,返回

{ id, initial, states: { draft: { type: 'atomic', meta: {} }, done: … } }

stats 没了,meta 两个键没了,onn(离 on 一个键位)连同作者声明的每一条流转一起没了。一个全部意义在于「拒绝未声明流转」的声明,被静默清空成零流转,并报告 valid。 这条实测已固化为测试。

control-flow(p) 同样落在执行期 parse(parseNodeConfig#4277)与 validateControlFlow 的区域 parse 上。

二、兄弟守卫 validateControlFlow —— 不打架,原因值得写下来

任务书要求确认二者不冲突。不冲突,因为它们回答的不是一个问题:守卫判结构(single-entry / single-exit / 无环),键闸门判键成员,两者互相都判不了。

它们只在一处相遇,而且是设计上的:validateControlFlow 在分析前对每个 region slot 做 safeParse,所以从本批起,区域的未声明键也在那里浮现,形式是

loop 'c1' body: invalid region — Unrecognized key(s) on this control-flow region: `name`. …
  • A region is not named. Only a `parallel` branch carries a `name` …

守卫的框架(哪个容器、哪个区域、嵌套路径)包着 schema 的处方,没有重复检测,也没有删掉任何东西 —— 守卫值钱的那部分(结构散文)原样保留,它只是不再静默修补自己的输入再去判它。嵌套深度也跟着走(loop 'c1' body → try_catch 'inner' try#4389 的同一条路径)。

一条连带的姿态变化:regionSlotsOfbranches[]ParallelBranchSchema、给其余 slot 选 FlowRegionSchema,原本是保真选择(区域 schema 会 strip 掉 name);两边都 strict 之后变成正确性选择(区域 schema 会拒绝一个合法分支)。同一行代码,赌注变了,已就地改注释并钉测试。

三、两条策展条目是出来的,不是想出来的

1. itemVariable —— 战役自己的 helper 在给出一条自信的错答案

裸的编辑距离建议器对 itemVariable 回答 indexVariable

itemVariable   maxDistance=4 -> ["indexVariable"]

作者要的是当前项,被指向绑定下标的键。照做得到一个变量里装着数字的 loop —— 静默的错误行为,由这场战役的 helper 亲手开出处方。这是账本第 7 条形状的第三例(piimintriggerPhrasetriggerPhrases 之后)。

alias 优先于编辑距离,所以点名即修复。测试把裸建议器的错误答案也一起钉住,删掉 alias 它会立刻回来 —— 这条 alias 不会被后人当冗余清理掉。

2. join / joinGateway 需要两段不同的散文

guidance 每个键逐字输出一条 bullet,共用一个字符串会把同一段话印两遍,读起来像错误本身有 bug。已拆成两条:join 讲隐式 join(ADR-0031 §Decision 2),joinGateway 讲它是 BPMN interop 节点类型(§Decision 5)。

其余策展一律要求仓内证据:guard → cond(schema 自己的 .describe() 就写着 "Condition (Guard)",且 XState v5 正是把 cond 改名为 guard)、label → name 于 parallel 分支(FlowNodeSchema.label 在同一个字面量里的每个 nodes[] 元素上都是必填)、flowName 指回 map 节点、finally 指向容器之后的节点、transitions 指向对象级校验规则、context 讲清它与 contextSchema 不是改名关系(XState 的 context 是初始,这里只声明形状)。

四、StateNode.meta —— 查过 #4909 的开放槽情形,判关闭

XState 惯例把 meta 当开放袋,所以这是本批唯一需要论证而非直接关闭的一处。三条事实指向关闭:

  1. 手写的 StateNodeConfig 类型恰好声明四个 meta —— passthrough 会让 Zod 开着而 tsc 关着,凭空造出一个新的「声明 ≠ 强制」裂口;
  2. 全仓没有任何消费者读任何 meta 键(aiInstructions 除本文件测试外零引用);
  3. 原行为不是开放而是 strip —— 上面的探针里作者的 meta 到达时是 {}

没有需要保留的开放性,只有需要终止的静默。#4909 恰是镜像:那里散文说开放而代码 strip,修法是让代码追上散文;这里代码与类型都说关闭,只有 XState 惯例暗示开放。

五、一个 strip 时代的测试仪器被修好(战役第三类教训)

region-slots.test.ts 的探针把每个候选键一次性喂给每个 schema(给 looptry/catch/branches),靠 .strip 丢弃不属于它的那些。三个容器配置一旦 strict,整个探针 payload 就不再 parse,函数对每个构件都返回 [] —— 一个对账测试报告「没有任何 schema 接受区域」

大声失败了,这也是它在这里只是脚注而不是第四例 finding-3 的唯一原因。修法保持行为式提问不变、去掉对 strip 的依赖:payload 改由 schema 自己声明的键构造,每个构件只被问它真有的 slot。比原来更诚实 —— 原来 loop 会被问 catch,答案读都不读就丢了。同时补了反向的反空洞断言(探针现在读 .shape,读不到就返回 [],所以「空结果」必须意味着「没有区域」而不是「问不出来」)。

parse-config.ts 的文档也就地更正:Unknown keys are NOT this seam's job: Zod's default .strip() drops them silently here 这句从本批起不成立。

六、验证(每条绿色都先证过红)

六处蓄意破坏,逐一观察报红后恢复:

# 破坏 报红
1 删掉 itemVariable alias × Loop: itemVariable is aliased… expected … to contain 'itemVariableiteratorVariable'
2 两条 join 散文改成相同 × Parallel: the two join spellings get DISTINCT prescriptions
3 FlowRegion 退回 z.object 4 红(含两条守卫交互钉)
4 StateNode.metalooseObject × refuses undeclared keys at all three depths + × meta is CLOSED
5 删掉 guard → cond alias 2 红
6 ActionRef union 分支退回 z.object 2 红

台账闸门两个方向都诱发过红: 反向钉(给已关闭文件留行)→ control-flow.zod.ts has NO strip sites left, but still has a row;表头算术 → header says 67 strip, rows sum to 56

十个 check:* 闸门全绿check:generated 8/8,另外 8 个纯检查逐一跑过:liveness / empty-state / react-declaration-parity / skill-examples / variant-docs / strictness-ledger / exported-any / dual-source-exports)。

@objectstack/spec         297 files / 7435 tests passed · tsc clean
service-automation        55 files / 662 tests passed · typecheck clean
lint                      54 files / 980 tests passed
metadata-protocol         33 files / 281 tests passed

**ADR-0087:无需转换。**三个示例应用 validate 全过(showcase 是唯一带真实 loop / parallel / try_catch 节点的那个):

example-showcase  ✓ Validation passed (916ms)
example-crm       ✓ Validation passed (270ms)
example-todo      ✓ Validation passed (224ms)

api-surface.json / authorable-surface.json / spec-changes.json / protocol-upgrade-guide.md 相对 origin/main 零 delta(收紧不增删导出、不增删可授权键)。

七、合并 origin/main:一次「干净的合并不是能用的合并」的实例

批 9(#4925)落地了同一个 automation/ 台账段。两边都删掉各自的行、并按各自的计数减表头 —— 于是 git 把干净合并(不重叠),只在表头冲突;而紧挨其下的 authorable 小计与任何东西都不冲突,干净合并,且在两个分支上都是错的

两个数字单独看都不是失误,各自是对一波删除算出来的。表头因此从存活的行重算(42 strip of 75,authorable 16 of 42),而不是选边,由 check:strictness-ledger 的表头算术裁定 —— 读数 45 open file(s) / 299 strip site(s)

os-regen 四步已走完(merge → 按 .gitattributes 逐路径 checkout origin/main → 整体重生成 → 断言兄弟条目存活)。批 9 的三个参考页与 #4909bulk-action.mdx origin/main 逐字节相同

content/docs/releases/ 零触碰。changeset 为 major,带完整 FROM → TO 迁移表;.changeset/pre.json 复核仍 mode: pre / tag: rc,v17 窗口未关。

八、范围外发现(PD#10,已立案未修)

#4971 —— formatZodError 把 union 分支的拒绝压成 "Invalid input"

zod 对 union 只抛一个 invalid_unionmessage 是字面量 "Invalid input",分支的真实 issue 嵌在 issue.errors[]formatZodError从包根导出,CLI 路径用)只 map 顶层 issue,不下降。同一格式化器、同一类错误的对照:

Transition (plain strictObject) → ✗ (root): … Did you mean `guard` → `cond`?
Action ref  (union branch)      → ✗ (root): Invalid input

处方在 payload 里完好(ZodError.message、REST 错误体都带着),丢的是压成单行的消费者。未在本 PR 修formatZodError 是公开导出,改它会改变全仓每一个 union 的 CLI 输出,不该搭在 spec 收紧 PR 上。批 10 已就地钉住现状(CONTROL — a non-union shape renders its full prescription through formatZodError),修好的那天这条钉会红,提醒把断言翻过来。


🤖 Generated with Claude Code

https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9


Generated by Claude Code

claude added 3 commits August 3, 2026 16:53
…achine (#4001 批 10)

11 strip sites closed across two files:
- control-flow.zod.ts (5): FlowRegion / Loop / ParallelBranch / Parallel / TryCatch
- state-machine.zod.ts (6): ActionRef / GuardRef / Transition / StateNode (+.meta) / StateMachine

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
- strictness ledger: automation/ 67->56 strip (rows for the two closed files
  deleted per the reverse pin), authorable 41->30; both (p) verdicts resolved
  with the evidence that resolved them
- region-slots.test.ts probe rebuilt: it depended on .strip
- parse-config.ts doc corrected: unknown keys are no longer this seam's blind spot
- major changeset with the full FROM -> TO migration table
- regenerated content/docs/references + skill refs (check:generated 8/8)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
批 9 (#4925) landed the same automation/ ledger section. Both waves deleted
their own rows and decremented the section header by their own count, so git
merged the ROWS cleanly and conflicted only on the header — while the
authorable subtotal one line below, which conflicted with nothing, merged
clean while being wrong on both branches. Header recomputed from the surviving
rows (42 strip of 75, authorable 16 of 42) rather than resolved in favour of
either side; check:strictness-ledger's header arithmetic is the arbiter and
reads 45 open files / 299 strip sites.

os-regen four-step run: merge -> checkout origin/main for every path in
.gitattributes -> wholesale regenerate -> assert siblings survived. 批 9's
three reference pages and #4909's bulk-action page are byte-identical to
origin/main.

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

vercel Bot commented Aug 3, 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 3, 2026 5:46pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling labels Aug 3, 2026
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/service-automation, @objectstack/spec.

106 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/service-automation, @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/service-automation, @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/service-automation, @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/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/service-automation, @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/service-automation, @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 3, 2026 18:00
@xuyushun441-sys
xuyushun441-sys added this pull request to the merge queue Aug 3, 2026
Merged via the queue into main with commit 5278e11 Aug 3, 2026
25 checks passed
@xuyushun441-sys
xuyushun441-sys deleted the claude/issue-4001-automation-batch10 branch August 3, 2026 18:11
xuyushun441-sys pushed a commit that referenced this pull request Aug 3, 2026
Second serial sync. One conflict, the same `automation/` section as last time,
and it arrived exactly as 批 10 predicted in the paragraph it left there.

Resolution — both waves' rows kept, header and subtotal recomputed from the
SURVIVING rows rather than resolved in favour of a side:

  surviving rows  execution 13 · etl 10 · flow 1 · bpmn-interop 5 · node-executor 4
  header          44 (HEAD) / 42 (main)  ->  33 strip of 75
  subtotal        18 (HEAD) / 16 (main)  ->  7 authorable of 33

Both incoming numbers were right against their own branch and wrong against the
merge: mine counted 批 10's deletions as still present, main's counted mine.
That is the third instance in one day of the shape 批 10 wrote down — the header
CONFLICTS and gets attention, while the subtotal line conflicts with nothing and
merges clean while being wrong on both sides. The paragraph is rewritten as a
per-wave table plus the rule stated mechanically, so the next batch does not
have to rediscover it a fourth time. `check:strictness-ledger` arbitrates, and
passes.

Milestone worth noting in the ledger prose: with 批 9 + 批 10 + 批 11 merged,
`automation/`'s authorable strip is **etl.zod.ts alone** (7 sites). The other 26
are wire — including `flow.zod.ts`'s last site `FlowVersionHistorySchema`, which
is why that file still has a row while having 0 authorable left and must not be
read as unfinished work.

os-regen four-step ran in full. The driver deferred `authorable-surface.json`
and `references/integration/connector.mdx` this time (recorded in
os-regen-pending) rather than text-merging them. checkout origin/main for every
`merge=os-regen` path -> install + rebuild spec -> `check:generated --fix`
(regenerated `content/docs/references/**` only) -> assert BOTH waves survive:
批 10's control-flow/state-machine reference pages and its 21
TryCatch/Loop/StateNode/Transition authorable-surface entries coexist with this
branch's `automation/Webhook:_packageId` / `:protection` and its two pages.
The only deletions in the merged artifacts belong to main's own
`connector.rateLimitConfig` retirement (#4911/#4947), not to either batch.

Verification on the merged tree:
  check:generated 8/8 · all 8 pure audits PASS
  check:strictness-ledger: 42 open file(s) / 289 strip site(s) — counts match
  @objectstack/spec 297 files / 7474 tests · tsc --noEmit clean

Part of #4001

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
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.

2 participants