Skip to content

feat(spec,automation): graduate the seven flow-node config aliases into the protocol-17 conversion layer (#3796) - #3976

Merged
os-zhuang merged 2 commits into
mainfrom
claude/flow-node-config-aliases-bypass-fsi64y
Jul 30, 2026
Merged

feat(spec,automation): graduate the seven flow-node config aliases into the protocol-17 conversion layer (#3796)#3976
os-zhuang merged 2 commits into
mainfrom
claude/flow-node-config-aliases-bypass-fsi64y

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

关闭 #3796

做了什么

FlowNodeSchema.config 是无约束 record,"哪个键是规范键"过去只存在于执行器的读取代码里——七个废弃别名以两种形态藏在那里:objectobjectNamereadAliasedConfig shim 后面(有警告、有台账),另外六个是裸 ?? 兜底(无警告、无台账、无退役路径)。

按 issue 讨论的结论(当前正处 protocol 17 大版本关口,跳过 shim 过渡阶段),七个别名全部直接毕业进 ADR-0087 D2 转换层,作为 protocol-17 live-window 条目:

转换条目 节点类型 FROM → TO
flow-node-crud-object-alias get_record/create_record/update_record/delete_record objectobjectName
flow-node-notify-config-aliases notify torecipientssubjecttitlebodymessageurlactionUrl
flow-node-script-config-aliases script functionNamefunctioninputinputs

存量流程在加载时(normalizeStackInputAutomationEngine.registerFlow 再水化缝)被改写为规范键并发出结构化 ConversionNotice,零消费者动作;window 于 protocol 18 退役。执行器只读规范键,清空后的 config-aliases.ts shim 随之删除

actionUrl 规范键决定

url/actionUrl 这对存在真实矛盾:notify descriptor 的 configSchema 文档写 url 是规范键,而执行器优先级、测试、示例全部偏向 actionUrl。本 PR 定 actionUrl 为规范:下游全链路已用此名(sys_notification.action_url、渠道分发契约、REST 读模型),且 url 在平台词汇里已有"要调用的 HTTP 端点"(http 节点、webhook)的既定含义。执行器原本就是 actionUrl 优先,选它是零行为变化;descriptor 已修正。

连带变更

  • 迁移链 step17.conversionIds 登记三个条目 + rationale 扩写;spec-changes.json / docs/protocol-upgrade-guide.md 重新生成(drift 检查通过)
  • crud-config-aliases.test.ts 改写为转换缝回归测试;notify/screen 的别名测试改为断言加载层转换
  • packages/lint 两处注释更新为指向转换条目(行为保留:window 期内 lint 可能跑在未转换的原始源上,继续两个键都认是正确的)
  • common-patterns.mdx 两处示例改用规范键(作者侧只发规范键)
  • AGENTS.md PD Add comprehensive test suite for Zod schema validation #12 记录终局:新别名一律直接进转换层,不再有执行器 shim
  • 两个 changeset(含 FROM→TO 迁移映射与一行修复指引)

语义保持验证

  • renameConfigKey 在 canonical 已有值时不改写(canonical wins),与被替换的 cfg.canonical ?? cfg.alias 逐位一致;CRUD fixture 显式覆盖双键并存场景
  • map/subflow/connector_actioninput(各自的规范键)不受影响——转换按 node.type 限定作用域
  • 绕过 registerFlow 直接把 config 递给执行器的调用方不再有别名解析(changeset 已注明)

测试

  • spec 6862 · service-automation 427 · lint 540 · cli 803 全绿
  • 全仓库 pnpm test:132/132 任务通过
  • check:spec-changes / check:upgrade-guide 通过

Refs #3713 #3742 #3754 #3795, ADR-0087.

🤖 Generated with Claude Code

https://claude.ai/code/session_01MFnoExtwnGhNDWXNvn7RKN


Generated by Claude Code

…to the protocol-17 conversion layer (#3796)

FlowNodeSchema.config is an unconstrained record, so the executors were the
only statement of which config key is canonical — and seven deprecated
aliases lived there: object→objectName behind the readAliasedConfig shim,
plus six open-coded ?? fallbacks (notify to/subject/body/url, script
functionName/input) with no warning, no ledger, and no retirement path.

All seven graduate into the ADR-0087 D2 conversion layer as protocol-17
live-window entries (flow-node-crud-object-alias,
flow-node-notify-config-aliases, flow-node-script-config-aliases): a stored
flow authored with an alias is rewritten to the canonical key at load —
normalizeStackInput and the AutomationEngine.registerFlow rehydration seam
alike — with a structured ConversionNotice per rewrite. The executors read
canonical keys only, and the emptied readAliasedConfig shim is deleted.

actionUrl (not url) is the deliberate canonical of its pair, resolving the
contradiction where the notify descriptor documented url as canonical while
the executor precedence, tests, and examples all preferred actionUrl: the
whole downstream chain already uses that name (sys_notification.action_url,
the channel contract, the REST read model), and url elsewhere means an HTTP
endpoint to call. The choice is behaviour-preserving.

Also: step-17 migration chain + regenerated spec-changes.json /
protocol-upgrade-guide.md carry the new entries; PD #12 records the endgame;
common-patterns.mdx now authors canonical keys; lint comments updated to
reference the conversions instead of the deleted shim.

Refs #3796, #3713, #3742, #3754, #3795, ADR-0087.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MFnoExtwnGhNDWXNvn7RKN
@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 12:37am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling size/l labels Jul 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/lint, packages/services, @objectstack/spec.

107 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 @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/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via @objectstack/lint, packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via packages/services, @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/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @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/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • 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/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/audit-service.mdx (via packages/services)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/services, packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/settings-service.mdx (via packages/services)
  • 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/permissions/authorization.mdx (via @objectstack/lint, @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 packages/services, @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/i18n-standard.mdx (via packages/services, @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @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/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.

@os-zhuang
os-zhuang marked this pull request as ready for review July 30, 2026 01:09
@os-zhuang
os-zhuang merged commit a47ac06 into main Jul 30, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/flow-node-config-aliases-bypass-fsi64y branch July 30, 2026 01:09
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 size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants