Repository navigation
Commit 6285203
docs(adr): ADR-0097 records that a held degraded connector instance is not retried (#28161)
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} -->
_Requested by **Elon** · [project
thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9DEG2wPiaWh8SdPykLP6yqhu)_
domain:skills#2 · os-elon-musk · session_016WV4cypdG8XcEafFNG2EFa
Fixes #28038
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:只改 `docs/adr/0097-declarative-connector-instances.md`。在「Upstream
availability」降级小节的三条要点之后加一条 2026-10-30 的修订注(按本 ADR 已有的 `> **Amendment
note (日期, #卡)**` 惯例),原句保留不动;头部 `Amended by` 追加一条对应记录。Status 行不记修订,未改。
- 为什么改:原文说每个降级实例的派发拒绝都写「平台会自动重试」。#27992(PR #28014)和 #27237
之后,有些实例是「挂起」的:重试时遇到配置错误,或上游拒绝了已存储的或写在声明里的凭据。这些实例退避定时器不重试,签名不变的 reconcile
也跳过;只有编辑声明、重新设置凭据或重启才会再试。PR #28037(#28016)已让拒绝文案写明解锁方式。ADR 与运行时不一致,本 PR
补记。
- 风险与回滚:纯文档,零代码。新增 7 个符号锚,`check:adr-symbol-anchors`
全部可解析(2843→2850,symbol 623→630)。回滚即 revert。
- 先看:修订注本身(第三条要点之后),对照 `plugin.ts#scheduleDeclarativeRetry` 的 `!d.held`
过滤与 `builtin/connector-nodes.ts` 的两种拒绝文案。
- 两分钟验证:`pnpm check:adr-symbol-anchors`,预期 exit 0、2850 个锚全部解析。
- 需要你做的:本 PR 改受管规则文本,欠一次契约复审(CONTRACT_REVIEW_TIER);登记册判为 Tier
H(`docs/adr/**`),落地需 GOVERNED_APPROVER 批准。
## What changes
- **A dated amendment note (2026-10-30, #28038)** under the
degraded-instance bullets of "Upstream availability: degrade, don't
die". The first bullet ("a `connector_action` dispatch fails with the
reason and 'the platform retries automatically'") and the third (the
backoff, and "immediately by any reconcile") are kept as written, per
Prime Directive #13; the note says they now hold only for an instance on
the backoff. It records:
- which instances are **held**: a configuration fault first met on a
backoff retry (#27992, `plugin.ts#failDegradedConnectorInstance`), and a
credential its upstream refused when the value is stored in
`sys_connector_credential` or written into the declaration (#27237,
`plugin.ts#holdConnectorForRejectedCredential`);
- that a held instance is not retried: the backoff timer skips it
(`plugin.ts#scheduleDeclarativeRetry`) and so does a reconcile while its
signature is unchanged (`plugin.ts#reconcileDeclaredConnectors`); only
an edit of the declaration, setting the stored credential again (the
row's revision is part of the signature), or a restart re-attempts it;
- the exact refusal wording PR #28037 ships for a held instance
("Dispatch is unavailable until its declaration is edited (or the server
restarts); the platform does not retry it." / "… until credential
'<ref>' is set again …"), anchored at
`builtin/connector-nodes.ts#registerConnectorNodes`,
`plugin-extension-api.ts#describeHold` and
`engine.ts#getConnectorDegradedHold`;
- that an instance on the backoff (an unreachable upstream, a refused
environment or resolver credential) keeps "the platform retries
automatically".
- **`Amended by` header**: one entry for #28038 beside the existing PR
#26798 and #27237 entries. The Status line records no amendments in this
ADR, so it is unchanged.
## Why
#28038 (triage 6521083653): since PR #28014 and #27237 the ADR's
degraded section contradicted the runtime, and PR #28037 (merged
`b59bf60c8`) made the refusal itself say so. Measured on `origin/main`
`27e0bd584`: `scheduleDeclarativeRetry` filters `!d.held`;
`reconcileDeclaredConnectors` `continue`s on `held?.held &&
held.signature === signature`; the two hold sites set `held: true` and
pass a `ConnectorHold` to `registerDegradedConnector`; the dispatch
refusal branches on `engine.getConnectorDegradedHold`.
## Verification
All readings at head `f4345a9d`, in a fresh worktree after `pnpm install
--frozen-lockfile --ignore-scripts` (and `turbo run build
--filter=@objectstack/formula --filter=@objectstack/lint` for the
doc-formula gate).
- `check:adr-symbol-anchors`: exit 0 on base `27e0bd584` (2843 anchors,
623 symbol: 597 declaration / 26 literal) and on head (2850 anchors, 630
symbol: 604 declaration / 26 literal). The 7 new anchors all resolve as
declarations.
- `check:adr-index`: exit 0 (derived; the ADR's title is unchanged).
- `check-governed-merges.mjs --test
docs/adr/0097-declarative-connector-instances.md`: GOVERNED, 1 of 1 path
on the register (Tier H).
- `dispatch-gates --ran`: 21 derived families accounted for, 21 run, 0
NOT-MEASURED. No changeset family is derived (docs only), hence
`skip-changeset`.
<details><summary>dispatch-gates families (21 derived, 21 run)</summary>
```text
node scripts/check-adr-links.mjs :: exit 0
node scripts/check-adr-links.mjs --self-test :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm check:adr-anchors :: exit 0
pnpm check:adr-index :: exit 0
pnpm check:adr-symbol-anchors :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:closed-ceremony-text :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-prior-rulings :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:watch-hint-literal :: exit 0
```
</details>
## Human Minimum
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
(not touched)
- [x] 2. Every name I added uses the casing for its kind. (no names
added)
- [x] 3. No formatter ran. (`pnpm lint` not run: the diff touches no
lintable source, only one ADR .md)
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. A change that publishes carries a changeset, and both
declaration lines are filled in here and in the changeset. (docs only,
publishes nothing: `skip-changeset`)
- [x] 6. `packages/spec` touched: its generated artifacts are
regenerated and committed. (not touched)
- [x] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`.
- [x] 8. Title, body and comments are in English.
- [x] The *Before Submitting* list in CONTRIBUTING.md is done.
---
_Generated by [Claude
Code](https://claude.ai/code/session_016WV4cypdG8XcEafFNG2EFa)_
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_016WV4cypdG8XcEafFNG2EFa
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 3fd4d6b commit 6285203
1 file changed
Lines changed: 28 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
| 8 | + | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
| |||
196 | 196 | | |
197 | 197 | | |
198 | 198 | | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
199 | 226 | | |
200 | 227 | | |
201 | 228 | | |
| |||
0 commit comments