在实施 #5932(补 min/max/minLength/maxLength 的执行)时顺带发现,记录下来交 triage。不在 #5932 的完成范围内 —— #5932 的分诊评论按名点死了那四个键,step 是第五个。
事实
packages/spec/src/system/settings-manifest.zod.ts 的 SpecifierSchema 在同一段注释下声明了三个键:
/** `number` / `slider`: numeric bounds and step. */
min: z.number().optional(),
max: z.number().optional(),
step: z.number().optional(),
#5932 落地后,min / max 在写入路径(validatePatch)与 env 路径
(effectiveEnvOverride)都被执行了。同一行注释下的 step 仍然零读取点 ——
packages/services/service-settings/src/ 里没有任何消费者,superRefine 也不校验它
(不像 min/max 至少查了次序、minLength/maxLength 至少查了次序)。
生产侧目前只有一处声明:packages/services/service-settings/src/manifests/ai.manifest.ts:189
的 temperature(min: 0, max: 2, step: 0.1)。
为什么单独一条,而不是 #5932 的续集
因为它先需要一个产品判断,而不是一段实现。step 有两种读法,导向不同的结果:
我倾向第二种(HTML 语义就是这样,而且 temperature: 0.15 对 AI 服务显然是合法值),
但这是规格判断不是实现细节,所以按 #5932 分诊的同一条界线上报而不自行决定。
影响面
相关
在实施 #5932(补
min/max/minLength/maxLength的执行)时顺带发现,记录下来交 triage。不在 #5932 的完成范围内 —— #5932 的分诊评论按名点死了那四个键,step是第五个。事实
packages/spec/src/system/settings-manifest.zod.ts的SpecifierSchema在同一段注释下声明了三个键:#5932 落地后,
min/max在写入路径(validatePatch)与 env 路径(
effectiveEnvOverride)都被执行了。同一行注释下的step仍然零读取点 ——packages/services/service-settings/src/里没有任何消费者,superRefine 也不校验它(不像
min/max至少查了次序、minLength/maxLength至少查了次序)。生产侧目前只有一处声明:
packages/services/service-settings/src/manifests/ai.manifest.ts:189的
temperature(min: 0, max: 2, step: 0.1)。为什么单独一条,而不是 #5932 的续集
因为它先需要一个产品判断,而不是一段实现。
step有两种读法,导向不同的结果:min + k * step的网格上。那么temperature: 0.15应当在写入时被拒(码表里
invalid_value可用),step就应当照 settings 写入路径只执行 required / options / pattern —— 声明的 min / max / minLength / maxLength 一条都不校验(auth.password_min_length 可被写成 1) #5932 同形补执行。代价:浮点网格判定需要容差策略(
0.1的整数倍在二进制浮点下不精确),这本身是个需要定的规格。
input[type=number]的step属性,告诉控件上下箭头一次走多远,从不表达「其他值非法」。那么它今天的行为就是正确的,不该补执行;
该做的是把注释写清楚,免得下一个人按 ADR-0049「declared ≠ enforced」把它当洞来补。
我倾向第二种(HTML 语义就是这样,而且
temperature: 0.15对 AI 服务显然是合法值),但这是规格判断不是实现细节,所以按 #5932 分诊的同一条界线上报而不自行决定。
影响面
ai.temperature,step: 0.1与min: 0 max: 2并存,而越过网格的值(如
0.15)对下游是完全合法的温度。故按观察类记录(
finding,不入pm:queue),严重度请 triage 定。SpecifierSchema的注释从"numeric bounds and step" 拆开,并在
step上写明它不参与校验 —— 否则 settings 写入路径只执行 required / options / pattern —— 声明的 min / max / minLength / maxLength 一条都不校验(auth.password_min_length 可被写成 1) #5932 的同族记忆会让下一个 agent 再来补一次。
相关
min/max/minLength/maxLength执行(本条的发现上下文)。options表在写入路径上的执行。