docs(spec): the connector header no longer teaches retryConfig as the rate-limit remedy - #19040
Merged
os-bill merged 3 commits intoSep 18, 2026
Merged
Conversation
The `connector.zod.ts` L3 header still taught that `retryConfig` (with its `retryableStatusCodes` `429` default) and `health.circuitBreaker` are what L3 declares for a rate-limited upstream. Both keys parse and store, and nothing reads either: `packages/spec/liveness/connector.json` records every `retryConfig` sub-key and every `health.circuitBreaker` sub-key as `dead`. Replace that one sentence with the wording PR #18979 landed for the same claim in `packages/spec/docs/SYNC_ARCHITECTURE.md`: declared but currently unimplemented, pointing at the liveness ledger, and explicitly neither retired nor left to the host. Prose only; no schema, declaration or accept set moves. Claude-Session: https://claude.ai/code/session_01JbZnqu8bt6YqfJsr9vaFb3 Co-authored-by: Claude <noreply@anthropic.com>
…eset `gen:docs` propagates the corrected header paragraph into `content/docs/references/integration/connector.mdx`; the generated page is not hand-edited. The changeset is a `patch` on `@objectstack/spec` because `src/**/*.zod.ts` is in that package's `files[]` and the edited file is present in the published tarball, so the corrected text reaches consumers. Claude-Session: https://claude.ai/code/session_01JbZnqu8bt6YqfJsr9vaFb3 Co-authored-by: Claude <noreply@anthropic.com>
…nnector-tsdoc-declared-unimplemented
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 136 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Sep 18, 2026
os-bill
marked this pull request as ready for review
September 18, 2026 13:54
os-bill
deleted the
claude/issue-18983-connector-tsdoc-declared-unimplemented
branch
September 18, 2026 14:42
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #18983
Clause-②: no
What moves
One sentence of the connector header TSDoc in
packages/spec/src/integration/connector.zod.ts, plus the reference pagegen:docsrenders from it. Prose only. No schema, declaration, default or accept set moves, and the fate of these keys stays ADR-0049's to rule on rather than being prejudged here.The header ended its "no outbound rate limiting" paragraph by naming a remedy: "What L3 does declare for a rate-limited upstream is
retryConfig— whoseretryableStatusCodesdefault[408, 429, 500, 502, 503, 504]includes429— andhealth.circuitBreaker." PR #18979 retired that same claim frompackages/spec/docs/SYNC_ARCHITECTURE.md; this file is where it was authored, and the generated page carried it downstream.The replacement carries the wording #18979 landed: both keys are declared but currently unimplemented, with a pointer to the liveness ledger, and explicitly neither retired nor left to the host.
Why the sentence was false — re-measured on this branch, not inherited
packages/spec/liveness/connector.json, read ated63e0d39c:retryConfig.*— all 8 sub-keysdeadhealth.circuitBreaker.*— all 7 rowsdeadhealth.healthCheck.*— all 8 rowsdeadproviderConfig— the must-answer live control, same readliveA
deadcolumn with no live row beside it would only show the instrument answering one way, so the control is part of the reading.The "not left to the host" half is re-verified here too, at source rather than cited:
ConnectorProviderContext(packages/spec/src/integration/connector-provider.ts:57) declares exactlyname,label,description,icon,type,providerConfig,authandloadPackageFile— eight members, none of themretryConfigorhealth. A provider factory is never handed either key, so it has no way to honour one.Regeneration leg
pnpm --filter @objectstack/spec gen:docsmoved exactly one tracked file,content/docs/references/integration/connector.mdx(sha256640ea9d5…toef0d11fc…), andcheck:docsis green on the merged tree. The page is not hand-edited.One prediction on the card did not hold, reported as measured: the page's
retryableStatusCodesoccurrence count stays 4, not lower. One of the four is inside the historical sentence this change quotes; the other three are the generated field tables forRetryConfigSchema, which this change does not touch.Zero-hit reading, with its radius
The corrected sentence spans three comment lines, so a per-line
grepreads0for it while it is plainly there — that reading is blind, not clean. The sweep here strips comment prefixes and collapses newline-bearing whitespace before matching.upstream gateway.** What L3 does declareoccurs 0 times in the tree ated63e0d39c(10,270 files scanned)..ts .tsx .mts .mjs .js .md .mdx .json;node_modules,dist,.git,.turboand.cachepruned.96cf32b075still holds that exact string. Extracted to a file inside the radius the same instrument reads it (2 hits), so the probe is live; scanning the tree it reads 0, because git objects are outside the radius by construction.Published-surface reading — per file, which is why this is not
skip-changesetfiles[]?packages/spec/src/integration/connector.zod.ts@objectstack/specshipssrc/**/*.zod.ts;npm pack --dry-runlists the path among the tarball's 2,039 filescontent/docs/references/integration/connector.mdxcontent/docs/**; same instrument does see@objectstack/spec'ssrc/**entry, so it is not blind.changeset/18983-connector-header-rate-limit-remedy.mdThe edited file is itself shipped, so the corrected text reaches consumers: this takes a
patchchangeset, notskip-changeset. The header TSDoc does not reachdist/, sosrc/**/*.zod.tsis its only published carrier.Verification
All of the below ran at
ed63e0d39c, afterorigin/mainwas merged in (packages/spechad moved on main, so §10's rebuild-and-recheck applies).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 100 commands from a non-stale tree. Each ran with its exit code written to disk before any pipe, then reconciled with--ran: 100 derived, 99 run green, 0 findings, 1 NOT MEASURED, 0 unrun.pnpm check:dual-build-cjs-loadsexits 3 —PREREQUISITE NOT MET, its own distinct code for "nothing was measured". It reads built output for 26 packages still without adist/(apps, connectors), which needs a whole-workspace build; CI's requiredLint & Repo Gatesjob builds everything and runs it. Five other gates refused the same way on first pass and were cleared by building the closures they named, then re-run green:check:doc-formula-expressions,check:doc-security-posture,check:skill-examples,check:docs-transcript-drift,check:lean-entry-closure.pnpm --filter @objectstack/spec test— 489 files, 14,229 tests passed.pnpm --filter @objectstack/spec typecheckgreen:tsc --noEmit,check:scripts-typecheck, andcheck:test-typecheck(54 files / 259 errors / 144 pinned signatures held in the shrink-only ledger, unchanged).check:generated— all 16 generated artifacts up to date,check:docsamong them.eslint . --no-inline-configover the whole repo: 6,861 files, 0 errors, 0 warnings, exit 0. The config enables no type-aware linting for any file (its own comment ateslint.config.mjs:326records this with a positive control), so this run is per-file parsing throughout.Acceptance notes — measured, deliberately not changed here
.describe()strings on the same dead keys still read as present-indicative behaviour:'HTTP status codes to retry','Enable circuit breaker','Failures before opening circuit','Add jitter to retry delays', and about twenty more acrossRetryConfigSchema,HealthCheckConfigSchemaandCircuitBreakerConfigSchema. They render into this same generated page three times over and into the authorable-surface artifacts an authoring agent reads. Correcting them edits the declaration surface and movesgen:schemaoutput, which is outside this card.retryConfigpaired with429or withcircuitBreakerreturns only: this file, its generated page, the already-correctedSYNC_ARCHITECTURE.mdpassages, the liveness ledger's own notes, a schema parse test, a generated defaults artifact, and an ADR naming-convention list. No third source asserts the remedy.Generated by Claude Code