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>
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