Skip to content

feat(spec)!: 双源 C1 收敛 — WebhookConfig / WebhookEvent 归 ./integration,./api 侧死删 + 改名 OpenApiWebhookEvent (#4572) - #4581

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-4572-webhook-dual-source
Aug 2, 2026
Merged

feat(spec)!: 双源 C1 收敛 — WebhookConfig / WebhookEvent 归 ./integration,./api 侧死删 + 改名 OpenApiWebhookEvent (#4572)#4581
os-zhuang merged 3 commits into
mainfrom
claude/issue-4572-webhook-dual-source

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #4572

#4535 C1:基线 35 条中的 4 条 —— WebhookConfig(Schema) / WebhookEvent(Schema)./api./integration 各有一份不同声明,且是跨形态的(./apiWebhookEventSchema 是 z.object,./integration 的是 z.enum)—— 选错 import 路径连"形状重叠、编译通过"的掩护都没有(#4411 陷阱)。

判真源:三仓 import 语句级扫描

按手册以 import 语句级(非名字出现次数)扫描 framework、/workspace/cloud、objectui(浅克隆,HEAD 022e4c3):

逐字段 diff(判定依据)

WebhookEvent(Schema) —— 两个概念,两种形态:

./api ./integration
形态 z.object z.enum
内容 OpenAPI 3.1 顶层 webhooks定义描述子:name(snake_case)/description/method(默认 POST)/payloadSchema($ref)/headers?/security(hmac_sha256|basic|bearer|api_key) connector 事件类型字符串:record.created/updated/deletedsync.started/completed/failedauth.expiredrate_limit.exceeded
概念 API 文档描述(OpenAPI 3.1 webhooks 节) connector webhook 订阅的事件词表

WebhookConfig(Schema) —— 两个概念,且 ./api 侧已死:

./api ./integration
形状 {enabled=false, events: WebhookEvent[], deliveryConfig{maxRetries=3, retryIntervalMs=5000, timeoutMs=30000, signatureHeader='X-Signature-256'}, registrationEndpoint='/webhooks'} 规范 WebhookSchema(automation).extend(events?, signatureAlgorithm?='hmac_sha256')
概念 REST server webhook 功能配置 connector 的 webhook 订阅配置
消费方 仅自己的单测。未接进 RestServerConfigSchema,也没有任何 runtime 读 REST webhook 配置 ConnectorSchema.webhooks(#3197)+ 单测

处置(逐名判定)

  1. ./api WebhookConfig / WebhookConfigSchema → 死侧删除(手册路线 1,v17 major 窗口)。三仓零消费方、未接线进任何 schema、无 runtime。authorable-surface 的 4 行按 refactor(spec)!: remove the kernel metadata-loader envelope family — 11 names declared twice with different shapes (#4411) #4458/feat(spec)!: contracts 手写 interface 与域内 zod 推导类型收敛(3 簇 11 名,#4535·A3) #4568 先例手工删除(插件 TS 配置类型,非可作者化 metadata 文件 —— 不适用 tombstone / D2 conversion;schema 本体已删,不存在"父 schema 静默剥离"路径,误用者在 import 处编译期即失败,changeset 带 FROM → TO)。
  2. ./api WebhookEvent / WebhookEventSchema → 改名 OpenApiWebhookEvent(Schema)(手册路线 3,先例 [#4535·B] 跨形态同名三条:ShareRecipientType(type≠const)、TransformType(const≠type)、suggestFieldType(双实现 function) #4539 → PR feat(spec)!: 跨形态同名三条收敛 — ShareRecipientType / TransformType / suggestFieldType (#4539) #4571)。它是 OpenAPI 3.1 webhook 描述子,归入 ./api 现有 OpenApi* 家族(OpenApiSpec / OpenApiServer / OpenApiSecurityScheme …);OpenApi31ExtensionsSchema.webhooks 同步改引用,作者可写形状零变化(纯改名,无字段增删,消费方类型不变 —— "收敛 ≠ 无行为变化"逐字段核实过:此处确实无行为变化)。
  3. ./integration 两对保持原名不动,成为裸名唯一属主 —— WebhookConfig/WebhookEvent 在同一域内保持成对语义(config.events: WebhookEvent[]),不再出现"裸名拆到两个域"的新陷阱。回归防护:编译期 pin(typeof import 条件类型,tsc --noEmit 兜底)+ check:dual-source-exports gate 本体(任何一侧再长回裸名即报新增双源)。
  4. json-schema.manifest:api/WebhookConfig 蓄意退休删行、api/WebhookEventapi/OpenApiWebhookEvent(蓄意改名,非静默下架)。

基线

dual-source-exports.baseline.json 恰好删除 gate 点名的 4 行(35 → 31,不多删不漏删):

  • WebhookConfig — [./api (type)] ≠ [./integration (type)]
  • WebhookConfigSchema — [./api (const)] ≠ [./integration (const)]
  • WebhookEvent — [./api (type)] ≠ [./integration (type)]
  • WebhookEventSchema — [./api (const)] ≠ [./integration (const)]

验证

  • pnpm --filter @objectstack/spec build
  • check:dual-source-exports ✅(self-test 通过;4308 名字 / 16 入口,基线 31)
  • check:generated 8/8 up to date ✅(api-surface + reference docs 经 --fix 定向再生,单独 commit;api-surface 净变化:−4 +2)
  • spec typecheck ✅;spec test 287 文件 / 7270 用例全过 ✅
  • 全仓 pnpm build 71/71 ✅、pnpm typecheck 122/122 ✅、pnpm test 132/132(spec 287 文件全过;pin 测试改为编译期后全绿) ✅

Changeset

@objectstack/spec major:两条 FROM → TO 迁移各带一行修法(./api WebhookConfig 删除 → 指向 automation Webhook / integration WebhookConfig 并说明形状差异;./api WebhookEventOpenApiWebhookEvent 或按实际所需形状改从 ./integration import)。不改 content/docs/releases/

范围外发现

🤖 Generated with Claude Code

https://claude.ai/code/session_01M9uWvoEp9CoLzYjNExj9sL


Generated by Claude Code

claude added 3 commits August 2, 2026 08:15
…pi pair removed/renamed, ./integration keeps the bare names (#4572)

The four #4535-C1 baseline rows were the #4411 trap in cross-form: ./api's
WebhookEventSchema was a z.object (OpenAPI 3.1 webhook definition) while
./integration's is a z.enum of connector event types — same names, two
concepts, and which one you got depended only on the import path.

Import-statement-level scan across framework, cloud and objectui:
zero external consumers on either side (each pair's only importer is its
own unit test; cloud and objectui reference neither name).

- api WebhookConfig(Schema): DEAD — wired into nothing, not even
  RestServerConfigSchema; no runtime reads a REST webhook config. Deleted
  (major window). Its authorable-surface lines deleted by hand per the
  #4458/#4568 precedent (plugin-config type, not authorable metadata —
  no tombstone, no D2 conversion).
- api WebhookEvent(Schema): renamed OpenApiWebhookEvent(Schema) — it is
  the OpenAPI 3.1 top-level `webhooks` descriptor and now sits in the
  existing OpenApi* family; OpenApi31ExtensionsSchema wiring updated,
  authored shape unchanged.
- integration WebhookConfig/WebhookEvent: untouched, now sole owners of
  the bare names, so the pair stays one coherent family in one domain.

dual-source-exports.baseline.json: exactly the 4 named rows removed
(35 → 31). json-schema.manifest: api/WebhookConfig retired,
api/WebhookEvent → api/OpenApiWebhookEvent (deliberate rename, not a
silent drop). Changeset: @objectstack/spec major with FROM → TO lines.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M9uWvoEp9CoLzYjNExj9sL
…:generated --fix, 2 proved stale)

api-surface.json: -WebhookConfig(Schema)/-WebhookEvent(Schema) on ./api,
+OpenApiWebhookEvent(Schema). Reference docs: the api/connector.mdx page
(which documented only the removed ./api pair, under a misleading name)
is no longer emitted; rest-server.mdx now documents OpenApiWebhookEvent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M9uWvoEp9CoLzYjNExj9sL
…arrel import timed out under parallel turbo load

typeof import('./rest-server.zod') is type-level only; if a bare
WebhookEventSchema/WebhookConfigSchema export returns, the conditional
type flips to `true` and `tsc --noEmit` fails the false assignment.

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

vercel Bot commented Aug 2, 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 Aug 2, 2026 8:47am

Request Review

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

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @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/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/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/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.

@github-actions github-actions Bot added the size/m label Aug 2, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 2, 2026 08:49
@os-zhuang
os-zhuang enabled auto-merge August 2, 2026 08:49
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 2, 2026
Merged via the queue into main with commit 355e951 Aug 2, 2026
21 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-4572-webhook-dual-source branch August 2, 2026 09: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/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec 双源 C1:WebhookConfig / WebhookEvent —— ./api ≠ ./integration(4 条,#4535 C 组)

2 participants