Skip to content

feat(runtime)!: 动作参数默认严格,opt-in 开关删除(#3438 D2 翻转,17.0 车次) - #4213

Merged
os-zhuang merged 2 commits into
mainfrom
claude/d1-d2-strict-default-flip-vbly5z
Jul 30, 2026
Merged

feat(runtime)!: 动作参数默认严格,opt-in 开关删除(#3438 D2 翻转,17.0 车次)#4213
os-zhuang merged 2 commits into
mainfrom
claude/d1-d2-strict-default-flip-vbly5z

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

执行 ADR-0104 2026-07-30 附录的 D2 决定(#4199 已合并)

三件实现工作的第 1 件,也是唯一有硬截止的一件:changeset pre exit 之前。一旦 OS_ACTION_PARAMS_STRICT_ENABLED 随 GA 上了 latest,「直接删除、不背弃用债」的窗口就永久关闭,此后必须走 readEnvWithDeprecation 兼容一版。

代码变更

- function actionParamsStrict()  → process.env.OS_ACTION_PARAMS_STRICT_ENABLED === '1'
+ function laxActionParams()     → process.env.OS_ALLOW_LAX_ACTION_PARAMS === '1'

- if (actionParamsStrict())  return `Invalid action params: ${summary}`;
+ if (!laxActionParams())    return `Invalid action params: ${summary}`;

违规参数包(缺 required、越出 optionsmultiple/reference 形状错、未声明键)在 handler 运行前被拒:REST 400 VALIDATION_FAILED,MCP 抛错。逃生阀路径仍然每个 action 告警一次——设了它是「容忍漂移」,不是「让漂移重新隐形」。

变量名按 PD #9 与 ADR-0110 D6 采用 OS_ALLOW_*(opt-out)形态。顺带:D6 原文把 OS_ACTION_PARAMS_STRICT_ENABLED 举为"可容忍的 opt-in 例外",本次删除后该规则再无例外可指,已在 ADR-0110 就地更新。

Dogfood 对偶翻转

原来「默认宽松」是每个调用方都会走的路径、而「严格」要设变量才能到达;现在反过来。测试也随之反过来:默认路径成为被证明的那条,而逃生阀——那条没人会设的分支——拿到专门用例,否则它正是会悄悄腐烂的东西。

顺带修掉两处 v17 发版说明的自相矛盾(#3681 遗留)

不是本任务范围,但我的新章节交叉引用了它,就变成了我的问题:

验证

套件 结果
@objectstack/runtime 951 passed
@objectstack/spec 7147 passed
完整 dogfood(真实 HTTP) 425 passed / 3 skipped,零失败
D2 契约 dogfood(翻转后对偶) 3/3
spec 十项生成物闸门 全 PASS

风险面排查:扫了 examples/packages/ 所有投递 param 包的调用点。todo 的 MCP e2e 只调用无 params 声明的动作(complete_task/clone_task;声明了参数的 defer_task 是 modal-only 且未被调用),showcase 测试直接调 handler 绕过 dispatch。完整 dogfood 跑真实 HTTP 全绿,是这条结论最强的证据。

Console 侧(objectui)从声明构造参数包,且 dispatch 自注入的 recordId/objectNameACTION_PARAM_BUILTIN_KEYS 白名单内——R3 里唯一会造成误伤的那半早已关闭,所以现在被拒的确实是写错的。

关联

#3438 剩余两项(os migrate value-shapes 扫描门禁 + 新库创建时记账)不在本 PR,仍在 issue 跟踪。

🤖 Generated with Claude Code

https://claude.ai/code/session_016zgA8CQMJeJbFEjnbib1Uv


Generated by Claude Code

… is gone (#3438)

ADR-0104 D2 landed warn-first behind OS_ACTION_PARAMS_STRICT_ENABLED. The
2026-07-30 addendum decided that window closes in 17.0 rather than 18.0, so
this executes it:

- actionParamsStrict() becomes laxActionParams(): enforcement is the default
  and OS_ALLOW_LAX_ACTION_PARAMS=1 is the only knob — spelled OS_ALLOW_* per
  PD #9 and ADR-0110 D6, which this change also removes the sole cited
  exception from. The opt-in name never reached `latest` (RC-only), so it is
  deleted outright rather than deprecated for a release.
- The escape-hatch path still warns once per action, so opting out tolerates
  the drift instead of hiding it again.
- Dogfood duals are inverted: the DEFAULT path is now what the gate proves,
  and the hatch — the branch nobody sets — is what gets a test so it cannot
  rot unnoticed.

Also corrects three docs the flip falsifies, plus two the earlier #3681 media
work had already left self-contradictory in the v17 notes (the section said
hard rejection arrives only via OS_DATA_VALUE_SHAPE_STRICT_ENABLED two
paragraphs before saying media enforces per verified deployment; the upgrade
checklist prescribed the env var as the way to get there, which would opt in
every value class including the ones with no migration behind them).

Verified: runtime 951, spec 7147, dogfood 425 (+3 skipped) all green; the D2
contract dogfood passes with the inverted duals; all ten spec artifact gates
pass. Swept examples and packages for callers posting param bags — the todo
MCP e2e invokes only param-less actions, showcase tests call handlers
directly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016zgA8CQMJeJbFEjnbib1Uv
@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Jul 30, 2026 4:12pm

Request Review

…efault-flip-vbly5z

# Conflicts:
#	content/docs/releases/v17.mdx
@github-actions github-actions Bot added documentation Improvements or additions to documentation tests protocol:ui tooling size/m labels Jul 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/runtime, @objectstack/spec.

113 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/api/wire-format.mdx (via @objectstack/runtime)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via @objectstack/runtime, packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/runtime, packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/runtime)
  • content/docs/deployment/single-project-mode.mdx (via @objectstack/runtime)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/runtime)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/runtime)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ui size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants