docs(changeset): make the two pending connectionTimeoutMs notes true when read as one release - #19918
Conversation
…when read as one release The retry-config note said ConnectorProviderContext gains connectionTimeoutMs, while the retirement note in the same pending release removes it. The member (and the two provider-option fields) entered after the 17.4.0 tag and leave in the same release, so no release ever carried them. - retry-config note: the context gains retryConfig and requestTimeoutMs; the unenforced key is retired by its own entry in this release; the "keeps every key" sentence is scoped to that change. - retirement note: the never-released members are no longer called published; the residue stage is stated as measured (30000 accepted and stripped, every other value refused at connectionTimeoutMs, or connectors.0.connectionTimeoutMs in a stack); the read census names the tree it was taken on (e07843b), six reads. Changeset text only. Frontmatter untouched. Claude-Session: https://claude.ai/code/session_013RDBh5DqXd2xnLwvHLgLFr Co-authored-by: Claude <noreply@anthropic.com>
…cription detector The previous wording mentioned the retirement entry's migration table by its house label, which check-adr-0087-registration's label branch reads as a prescription on this non-breaking note. Reworded so the gate reads both notes exactly as it does on the merge base. Claude-Session: https://claude.ai/code/session_013RDBh5DqXd2xnLwvHLgLFr Co-authored-by: Claude <noreply@anthropic.com>
…onfig note Wording only: "that release entry" becomes "its own entry in this release". Claude-Session: https://claude.ai/code/session_013RDBh5DqXd2xnLwvHLgLFr Co-authored-by: Claude <noreply@anthropic.com>
Maintainer confirmation — the DELIBERATE CORRECTION of the two pending changesets, 2026-09-24T15:16Z
Provenance.
What the confirmation covers. The text corrections this PR makes to two pending notes:
The frontmatter of both is unchanged: packages and levels are byte-identical to the merge base. The second sentence hands the wording to this seat. If the at-tier review asks for a changed sentence, this seat corrects it in a patch round on this branch and does not come back for a new confirmation. The review record on the final head is the basis ( The red it answers. Recorded here as the red-by-design route requires:
Landing. Not armed yet, as the takeover comment says. First, an at-tier contract review of head Generated by Claude Code |
Contract reviewServed-tier: 89/89 Isolated at-tier reviewer subagent, run by the Refs used: merge base ① Derived judgmentsMain drift since the merge base. M1, the three members were never in a tagged release. M2, the residue stage, judged from the implementation at M3, the census. Ledger and the "ten rows". Walking Retirement kit at main. Both ADR-0087 ids resolve: Card coverage. Item 1 (18975 "gains … Left as-is, imprecise but not false of what ships (non-blocking, both pre-existing and untouched by this PR): 19580:108 says the liveness row stays ② Semver levelFrontmatter: extracting lines 1 through the closing 18975: 19580: ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #19851
Clause-②: no
What this changes
Changeset text only: two PENDING notes on
origin/main,.changeset/18975-connector-retry-config-and-request-timeout.mdand.changeset/19580-retire-connector-connection-timeout-ms.md,+47 / -29. No code, no other file, and no frontmatter line: packages and levels are byte-identical to the merge base.Both notes go into the same next release. The last tag is
@objectstack/*@17.4.0. On npm,latestfor@objectstack/spec,connector-rest,connector-openapi,connector-mcp,connector-slackandservice-automationis17.4.0, published 2026-09-09, with no version after it. Read together as that one release, the base text said thatConnectorProviderContextgainsconnectionTimeoutMs, and also that the same member, called "a published interface member", is removed. It also misstated what the residue stage does with the default value, and it anchored its read census to a moving ref. After this PR, every sentence the two notes publish is true of what that release ships.DELIBERATE CORRECTION: this PR awaits the maintainer's written confirmation, and
Check Changesetis red on purposeThis PR adds no changeset of its own. It changes two pending changesets it did not add. Route 0's discriminator against the merge base:
Every row is
Mand none isA, so this is the DELIBERATE CORRECTION class thatscripts/check-empty-changeset.mjsnames. It is not a COLLISION: nothing of this PR's own was overwritten, and restoring the base copies would republish the false sentences.skip-changesetlabel, and ⛔ no new changeset file (ruling D on [finding] theskip-changesetlabel suppresses the DELIBERATE-CORRECTION refusal whose own text says 「no label and no diff shape makes that safe」 — declared contract against enforced behaviour #18375).Check Changesetstays advisory red. It is not one of the seven required contexts. Every other check should be green.Measurements (taken before editing a word)
The worktree was cut at merge base
8490127962. The checkout is a full clone (git rev-parse --is-shallow-repositoryanswersfalse).M1: the three members entered after 17.4.0, and no release carried them
git log -G 'connectionTimeoutMs\?:' origin/mainonconnector-provider.ts,rest-connector.tsandopenapi-connector.tsb929e0a662(2026-09-20, #19388) and left withfc29c74400(2026-09-23, #19657).b929e0a662in any release?git tag --contains b929e0a662git merge-base --is-ancestor b929e0a662 '@objectstack/spec@17.4.0'@objectstack/spec@17.3.0(8a1bad8b8e), in the same checkout, against the same target, an older commit: exit 0.git ls-remote --tags origin 'refs/tags/@objectstack/spec@*'andnpm view @objectstack/spec dist-tags time17.4.0, which peels to7e6337007f. Theconnector-rest,connector-openapiandservice-automation17.4.0 tags point at the same commit. npm haslatest17.4.0andrc17.0.0-rc.6, and nothing was published after 2026-09-09T03:57Z.npm install @objectstack/spec@17.4.0, then readdist/integration/index.d.tsinterface ConnectorProviderContexthasname,label,description,icon,type,providerConfig,authandloadPackageFile. It has noconnectionTimeoutMs, and noretryConfigorrequestTimeoutMseither.npm pack @objectstack/connector-rest@17.4.0and@objectstack/connector-openapi@17.4.0, then read every.d.tsinterface RestConnectorOptionsandinterface OpenApiConnectorConfigare present (the control), with 0connectionTimeoutMsoccurrences in any.d.ts.packages/spec/src/integration/connector-provider.ts:67at the merge baseConnectorProviderContextdeclaresretryConfigandrequestTimeoutMs.connectionTimeoutMsappears only in a "REMOVED" comment.rest-connector.ts:42andopenapi-connector.ts:130have comments only.The authorable key was published. In the 17.4.0 source,
connector.zod.ts:839readsconnectionTimeoutMs: z.number().min(1000).max(300000).optional().default(30000), andDeclarativeConnectorEntrySchema(:955) is built onConnectorSchema. The M2 probe of the released 17.4.0 package showsConnectorSchemaaccepting and keeping an authored15000. So "a published authorable key is removed on two carriers" stays true, and it is now the only thing the Clause-② sentence rests on.M2: parse probes, with the path each refusal is reported at
For today's tree,
tsxran againstpackages/spec/srcat the merge base, for four carriers. The entry is{ name: 'ledger_api', label: 'Ledger API', type: 'api' }plus the key:connectionTimeoutMsConnectorSchemaDeclarativeConnectorEntrySchemagetMetadataTypeSchema('connector')ObjectStackSchema(connectors: [entry])3000015000invalid_type@connectionTimeoutMsinvalid_type@connectors.0.connectionTimeoutMs100015000"30000"(string)15000Every refusal message names
requestTimeoutMs. In every accepted caserequestTimeoutMsstill reads30000, the control that shows the stage leaves the live sibling alone.ConnectorSchemais apipewhose input stage is atransform. The tombstone without the stage is the pipe's inner object. It refuses30000atconnectionTimeoutMs, and it accepts the same entry with the key absent (the control).Released side:
@objectstack/spec@17.4.0from npm emitsconnectionTimeoutMs: 30000for that entry onConnectorSchema, onDeclarativeConnectorEntrySchemaand onObjectStackSchema, and it accepts and keeps an authored15000.npm packofconnector-mcp,connector-openapi,connector-restandconnector-slackat17.4.0each ship one literalconnectionTimeoutMs: 3e4in their JS.M3: which sites READ the key (one number: six)
The instrument is
git grep -n connectionTimeoutMs SHA -- . ':!packages/spec', keeping non-test code files. It was run ate07843b5a6, the parent of the landing commitfc29c74400, and gives an identical result at6eaa0f4a81, the review's merge base. The result is 13 occurrences, 7 files, 5 packages:openapi-connector.ts:242,openapi-provider.ts:193,rest-connector.ts:134,rest-provider.ts:64,plugin.ts:307,plugin.ts:1589openapi-connector.ts:135,rest-connector.ts:47,plugin.ts:291,plugin.ts:33930000writes:mcp-connector.ts:247,slack-connector.ts:94,plugin.ts:1782Six read expressions sit at six file:line locations. The "five sites" phrasing elsewhere counts the two
?? 30000fallbacks as one site: it is the same set in a different unit (see the acceptance notes). Within the changesets, the one count used is six reads, and the tree it was taken on is now named.0870fb5418, which the note cites for the earlier census, re-measures at exactly five hits, allconnectionTimeoutMs: 30000,, as the note says.Old and new, per file
.changeset/18975-connector-retry-config-and-request-timeout.md(a) This release does not add a member that the same release removes (M1).
(b) The key is no longer described as "carried onto
ConnectorProviderContext" and "owed a decision". The same release retires it, and no release carries it on the context (M1). The mapping and the ledger still record the reason:connector-fetch-policy.ts:57andliveness/connector.jsonprops.connectionTimeoutMs.status: dead, both at the merge base.(c) The claim that the schema "keeps every key" is scoped to the change it describes. Read as a claim about the release, it is false twice.
connectionTimeoutMsis retired byfc29c74400.syncConfig.scheduleis deleted by929d9e3f20: present at 17.4.0, absent at the merge base, andgit merge-base --is-ancestor 929d9e3f20 '@objectstack/spec@17.4.0'gives exit 1. As a claim aboutb929e0a662itself it holds: that commit changes 0 non-comment lines ofconnector.zod.ts, the file that also holdsRetryConfigSchema..changeset/19580-retire-connector-connection-timeout-ms.md(d) The never-released member is no longer called published. The Clause-② sentence now rests on the authorable key alone (M1). The line's leading token is unchanged, and
readClause2Linereads it identically at base and head.(e) The migration no longer tells a released-version factory to stop reading something it never had (M1). One paragraph says which members were never released and who could have read them.
Two sentences follow from the same reading. The FROM → TO row for
ConnectorProviderContext.connectionTimeoutMsgains "added after@objectstack/spec@17.4.0and never in a release, see below". The D3 bullet now says the removal reaches "a factory author who read it — possible only against an unreleasedmain—" rather than any factory author.(f) The residue stage is stated as measured (M2).
The tombstone bullet's "
stack.connectors[]and the/meta/connectordoor refuse it too" gains "every value but the retired default30000, which the residue stage below strips first". Without that clause, the bullet contradicted the residue bullet.(g) The read census names its tree (M3).
What deliberately did not change
minors cover real widenings:ConnectorProviderContextgainsretryConfigandrequestTimeoutMs, and the provider options andresilientFetchgain knobs.@objectstack/spec: minorwith the BREAKING banner, because the launch window refusesmajor.patchfor the connector and service packages is now better supported: the correction states outright that the option fields those packages withdraw were never released.check-adr-0087-registrationandreadClause2Line:breaking true ["BREAKING","bang"], dispositionregisteredwith the same two ids, migration prescription found.Clause-②: yes (widening)declared.654adaba14) mentioned the retirement entry's migration table by its house label. The detector's label branch read that as a migration prescription on 18975. It was reworded inbaf93b20fd, and the parity above was re-measured onf4fbb2203e.Local gates, on
f4fbb2203eThe gate list is derived by
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands: 19 commands. Reconciled with--ranand exit codes recorded:19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN. Every exit code was captured before any pipe.node scripts/check-empty-changeset.mjs --base origin/main✓ No empty-frontmatter changeset introduced, then "This PR changes a changeset it did not add" naming both files, with the DELIBERATE CORRECTION remedynode scripts/check-adr-0087-registration.mjs --base origin/main✓ … this PR adds no declared-breaking changeset (2 non-breaking changeset(s) seen))node scripts/check-changeset-no-major.mjs --base origin/main✓ This diff introduces no major bump.; the LEVEL axis is not applicable without apull_requestpayload)node scripts/check-changeset-fixed.mjs(not derived, run as acheck-changeset*gate)✓ … "fixed" group is in sync with 70 public workspace packages.)pnpm check:changeset-gate-self-testspnpm check:nul-bytesOK … no raw ASCII control bytes)--self-testofcheck-adr-0087-registration,check-changeset-no-majorandcheck-empty-changeset, pluscheck-closing-keyword-parity(both),check-comment-mask-corpus,pm/release-rehearsal-clone --self-test,check:driver-memory-census,check:gitlink-declared,check:objectui-changeset,check:pm-changeset-deadline-census,check:published-files,check:refd-timer-probe,check:watch-hint-literalNOT MEASURED: the four type-check programs the derivation lists outside the derived total, which are CI's whole-workspace lanes. Reason: the diff touches no TypeScript, and no workspace build was bought for a text-only diff. Also scanned for control bytes (none, with a lit positive control) and for model identifiers in the diff (0 hits).
Acceptance notes
packages/spec/src/integration/connector.zod.ts:565,packages/spec/src/conversions/registry.ts:9078,packages/spec/src/integration/connector-connection-timeout-retirement.test.ts:15andpackages/spec/src/migrations/registry.ts:5255say that. The retired-key entry (18.integration__Connector__connectionTimeoutMs.ts:14,migrations/registry.ts:14678), the liveness row and the 19580 changeset say "six reads". It is the same set, with the two?? 30000fallbacks counted as one site or two. Not touched here, because this PR is changeset text only. Carrier: none._notestill anchor the read census "atorigin/main" without a sha. This is the moving-ref reading corrected in the changeset by (g). Code and data, not changeset text, so not touched here. Carrier: none.Clause-②sentence reads asnear-miss(reasondescribing) inreadClause2Line. That is so at base and at head, because the token sits in backticks with prose after it.check-adr-0087-registrationtherefore classifies the note as breaking through the banner and the!, not through signal (4). It is left as it was: changing the line would change what the gate reads, which is outside a correction of false sentences.Generated by Claude Code