Skip to content

tracking: 翻转 ADR-0104 值形状/参数强校验为默认严格(D1 + D2 warn-first → error) #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

No one assigned

    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