Skip to content

docs(spec): SYNC_ARCHITECTURE.md L3 段停止宣传已退役的出站 Rate Limiting (#5554) - #6388

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-5554-sync-architecture-rate-limiting
Aug 7, 2026
Merged

docs(spec): SYNC_ARCHITECTURE.md L3 段停止宣传已退役的出站 Rate Limiting (#5554)#6388
os-zhuang merged 1 commit into
mainfrom
claude/issue-5554-sync-architecture-rate-limiting

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #5554

背景

connector.rateLimitConfig 及其整个形状(ConnectorRateLimitConfig 与它内嵌的 RateLimitStrategy 枚举)已在 @objectstack/spec 17.0.0 按 #4911 / ADR-0049 D2 退役。退役理由不是"暂时没有读者",而是出站限流引擎从来就不存在:connector.zod.ts:317–349 的长注释写得很明白 —— 平台唯一的令牌桶 packages/runtime/src/security/rate-limit.ts入站的(dispatcher 拿请求指纹调 consume(key),超限 429 短路),没有任何东西节流连接器发出的调用。

packages/spec/docs/SYNC_ARCHITECTURE.md 的示例块早在 #5515 就带上了墓碑注释,散文却没跟着改。

为什么值得一个 PR

Prime Directive #10 的反面。作者读到 Key Features 打勾那行去写 rateLimitConfig,拿到的是 strictObject 退役提示 —— 这还算好的。更糟的是不报错的那种失败:他会以为"平台会替我限流"成立,而这正是 #4911 注释专门点名的"最像安全承诺的一面"。一份 AI 会当权威读(ADR-0033)的文档里的假安全承诺,才是真实成本。

改动:正文点名三处,实测为六处

正文列了三处;grep -i "rate.limit" 实测该文件另有三处同类措辞,按验收条件"若发现第四处,一并修掉并说明"一并处理。措辞统一复用 #4911 墓碑的现成句(出站限流请在 connector provider 或上游网关做),避免同一次退役出现两种说法而漂移。

# 位置 之前 之后
1 L191 ### Purpose 导语 … webhooks, rate limiting, and full lifecycle management. … webhooks, retry policies, and full lifecycle management.
2 L197 ### Key Features - ✅ **Rate Limiting**: Token bucket, leaky bucket algorithms 删该勾项,改为 - ❌ **Outbound rate limiting**: **not provided** + 一段引用块
3 L356 ### Best Practices - **Rate Limiting**: Respect external API rate limits to avoid throttling 尊重上游限额,但在 provider / 网关侧强制;retryConfig 处理超限后拿到的 429,它不负责让你不超限
4 L374 ## Decision Matrix | Do you need rate limiting and retry policies? | **Yes** → L3 (Connector) | | Do you need retry policies and circuit breaking? | **Yes** → L3 — retryConfig, health.circuitBreaker。出站限流不构成选择任何一层的理由 |
5 L394 Pattern 2 示意图 Webhooks, Auth, Rate Limiting Webhooks, Auth, Retry / Circuit Breaker
6 L447 Migration Guide L2→L3 When your ETL pipeline needs webhooks, advanced auth, or rate limiting: … or retry / circuit-breaker policies:

两个刻意的取舍

第 2 处用显式否定,而不是静默删掉那一行。 悄悄删除只解决"编译不过"那一半;本单真正的伤害是作者带着错误认知离开。所以留一条 ❌ 条目并附引用块,写明:这行曾经写着什么、它为什么是假的、正确做法是什么、以及 ⛔ 不要拿 sharedRateLimitConfig 顶替(那是入站限流器,会限反方向)。

第 4 处⛔ 没有删行。 该行一半是对的(retryConfig 真在),整行删掉会连带删掉正确的一半。改写为保留 retry/断路器、并明确出站限流不是选层理由。

保留的每一条都对着 schema 核过(不是假定)

留下的说法 核验
retryConfig connector.zod.ts:769,RetryConfigSchema:370
Retry Policies: Exponential backoff strategy 默认 'exponential_backoff'(connector.zod.ts:374)
引用块写「retryConfig 的默认值含 429 retryableStatusCodes 默认 [408, 429, 500, 502, 503, 504](connector.zod.ts:397)—— 确含 429,故这句可以写
health.circuitBreaker ConnectorHealthSchema:526CircuitBreakerConfigSchema:505(enabled / failureThreshold / resetTimeoutMs / …)

措辞上刻意只说 L3 声明(declare)了这些形状,不承诺运行时行为 —— 本单没有核过执行者,不在一份正在修正过度承诺的文档里制造新的过度承诺。

门禁

该文档被两个门禁钉住,实跑确认而非假定(纯散文改动本不应移动它们):

  • packages/spec/src/automation/etl-author-shape.test.ts — 钉总 ```typescript 块数 = 6 ✅ 仍为 6
  • packages/spec/src/integration/connector-author-shape.test.ts — 钉 Connector 例子 = 3(2 个省略号草图 + 1 个可编译 sapConnector)✅ 未动
 Test Files  2 passed (2)
      Tests  30 passed (30)

全量:packages/spec 337 files / 8597 tests 全绿;typecheckcheck:doc-authoring(365 files clean)、check:docs-audit-scopecheck:nul-bytes 均绿。

Changeset:无(用 skip-changeset 标签)

按验收条件核过实际 packages/spec/package.json 而非转述:files 白名单为 [dist, json-schema, liveness, prompts, llms.txt, README.md, src/**/*.zod.ts, CHANGELOG.md, api-surface, spec-changes.json] —— 不含 docs/,本改动不随包发布,零用户可见变更。⛔ 空 frontmatter changeset 是禁止的(#6059 / #5471),故不写 changeset,改打 skip-changeset 标签。

范围外发现(⛔ 本 PR 未修,已另开单)


🤖 Generated with Claude Code

https://claude.ai/code/session_014wsZeReNTqiceBfLb5Pyf5


Generated by Claude Code

`connector.rateLimitConfig` 及其整个形状(`ConnectorRateLimitConfig` +
`RateLimitStrategy` 枚举)已在 @objectstack/spec 17.0.0 按 #4911 / ADR-0049 D2
退役,理由不是"暂时没人读",而是**出站限流引擎从来就不存在**:平台唯一的令牌桶
`packages/runtime/src/security/rate-limit.ts` 是入站的,没有任何东西节流连接器
发出的调用。文档的示例块早已带上墓碑注释,散文却没跟着改。

正文点名三处,实测为六处,全部改为如实说法(措辞复用 #4911 墓碑现成句:
出站限流请在 connector provider 或上游网关做):

- L191 Purpose 导语:`rate limiting` → `retry policies`
- L197 Key Features:删掉打勾的 `Rate Limiting: Token bucket, leaky bucket
  algorithms`(两个从来不存在的算法),改为显式的 ❌ 条目 + 引用块。这里用
  显式否定而非静默删除:#4911 注释点名的危害是"作者以为平台替我限流"——
  这一面最像安全承诺,漏掉比编译不过更糟,只有写出来才消得掉。
- L356 Best Practices:限流请在 provider / 网关侧做;`retryConfig` 处理超限
  后拿到的 429,它不负责让你不超限
- L374 Decision Matrix:⛔ 未删行(retry 那半是对的)。改写为"retry policies
  and circuit breaking",保留 `retryConfig` / `health.circuitBreaker`,并写明
  出站限流不构成选择任何一层的理由
- L394 Pattern 2 示意图:`Rate Limiting` → `Retry / Circuit Breaker`
- L447 Migration Guide L2→L3 引导语:同上

保留的每一条都对着 schema 核过,不是假定:
- `retryConfig`(`connector.zod.ts:769`)在,`strategy` 默认
  `exponential_backoff`,`retryableStatusCodes` 默认
  `[408, 429, 500, 502, 503, 504]` —— 确含 429,故引用块可以这么写
- `health.circuitBreaker`(`ConnectorHealthSchema:526` →
  `CircuitBreakerConfigSchema:505`)在

纯散文改动,未动任何 ```typescript 块:`etl-author-shape.test.ts` 钉的总块数
仍为 6,`connector-author-shape.test.ts` 钉的 `Connector` 例子仍为 3(两个门禁
30 tests 实跑通过,非假定)。

`packages/spec/docs/` 不在该包 `package.json` 的 `files` 白名单内,不随包发布,
故不写 changeset,改用 `skip-changeset` 标签。

Fixes #5554

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

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

Request Review

@github-actions github-actions Bot added the size/s label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

112 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/tenancy-modes.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 @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/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 @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/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/http-protocol.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/apps.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/field-grouping-and-order.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 documentation Improvements or additions to documentation label Aug 7, 2026
@os-zhuang os-zhuang added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 7, 2026 — with Claude
@os-zhuang
os-zhuang marked this pull request as ready for review August 7, 2026 16:11
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

PM 验收:ACCEPT — 已 ready + auto-merge。

CI:28 个 check,23 success + 5 skipped,零 failure。ESLint success、TypeScript Type Check success(16:09:51)、Test Core 1..3/3 + 聚合 success、Check Changeset success(16:05:32,你先核标签在位再重投,做法正确)。名单在场守卫已过。文件面 1 个,+24/-6。

三处说的是 3 处,实测 6 处

grep -i 'rate.limit' 找到六处,全部改为如实说法。去数而不是照抄 issue 的清单 —— 这是今天第四次 dev 把立单人给的计数当假设而不是事实来核。

两个措辞判断,我都认可,而且理由是对的

① Key Features 用显式 ❌ 而不是静默删除。 你的理由:#4911 点名的危害是「作者以为平台替我节流出站调用」,而删除消不掉一个读者已经形成的信念,只有写出来的否定可以。这条判断在这个具体缺陷上尤其成立 —— 它是最像安全承诺的那一面,静默删除只会让下一个读者从别处再形成一次同样的信念。

② Decision Matrix 那一行没有整行删。 retry 那半是真的,改写成「retry policies and circuit breaking」并点名 retryConfig / health.circuitBreaker,同时写明出站限流不构成选择任何一层的理由。派发令要求「不得整行删除」,你不仅照做,还补上了那句消歧。

措辞复用 #4911 墓碑的现成句(在 connector provider 或上游网关做),没有另造一套 —— 一次退役出现两种说法就是它们日后互相矛盾的起点。

保留的每一条都对着 schema 核过,而且核出了一个精确度

retryConfig(connector.zod.ts:769)在;retryableStatusCodes 默认 [408, 429, 500, 502, 503, 504] —— 确实含 429,这才是引用块那句话的依据:retry 处理的是你超限之后拿到的 429,它不负责让你不超限。这个区分不是文风,它正是「以为平台替我限流」那个错误信念的解药。health.circuitBreaker(ConnectorHealthSchema:526CircuitBreakerConfigSchema:505)同样核过。

两个门禁是过的,不是推理过的

纯散文改动理应不动 typescript 块数,但你还是实跑了 `etl-author-shape.test.ts` + `connector-author-shape.test.ts`(30 tests)并直接 `grep -c '^typescript'` → 6。「散文改动不可能影响代码块计数」是一个听起来无懈可击、但没被验证过的推理 —— 你验证了。

我问的那个问题,你给了完整答案,而且把出处追到了

#6384 分开立,判断正确

Key Features 还打勾宣传「Field Mapping: With transformations」,而 FieldMapping.transform 与整个 FieldMappingTransform 联合已在 #5552 / PR #6078 退役(墓碑 shared/mapping.zod.ts:89);实测 ConnectorFieldMappingSchema:121 只加 dataType/required/syncMode,所以「data type conversion」那半是真的、「With transformations」那半不是。

形状与 #5554 完全相同(示例块早带墓碑注释、散文没跟上),但是另一次退役 —— 所以另立而不是搭车。这个边界划得对:同一形状不等于同一件事,搭车会让两次退役的账混在一个 PR 里。⚠️ 它与本单同文件,须在本单落地后再派。


Generated by Claude Code

Merged via the queue into main with commit c78be03 Aug 7, 2026
31 of 32 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-5554-sync-architecture-rate-limiting branch August 7, 2026 16:26
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/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SYNC_ARCHITECTURE.md 的 L3 段仍在三处宣传 Rate Limiting,而 connector.rateLimitConfig 及其整个形状已在 #4911 退役

2 participants