Repository navigation
refactor(plugin-auth): move the buildPluginList body into auth-manager-plugin-list.ts (#25224 cut 16) - #25624
Conversation
…r-plugin-list.ts The body of AuthManager.buildPluginList() moves unedited into the module function buildPluginList, re-indented one level: the reset of the degraded-feature record and the JWT signing verdict, the enabled table with its env and config precedence and the SCIM coherence re-check, and every plugin in the same order (bearer, the organization factory's arrow, twoFactor, breached-password rejection, admin, phoneNumber, magicLink, the generic OAuth providers, the OIDC provider with its jwt plugin, sso, scim, device authorization and the custom session). The method keeps its place, docblock, signature and return type; it now builds one host of the 22 AuthManager members the body reads (18 methods as late-bound closures, config and degradedFeatures as getters, jwtSigningFailureReported and orgRolesMap as get/set pairs because the body writes them) and returns buildPluginList.call(host). The async moved from the method to the function. The organization factory's arrow, which cut 15 left in the body, moves with it and builds its host from this host, so it reaches the same members and the same field as before. readBooleanEnv and consentOrganizationOf, the two top-level declarations of auth-manager.ts the body reads that the file did not export, are exported in place and imported by value with the five that already were; src/index.ts names its auth-manager.ts exports one by one, so nothing new is published. Nine imported names leave auth-manager.ts with the body. Readers that follow it: the two plugin-factory scans read the module, and the population comments in auth-email-locale.test.ts name it. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSXBc2GCBwiAL7vV4kWkyr
📓 Docs Drift CheckThis PR changes 1 package(s): 14 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 21 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 d4a6dc12b9f3b6afef96e941ad6bd50d6513b6ca && git checkout d4a6dc12b9f3b6afef96e941ad6bd50d6513b6ca
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 481ac6211641ccb7292508ed423f02e432322e4a a2413e05ce692c7e8127d7aa891859c3c49ec611 && git checkout -B drift-repro 481ac6211641ccb7292508ed423f02e432322e4a && git merge --no-ff a2413e05ce692c7e8127d7aa891859c3c49ec611
node scripts/docs-audit/affected-docs.mjs --json 481ac6211641ccb7292508ed423f02e432322e4a
|
席位核对 · ACCEPT · 2026-10-24T11:29Z
Generated by Claude Code |
Requested by Sales · project thread
Part of #25224
Clause-②: no
Metadata-protocol: none
Ruling-ref: 6348891160, 6364006498
The basis for the
Clause-②: noline: this is a move plus reader migrations. No accept set, route, refusal, code or answer changes, and the published surface is measured unchanged:@objectstack/plugin-auth'sdist/index.d.tsanddist/index.d.mtsare raw byte-identical to base (0 diff lines, so the union-order normalisation has nothing to do). The positive control is the one ruling6348891160asks for.buildPluginListandPluginListHostare not among them.The
.d.tsbar is ruling6348891160item 1 (on #25222, covering this card). Ruling6364006498is Sales's ruling A on this card. This is the eighth cut it applies to.Cut 16 of the
auth-manager.tssplit, and the series' last: the rest ofbuildPluginList, which is its whole body. It is the second of the twobuildPluginListcuts the seat set at 02:10Z (theorganizationfactory in cut 15, #25594, then the rest of the method). The series ends after this cut; once it lands, the final report goes on #25224.This follows the amended claim
6383249105, which amends6379187398on the file cut 15 left (#25594, landed note6382750527). The shape is the #23050 method move cuts 1 to 11 and 14 used, with cut 10's get/set pair (#25508) for the two fields the body writes.Branch:
claude/project-thread-lg3wrj, the harness-pinned branch for this session, restarted fromorigin/mainafter #25594 merged. It names no issue, so the card relation is this body's first line.auth-manager.tsgoes from 6,556 to 5,789 lines. The cut is +961 / −813 over 5 files: 1,774 changed lines, under the 3,000-line line. Two of the five files are path readers outside the move and one carries two comments, socheck-governed-merges.mjsran on the trial file list before the cut: NOT governed (0 of 5 paths hit the register), and--branch HEADagrees. One commit:a2413e05cerefactor(plugin-auth): move the buildPluginList body into auth-manager-plugin-list.ts.The move
buildPluginList:1876–:2666The lines are base
10b8250ad5. The 793 proof lines are the body with its braces (the method's{on:1875to its}on:2667).What it is:
buildPluginList(:1875,private async, annotatedPromise<any[]>) builds better-auth's plugin list.createAuthInstancecalls it once per build, asawait this.buildPluginList(), through its host's closure since cut 14.What the body does, in order (all of it moves, with its comments): the reset of the degraded-feature record and of the JWT signing verdict; the
enabledtable (the env and config precedence it documents and the SCIM coherence re-check); and every plugin in the same order:bearer, theorganizationfactory's arrow (whose body cut 15 moved),twoFactor, breached-password rejection,admin,phoneNumber,magicLink, the generic OAuth providers, the OIDC provider with itsjwtplugin,sso,scim, device authorization and the custom session, thenreturn plugins.Where it goes: a new module,
packages/plugins/plugin-auth/src/auth-manager-plugin-list.ts(913 lines). The body becomes the body ofexport async function buildPluginList(this: PluginListHost): Promise<any[]>, re-indented two spaces (one level) and otherwise unedited. The module header gives the reasoning, in the form the fifteen earlierauth-manager-*.tsmodules use.What stays:
buildPluginListkeeps its place, its docblock, itsprivatemodifier, its (empty) parameter list and its return annotation. Its body is now:The seat's bars
Body.
asyncmoves from the method to the function. The stub is notasync, and it returnsbuildPluginList.call(host), the function's own promise, socreateAuthInstance'sawait this.buildPluginList()awaits the same promise the body settles. The readers, the writers, the host literal and the.callcannot throw before the promise exists, and a throw inside the body is still a rejection of it.Promise<any[]>. The body uses noarguments,new.targetorsuper(0 of each), no barethis, and nothisunder a non-arrow function (its only non-arrow function nodes are the getter and the setter in theorganizationarrow's host literal, which read and write through their closures and name nothis).Receiver.
thiswas theAuthManagerinstance. It is now the host.PluginListHostnames exactly the 22 members the body reads, no more, each typed as the class member (AuthManager['x']).(...a) => this.x(...a):addOptionalPlugin,buildJwtPlugin,computeAuthGate,deliverPhoneOtp,emailLocaleArg,enforceSessionControls,getAppName,getConsolePageUrl,getDataEngine,getEmailService,getMcpResourceUrl,isPlatformAdminUserId,multiOrgPostureEffective,reconcileScimUserLifecycle(which stays in the class, per ruling A),resolveAuthSecret,resolveMembershipRole,resolveTwoFactorAccountLockoutandstoredRecipientLocale. The method runs on the manager and is looked up when the body calls it, so a spy or double set on the manager is still the one the body reaches, including from the callbacks it hands better-auth (the phone OTP senders, the magic-link sender and the custom session among them), which run long after the function returns. Every method read is a direct call.config, which the class reassigns after construction (setRuntimeBaseUrlandapplyConfigPatch), anddegradedFeatures, as every field this series carries goes, go as getters over reader closures,readonlyon the interface. The body readsconfig7 times and writes neither.jwtSigningFailureReportedandorgRolesMapgo as get/set pairs, the shape the seat set for a moved body that writes a field (cut 10, refactor(plugin-auth): move AuthManager's request routing into auth-manager-request-routing.ts (#25224 cut 10) #25508; cut 6'sreportJwtSigningFailurestub carries the first the same way, and cut 15 carriedorgRolesMapso). The body resetsjwtSigningFailureReportedonce (:1881,= false) and never reads it. It reads and writesorgRolesMaponly through theorganizationarrow's reader and writer (:1978,:1979). Each setter writes the manager's own field through its writer closure, soreportJwtSigningFailure, which reads the flag back, and the actor guards, which read the roles map back, read the same field, written at the same moment, as before. Neither isreadonlyon the interface.resolveKernelService): the body callsthis.degradedFeatures.clear()(:1876) on the object the getter returns, the manager's ownMap, at the same moment as before. Itsthis.configreads are data (plugins,phoneOtp,oidcProviders,dataEngine); none is called.AuthManager.X, so the module imports the class as a type only. Its one read of the class is a type position (AuthManager['orgRolesMap'],:1979, in theorganizationarrow's writer).The
organizationarrow. It moves with the body, unedited, and builds its host fromthis, which is now this host: each of its eight closures calls this host's closure, which calls the manager's method; itsconfiggetter reads this host's getter; itsorgRolesMapreader and writer read and write this host's pair, which read and write the manager's field. So it reaches the same members, and the same field, at the same moment as before (cut 14's precedent for a moved body holding an earlier cut's stub). Its import (buildOrganizationPluginandOrganizationPluginHost) moves to the new module with it.Two top-level declarations, exported in place, and five already exported.
auth-manager.ts:readBooleanEnv(:347, 4 reads) andconsentOrganizationOf(:1453, once), which were not exported, andresolveScimEnabled,assertScimAdminCoherence,resolveOidcProviderEnabled,resolveDcrEnabledandOAUTH_ORGANIZATION_CLAIM, which were.6364006498(A), the two getexportin place, in this cut, the first whose body reads them, and the module imports all seven by value from./auth-manager.js, with the class as a type. The binding proof checks that each head declaration is the base one withexportin front and nothing else changed, and that the base and head reads resolve to it.src/index.tsnames itsauth-manager.tsexports one by one and names neither, so nothing new is published.Host lifetime. The host is built each time
buildPluginListis called, whichcreateAuthInstancedoes once per build, as every stub in this series builds its host per call. Nothing the body reads is captured early: the closures look each method up on the manager at call time, and the getters and the get/set pairs read and write the fields when the body, or a callback it handed better-auth, does.Readers. The decision letters are read on the merge base and on the head below: 19 leave the anchored surface, disclosed. Tenant census and symbol-anchor output are byte-identical at both ends, and the full plugin-auth suite passes at both ends. The three readers whose lists or comments name where the moved lines live are migrated in this commit.
Imports and evaluation order
Nine imported names leave
auth-manager.ts, because the body was their last reader there:resolveUserAuthzGrants(the@objectstack/coreblock keeps its other names);./admin-impersonate-endpoint.jsblock (applyPlatformAdminImpersonation);./auth-schema-config.jsblock (buildTwoFactorPluginSchema,buildOauthProviderPluginSchema,buildDeviceAuthorizationPluginSchema,buildAdminPluginSchema,buildPhoneNumberPluginSchema);./auth-manager-organization-plugin.jsline (buildOrganizationPlugin,type OrganizationPluginHost) with its three comment lines.One comment and one line replace cut 15's:
import { buildPluginList, type PluginListHost } from './auth-manager-plugin-list.js'.AuthPluginConfig(a type),MCP_OAUTH_SCOPESandisPlaceholderEmailhave other readers, so both files import them.esbuild drops a type-only import, so a module whose last value import leaves
auth-manager.tscan now be evaluated later. The order was measured rather than argued:dist/index.mjsloaded, at base and at head. 171 modules evaluate at both, in the same order.Module._loadlog fordist/index.jsgives 127 first loads at both, in the same order.init_*calls finds three that run later at both entries, whose last value import fromauth-manager.tsleft with the body:auth-schema-config.ts,admin-impersonate-endpoint.tsandimpersonation-bearer-rotation.ts(whichadmin-impersonate-endpoint.tsimports). At the CommonJS entryplatform-admin-gate.tsalso moves, by two places: it ran two modules beforeprincipal-session-mint.tsat base and runs right after it at head;principal-session-mint.tsimportsjudgeHeldSessionfrom it and reads it inside a function only. The top levels of all five are imports, types, constants and function declarations (principal-session-mint.tsadds oneextends Errorclass), with no load-time call, apart fromadmin-impersonate-endpoint.ts'sVENDOR_ROLE_SCALAR_ADMIN_PATHS, anew Setof string literals (:191). No importer reads any of their bindings at load time: all 41 references in the 16 files that import one of these five or the new module (auth-manager.tsamong them) are inside functions, andindex.tsre-exportsplatform-admin-gate.tsandauth-schema-config.tswithexport *, which reads nothing.auth-manager.ts, for the seven declarations, andauth-manager.ts's import of it form a cycle with nothing read at load time, as cut 14's and cut 15's do.The decision-letter layer: 19 drop, disclosed
check-adr-anchors, measured on the merge base and on the head. The gate exits 0 at both, and every citation still resolves.10b8250ad5a2413e05ce:2532,:2569,:2594), ADR-0068 D1/D2 (:2526,:2555), ADR-0068 D2 (:2032,:2595,:2603), ADR-0069 D1 (:2007), D2 (:2001), D3 (:2046) and D4 (:2643), ADR-0090 D3 (:2526,:2555) and D5 (:2533), ADR-0131 D7 (:2196) and ADR-0135 D6 (:1913,:2404,:2435). They leaveauth-manager.ts, which is anchored, for a module that is not, so the count drops by 19 while the gate stays green and every citation still resolves. Theauth-manager.tsentry carries two paragraphs: ADR-0093 D2 (the membership reconciler, which stays) and ADR-0108 (the organization roles map, whose mechanism cut 15 moved toauth-manager-organization-plugin.ts, anchored by its own entry). Neither describes this body, so no entry is owed, per the seat's ruling after cut 5 (an entry would need new invariant text, which a move-only cut must not add; the drop is recorded in the ACCEPT), as cut 14 recorded its 8.Path readers
Three readers outside the move follow it, in this commit:
better-auth-schema-parity.test.tsandmanaged-extension-fields.test.ts: each one'sauthManagerPluginFactories()scans a list of files forconst { X } = await import('better-auth/plugins…' | '@better-auth/…'), and both lists gainauth-manager-plugin-list.ts(:324and:634). The body holds 13 such imports, all ofauth-manager.ts's (13 → 0). At base the scan finds 16 factories; at head without the new entry it would find 3 (organizationfrom the cut 15 module and the two inauth-manager-actor-guards.ts), missing 13, which each test's stale-entry check fails on; with it the scan finds the same 16 as base.auth-email-locale.test.ts: the two population comments (the docblock at:863and the in-test note at:1130, head numbering) that name the files the fivesendTemplatesites live in now nameauth-manager-plugin-list.ts(the body ofbuildPluginList) among them; the magic-link send moved with the body, andauth-manager.tskeeps one. No assertion, count or pattern changes.Read, and not edited:
api-error-code.pin.test.ts: the body carries nonew APIError(site, soauthManagerFilesis not owed the new module. Its sum stays 30, as at base.scripts/check-dispatcher-error-vocabulary.mjs: the body carries no code-stamping site (nocode:and nonew APIError(), and the gate's only per-fileplugin-authkey isliveMemberFile(auth-manager-before-hook.ts), which the cut does not touch. It exits 0 at both, 56 sites found and 56 classified at both, and its output is identical apart from its scanned-file count (3,444 → 3,445). Its--self-testruns inside the derivedpnpm check:dispatcher-error-vocabulary.The tenant-audit census. No census site moves: the body's engine calls are reads.
check-tenant-audit-censusexits 0 at both with no--write, with byte-identical output. Its--jsondocument has 238 sites at both and 0 per-site differences with line numbers ignored. 2 sites are inauth-manager.tsat both, 0 are in the new module, and 0 are unresolved or unledgered at both. OnlyscannedSources(762 → 763) andmeasuredAtmove, so neither census document is edited.scripts/measure-durability-swallow-family.mjs(a measurement, not a gate): 77 members and 84 quiet rows at both, identical with line numbers ignored (one member, inobserveFirstMemberships, which stays, moves 767 lines up with the cut's net::3876→:3109). Every statistic is the same apart fromfiles(3,494 → 3,495):tryStatements3,647 anddroppedNotAwaited230 at both.check-auth-mount-ledger.mjsreads only thebasePathdeclaration inauth-manager.ts, which stays.auth-manager-base-path.test.tsreadsauth-manager.tsfor code lines carrying'/api/v1/auth'; the body has none.rate-limit-storage-isolation.test.tswalks the import graph fromrate-limit-storage.ts, which reaches neither file. It passes at head.check-system-context-census.mjstracks reads ofExecutionContext.isSystem; the body has none in code.check-cross-package-test-inputs.mjsnamesauth-manager.tsin a self-test fixture only.Every symbol anchor into the file. Before the cut, every
auth-manager.ts#symbolanchor in the tracked tree outside changelogs was mapped withsymbolSegmentResolutionfromscripts/symbol-anchors.mjs. There are 29, and all 29 aredeclaration-class at base, at base with the body blanked, and at head. Seven of their symbols occur as a token on a line of the body, and each one's declaration stays where it was:resolveScimEnabled(ADR-0134:90,:127),reconcileScimUserLifecycle(:158,:263; the method, which stays per ruling A),assertScimAdminCoherence(:171),AuthManager(ADR-0135:104, the class),resolveOidcProviderEnabled(the ai checklist area:737, identity-auth:1166),computeAuthGate(identity-auth:1718, the method) andtwoFactor(identity-auth:1429, which resolves togetPublicConfig'sfeatures.twoFactor,:5301at base, which stays). Each resolves to its declaration at all three readings.Prose that now points one file early, disclosed, not edited (cut 14's precedent: a comment that reads no file is not a path reader):
scripts/publish-smoke.sh:1131namesauth-manager.tsfor theadmin: pluginConfig.admin ?? scimEffectiveline, which now sits in the module; thewhyof thedeliverPhoneOtprow inpackages/runtime/src/dispatcher-error-vocabulary.ts(:1359) says its two callers aresendOTPhooks inauth-manager.ts, which now sit in the module (the row'sfilefield, which the gate reads, namesauth-manager-email-sms-delivery.tsand is unchanged); andauth-manager-organization-plugin.ts's header describes theorganizationcall inbuildPluginList, which is now the module function's. If the seat wants any of them re-pointed, it is a comment edit in this PR.Proof
Builds and suites ran through
os-verify-lock, and every exit code was captured before any pipe. Base10b8250ad5. A fullturbo run buildran first. Thenplugin-authwas built and its suite run at base, and built and run again at head, on the same dependency dists.1. The moved text.
Token identity: the base method body and the module function body are the same TypeScript token sequence (scanner tokens, kind and text, trivia skipped, each template literal re-scanned at its substitutions as the parser does): 793 lines and 2,096 tokens, each line the base line minus two spaces.
The stub's shape, checked by the same run: the stub is not
async, takes no parameter and keeps the docblock,privateandPromise<any[]>; it opens with the six reader and writer closures (one reader per field, one writer per get/set field), then one host literal whose keys are exactlyPluginListHost's, alphabetical, whose 18 method values are each(...a) => this.<key>(...a), whoseconfiganddegradedFeaturesare getters over their readers and whosejwtSigningFailureReportedandorgRolesMapare getters over their readers and setters over their writers, thenreturn buildPluginList.call(host), and nothing else. The interface types every memberAuthManager['x'], and exactly the two getter-only fields arereadonly. The run also checks that the body writes exactly the two get/set fields.Binding identity: a second proof walks all 500 identifiers of the body at base and in the module, in order, and resolves each with the TypeScript checker (the module's
./auth-manager.jsresolved to the head file, where the in-place exports live). All 500 resolve the same way at both ends:AuthManagerat base,PluginListHostat head);./auth-manager.jsnames among them;auth-manager.ts: sixAuthManagerOptionsmembers read throughthis.config(dataEngine,oidcProviders, andphoneOtpwith itsallowedAttempts,expiresInandotpLength);None resolves to an unexported top-level declaration of
auth-manager.tsor to a top-level declaration of the module. A read of the class itself would have to be in a type position: the one there is (:1979) is.Negative controls: each proof reads the module text, and each control changes it, or the proof's input, in memory only; the file is untouched.
plugins.push(bearer());changed toplugins.push(bearer?.());fails the token and line checks (2 failures), and the run exits 1. Declaring the get/set fields withoutjwtSigningFailureReportedfails the write check and the stub-shape checks (4 failures), and the run exits 1.admin-impersonate-endpointimport pointed at another specifier gives 1 difference, and the run exits 1. Theplaceholder-emailimport shadowed by a module-levelconstgives 1 difference and reports the module top-level read, and exits 1. Run without being told about the in-place exports, it reports the base reads of the two unexported declarations (5 reads), and exits 1.An independent reading:
git diff --color-moved=plain --color-moved-ws=allow-indentation-change 10b8250ad5 a2413e05ceover the two source files marks 799 of the 808 deleted lines and 820 of the 954 added lines as moved.resolveUserAuthzGrants,applyPlatformAdminImpersonationand the./admin-impersonate-endpoint.jscloser), cut 15's three import comment lines, the first lines of the two declarations (now withexport) and the method's own line (now withoutasync).return, the twoexportlines, and the new import comment and line. Of the 820, 14 are stub lines inauth-manager.tsthat git pairs with theorganizationarrow's own host lines, which have the same text.2.
.d.tsand exports (ruling6348891160items 1 and 2).dist/index.d.tsraw1b3a48357d137155de33104277667a922aab62df73b418b03894c56faaacd0badist/index.d.tsnormalisedcee7303ccdfe72794efd588c85b628419d4253d730b5a0c5a3f1cdb8dddb4443dist/index.d.mtsrawb5e8dc982b634f0a5108b1b533626a68767f2da5a56f72dba801059b149e2872dist/index.d.mtsnormalised562d0a4ce656f97aeb937541482cdf531b61d7c75a005918784bf0a52d032dfcnode -e 'const s=require("fs").readFileSync(process.argv[1],"utf8");process.stdout.write(s.replace(/"[^"\n]*"(?:\s*\|\s*"[^"\n]*")+/g,r=>r.split(/\s*\|\s*/).sort().join(" | ")))' dist/index.d.ts | sha256sum.dist/index.d.tswith one private member made public (private buildPluginList;→buildPluginList;, line 1829, a one-line change) hashes rawf8ff1470cbc34cd34a441c67b8763c5adde86fa408a4bcecf1590c60d30bce57and normalisedfe48a6a7f320e626e941a422a27571c28fbdc47a73bbbdaa0d5048d7307cae55. Both differ from the readings above.dist/index.mjsand CJSdist/index.jseach have 159 names at base and at head, the same list (the sha256 of the sorted names is3abb126f5babb701…on all four). Neither in-place export,buildPluginListnorPluginListHostis among them.dist/index.d.tsnames neither in-place export norPluginListHost; its 7buildPluginListlines areprivate buildPluginList;and docblock text, the same 7 at both ends.tsupbundles the new module into the root entry (splitting: false). The dist has the same 18 files at base and at head, plus the two.build-input-hashstamps the build writes from its inputs. Onlyindex.js,index.mjsand their maps differ.3. Tests and lint.
pnpm exec vitest run --maxWorkers=3inpackages/plugins/plugin-auth: baseTest Files 191 passed (191),Tests 3626 passed | 10 skipped (3636), exit 0. Head: the same counts, exit 0.pnpm --filter @objectstack/plugin-auth typecheck(bothtscprojects andcheck:test-typecheck): exit 0.pnpm --filter @objectstack/runtime typecheck: exit 0.eslintover the 5 changed files: exit 0.4. The censuses, the measurement and the anchors, at base and at head.
The tenant-audit census, as above: byte-identical gate output, 238 sites at both, 0 per-site differences line-blind, 0 unresolved and 0 unledgered at both.
The durability measurement, as above, with its one moved statistic traced.
These checkers were run by hand at base and at head, because
dispatch-gatesdoes not derive the ADR one. All six exit 0 at both. Five print byte-identical output at both (cmpclean):check-adr-symbol-anchors: 2,384 anchors across 142 records, 466 symbol (440 declaration, 26 literal);check-scripts-symbol-anchors: 4,070 anchors;check-spec-docblock-symbol-anchors: 5,076 anchors;check-system-context-census: 149 elevation read sites;check-platform-checklist: 16 areas, 329 items.The sixth,
check-adr-anchors, differs only in the file count and the decision letters, as in the table above.5. Gates.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 61 commands for the 5 paths. All 61 ran at head after the full build, and all 61 exited 0.--ranover the record with each exit code: 61 derived, 61 run, 0 NOT-MEASURED, a derived zero.--tier: no path-derived mandate.check-governed-merges.mjs: on the trial file list before the cut and--branch HEADafter the commit, both read NOT governed (0 of 5 paths hit the register), 1,774 changed lines.node scripts/docs-audit/affected-docs.mjs --json 10b8250ad5, exit 0): 21 pages, all name matches of names the moved code carries (thePLATFORM_ADMIN,platform_admin,OS_AUTH_TWO_FACTORandOS_SSO_DOMAIN_VERIFICATIONliterals, the plugin namesphoneNumber,magicLink,oidcProvideranddeviceAuthorization, andAuthManagerandgetMcpResourceUrl). One namesauth-manager.ts:content/docs/kernel/services-checklist.mdx(:314), for the identity provider service as a whole, which still holds. The code that reads those names is unchanged, so no doc edit is owed. 7 of the 21 are release notes, release-owned and not edited.auth-manager.ts: feat(plugin-auth): a new organization takes its creator's default currency (#25495) #25621, whose only hunk there is:1320–:1331(the docblock ofacceptLanguageHeaderand anexportin place on it), a region this cut does not touch and the body does not read;git merge-treemerges this head with its head cleanly. None of the others touchesplugin-auth, the new module's path, a reader edited above orscripts/adr-anchors/.origin/mainhas moved 5 merges past this base, tof7b0298968; none touchesplugin-auth,scripts/adr-anchors/or a reader named above, andgit merge-treemerges this head with it cleanly.Changeset
None:
skip-changeset, per ruling6348891160item 4. The published declarations and export lists are unchanged, and the bundle's bytes move only because code moved inside it.Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_01LSXBc2GCBwiAL7vV4kWkyr