背景
ADR-0104 的 D1(#3429)和 D2(#3432)都已合并。两者的新校验按 ADR 的 R1/R2/R3 纪律都以 warn-first 落地——违规仅告警放行,通过环境开关才转严格,目的是不让历史上静默错配的数据/调用在升级瞬间硬失败:
| 阶段 |
新校验 |
开关(opt-in 严格) |
位置 |
| D1 |
记录写入时,此前完全不校验的类型(单值 lookup/master_detail/user/tree、file 系、location/address/composite/repeater/record/vector)的值形状 |
OS_DATA_VALUE_SHAPE_STRICT_ENABLED=1 |
packages/objectql/src/validation/record-validator.ts |
| D2 |
动作派发时(REST + MCP)声明参数的 required / 值形状 / 未知键 |
OS_ACTION_PARAMS_STRICT_ENABLED=1 |
packages/runtime/src/http-dispatcher.ts |
ADR-0104 明确写了这是过渡态:「The flip to strict-by-default rides a later minor once telemetry is quiet.」本 issue 跟踪这次翻转。
目标
在 warn-first 的告警在生产/dogfood 静默一段(确认没有正当调用被误伤)后,把两个开关翻成默认严格:
前置条件 / 触发时机
- warn-first 已在生产观测「足够久且安静」(具体窗口由维护者定;建议至少覆盖一个发版周期)。
- 两次翻转各走一个后续 minor(不必同一版),互不依赖,可分别评估节奏。
关联
🤖 Generated with Claude Code
背景
ADR-0104 的 D1(#3429)和 D2(#3432)都已合并。两者的新校验按 ADR 的 R1/R2/R3 纪律都以 warn-first 落地——违规仅告警放行,通过环境开关才转严格,目的是不让历史上静默错配的数据/调用在升级瞬间硬失败:
OS_DATA_VALUE_SHAPE_STRICT_ENABLED=1packages/objectql/src/validation/record-validator.tsOS_ACTION_PARAMS_STRICT_ENABLED=1packages/runtime/src/http-dispatcher.tsADR-0104 明确写了这是过渡态:「The flip to strict-by-default rides a later minor once telemetry is quiet.」本 issue 跟踪这次翻转。
目标
在 warn-first 的告警在生产/dogfood 静默一段(确认没有正当调用被误伤)后,把两个开关翻成默认严格:
record-validator.ts的VALUE_SHAPE_STRICT()默认返回true;违规从console.warn变为400 VALIDATION_FAILED(invalid_type)。保留一个关闭逃生阀(如OS_DATA_VALUE_SHAPE_STRICT_ENABLED=0/OS_ALLOW_LAX_VALUE_SHAPE),便于个别环境临时回退。http-dispatcher.ts的actionParamsStrict()默认返回true;REST 违规400、MCP 抛错。同样保留关闭逃生阀。_ENABLED(opt-in)变成 opt-out,考虑用OS_ALLOW_*/OS_SKIP_*形式,并用readEnvWithDeprecation兼容一版旧名)。record-validator.test.ts、D2 的 dogfoodaction-params-contract.dogfood.test.ts目前显式 set 开关才测严格路径——翻转后默认路径即严格)。前置条件 / 触发时机
关联
docs/adr/0104-field-runtime-value-shape-contract.md(D4 rollout、R1/R2/R3)🤖 Generated with Claude Code