feat(spec,automation): publish executor-derived config contracts for the schemaless flow nodes (#4278) - #4325
Merged
Conversation
…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
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 2 package(s): 107 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
… 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
os-zhuang
marked this pull request as ready for review
July 31, 2026 06:35
…es-designer-forms-y1g7q0 # Conflicts: # packages/services/service-automation/src/builtin/screen-nodes.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
关闭 #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文档中记录。测试与生成物
sms失败信息精确列出发布集合;Zod 接受三种规范 authoring 形态;subflow 转换在 registerFlow 缝生效。@objectstack/specminor +@objectstack/service-automationpatch,含flow→flowName的 FROM→TO 与一行修法。🤖 Generated with Claude Code
https://claude.ai/code/session_01Ki9WjmmSY19koz9hNkeL1P
Generated by Claude Code