Skip to content

D1 非媒体类型的按部署扫描门禁 + D2 动作参数 17.0 默认严格 —— 证据来源与载体已定于 ADR-0104 2026-07-30 附录(修订版) #3438

Description

@os-zhuang

背景

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 静默一段(确认没有正当调用被误伤)后,把两个开关翻成默认严格:

  • D1:record-validator.tsVALUE_SHAPE_STRICT() 默认返回 true;违规从 console.warn 变为 400 VALIDATION_FAILED(invalid_type)。保留一个关闭逃生阀(如 OS_DATA_VALUE_SHAPE_STRICT_ENABLED=0 / OS_ALLOW_LAX_VALUE_SHAPE),便于个别环境临时回退。
  • D2:http-dispatcher.tsactionParamsStrict() 默认返回 true;REST 违规 400、MCP 抛错。同样保留关闭逃生阀。
  • 环境变量按 Prime Directive [WIP] Create a new release version #9 收敛命名(翻转后主开关语义从 _ENABLED(opt-in)变成 opt-out,考虑用 OS_ALLOW_* / OS_SKIP_* 形式,并用 readEnvWithDeprecation 兼容一版旧名)。
  • 现有 warn-first 测试补上「默认即严格」的对偶用例(D1 的 record-validator.test.ts、D2 的 dogfood action-params-contract.dogfood.test.ts 目前显式 set 开关才测严格路径——翻转后默认路径即严格)。
  • changeset 标注为行为破坏:过去静默放行的畸形值/参数包升级后会 400。发版说明列清两类。
  • 翻转前先跑一遍存量体检:对代表性租户/showcase 采集 warn-first 告警,确认没有需要先修的正当用法(ADR-0104 R1)。

前置条件 / 触发时机

  • warn-first 已在生产观测「足够久且安静」(具体窗口由维护者定;建议至少覆盖一个发版周期)。
  • 两次翻转各走一个后续 minor(不必同一版),互不依赖,可分别评估节奏。

关联

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions