Skip to content

fix(spec,service-automation): reconcile notify/http/connector declared config with what the executors read (#4045) - #4210

Merged
os-zhuang merged 2 commits into
mainfrom
claude/amazing-darwin-2z3fab
Jul 30, 2026
Merged

fix(spec,service-automation): reconcile notify/http/connector declared config with what the executors read (#4045)#4210
os-zhuang merged 2 commits into
mainfrom
claude/amazing-darwin-2z3fab

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

#4045 本体 —— 按 issue 结论「先只做 notify / http / connector 这 3 个完全封闭的」落地对账。wait 的判断已由 #4161 单独完成。

notify / http:执行器派生的 Zod + 双向键集对账

connector_action:对账抓到的真实漂移(本 PR 的主要发现)

执行器完全不读 config——契约是声明的兄弟块 FlowNodeSchema.connectorConfig。但描述符发布着一份把 connectorId/actionId/input 声明成 config 键configSchema,而这不是无害的文档错位:

  • objectui 的 FlowNodeInspectorserverFields ?? fieldsForNodeType(...)——发布了 schema 就用 schema 生成表单,且 json-schema-to-fields 把每个字段都根在 ['config', key]
  • 所以连着真实后端时,Studio 的 connector 表单替换掉手写的 connectorConfig 表单(连带 connector/action 选择器一起丢失),把三元组写进执行器永远不读的位置——在线创作的 connector 节点必然以 "connectorConfig.connectorId and .actionId are required" 拒绝执行。Console: screen-flow Submit never calls the resume endpoint — every screen flow is un-completable from the UI #3528 的失效形态,活的。

处置(三件一体):

  1. 描述符不再发布 configSchema,加入 wait/decision/script/subflow 的 deliberately-schemaless 类(config-schemas.test.ts 钉住不许回来)。objectui 零改动自动回落到正确的手写表单。
  2. flow-node-connector-config-lift(ADR-0087 D2,protocol 17,18 退役):把被误教的 config.{connectorId,actionId,input} 抬进声明块,含 registerFlow 再水化缝。带完备性守卫:抬升凑不齐必填的 connectorId+actionId 对就整节点不动——绝不把「注册成功、步骤拒绝」变成「加载失败」。
  3. connectorConfig.input 改为 optional:执行器本来就 input ?? {},设计器的 keyValue 编辑器空映射时整个省略——spec 里的 required 是 declared ≠ read,且把「无输入的 action」变成过 registerFlow 解析失败。

顺手修(一行,会挡住所有人)

check:generated 的账本自检在 main 上就红:#4177 新增的 check:variant-docs 没有分类。已按其性质入 NO_GENERATOR(审计手写文档,无生成器可跑)。

验证

  • spec:274 文件 / 7138 通过(含新 conversion fixture 走 registry 测试)
  • service-automation:42 文件 / 466 通过(含新 ledger 测试、lift 过 registerFlow 缝的执行测试、input-optional 测试)
  • check:generated:8 个生成物全绿(spec-changes / upgrade-guide / api-surface / docs 已按 --fix 精确再生)
  • objectui 侧确认:clientValidationconnector_action 本就是 forward-compat 开放点,无需跨仓库改动

🤖 Generated with Claude Code

https://claude.ai/code/session_01UDhMtxPLLoFaGtdpNA7xTU


Generated by Claude Code

…d config with what the executors read (#4045)

The notify/http/connector step of the declared-vs-read worklist:

- notify/http gain executor-derived Zod contracts (NotifyConfigSchema,
  HttpConfigSchema) written from the executors, not the form literals,
  plus a bidirectional form <-> Zod key-set ledger test. Both reconcile
  clean, with no deliberately-shallow entries.
- connector_action's configSchema is retired: the executor reads only
  the declared FlowNodeSchema.connectorConfig sibling, but the published
  schema declared the trio as config keys - and the schema-driven Studio
  form roots every field at config.<key>, replacing the hand-written
  connectorConfig form, so online authoring produced nodes that refused
  to dispatch. Schemaless drops the designer back onto the correct form.
- flow-node-connector-config-lift (ADR-0087 D2, protocol 17) heals
  stored flows carrying the mis-taught config.{connectorId,actionId,
  input} shape, with a completeness guard so a step-time refusal never
  becomes a load failure.
- connectorConfig.input is optional, matching the executor (input ?? {})
  and the designer's keyValue editor, which omits an empty map.
- check:variant-docs (new in #4177) is classified in the check:generated
  ledger (NO_GENERATOR) - unclassified, it failed every gate run.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UDhMtxPLLoFaGtdpNA7xTU
@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 3:58pm

Request Review

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/service-automation, @objectstack/spec.

106 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/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/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.

…-2z3fab

# Conflicts:
#	packages/spec/scripts/check-generated.ts
@os-zhuang
os-zhuang marked this pull request as ready for review July 30, 2026 16:14
@os-zhuang
os-zhuang merged commit 011b386 into main Jul 30, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the claude/amazing-darwin-2z3fab branch July 30, 2026 16:14
os-zhuang added a commit that referenced this pull request Jul 30, 2026
…config with what the executors read (#4045) (#4228)

Completes the declared-vs-read reconciliation across the flat builtins, after
notify/http/connector in #4210. Six executor-derived Zod contracts land in
automation/builtin-node-config.zod.ts (get/create/update/delete_record, screen
+ its field item, map), each written by READING the executor rather than
transcribing the descriptor literal — so the new bidirectional ledger test is
evidence, not a tautology. Contract exports only; nothing parses with them yet
(step 3b, gated on the #4059 warning data).

Writing them against the executors surfaced seven live capabilities that no
form offered, online or offline — authorable only by hand-written metadata:
get_record.fields (the projection passed into find/findOne), screen.recordId
(the record `mode: 'edit'` opens — the form declared the mode but not its
target), screen.fields[].options/defaultValue/placeholder (all three forwarded
into the ScreenSpec the client renders, so a select field's choices could not
be authored in Studio at all — the same nested repeater position as #3528), and
map.indexVariable/map.input. All are declared on their descriptors now.

map's undeclared `flow` alias went the other route: the executor carried
`cfg.flowName ?? cfg.flow` for a spelling no schema ever described — the
notify.source shape (PD #12). The bare fallback is deleted and
flow-node-map-flow-alias (protocol 17, retires at 18) renames it at load,
including the registerFlow rehydration seam.

assignment is pinned as deliberately un-reconcilable with its reason on record:
with no `assignments` wrapper its top-level config keys ARE the author's
variable names, so no fixed key set describes it and a catchall Zod would
reconcile vacuously. The ledger pins what CAN be pinned — the form offers
exactly the canonical assignments map, and that map stays open.

Every builtin publishing a configSchema is now reconciled against its executor;
those publishing none each have a recorded reason.


Claude-Session: https://claude.ai/code/session_01UDhMtxPLLoFaGtdpNA7xTU

Co-authored-by: Claude <noreply@anthropic.com>
os-zhuang added a commit that referenced this pull request Jul 31, 2026
)

Lands objectui#3082 in the platform — the flow inspector no longer lets a
published `configSchema` delete a node's sibling-block editors (#4045). The
server half of that fix shipped in #4210/#4228; this is what puts the client
half in front of an author.

Scope note for review: the pin was 76 commits stale (96ee72e, and objectui has
been landing steadily), so this advances the vendored console by that whole
range, not by one fix. There is no smaller option — the vendored build is a
snapshot of a single objectui commit, and pinning #3082's own merge commit
instead of the tip would drop only 3 of the 76. The generated changeset
enumerates the range; beyond the #4045 fix it carries real feature and
behaviour work, notably the notification surfaces mounting in the console,
per-displayType notification presentation, the curated page:*/element:*/action:*
SDUI contract, If-Match on form edit saves (409 instead of a silent overwrite),
and searched-list export no longer downloading the unsearched superset.

`packages/console/dist` is gitignored — the release pipeline rebuilds it from
.objectui-sha — so the tracked diff is the pin plus its changeset. The build
was run locally anyway (`scripts/build-console.sh`): it worktrees objectui at
the pinned SHA, builds @object-ui/console, and asserts the framework-client
bundle canary, which is what proves the SHA is actually buildable rather than
merely newer.

Co-authored-by: Claude <noreply@anthropic.com>
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