Skip to content

refactor(spec)!: 「v17」摘除 connector.rateLimitConfig 出站限流词表 —— 执行引擎不存在 (#4911) - #4947

Merged
xuyushun441-sys merged 2 commits into
mainfrom
claude/issue-4911-connector-ratelimit-retire
Aug 3, 2026
Merged

refactor(spec)!: 「v17」摘除 connector.rateLimitConfig 出站限流词表 —— 执行引擎不存在 (#4911)#4947
xuyushun441-sys merged 2 commits into
mainfrom
claude/issue-4911-connector-ratelimit-retire

Conversation

@xuyushun441-sys

@xuyushun441-sysxuyushun441-sys commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Fixes#4911

父单 #4686 拆向之二(出站半边)。入站半边 #4910 文件面不相交,本 PR 未触碰 shared/http.zod.tsapi/endpoint.zod.tsapi/registry.zod.tssystem/http-server.zod.ts

为什么是「摘除」而不是「接执行」

不是「声明了没人读」,是声明了根本没有引擎——比前者更差一档。

全平台唯一的 token bucket 是 packages/runtime/src/security/rate-limit.ts,它是入站的:dispatcher 拿 request fingerprint 调 consume(key),空桶就 429。出站方向没有任何对应物:四个 provider(connector-rest / connector-openapi / connector-mcp / connector-slack)都不读这个键,也没有可以接上去的缝。

于是 strategy / maxRequests / windowSeconds / burstCapacity / respectUpstreamLimits / rateLimitHeaders 六个旋钮:schema 校验通过、形状精确、作者相信自己已经把对第三方配额的调用速率封了顶——实际什么都没封。这正是 ADR-0049 存在的 false-compliance 类别。没有实现、也没有已承诺的 roadmap,experimental 是没人许过的承诺,absent 才是诚实的处置。词表随未来实现一起回来(implementation-first,#4834 / PR #4878 同向裁决)。

⚠️不要拿 sharedRateLimitConfig 顶替:那是入站限流器(enabled / windowMs / maxRequests),限的是别人打给我们的调用。#4684 正是为这个混淆才把两个名字拆开;conversion 刻意不做这个改写——那会静默改变行为,超出 D2 的无损范围。

退役套件

动作
schemaConnectorSchema.rateLimitConfigretiredKey() 墓碑(ConnectorSchema不是.strict(),直接删就是 ADR-0104 静默剥离)
形状ConnectorRateLimitConfigSchema / ConnectorRateLimitConfig 整体删除;孤儿枚举 RateLimitStrategySchema / RateLimitStrategy 随之删除(#3950:无消费者的导出 schema 会被下一个读到的人当成能力)
墓碑话术#4878 惯例写「整个形状已移除」而非「该键已移除」
ADR-0087 D2connector-rate-limit-config-removed(retiredFromLoadPath: true,surface connector.rateLimitConfig)
ADR-0087 D3挂进 MIGRATIONS_BY_MAJOR[17].conversionIds + rationale 补段
#4684 改名RENAMED_DEFS 条目吸收:同一未发布 major 内 rename-then-delete 复合起来就是 delete
changesetmajor,带 FROM → TO 表

可达性用 BFS 实证,不读散文

gen:schema 的 def 遍历自己给出了答案——authorable-surface.json行同时变 [RETIRED]:

- "integration/Connector:rateLimitConfig",
+ "integration/Connector:rateLimitConfig [RETIRED]",
- "integration/DeclarativeConnectorEntry:rateLimitConfig",
+ "integration/DeclarativeConnectorEntry:rateLimitConfig [RETIRED]",

DeclarativeConnectorEntrySchemaConnectorSchema.superRefine(…),从 stack.zod.tsconnectors: 可达,所以墓碑自动覆盖真作者面。测试里也直接跑了这条路径(见下)。

路线自证:整 def 删除必须在四张 ratchet 上可见

按 skill 的对照表,「整 def 删除」必须看到变化(与「枚举值收窄」的零变化相反)。gen:schema 自己先开火,要求有意删除 manifest key:

❌ 2 previously published schema(s) disappeared from this build:
- json-schema/integration/ConnectorRateLimitConfig.json
- json-schema/integration/RateLimitStrategy.json

删掉这两行后再跑,per-key ratchet 自行判定为 #4650 路径 3:

ℹ️ 1 baseline deletion(s) since 3edff5cf923c carry their own proof (#4650):
- integration/ConnectorRateLimitConfig:* (6 line(s)) — def no longer emitted by this build; whole-schema
removals are adjudicated by json-schema.manifest.json (#2978) and check:api-surface.

⛔ 基线没有手编:6 行是被门禁判定为合法删除后由 gen:schema 整份规范化写出的。

四张 ratchet 逐一自证(零意外新增)

ratchet变化是否精确对应
json-schema.manifest.json−2 defintegration/ConnectorRateLimitConfigintegration/RateLimitStrategy
authorable-surface.json−6 行 / 2 行转 [RETIRED]恰是被删 def 的 6 个 key + 两处嵌入点 ✅
api-surface.json−4 导出ConnectorRateLimitConfig (type) / …Schema (const) / RateLimitStrategy (type) / …Schema (const)
api-surface-signatures.json字节不变构造使然:它按 TypeScript 打印出的样子哈希 defineX 参数,即引用 z.input< typeof ConnectorSchema >,从不结构展开,所以 key 级收窄够不到它;被删的两个 def 也都不是 factory ✅

strictness-ledger

integration/ 不在台账 triaged 目录内,实跑 check:strictness-ledgerPASS 且无行要动——与立单预期一致。liveness 台账同理:connector 不是 registry-rooted 的受治理 metadata type(packages/spec/liveness/ 下无 connector.json),check:liveness PASS。

pin 与 sabotage 实跑

pin 是符号身份断言(runtime 模块命名空间 + compiler-API),不是编译期 Assert< Equal< … > >——#4642 教训:spec 的 tsconfig.json 排除 **/*.test.ts,编译期 pin 是空转文本。

Sabotage 1(载荷最重的一条):只把 TYPE 加回来(export type ConnectorRateLimitConfig = { maxRequests: number };)——类型被擦除,所有 runtime in 检查照样绿:

× no name resolves to two declarations across ./shared and ./integration (types included) 1446ms
AssertionError: expected 'src/integration/connector.zod.ts:829' to be undefined
Test Files 1 failed | 294 passed (295)

Sabotage 2:把键改回活的可选字段(静默剥离形状):

× authoring `rateLimitConfig` is rejected with the prescription, not silently stripped 14ms
× the same rejection reaches `connectors[]` in a stack — the real authoring path 1032ms
× allows deletions that carry their own proof: unreachable def, vanished def, aged-out tombstone …
× fails --check on a hand-edit that changes no key (generated-form mismatch, #4662) …
× a declared def rename is not a deletion: base keys are carried through RENAMED_DEFS …
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 5 ⎯⎯⎯⎯⎯⎯⎯

两次 sabotage 均已回滚,回滚后 295/7361 全绿。

验收扫描(三仓,带阳性对照)

"ConnectorRateLimitConfigSchema""ConnectorRateLimitConfig"rateLimitConfig(裸名)阳性对照
objectstack声明式 0声明式 0无活体作者点邻近活键 retryConfigconnector.zod.ts / authorable-surface.json 均命中
objectui000rateLimit 10 命中、Connector 5 文件——扫描器有效
cloud(只读)001(.changeset/bump-objectstack-*.md,引用 spec CHANGELOG 的散文)connectors 7 命中、rateLimit 3 命中——扫描器有效

声明式判据(^(export )?(const|type|interface) 后接目标名 + 词边界)全部零命中。objectstack 侧残留全部属正常类别:墓碑处方、conversion 定义、pin 断言词、生成的迁移文档(spec-changes.json / protocol-upgrade-guide.md / references)、[RETIRED] 基线标记,以及历史 CHANGELOG / releases / 旧 changeset 的散文。裸名 rateLimitConfig 逐条核对无幸存家族子串误伤。

门禁

  • spec 十道 check:* 全跑(build 先于 check:api-surface):check:generated8/8 up to date;八项 source audit(check:liveness / check:empty-state / check:variant-docs / check:strictness-ledger / check:skill-examples / check:exported-any / check:dual-source-exports / check:react-declaration-parity)全 PASS
  • 全仓 pnpm typecheck:122/122 successful
  • @objectstack/spec test:295 files / 7363 tests passed(合并 origin/main 后复跑)
  • @objectstack/cli test:67 files / 588 tests passed(含 migrate-meta e2e 重放)
  • 三个示例应用 validate 全部 exit 0
  • pnpm check:i18n OK(9 包);check:doc-authoring OK;docs-audit scope OK

未触碰

content/docs/releases/(未改一字);⛔ #4910 的入站文件面。.changeset/pre.json 开工时已确认 mode: pre / tag: rc,未改动。

…te-limit shape (#4911)
ADR-0049 enforce-or-remove: `ConnectorSchema.rateLimitConfig` declared an
outbound throttle that no engine ever applied. The platform's only token
bucket (runtime security/rate-limit.ts) is INBOUND; no connector provider
reads the key and no seam exists that could. Removed rather than kept —
the vocabulary returns with an implementation (#4834 / PR #4878 ruling).
- `retiredKey()` tombstone on `ConnectorSchema.rateLimitConfig` (non-strict
schema — a plain delete would be an ADR-0104 silent strip)
- `ConnectorRateLimitConfigSchema`/`ConnectorRateLimitConfig` and the orphaned
`RateLimitStrategySchema`/`RateLimitStrategy` removed with it
- D2 conversion `connector-rate-limit-config-removed` (retiredFromLoadPath)
+ D3 chain step at major 17
- #4684's RENAMED_DEFS entry absorbed: rename-then-delete in the same
unreleased major is a delete
- baselines updated deliberately (manifest -2 defs, authorable -6 lines +2
[RETIRED], api-surface -4 exports); docs/spec-changes/upgrade guide regenerated
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
@vercel

vercelBot commented Aug 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 3, 2026 5:01pm

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation tests tooling size/l labels Aug 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

@xuyushun441-sys
xuyushun441-sys marked this pull request as ready for review August 3, 2026 17:48
@xuyushun441-sys
xuyushun441-sys added this pull request to the merge queueAug 3, 2026
Merged via the queue into main with commit 64fc6d5Aug 3, 2026
25 checks passed
@xuyushun441-sys
xuyushun441-sys deleted the claude/issue-4911-connector-ratelimit-retire branch August 3, 2026 17:59
xuyushun441-sys pushed a commit that referenced this pull request Aug 3, 2026
Second serial sync. One conflict, the same `automation/` section as last time,
and it arrived exactly as 批 10 predicted in the paragraph it left there.
Resolution — both waves' rows kept, header and subtotal recomputed from the
SURVIVING rows rather than resolved in favour of a side:
surviving rows execution 13 · etl 10 · flow 1 · bpmn-interop 5 · node-executor 4
header 44 (HEAD) / 42 (main) -> 33 strip of 75
subtotal 18 (HEAD) / 16 (main) -> 7 authorable of 33
Both incoming numbers were right against their own branch and wrong against the
merge: mine counted 批 10's deletions as still present, main's counted mine.
That is the third instance in one day of the shape 批 10 wrote down — the header
CONFLICTS and gets attention, while the subtotal line conflicts with nothing and
merges clean while being wrong on both sides. The paragraph is rewritten as a
per-wave table plus the rule stated mechanically, so the next batch does not
have to rediscover it a fourth time. `check:strictness-ledger` arbitrates, and
passes.
Milestone worth noting in the ledger prose: with 批 9 + 批 10 + 批 11 merged,
`automation/`'s authorable strip is **etl.zod.ts alone** (7 sites). The other 26
are wire — including `flow.zod.ts`'s last site `FlowVersionHistorySchema`, which
is why that file still has a row while having 0 authorable left and must not be
read as unfinished work.
os-regen four-step ran in full. The driver deferred `authorable-surface.json`
and `references/integration/connector.mdx` this time (recorded in
os-regen-pending) rather than text-merging them. checkout origin/main for every
`merge=os-regen` path -> install + rebuild spec -> `check:generated --fix`
(regenerated `content/docs/references/**` only) -> assert BOTH waves survive:
批 10's control-flow/state-machine reference pages and its 21
TryCatch/Loop/StateNode/Transition authorable-surface entries coexist with this
branch's `automation/Webhook:_packageId` / `:protection` and its two pages.
The only deletions in the merged artifacts belong to main's own
`connector.rateLimitConfig` retirement (#4911/#4947), not to either batch.
Verification on the merged tree:
check:generated 8/8 · all 8 pure audits PASS
check:strictness-ledger: 42 open file(s) / 289 strip site(s) — counts match
@objectstack/spec 297 files / 7474 tests · tsc --noEmit clean
Part of #4001
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ehu85kbvMcrNTUJjwxvLJ9
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/lteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

「v17」ConnectorRateLimitConfig 出站限流词表按 ADR-0049 摘除 —— 执行引擎不存在(#4686 拆向之二)

2 participants

@xuyushun441-sys@claude