Skip to content

automation/ 里还有两处 X / XParsed 未兑现:execution.zod.ts 的七对别名两边都是 z.infer,ScreenFieldConfigParsed #5507

Description

@os-zhuang

发现于 #4963(automation/etl.zod.ts 九个别名翻转为 house convention)的邻域扫描,不在该 PR 范围内。

house convention 见 packages/spec/src/shared/retry-policy.zod.ts 的 JSDoc:裸名 = z.input = 作者写的形状,XParsed = z.infer = parse 之后的形状。flow.zod.ts / control-flow.zod.ts / io-node-config.zod.ts / builtin-node-config.zod.ts 都成对导出并且方向正确。

事实 1 —— packages/spec/src/automation/execution.zod.ts:七对别名两边都是 z.infer

文件底部有一段 // Type Exports 集中声明了七个 *Parsed,但每一个都是 z.infer,而对应的裸名也是 z.infer(分散在各 schema 声明处),于是这七对是纯同义词:

裸名(行)*Parsed(行)两者
ExecutionStepLog (122)ExecutionStepLogParsed (410)都是 z.infer
ExecutionLog (260)ExecutionLogParsed (411)都是 z.infer
FlowRunSummary (194)FlowRunSummaryParsed (412)都是 z.infer
ExecutionError (294)ExecutionErrorParsed (413)都是 z.infer
Checkpoint (327)CheckpointParsed (414)都是 z.infer
ConcurrencyPolicy (358)ConcurrencyPolicyParsed (415)都是 z.infer
ScheduleState (404)ScheduleStateParsed (416)都是 z.infer

这比"根本没有 *Parsed"(#4963 的原状)更容易误导:成对的名字看起来就是约定已经兑现,读者据此假定裸名是作者形状,而实际上裸名仍然是 parsed 形状。

同款构造在 ScheduleState 上完整重现了 #4963 的失败面:它有四个带 .default() 的键(timezone / status / totalRuns / consecutiveFailures,379–392 行)和一个 cronExpression: CronExpressionInputSchema(378 行,transform)。在 z.infer 下四个默认键全部必填、裸 cron 字符串被拒,所以手写一份 ScheduleState 字面量(测试 fixture、seed 数据)编译不过 —— 与 #4963 逐条对应。ConcurrencyPolicy 上另有三个默认键(341/346/351)。

#4963 的关键差别:这里迁移面不为空。service-automationpackages/spec/src/contracts/automation-service.ts 都在消费 ExecutionLog / FlowRunSummary(packages/services/service-automation/src/engine.ts:5,10run-summary.ts:6,31contracts/automation-service.ts:17,256,411,418),而且它们读的都是引擎产出的 parsed 形状 —— 也就是说这些消费点在翻转后需要改成 *Parsed#4963 的"三仓零 importer 所以一次做完"的论证在这里不成立,需要单独裁定翻转 vs. 其它路线。

事实 2 —— packages/spec/src/automation/builtin-node-config.zod.ts:ScreenFieldConfigParsed

ScreenFieldConfig(304 行)是该文件里唯一一个方向正确(z.input)却没有 Parsed 对应物的别名;同文件另外六个(GetRecordConfig / CreateRecordConfig / UpdateRecordConfig / DeleteRecordConfig / ScreenConfig / MapConfig)都成对。纯遗漏,补一行即可。

为什么标 finding 而不是直接排期

今天没有已知的用户命中路径:仓内没有任何文档或示例把这七个名字当作作者字面量来标注(唯一的手写字面量是 contracts/automation-service.test.ts:117const mockRun: ExecutionLog = { … },它写全了键所以照样编译),而现有的消费点读的正是 parsed 形状 —— 也就是说当前裸名的含义恰好是消费者要的。#4963SYNC_ARCHITECTURE.md 三段不可编译的示例作为实证,这里没有对应的实证。

严重度请 PM 复核:#4963 的评审记录提醒过,filing 时刻的严重度判断两个方向都不可靠。事实 2 无论如何都是一行的事。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions