Repository navigation
fix(spec): correct the conversion registry's falsified retryConfig liveness claim - #18789
Merged
Merged
Conversation
… liveness claim The `connector-rate-limit-config-removed` entry's fixture comment asserted that `retryConfig` and the connector timeouts beside it "are live". Measured false: the read-probe for all three keys reads 0 outside `packages/spec` (control: the sibling key `providerConfig` fires on the same probe), no retry loop reads a strategy or a backoff, every timeout occurrence outside the spec is a write of the literal 30000 to satisfy the post-parse type, and `ConnectorProviderContext` carries none of them, so a provider factory cannot see them either. `packages/spec/liveness/connector.json` (#18582) classifies all of these rows `dead`. The true half of the claim is kept and narrowed to what it actually measured — this conversion's scope — and the liveness verdict now points at the ledger. No retirement is implied: ADR-0049 owes these keys a decision. Claude-Session: https://claude.ai/code/session_01JbZnqu8bt6YqfJsr9vaFb3 Co-authored-by: Claude <noreply@anthropic.com>
…claim The corrected comment ships: tsup preserves comments, so the text reaches dist/index.js, dist/index.mjs and the shared/browser bundles, all six of which npm pack lists in the published tarball. Published bytes move, so this is a patch rather than skip-changeset. Claude-Session: https://claude.ai/code/session_01JbZnqu8bt6YqfJsr9vaFb3 Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. 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 17, 2026
os-bill
marked this pull request as ready for review
September 17, 2026 21:34
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 #18614
Clause-②: no
The
connector-rate-limit-config-removedentry's fixture comment asserted thatretryConfig"and the timeouts beside it are untouched — they are live." The first half is true and is kept. The second half was never measured by that entry, and is false.The two questions the claim comment could not answer
1. Is
conversions/registry.tsgenerated? — measured: hand-writtenNot read off the file header (the absence of a banner proves nothing). Read off the repo's own routing ledger:
scripts/regen-artifacts.mjs— named in.gitattributesas "the single source of truth for this list" — carriespackages/spec/src/conversions/registry.tsinNOT_DRIVER_MANAGEDwithwhy: 'hand-written source.', and nogen:key.packages/spec/src/migrations/registry.tssits in the same structure withgen: 'gen:migration-registry'. The ledger does distinguish a generated registry from a hand-written one, so "no gen key" is a reading, not a search that never fired.⚠️ The three tables below are GENERATED (#7297); the same predicate reads 0 onconversions/registry.ts.pnpm --filter @objectstack/spec check:generated— all 15 artifacts up to date, includingcheck:spec-changesandcheck:upgrade-guide, the two artifacts derived from this registry. Nothing regenerates it.No generator was run against it, so no hand-edit of a generated file occurred.
2. What should the wording say? — measured: declared, unimplemented, and unreachable by a host
The seat listed three candidate readings. Measured against this tree:
ConnectorProviderContextcarries none of the three keysRead-probe — the property-access form, i.e. a consumer reading the key, everywhere outside
packages/spec:Lit control for that probe:
providerConfig— a sibling key on the same schema that is consumed — fires on the identical predicate (connector-mcp/src/mcp-provider.ts:173,connector-openapi/src/openapi-provider.ts:175,connector-rest/src/rest-provider.ts:41, and more). The zero is a reading.The host seam settles the "left to the host" branch:
packages/spec/src/integration/connector-provider.ts:57declaresConnectorProviderContextasname,label,description,icon,type,providerConfig,auth,loadPackageFile. A provider factory is never handedretryConfigor either timeout, so it cannot honour them even if it wanted to.So the new text says: untouched by this conversion — a statement about scope, not a liveness verdict — and points at
liveness/connector.jsonas the authority, without implying a retirement ADR-0049 has not decided.Census — paths printed, never counts
The card records the method lesson that a count over a widened path set nearly produced a false refutation. Both censuses printed every path; the full listings are in the report comment. Summary:
retryConfig— every occurrence underpackages/is insidepackages/spec(the declaration, its own test, generated baselines,SYNC_ARCHITECTURE.md, the liveness ledger, and the claim itself). Outsidepackages/spec: twocontent/docs/**pages (one generated from the declaration, one prose) and, new since the card was filed, the.changesetentry for spec/liveness: seed ledgers for the three PENDING_GOVERNANCE debts #18133 declared —connector,sharing_rule,analytics_cube#18582. None is a producer or a consumer.connectionTimeoutMs/requestTimeoutMs— every occurrence outsidepackages/specis a write of the literal30000into a def so it satisfies the post-parseConnectortype: four connector packages plus the degraded-husk literal inservice-automation/src/plugin.ts, each with a comment saying exactly that.Lit control (required, so that "nothing outside" is not a search that never fired): the census reads 2 on
packages/spec/src/integration/connector.zod.ts, a file known to declare the key.DARK control — and a broken predicate the control caught
Required reading: the "are live" assertion about
retryConfigmust read 0 inpackages/spec/src/conversions/registry.tsafter the change, with a non-zero control proving the predicate fires.[^\n]*between the two halves and read 0 on the pre-edit tree — it would have "confirmed" the fix against a file that still carried the claim. In POSIX ERE a bracket expression has no escapes, so[^\n]is "any character except backslash and the letter n" and the match died on thenin "and". Demonstrated on a string that plainly contains the assertion: v1 returns 0 hits. The corrected predicate is the one above.Second control, against a blanket wipe: the file carries 9
are live/is liveassertions before the change and 8 after — exactly one moved, and the other eight (aboutaria/data,batchSize,doc.translations,icon,object) are untouched.Changeset — decided by measuring published bytes
Clause-②: no— comment text only, no authorable key moves. The bump ispatch, notskip-changeset, and that was measured rather than inferred from the source path:files[]for@objectstack/specshipssrc/**/*.zod.ts, so the editedsrc/conversions/registry.tsships no source bytes —npm pack --dry-run --jsonlists 0src/conversions/*entries. The inference stops here and gets it wrong.tsupdoes not strip comments. The corrected text is present indist/index.js,dist/index.mjs,dist/shared/index.js,dist/shared/index.mjs,dist/browser/index.jsanddist/browser/index.mjs, andnpm pack --dry-run --json(re-run after a real build — the first run was taken against a tree with nodist/and silently missed all of it) lists all six in the 2021-entry tarball for@objectstack/spec@17.4.0.no outbound rate-limiting engine exists) is found in those bundles plusspec-changes.json.Published bytes move, so
skip-changesetis unavailable.Verification
pnpm --filter @objectstack/spec build— clean, 34/34 declaration files emitted.pnpm --filter @objectstack/spec test— 486 files / 14017 tests passed.pnpm --filter @objectstack/spec typecheck— clean.pnpm --filter @objectstack/spec check:generated— 15/15 up to date.pnpm lint— the full repo-wideeslint . --no-inline-config, exit 0. Not a narrowed run, so no scope-invariance argument is needed.scripts/pm/dispatch-gates.mjs, and the implicated families run green:check:adr-0087-registration,check:spec-docblock-symbol-anchors,check:page-declaration-shape,check:pm-widening-tells(--declaration no),docs-audit/check-affected-docs,check:changeset-no-major,check:empty-changeset,check:objectui-changeset,check:nul-bytes,check:comment-mask-adoption(+ self-test),check:comment-mask-corpus,check:keyed-text-bounds,check:published-files,check:llms-txt,check:merge-driver,check:empty-state,check:exported-any,check:dual-source-exports,check:variant-docs,check:doc-authoring.@objectstack/spec^...) is empty —packages/specdeclares noworkspace:dependencies — so that family is a genuine no-op here, not a skip.Acceptance notes
Out-of-scope observations, noted and deliberately not folded into this PR. They are carried back in the report comment for the triage seat; none is filed from here.
packages/spec/docs/SYNC_ARCHITECTURE.mdstill routes an author toretryConfigas the answer for a rate-limited upstream, citing itsretryableStatusCodesdefault of[408, 429, 500, 502, 503, 504]— a default the liveness ledger records as read by nothing.content/docs/automation/flows.mdx:1588carries the same advice. This is the metadata-authoring-trap class, and the ledger's own note already flags it as the reason ADR-0049 owes a decision rather than a sweep. It is a docs surface this card's file surface does not cover.content/docs/references/integration/connector.mdxadvertisesretryConfigand both timeouts with their defaults and no liveness signal. It is generated from the declaration, so the remedy belongs at the generator or the declaration, never in the page.Neither is touched here: this card is a one-comment correction and says in its own body that it does not ask for the keys to be retired.
Generated by Claude Code