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-sys xuyushun441-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 的无损范围。

退役套件

动作
schema ConnectorSchema.rateLimitConfigretiredKey() 墓碑(ConnectorSchema 不是 .strict(),直接删就是 ADR-0104 静默剥离)
形状 ConnectorRateLimitConfigSchema / ConnectorRateLimitConfig 整体删除;孤儿枚举 RateLimitStrategySchema / RateLimitStrategy 随之删除(#3950:无消费者的导出 schema 会被下一个读到的人当成能力)
墓碑话术 #4878 惯例写「整个形状已移除」而非「该键已移除」
ADR-0087 D2 connector-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
changeset major,带 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 def integration/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-ledger PASS 且无行要动——与立单预期一致。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 均命中
objectui 0 0 0 rateLimit 10 命中、Connector 5 文件——扫描器有效
cloud(只读) 0 0 1(.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:generated 8/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,未改动。

claude added 2 commits August 3, 2026 16:33
…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

vercel Bot commented Aug 3, 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 3, 2026 5:01pm

Request Review

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

github-actions Bot commented Aug 3, 2026

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 queue Aug 3, 2026
Merged via the queue into main with commit 64fc6d5 Aug 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 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.

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

2 participants