Skip to content

feat(spec,automation): publish executor-derived config contracts for the schemaless flow nodes (#4278) - #4325

Merged
os-zhuang merged 4 commits into
mainfrom
claude/schemaless-nodes-designer-forms-y1g7q0
Jul 31, 2026
Merged

feat(spec,automation): publish executor-derived config contracts for the schemaless flow nodes (#4278)#4325
os-zhuang merged 4 commits into
mainfrom
claude/schemaless-nodes-designer-forms-y1g7q0

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

关闭 #4278 的 objectstack 半边(objectui 半边:objectui 同名分支的配套 PR)。

问题

五个内置节点有意不发布 configSchema(config-schemas.test.ts 钉住),它们在 Studio 的表单只存在于 objectui 手写的 FLOW_NODE_CONFIG 表里——而那张表和执行器之间没有任何对账。#4278 查实了 script 的漂移:表单声明无人读的 outputVariables、提供两个必然失败的选项(sms/notification)、默认项 code 是 no-op,而唯一能跑的 function/inputs/outputVariable 路径无法授权。

改动

spec 发布执行器派生的 config 契约(新模块 automation/schemaless-node-config.zod.ts,纯契约导出,引擎不用它 parse):

  • ScriptConfigSchema / SubflowConfigSchema / DecisionConfigSchema(+ DecisionConditionSchema)——从执行器读出来写的,不是抄表单;objectui 侧新增测试将手写表与这些导出做双向键集对账(同 builtin-node-form-zod-ledger.test.ts 的模式,跨仓库经由已有的 @objectstack/spec 依赖)。wait/connector_action 无需新 schema:契约就是 FlowNodeSchema 的 sibling 块。
  • SCRIPT_BUILTIN_ACTION_TYPES(['email','slack'])与 SCRIPT_INVOKE_FUNCTION_ACTION_TYPE——script 执行器改由该常量构建分发集合,表单选项、分发集合、失败信息三者从此不可能不一致。

subflow 未声明别名毕业(PD #12,map.flow 同款路径):执行器裸回退 cfg.flowName ?? cfg.flow 删除,新增 ADR-0087 D2 转换 flow-node-subflow-flow-alias(协议 17 活跃窗口,18 退役),含 AutomationEngine.registerFlow 再水化缝的测试。这是给 SubflowConfigSchema 一个诚实契约的前提——别名进转换层,而不是进契约。

decision 审计结论(#4278 遗留项):表单与执行器对齐(conditions[] 的 label/expression;target 列是 flow-decision-edges 派生的虚拟列,不落库);遗留单数 condition 仅存量渲染,decision 执行器不读它。已在 DecisionConfigSchema 文档中记录。

测试与生成物

  • service-automation 487、spec 7139、cli 628 全绿;turbo 全仓 108/112(其余 4 个为双套件并行导致的资源竞争偶发,单独重跑均绿)。
  • 新钉住:每个已发布内置 actionType 走 builtin 分支;sms 失败信息精确列出发布集合;Zod 接受三种规范 authoring 形态;subflow 转换在 registerFlow 缝生效。
  • 8 个生成物 gate 全部通过(api-surface / docs / spec-changes / upgrade-guide / authorable-surface 等已再生)。
  • changeset:@objectstack/spec minor + @objectstack/service-automation patch,含 flowflowName 的 FROM→TO 与一行修法。

🤖 Generated with Claude Code

https://claude.ai/code/session_01Ki9WjmmSY19koz9hNkeL1P


Generated by Claude Code

…the schemaless flow nodes (#4278)

The descriptor-schemaless builtins (decision/script/subflow/wait/
connector_action) deliberately publish no configSchema, so their Studio
forms live only in objectui's hand-written FLOW_NODE_CONFIG table — and
nothing reconciled that table against the executors. Publish the
machine-readable half of that reconciliation from spec, written from the
executors, not from any form:

- automation/schemaless-node-config.zod.ts: ScriptConfigSchema /
  SubflowConfigSchema / DecisionConfigSchema (+ DecisionConditionSchema),
  plus SCRIPT_BUILTIN_ACTION_TYPES and SCRIPT_INVOKE_FUNCTION_ACTION_TYPE.
  Contract exports only — no engine path parses node config with them.
  wait / connector_action need no new schema: their contracts are the
  existing FlowNodeSchema sibling blocks.
- The script executor now builds its dispatch set from the published
  constant, so the designer's options, the dispatch set, and the "not a
  built-in action" failure message cannot disagree. New pins: every
  published action type runs the built-in branch, the failure message
  names exactly the published set, and the Zod accepts the canonical
  authoring shapes.
- subflow's undeclared `flow` alias graduates into the ADR-0087 D2
  conversion layer (flow-node-subflow-flow-alias, protocol 17, live
  window) and the bare `cfg.flowName ?? cfg.flow` executor fallback is
  deleted (PD #12 — the map.flow path). Proved at the registerFlow seam.

objectui's flow-node-config.spec-reconciliation test is the other half:
it compares the hand-written form groups against these exports, closing
the cross-repo seam #4278 documented (script offered three broken
options and could not author the function path that works).

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

vercel Bot commented Jul 31, 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 31, 2026 6:56am

Request Review

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

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/service-automation, @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 @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/service-automation, @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via 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/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/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/service-automation, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @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/service-automation, @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 @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/service-automation, @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/service-automation, @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.

claude added 2 commits July 31, 2026 06:06
… ledger (#4278)

The strictness-ledger gate requires every new *.zod.ts with z.object sites
under a triaged directory to carry a Class verdict. The new module's four
sites are authorable (the #4045 node-config family, third panel), with the
drift check living in objectui's cross-repo reconciliation test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ki9WjmmSY19koz9hNkeL1P
…es-designer-forms-y1g7q0

# Conflicts:
#	packages/services/service-automation/src/builtin/screen-nodes.ts
@os-zhuang
os-zhuang merged commit 667b83e into main Jul 31, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the claude/schemaless-nodes-designer-forms-y1g7q0 branch July 31, 2026 07:08
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