Skip to content

feat(spec)!: 删除 per-provider connector "模板"簇 —— 已被否决架构的 2672 行残留,零消费者 (#4480) - #4500

Merged
os-zhuang merged 1 commit into
mainfrom
claude/datasource-config-validation-i7wdmo
Aug 1, 2026
Merged

feat(spec)!: 删除 per-provider connector "模板"簇 —— 已被否决架构的 2672 行残留,零消费者 (#4480)#4500
os-zhuang merged 1 commit into
mainfrom
claude/datasource-config-validation-i7wdmo

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes #4480

从一个字段到一个簇

#4480 立案时是一个死字段:DatabaseConnector.readReplicaConfig#4468datasource.readReplicas 时发现的读副本第二处声明)。issue 自己写了先决条件:"先确认 DatabaseConnectorSchema 整体的活性,别一个字段一个字段地拆。"

确认的结果:整个 integration/connector/* 目录 —— 6 个 schema、2672 行、~110 个导出 —— 零消费者。

  • engine.registerConnector() 校验的是 connector.zod.tsConnectorSchemaengine.ts:1379),从来不是模板
  • stack 的 connectors: 集合走 DeclarativeConnectorEntrySchemastack.zod.ts:395),也不是模板
  • 全仓(含 objectui)没有任何 import 指向六文件中的任何一个 —— 连同模块的活半边都不引用它们

为什么是"删"而不是"接上"

这不是没做完的功能,是已分胜负的架构之争里输掉的那一方,而裁决就写在同目录活文件的头注释里:

  • ADR-0023 明确否决了"在 schema 里手工建模每个外部系统的形状"("rejected re-inventing OpenAPI inside this schema")
  • ADR-0097 的活协议走反方向:一个 ConnectorSchema,provider 形状来自 provider 自己 —— connector-openapi 从 OpenAPI 文档物化实例,connector-mcp 从 MCP server 物化

模板把 Postgres/S3/GitHub/RabbitMQ/Vercel 的形状硬编码进没人读的 spec 文件,而且在与活平台重叠处语义就是错的:DatabaseConnectorSchema 建模"要同步的 tables"+ CDC + readReplicaConfig —— 后者把读副本路由第二次声明出来,精确到一个不存在的负载均衡器的 weight 字段。外部数据库接入是 datasource federation(ADR-0015),是活的,而且不是 connector。

留着的危害即 #3950 先例:下一个人 grep 到 FileStorageConnectorSchema 会以为平台支持 S3 连接器,然后在死代码上盖楼。

删除清单

改动
源码 integration/connector/ 整目录(6 zod + 6 test);integration/index.ts 六行 export,模块头注释改为记录这次决定和 ADR 线索
manifest json-schema.manifest.json 有意删 47 条(gen:schema 棘轮的文档化退休路径)
authorable-surface 有意删 365 行(gate (a) 的 strict-removal 绊线,整簇版)
api-surface 从重建的 dist 重新生成
文档 6 页 connector-* 参考页删除;另有 3 页(references/integration/ 下的 message-queue/object-storage/tenant全部内容都在文档化已删文件的导出(逐页验证过),随 gen:docs 一并消失;章节 meta/index 重新生成;references/index.mdxquick-reference.mdx 的手写表格改写为单一活协议(计数 139→133、175→169)
PROTOCOL_MAP.md 六行折叠进 connector.zod.ts 一行 —— 这个面是 protocol-map.test.ts 的链接存在性测试抓出来的,不是我记得的
release notes v17 dead-clusters 表新增一行
changeset major,含"无迁移"的理由:这些 schema 从未校验过任何存储元数据,没有 stack 源可改写,所以没有 D2 conversion 可注册 —— 迁移面是 TypeScript import,changeset 给了 before/after

验证

check:liveness / empty-state / authorable-surface / docs / api-surface /
spec-changes / upgrade-guide / skill-refs / skill-docs / skill-examples /
strictness-ledger        —— 全部 PASS
  • @objectstack/spec — 280 files / 7078 tests passed(含 protocol-map 链接测试,先红后修)
  • @objectstack/service-automation — 609 tests passed —— 这是关键回归面:它是 @objectstack/spec/integration 的真实消费者,609 全绿证明 ADR-0097 活路径未被触碰
  • @objectstack/cli — 689 tests passed
  • tsc --noEmit PASS

后续(已开,未指派)

#4499 —— 定级时发现 "connector" 在 spec 里其实被声明了三次automation/trigger-registry.zod.ts 还有第三份自成体系的 ConnectorSchema 簇(~440 行,同样零运行时消费者),且 connector.zod.ts 的头注释还在教用户"什么时候选它"。没并进本 PR:那个文件混着可能被 flow 侧使用的 trigger-registry 导出,需要逐个甄别,塞进来会把单一叙事的删除变成两场审计。


Generated by Claude Code

)

BREAKING CHANGE: @objectstack/spec/integration no longer exports the six
per-provider connector schemas — DatabaseConnectorSchema,
FileStorageConnectorSchema, GitHubConnectorSchema, MessageQueueConnectorSchema,
SaasConnectorSchema, VercelConnectorSchema — nor their ~100 sub-schema/type/
example exports (2,672 lines). The six generated reference pages go with them.

#4480 started as one dead key (DatabaseConnector.readReplicaConfig, found
while removing datasource.readReplicas in #4468) and scoped out to the whole
cluster: zero consumers for all six schemas. Nothing in the monorepo imported
any of them — not the automation engine (engine.registerConnector validates
against ConnectorSchema from connector.zod.ts, engine.ts:1379), not the
`connectors:` stack collection (DeclarativeConnectorEntrySchema), not even
their own module's live half.

They were the losing side of a decided architecture fight, left standing.
ADR-0023 rejected hand-modelling each external system's shape inside the spec;
ADR-0097's connector protocol does the opposite — provider shapes come from
the provider itself (connector-openapi materializes instances from an OpenAPI
document, connector-mcp from an MCP server). The templates hardcoded
Postgres/S3/GitHub/RabbitMQ/Vercel shapes nothing would ever read, and were
semantically wrong where they overlapped the live platform:
DatabaseConnectorSchema modelled "tables to sync", CDC, and readReplicaConfig
— read-replica routing declared a SECOND time, down to a `weight` field for a
load balancer that does not exist. External-database access is datasource
federation (ADR-0015), which is live and is not a connector.

The removal kit:

- integration/index.ts: six export lines removed; module header now records
  the decision so the next reader finds the ADR trail, not a gap
- json-schema.manifest.json: 47 entries deleted deliberately (the gen:schema
  ratchet's documented retirement path)
- authorable-surface.json: 365 lines deleted deliberately (gate (a)'s strict-
  removal trip wire, whole-cluster edition)
- api-surface.json regenerated from the rebuilt dist
- docs: six connector-* reference pages deleted, plus three sibling pages
  (message-queue/object-storage/tenant under references/integration) whose
  entire content documented deleted-file exports; section meta + index
  regenerated; hand-written tables in references/index.mdx and
  getting-started/quick-reference.mdx rewritten around the one live protocol
- PROTOCOL_MAP.md: six rows collapsed into the connector.zod.ts row (the
  protocol-map link test is what caught this surface)
- v17 release notes: dead-clusters table row
- changeset: major, with the no-migration rationale (these schemas validated
  no stored metadata, so there is no D2 conversion to register — nothing to
  rewrite)

No runtime behaviour changes: the ADR-0097 path — ConnectorSchema,
DeclarativeConnectorEntrySchema, the provider contract, connector-descriptor,
connector auth — is untouched, which the service-automation suite (609 tests)
confirms.

Follow-up filed: #4499 — automation/trigger-registry.zod.ts carries a THIRD
declaration of the same business need (its own ConnectorSchema cluster, ~440
lines, zero runtime consumers; the engine imports integration's schema).
Kept out of this PR: that file mixes the dead cluster with trigger-registry
exports that need individual verdicts.

Closes #4480

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

vercel Bot commented Aug 1, 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 1, 2026 12:32pm

Request Review

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

github-actions Bot commented Aug 1, 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.

@os-zhuang
os-zhuang added this pull request to the merge queue Aug 1, 2026
Merged via the queue into main with commit b4487aa Aug 1, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the claude/datasource-config-validation-i7wdmo branch August 1, 2026 13:01
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/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DatabaseConnector.readReplicaConfig 是读副本的第二处死声明(ADR-0049 enforce-or-remove,#4468 收尾发现)

2 participants