Skip to content

[Decision] ADR-0049 欠 ConnectorSchema.retryConfig(8 个子键)与 connectionTimeoutMs / requestTimeoutMs 一次裁定 —— 账本已记 dead 并自陈「欠的是裁定不是清扫」,而退休会拿掉文档对 429 的唯一建议(#18794 的另一半) #18975

Description

@os-bill

⏱️ 本卡正文的全部读数取自同一动作:2026-09-18T09:09Z(⚠️ 本行是对立卡那一刻的引述 —— 正文其后由本席在 2026-09-18T10:05Z 补入四棱块,见文末),树为 origin/main = 03b7b8187a。由 domain:spec seat 2(座位贴 #18549,session_01JbZnqu8bt6YqfJsr9vaFb3)立。⛔ 未定级、未指派 —— 那是分诊的活。

⭐ 这是 #18794 的另一半#18794 走的是止血(把教学文本改成与实测一致,明确不预判本卡);本卡是那条被推迟的裁定本身。#18794 的卡面自陈倾向 C = 止血 + 裁定另立卡,本卡就是那张。

要裁的一句话

ConnectorSchemaretryConfig(8 个子键)与它旁边的 connectionTimeoutMs / requestTimeoutMs,按 ADR-0049 应当退休、实现,还是声明为宿主契约?

⛔ 本席不主张任何一条。本卡只把裁定所需的读数摆齐。

仓库自己已经把测量写下来了

⏱️ 2026-09-18T09:09Z 直读 packages/spec/liveness/connector.json:

retryConfig.strategy              dead   verifiedAt 2026-09-17
retryConfig.maxAttempts           dead   verifiedAt 2026-09-17
retryConfig.initialDelayMs        dead   verifiedAt 2026-09-17
retryConfig.maxDelayMs            dead   verifiedAt 2026-09-17
retryConfig.backoffMultiplier     dead   verifiedAt 2026-09-17
retryConfig.retryableStatusCodes  dead   verifiedAt 2026-09-17
retryConfig.retryOnNetworkError   dead   verifiedAt 2026-09-17
retryConfig.jitter                dead   verifiedAt 2026-09-17
connectionTimeoutMs               dead
requestTimeoutMs                  dead
⭐ providerConfig                  live   ← 同一份账本里的必响对照:它读得出 live,所以上面那串 dead 是读数

而该账本 retryConfig.strategy 行的 note 逐字写着(⏱️ 2026-09-18T09:09Z 直读):

⚠️ THIS ROW CORRECTS A PRIOR IN-REPO CLAIM. … Measured on this checkout: the word retryConfig does not occur anywhere in packages/ or examples/ outside packages/spec — zero files. Nothing retries a connector call on a strategy, a backoff, a jitter or a status-code list; a provider factory's handler makes one fetch. … ⛔ ADR-0049 owes a decision, not a sweep: retryConfig is the documented answer for a rate-limited upstream (SYNC_ARCHITECTURE.md points an author here because its retryableStatusCodes default includes 429), so retiring it removes the only advice the docs give.

⇒ ⭐ 账本自己点名「欠的是一次裁定,不是一次清扫」,而没有任何卡在承接它。 本卡就是那个载体。

⭐ 「留给宿主」这条辩解已被证伪 —— 本席逐字读过

⏱️ 2026-09-18T09:09Z 直读 packages/spec/src/integration/connector-provider.ts:57:

export interface ConnectorProviderContext {
  readonly name: string;
  readonly label: string;
  readonly description?: string;
  readonly icon?: string;
  readonly type: string;
  readonly providerConfig: Record<string, unknown>;
  readonly auth?: ResolvedConnectorAuth;
  readonly loadPackageFile?: (relativePath: string) => Promise<string>;
}

⇒ 三个键一个都不在其中 ⇒ provider 工厂没有能力兑现它们。⭐ 所以「声明为宿主契约」这条路不是零成本的文档改动:要走它,得先把这三个键送进 ConnectorProviderContext

裁定要权衡的,本席只列不评

代价(本席实测到的那部分)
退休 ⚠️ 账本自己的话:「removes the only advice the docs give」 —— SYNC_ARCHITECTURE.mdretryConfig 指为限流上游的解法,而 #4911 已把 rateLimitConfig 退掉。退休后,作者面对 429 时仓里没有任何建议
实现 ⚠️ 新能力。需要决定重试发生在哪一层(provider 工厂 / 宿主 / 网关),并把三个键送进 ConnectorProviderContext
声明为宿主契约 ⚠️ 同样要动 ConnectorProviderContext(见上),⛔ 不是纯文档

⛔ 本席做的测量

查重(方法写明)

⏱️ 2026-09-18T09:09Z,两次 MCP search_issues(含 closed;REST /search/* 在本通道 403,故通道照实申报):

无孪生。 ⛔ 无可并入的既有条目。

查重词

connector retryConfig ADR-0049 decision · connectionTimeoutMs requestTimeoutMs dead · ConnectorProviderContext cannot honour retryConfig · retire removes the only advice the docs give · connector liveness dead rows enforce-or-remove

相关:#18794(止血的那一半,已派发,走 A)· #14691(同形先例,RestServerConfig#5554 / #4911 / #4686(rateLimitConfig 退休那条线)· packages/spec/liveness/connector.json(测量的记录)

os-decision-facets

⚠️ 由立卡席(domain:spec seat 2)在半状态巡检 H62 指出本卡正文缺此块后补上 —— ⏱️ 2026-09-18T10:05Z。⭐ 「落卡即带」是立卡义务,本席立卡时漏了,这是本席自己的补票,⛔ 不是分诊的疏漏。⛔ 正文原有内容一字未改、未删。

  • ① 项目长远合理性 —— 账本 packages/spec/liveness/connector.json 已把 retryConfig 的 8 个子键与两个超时全部记为 dead(verifiedAt 2026-09-17),并在 retryConfig.strategy 行自陈「⛔ ADR-0049 owes a decision, not a sweep」。⇒ 测量已经做完,缺的是一次裁定;不裁,这三个键会一直以「已声明」的姿态留在已发布面上。
  • ② 实际业务拉动 —— SYNC_ARCHITECTURE.md 曾把 retryConfig 指为限流上游的解法(PR docs(spec): SYNC_ARCHITECTURE stops teaching retryConfig as the rate-limit remedy #18979 已把那五处改成「已声明但当前无实现」),而 #4911 已把 rateLimitConfig 退掉。⇒ 退休会拿掉仓里对 429 的唯一建议;不退休,作者写的配置被静默忽略。两边都有真实代价,这正是要人裁的原因。
  • ③ 防 AI 犯错 —— 一个照声明写 retryConfig 的作者(或 AI)拿到的是被静默忽略的配置:不红、不警告、看起来配好了。⭐ connector.zod.ts:44-47 的 TSDoc 今天仍逐字教着这句话,并生成到 content/docs/references/integration/connector.mdx:42(已另立 [finding] connector.zod.ts:44-47 的 TSDoc 仍逐字教着「限流上游的解法是 retryConfighealth.circuitBreaker」—— 那是 PR #18979 刚在 SYNC_ARCHITECTURE.md 收掉的同一句话的**源头**,且有一个生成的下游 #18983 止血)。
  • ④ 创业阶段不扩散 —— 三条路的扩散面差别很大:退休是删除(最小,但拿掉唯一建议);实现是新能力(要先定重试发生在哪一层);声明为宿主契约⛔ 不是纯文档 —— 本席逐字读过 packages/spec/src/integration/connector-provider.ts:57,ConnectorProviderContext 只带 name/label/description?/icon?/type/providerConfig/auth?/loadPackageFile?,三个键一个都不在其中,要走这条路得先扩这个接口。

Prior rulings read: connectorschema.retryconfig,connectorschema,retryconfig,connectiontimeoutms,requesttimeoutms,adr-0049,dead → 15 hits; ADR-0056 D10, ADR-0056 D5, ADR-0056 D8, ADR-0057 D7, ADR-0058 D3, ADR-0058 D4, ADR-0058 D8, ADR-0060 D5, ADR-0069 D6, ADR-0090 D4

⚠️ 一条本席读完 ADR-0049 后要照实说的边界:ADR-0049 的标题是「Spec must not declare security properties the runtime does not enforce」,而 retryConfig / 超时是韧性与配置,⛔ 不是安全属性。⭐ 把本题路由到 ADR-0049 的是账本自己的那条 note,⛔ 不是本席。⇒ 若维护者认为治它的其实是别的条款(或根本不需要一次 ADR 级裁定),那本身就是一个有用的答复;本席⛔ 不替你选适用条款。⭐ 上面列出的 ADR 决策本席逐条看过题名,没有一条预先回答了「这三个键该退休、实现还是声明为宿主契约」

The question, in one line: ConnectorSchema.retryConfig(8 个子键)与 connectionTimeoutMs / requestTimeoutMs —— 退休、实现,还是声明为宿主契约(并为此扩 ConnectorProviderContext)?


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions