Conversation
…rovider-context carry Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
… semantic entry, consumers and pins Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
…reference docs Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
…tire-connector-connection-timeout
📓 Docs Drift CheckThis PR changes 6 package(s): ⛔ 2 release-owned page(s) name something this change touched. These are read-only:
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): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 9bdb28c12f41c1ea6c992beea58a10189da665cd && git checkout 9bdb28c12f41c1ea6c992beea58a10189da665cd
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 106d4c8dd7fe35d6195c507304ac21a299c510ea 9e2843a4d31da6cb185c5c33631691650373add4 && git checkout -B drift-repro 106d4c8dd7fe35d6195c507304ac21a299c510ea && git merge --no-ff 9e2843a4d31da6cb185c5c33631691650373add4
node scripts/docs-audit/affected-docs.mjs --json 106d4c8dd7fe35d6195c507304ac21a299c510ea
|
…eted card number The four #19388 citations this change added do not resolve: probed [deleted] — minted, absent from the board, and the web endpoint 404s. The claim they attributed is unchanged and independently checkable in the tree, so each site now names connector-fetch-policy.ts, where connectorFetchOptions() maps requestTimeoutMs onto resilientFetch's per-attempt timeoutMs, pinned by connector-fetch-policy.test.ts. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
… correct the census note F1 — the key was `.optional().default(30000)`, so a 17.x parse materialized it into every connector. Measured across two builds: the base build emits it for an entry that authored only name/label/type, and the tombstoned build refused that exact object at connectors.0.connectionTimeoutMs. Adopts the ruled acceptRetiredDefaultResidue stage on both carriers. A D2 does not discharge this obligation — the ObjectPermission precedent carries both — because AutomationEngine.registerConnector parses ConnectorSchema for a def a plugin builds in code, where no conversion runs. Nothing is un-retired: z.input stays never, the [RETIRED] row stays, and any other value keeps the refusal. The residue wrapper is a preprocess pipe, so the ADR-0097 refinements move onto its OUT side; dropped-refinements.baseline.json moves the five site paths with them, as the gate required in the same change. F2 — the card's five-writes table was CORRECT at the SHA it cited (0870fb5) and was superseded by b929e0a. It is stale, not false, and the ledger note, the entry and the changeset now state both readings with their trees: thirteen non-test source occurrences over seven files in five packages at origin/main — six reads, four type declarations, three surviving hardcoded writes. N2 — the absence-pin pointer names the file the pin actually lives in. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
FB1 — connector.zod.ts still promised that the base export 'stays a plain object so connector subtypes can still .extend() it'. Both published carriers are z.preprocess pipes since the residue stage, so that is false, and the sibling repo quotes the sentence verbatim in its own code. Measured on the built entry against a plain-object control (WebhookConfigSchema, which keeps all nine): .extend/.omit/.pick/.partial/.merge/.strict/.keyof/.safeExtend are gone from both. .superRefine SURVIVES — it lives on zod's base type — but returns a schema with no read-through shape, so my own new docblock overstated it and is corrected too. The affordance withdrawal is now a FROM to TO row in the changeset with the extend-the-base-and-re-wrap remedy. FB2 — five records asserted a composition this change abolished: the two carriers no longer derive from one another, they are siblings wrapping one private ConnectorBaseSchema. Three of them I authored in the round that fixed the same defect class. Corrected in the two retired-key entries, the two conversion docblocks, the schema docblock, the reachability comment in connector.test.ts and the liveness _note, whose walk mechanism is restated and whose conclusion is re-measured: 30 keys on each carrier, byte-identical key sets, no entry-only and no base-only key. NB5 — the changeset said allowPurge carries both 'because' registerConnector, compressing two different reasons into one. Separated. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
…s README Declared widening, one table row. The row asserted in the present tense that DeclarativeConnectorEntrySchema IS ConnectorSchema.superRefine(...) and rested its byte-identical-key-set conclusion on that Zod 4 attachment. This PR falsifies both halves: the two carriers are now siblings wrapping one private ConnectorBaseSchema in the residue stage, and what preserves the walked shape is the pipe's read-through shape, not a superRefine attachment. Mechanism corrected, conclusion kept and re-measured on the built entry (30 keys each, byte-identical, zero entry-only, zero base-only), and the row says which spelling moved and when — the form used on the six sibling sites. This file is hand-written Notes prose by .gitattributes' own split, not a driver- managed artifact, so a hand correction is the right act; regenerating a Note would fabricate a verdict. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
…head FB-A — forty words after the sentence round 4 corrected, the row still said 'four retiredKey tombstones'. Two instruments disagreed on the absolute number and agreed on the delta, so I established the scope the sentence means before counting: it enumerates the contents of THIS ledger's dead set, so the population is this file's dead rows that are retiredKey tombstones kept because the key stays in the walked shape. One instrument over both refs reads 5 on origin/main and 6 at head. The six are now named individually rather than totalled, with the double-count that made the old tail drift called out: three of them already sit inside the fieldMappings, triggers and health counts. NB-1 — the rest of the row was stale too (not introduced here; byte-identical on origin/main). The 20/1/53 split and the 53 dead become 29/1/44 and 44, cited to the generated state-counts row. retryConfig (8) leaves the dead list entirely: all eight sub-keys are live since #18975, which is the same measurement this row's own falsification note records. 'The two timeouts' is corrected: requestTimeoutMs is live, connectionTimeoutMs is the tombstone. The decomposition is partitioned so every dead row is counted once and sums to 44. NB-2 — the four PR-authored 'inherits' spellings contradicted this PR's own 'siblings, not parent and child'. Respelled the way connector.zod.ts already does. The pre-existing ones are left for their own round. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
…its census stale Found by doing what the round asked — re-reading the WHOLE row against head rather than the named sentences. The closing note asserted two things that are no longer true, and one of them contradicted the correction this same round made forty words earlier: - it recorded retryConfig's 'they are live' claim as falsified, but #18975 made the declared policy execute at the one platform fetch site, so those eight sub-keys are live now and the claim came true after the fact; - its supporting census, 'the word does not occur outside packages/spec at all', is false at this head: git grep over the tree minus packages/spec returns 54 hits over 10 files. Both halves are recorded rather than overwritten — the history of how the type got here is what this row is for — and the census is restated with the command and the tree behind it. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
…d command The census clause printed 54 hits over 10 files while printing a command that returns 67 over 15: the reading was taken with `.changeset` excluded and the exclusion was never written down, and the parenthetical covered neither of the two `content/docs` pages it returns. Print the command that produces the number, pinned to the tree it was taken against, and make the parenthetical account for all fifteen files. Same row: `name` is itself a `ConnectorProviderContext` field, so the "plus `name`" tail double-counted it, while `provider` -- which selects the factory and never reaches the context -- sat outside the "exactly". `loadPackageFile` is host-injected rather than authored. Correct the set. Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx Co-authored-by: Claude <noreply@anthropic.com>
…on claims
The `_note` in `packages/spec/liveness/connector.json` still carried the
uncorrected form of the key-reach claim after the README row was fixed, and
its tail asserted something the same file's own `actions.key` row already
contradicted. Four measured corrections, all in one sentence:
1. `name` IS a `ConnectorProviderContext` field
(`connector-provider.ts:68`), so "plus `name`" double-counted it;
2. `provider` is read on the AUTHORING door and is not on the interface —
`plugin.ts:1478` gates the desired set on it and `:1533` selects the
factory via `engine.getConnectorProvider(provider)` — so it was left
out of the "exactly";
3. `loadPackageFile` IS a context field (`:117`) that no authored key
reaches — `plugin.ts:1601` injects `createPackageFileLoader(...)` — so
it was over-included;
4. "read by no runtime" is FALSE: `plugin.ts:433`
`findInertDeclaredConnectors` reads `(c.actions?.length ?? 0) > 0` on
every descriptor at boot, which the `actions.key` row already records
as the #2612 inert-descriptor warning. Reaching no provider factory
and being read by nothing are two different claims; only the first
holds of the remainder.
The whole entry-read census is now stated: the materializer reads exactly
`name`, `provider`, `enabled`, `label`, `description`, `icon`, `type`,
`providerConfig`, `auth`, `retryConfig`, `requestTimeoutMs` plus that one
`actions` read, the last nine also being `connectorInstanceSignature`.
README row 942, `authentication` clause: "refused outright by ADR-0097 §3"
is contradicted by all three instruments including the one it cites. The
key is accepted (`connector.zod.ts:893`
`.optional().default({ type: 'none' })`); `:1168` refuses a non-`none`
VALUE and `:1174`'s message prescribes "drop `authentication` (or set
`{ type: 'none' }`)"; ADR-0097 §3 "Credentials are references" rejects
INLINE SECRETS, not the key. Accepted-and-ignored plus a loud refusal of
every other value is the basis of the `planned` verdict the row already
stated.
Same file, `auth` row: "whose other half (`authentication`) is refused"
compressed to the same wrong claim; scoped to "any value but
`{ type: 'none' }`".
README row 942, census sentence: "67 hits" -> "67 matching lines", with the
`git grep -o` reading (77 occurrences) beside it — re-measured at
14fdebd on this checkout, 67 lines / 15 files / 77 occurrences.
Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
Co-authored-by: Claude <noreply@anthropic.com>
…truments
Rounds 3-6 each fixed the sentence they were handed and left the identical
claim standing one sentence, or one row, over. This round decomposed both
lines into their individual claims and re-derived each against the
instrument it names. Five corrections, four of them measured here:
1. `connectorInstanceSignature` (`plugin.ts:282-314`) hashes NINE keys —
`provider`, `providerConfig`, `auth`, `label`, `description`, `icon`,
`type`, `retryConfig`, `requestTimeoutMs` — identical in its parameter
type and its hashed object. So "the last nine" of the eleven-key
census was wrong in BOTH directions: it swept in `enabled`, which is
never hashed, and dropped `provider`, which is. The spelling that
holds is "all but `name` and `enabled`".
2. The conversion-registry comment is quoted as it reads TODAY. Inside
`connector-rate-limit-config-removed`'s fixture (`registry.ts:4503`)
it says the timeouts are "untouched by THIS conversion - a statement
about its scope, not a liveness verdict. They are not live". It
asserts they are NOT live; both lines quoted it as asserting the
opposite. Measured direction: TRUE when this ledger was seeded, STALE
now (#18975). The stale comment is #19729's and is not rewritten here.
The tail's "They are not read anywhere" is false besides -
`plugin.ts:1596-1597` hands both to `ConnectorProviderContext`, and
the same line's own census lists both among the eleven.
3. The ADR-0087 entry is `field-mapping-transform-removed`; there is no
`connector-` prefix on it (`registry.ts:4594`). The `connector-`
prefixed neighbour is `connector-rate-limit-config-removed`. Both the
`_note` and the `fieldMappings.transform` row carried the fused name;
the second was found by sweeping the file rather than by being handed
the line.
4. That entry's "Execution: none" quote was truncated before its own
scoping gloss, which is what made it falsifiable: `fieldMappings`
occurs on 14 lines over 6 files outside `packages/spec`, all prose.
The gloss - no read in the connector packages, the engine, REST or
objectui - holds, and the split is now recorded rather than smoothed.
The `fieldMappings.transform` row's own census, scoped to `packages/`
and `examples/`, was re-derived and HOLDS with two positive controls,
so only its id was touched.
5. `registerBuiltinPreviews()` at objectui dda8f3815 makes 22
`registerMetadataPreview(` calls naming 22 distinct types over 20
distinct components. "nineteen" matched no reading; the reading is
now stated. The load-bearing clause - `connector` is not registered -
is unchanged and still true.
Re-derived and unchanged: the 30-key byte-identical carrier pair (measured
on the built entry, with controls), the 29/1/44 split against
`state-counts.md`, the 44-row dead partition, the six `retiredKey`
tombstones and their containment, `retryConfig`'s eight `live` sub-rows,
`requestTimeoutMs` live / `connectionTimeoutMs` retired, the eleven-key
materializer census plus the one `actions` read, `type`/`icon` dropped by
all three shipped factories, and every objectui consumption citation.
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
Fixes #19580
Clause-②: yes (narrowing)Ruled: comment
5770606746, batch #211 item 1, letter A — retireconnector.connectionTimeoutMs(ADR-0049 enforce-or-remove; the standing 2026-09-10 「以协议为准」 ruling; the 2026-08-27 「no staged retirement」). Removal route: thespec-property-retirementplaybook.What this removes
A fully authorable key — bounded (
min(1000).max(300000)), defaulted (30000),.describe()d, writable onConnectorSchemaand, throughDeclarativeConnectorEntrySchema, onstack.connectors[]andPUT /meta/connector/:name, and served back by/meta/connector. Every signal an authoring surface can give said it worked. Plus theConnectorProviderContext.connectionTimeoutMsmember handed to every provider factory.requestTimeoutMsis the replacement: the deadline the platform actually keeps, applied asresilientFetch's per-attempt timeout.⭐ The measurement the ruling left to the dev — D2 or D3
The ruling prescribed a D3 semantic entry and said a D2 conversion is owed only if a stored connector row can carry the key — 「the dev measures」. It can, so both ship.
Measured first-hand on this branch, before the tombstone landed, against the built
packages/spec/dist:getMetadataTypeSchema('connector')bound?true— it resolvesDeclarativeConnectorEntrySchema, the shapePUT /api/v1/meta/connector/:namevalidates againsttrue4321— so the number reachessys_metadataerrorMappingon the same schema is refused — the door discriminates rather than accepting everythingapplyConversionsToStoredItem('connector', row)live for this type?connector-error-mapping-removedand stripped that key from a stored rowrequestTimeoutMssurvived untouched, so the strip is attributableWhat would have made it the other answer:
getMetadataTypeSchema('connector')returningundefined(no write door ⇒ no stored row), or the door's output dropping the key, or the rehydration seam never reachingconnectorrows. All three fired the other way, so a D2 conversion is owed and a D3-only kit would have left 17.x rows carrying a key the schema now refuses.Both dispositions are re-measured by pins in
packages/spec/src/integration/connector-connection-timeout-retirement.test.ts, so the answer cannot rot into an assumption.⛔ This section's earlier premise is known false and is replaced rather than patched. It claimed the card's Leg-2 table 「was already false when this retirement was taken」. It was not.
At the SHA the card cites and dates —
0870fb5418—git grep -n connectionTimeoutMs SHA -- . ':!packages/spec'returns exactly five non-spec source hits, and all five areconnectionTimeoutMs: 30000,: the card's table, line for line. ⇒ the card was correct when measured. What moved it isb929e0a662(#19388) — the very PR the card itself flagged as pending.At⚠️ Seven files, not five — five is the count of packages, and conflating the two is how the earlier number was reached.
origin/mainthe same instrument returns thirteen non-test source occurrences over seven files in five packages: six reads, four type declarations, and three surviving pure hardcoded30000writes (connector-mcp/src/mcp-connector.ts,connector-slack/src/slack-connector.ts,service-automation/src/plugin.ts).services/service-automation/src/plugin.ts:307entry.connectionTimeoutMsinto the materialization fingerprintservices/service-automation/src/plugin.ts:1589ConnectorProviderContextconnectors/connector-rest/src/rest-provider.ts:64ctx.connectionTimeoutMsconnectors/connector-openapi/src/openapi-provider.ts:193ctx.connectionTimeoutMsconnector-rest/src/rest-connector.ts:134,connector-openapi/src/openapi-connector.ts:242?? 30000— read the opts and deposit the value on the reported defThe ruling's premise survives, and the mechanism is unchanged. Every read is a pass-through. The value's only termini are (a) the def
GET /connectorsechoes and (b) the fingerprint that decides whether to re-materialize.connectorFetchOptions()(integration/connector-fetch-policy.ts) is handed{ retryConfig, requestTimeoutMs }only, and a pin has asserted since #18975 that nothing aliases this key ontotimeoutMs. Carrying a number is not honouring it — the parsed-unmarked-unenforced state ADR-0049 forbids, wearing a longer route.Nor was the
实现arm available: a WHATWGfetchexposes oneAbortSignalover the whole operation and never the connect phase, so bounding time-to-response with this key would kill a slow-but-connected upstream the author meant to allow with a largerequestTimeoutMs.Zero-enforcement verification, with its control
git grep -n connectionTimeoutMsover the whole worktree (45 hits, hand-read, not counted) plus the source ofconnectorFetchOptions(). Radius: the monorepo. Control:requestTimeoutMs— same schema, same census, same files — resolves to a real read (opts.timeoutMs = policy.requestTimeoutMs), so the instrument is not dead.git grep connectionTimeoutMsat objectui87af769e9a3ee28ace099fdd653d3ebd79fe82e2(the.objectui-shapin) → exit 1, zero hits; controlconnectoron the same command and scope returns 458 lines across 66 files; andrequestTimeoutMsis exit 1 / 0 lines there, so it is not a usable control in that repo (it is in objectstack). ⇒ theConsole Pin Gateneeds no sibling fix and no pin bump with this removal.z.preprocesspipes, and objectui'spackages/app-shell/src/views/metadata-admin/clientValidation.optOuts.test.ts:468assertschecks(DeclarativeConnectorEntrySchema) > 0— 1 againstmain, 0 here, because a pipe def has nochecksarray. The SPA still builds andConsole Pin Gatenever runs that suite, so no gate in either repo sees it. objectui resolves@objectstack/specfrom the registry at^17.0.0, so ⛔maindoes not go red on merge — the break lands at objectui's next spec bump. Tracked at objectui#10211; the gate-reach gap at objectstack#19692. ⛔ A.objectui-shabump is never a rider on another PR, so neither rides here.retiredKey()types the keynever, so every authoring site in the monorepo fails to compile. All six affected packages typecheck green after the cleanup, which is what says the census is complete rather than the grep.The retirement kit
retiredKey()tombstone on the non-strictConnectorSchema(a bare delete would be a silent strip, ADR-0104), inherited byDeclarativeConnectorEntrySchema.RETIRED_KEYS_BY_MAJOR[18]× 2 —integration/Connector:connectionTimeoutMsandintegration/DeclarativeConnectorEntry:connectionTimeoutMs— as one-file-per-entry undermigrations/entries/retired-keys/.connector-connection-timeout-ms-removedinconversions/registry.ts, wired into the step-18 chain.acceptRetiredDefaultResidueon both carriers with{ connectionTimeoutMs: 30000 }. A D2 does not discharge this: the ruled precedent18.security__ObjectPermission__allowPurgecarries both a D2 (permission-allow-restore-purge-removed) and the residue stage, so D2 coverage cannot be the discriminator. The discriminator is whether a released toolchain MATERIALIZED the default — a 17.x toolchain emitsconnectionTimeoutMs: 30000into every connector entry, authored or not — and the second door isAutomationEngine.registerConnector, which parsesConnectorSchemafor a def a plugin builds in code, where no conversion runs. Without the stage a 17.x connector package fails registration on a value its author never typed. Head now accepts-and-strips30000while still refusing15000,1000and"30000". The preprocess pipe this introduces moves five ADR-0097 refinement sites onto its OUT side, sodropped-refinements.baseline.jsonmoves with them — exactly the moves the build gate printed, no additions.connector-provider-context-connection-timeout-ms-retiredfor the withdrawnConnectorProviderContextmember — a provider factory is code, so there is no authored source for a conversion to rewrite.liveness/connector.json: the row staysdeadwith aREMOVEDnote, becauseretiredKey()keeps the key in the walked shape (therls.priorityprecedent). Its stale 「every occurrence outsidepackages/specis a WRITE」 claim is corrected there, with the reads named.authorable-surface/integration.jsongains two[RETIRED]rows,authorable-defaults/integration.jsonloses the two= 30000rows.api-surface/andjson-schema.manifest/are byte-identical — the correct reading for a key-only tombstone that retires no def, not a missed regeneration.service-automation(fingerprint, declared-item shape, context build, degraded husk).packages/spec/liveness/README.md'sconnectorrow asserted, present tense, that the entry schema isConnectorSchema.superRefine(...)— and rested its byte-identical-key-set conclusion on that attachment. Both halves are corrected: the mechanism is now the pipe's read-throughshape, and the conclusion is re-measured rather than inherited (30 keys each carrier, byte-identical, zero entry-only, zero base-only)..gitattributes:71-77splitsliveness/state-counts.md(driver-managed numbers) fromliveness/README.md(hand-written Notes prose), because 「regenerating a Note would fabricate a verdict」.ZodObjectcombinators leave both published exports. WrappingConnectorSchemaandDeclarativeConnectorEntrySchemain the residue stage makes themz.preprocesspipes, so.extend(),.omit(),.pick(),.partial(),.merge(),.strict(),.keyof()and.safeExtend()no longer exist on them. Build on the object and re-wrap —acceptRetiredDefaultResidue(<the extended object>, { connectionTimeoutMs: 30000 }), theEffectiveObjectPermissionSchemaroute..superRefine()still exists on a pipe and is callable, but returns a schema with no read-throughshape— which is exactly what the schema walkers duck-test — so refine before wrapping, never after. Parsing,z.input/z.inferand the read-through.shapeare unchanged. The changeset's FROM → TO carries this row; the docblock atconnector.zod.tsand the superseded sentence it replaces carry it in the source.Clause-②: yes (narrowing),minoron@objectstack/spec(the launch-window gate refusesmajor),patchon the five consumer packages, with the FROM → TO table and the ADR-0087 disposition marker.Tests and gates run locally
pnpm --filter @objectstack/spec buildtypecheck× 6 (spec,connector-rest,connector-openapi,connector-mcp,connector-slack,service-automation)test× 5 consumer packagessrc/integration src/conversions src/migrations+ the migrate-sentence and cron pinstest:repopnpm build+ the re-derived 112-command gate sweep on this headPREREQUISITE NOT METfrom unbuilt packages ⇒ read as NOT MEASURED, ⛔ never as failures, and re-run green after the build)--project repocheck:generatedcheck:docsandcheck:livenessincludedcheck:generatednames as not runcheck:nul-bytes,check:cross-package-test-inputs,check:adr-0087-registration,check:changeset-no-majorEvery exit code above was captured before any pipe. The repo-wide gate farm is CI's run, not this PR's local obligation.
Acceptance notes
content/docs/**off.content/docs/references/integration/connector.mdxis an auto-generated baseline whose gate (check:docs) is inside the requiredTypeScript Type Checkjob, and it goes stale on this change alone. Measured across all 19 open PRs (283 file rows, 0 unreadable): zero hold that path, so the fence's stated reason — "open PRs hold files there" — does not apply to it; the instrument discriminates, returningcontent/docsrows for seven other PRs. It is regenerated here, exactly as the sibling retirement fix(spec): retiretenancy.organizationFieldfrom the authorable surface (#19054) #19618 regenerates four of the same tree's pages. No hand-writtencontent/docs/**prose is touched, andskills/**and.claude/**are untouched — this diff hits no governed surface.never, so the four connector packages andservice-automationmust stop writing it or the monorepo does not compile. Those paths are outside the claim's declared file surface and are held by zero open PRs on the same census.packages/spec/vitest.repo-tests.jsongains one line: the new tree-scoped absence pin's walk radius, whichcheck:cross-package-test-inputsdemanded by name. No new glob; the radius was already declared for this package.connectionTimeoutMs-is-never-mapped pin inconnector-fetch-policy.test.tsis kept after the retirement, deliberately: it is what makes a re-introduction as a silent alias ontotimeoutMsfail.health.circuitBreakerremainsdeadon this schema and is not touched here — a different set of rows on the same ADR-0049 worklist.Generated by Claude Code