Repository navigation
refactor(plugin-auth): move the organization plugin factory into auth-manager-organization-plugin.ts (#25224 cut 15) - #25594
Conversation
…-manager-organization-plugin.ts The body of the arrow AuthManager.buildPluginList() hands addOptionalPlugin for 'organization' moves unedited into the module function buildOrganizationPlugin, re-indented two levels: the closed organization-role vocabulary and the roles map built from it, the options object (schema, teams, the invitation verification declaration, the organization and membership limits, the organization hooks with their refusal codes, the invitation e-mail), the vendor plugin and the rebuilt invitation listing. The arrow keeps its place in buildPluginList; it now builds one host of the ten AuthManager members the body reads (eight methods as late-bound closures, config as a getter, orgRolesMap as a get/set pair because the body stores the roles map on the manager) and returns buildOrganizationPlugin.call(host). The async moved from the arrow to the function. The eight top-level declarations of auth-manager.ts the body reads and the file did not export (five hook refusal codes, two read-fault answers and the placement gate's refusal test) are exported in place and imported by value, with readInvitationPlacementIntent; src/index.ts names its auth-manager.ts exports one by one, so nothing new is published. Fifteen imported names leave auth-manager.ts with the body. Readers that follow it: the api-error-code pin counts the module among the AuthManager files, the two plugin-factory scans read it, the population comments in auth-email-locale.test.ts name it, and the module gets its own ADR anchor entry carrying the ADR-0108 paragraph verbatim, since the body is the roles map that paragraph describes. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSXBc2GCBwiAL7vV4kWkyr
📓 Docs Drift CheckThis PR changes 1 package(s): 30 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 11 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. 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 cae3a7d4a5672fd571c19ccd58e2c3bda3c49010 && git checkout cae3a7d4a5672fd571c19ccd58e2c3bda3c49010
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin e073455929a60b67c48da3f91324261e57aaa26b 361581a546d70f3f2e0597fe598428349ae27cef && git checkout -B drift-repro e073455929a60b67c48da3f91324261e57aaa26b && git merge --no-ff 361581a546d70f3f2e0597fe598428349ae27cef
node scripts/docs-audit/affected-docs.mjs --json e073455929a60b67c48da3f91324261e57aaa26b
|
席位核对 · ACCEPT · 2026-10-24T03:59Z
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 and one anchor entry. 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.buildOrganizationPluginandOrganizationPluginHostare 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 seventh cut it applies to.Cut 15 of the
auth-manager.tssplit: theorganizationplugin's factory insidebuildPluginList. It is the first of the twobuildPluginListcuts the seat set at 02:10Z (this factory, then the rest of the method); the series ends after cut 16, and #25224 stays open for it.This follows the amended claim
6379187398, which amends6377759458on the file cut 14 left (#25566, landed note6378561924). The shape is the closure move cuts 12 and 13 used (a factory arrow's body into a module function called on a host), with cut 10's get/set pair (#25508) for the one field the body writes.Branch:
claude/project-thread-lg3wrj, the harness-pinned branch for this session, restarted fromorigin/mainafter #25566 merged. It names no issue, so the card relation is this body's first line.auth-manager.tsgoes from 7,122 to 6,556 lines. The cut is +734 / −608 over 7 files: 1,342 changed lines, under the 3,000-line line. Four of the seven files are path readers outside the move and one is a new anchor entry, socheck-governed-merges.mjsran on the trial file list before the cut: NOT governed (0 of 7 paths hit the register), and--branch HEADagrees. One commit:361581a546refactor(plugin-auth): move the organization plugin factory into auth-manager-organization-plugin.ts.The move
organizationfactory arrow inbuildPluginList:1991–:2559The lines are base
ba9e0c3749. The 571 proof lines are the body with its braces (the arrow's{on:1990to its}on:2560).What it is:
buildPluginList(:1892,private async, annotatedPromise<any[]>) builds better-auth's plugin list. For each optional plugin it callsawait this.addOptionalPlugin(plugins, name, async () => {…}), whose arrow loads the plugin and builds it. Theorganizationcall is at:1990, insideif (enabled.organization).What the body does, in order (all of it moves, with its comments): the deferred
better-auth/plugins/organizationimport; the closed organization-role vocabulary and the roles map built from it (better-auth/plugins/organization/access), stored on the manager asorgRolesMap; one options object (the schema, teams, therequireEmailVerificationOnInvitation: falsedeclaration, the organization limit, the membership limit, the organization hooks for creation, invitation, acceptance, slug change and deletion with their refusal codes, and the invitation e-mail); the vendor plugin built from it; and the rebuilt/organization/list-user-invitationslisting, with its warning when the vendor no longer exposes it.Where it goes: a new module,
packages/plugins/plugin-auth/src/auth-manager-organization-plugin.ts(683 lines). The body becomes the body ofexport async function buildOrganizationPlugin(this: OrganizationPluginHost), re-indented four spaces (two levels) and otherwise unedited. The module header gives the reasoning, in the form the fourteen earlierauth-manager-*.tsmodules use.What stays:
buildPluginListkeeps its place, its docblock, its signature and every other line. Theorganizationcall keeps its place in it, and its arrow is now:The seat's bars
Body.
}was at column 6, and in the module it is at column 0.asyncmoves from the arrow to the function. The arrow is notasync, and it returnsbuildOrganizationPlugin.call(host), the function's own promise, soaddOptionalPluginawaits the same promise the body settles. The readers, the writer, the host literal and the.callcannot throw before the promise exists, and a throw inside the body is still a rejection of it.arguments,new.targetorsuper(0 of each), no barethis, and nothisunder a non-arrow function (its one non-arrow function node is a function type). It reads no local ofbuildPluginList:enabledandpluginsappear only in theifand in the call's own arguments, and the body'sdataEngineis its own local.buildPluginListis byte-identical at base and at head outside the arrow, apart from the three comment lines above the call (772 lines at base, checked by the same run).Receiver.
thiswas theAuthManagerinstance, the arrow's lexical receiver. It is now the host.OrganizationPluginHostnames exactly the 10 members the body reads, no more, each typed as the class member (AuthManager['x']).(...a) => this.x(...a):emailLocaleArg,getAppName,getConsolePageUrl,getDataEngine,getEmailService,multiOrgPostureEffective,resolveMembershipRoleandstoredRecipientLocale. 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 organization hooks and the invitation e-mail, which better-auth runs long after the function returns.config, which the class reassigns after construction (setRuntimeBaseUrlandapplyConfigPatch), goes as a getter over a reader closure,readonlyon the interface. The body reads it 9 times and never writes it.orgRolesMapgoes as a get/set pair, 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,routeOwnershipandrouteOwnershipFor). The body writes it once (:2050,this.orgRolesMap = customOrgRoles) and never reads it. The setter writes the manager's own field through the writer closure, so the field the actor guards read back (assertRemoveMemberPermittedandassertOrganizationDeletable, through their own getters) is the same field, written at the same moment, as before. It is notreadonlyon the interface.resolveKernelService): the body reads five function-valued members offthis.config. It callsthis.config.invitationPlacement?.()(twice,:2245and:2290) andthis.config.logger.warn(msg, meta)(:2487) on their own objects; it readsonOrganizationCreated(:2178) andonInvitationAccepted(:2307) into a localcband calls that; and it handsgetI18non as a value (:2485). Each is read off the object the getter returns, the manager's currentconfig, at the same moment as before, so every call has the same callee and the samethis.AuthManager.X, so the module imports the class as a type only.Eight top-level declarations, exported in place, and one already exported.
auth-manager.ts:ORGANIZATION_RESERVED_IDENTIFIER_CODE,ORGANIZATION_CREATION_DISABLED_CODE,INVITE_PLACEMENT_UNSUPPORTED_CODE,INVITE_PLACEMENT_OUTSIDE_ISSUER_SCOPE_CODEandORGANIZATION_SLUG_LOCKED_CODE;slugGuardReadFaultApiErrorandinvitationPlacementReadFaultApiError;isInvitationPlacementGateRefusal;readInvitationPlacementIntent, which is already exported.6364006498(A), the eight unexported ones getexportin place, in this cut, the first whose body reads them, and the module imports all nine by value from./auth-manager.js. 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.new APIError(sites stay inauth-manager.ts.src/index.tsnames itsauth-manager.tsexports one by one and names none of them, so nothing new is published.readInvitationPlacementIntentwas exported and published at base, and is in both export lists and indist/index.d.tsat both ends, unchanged.Host lifetime. The host is built each time
addOptionalPluginruns the factory, whichbuildPluginListdoes 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 getter and the get/set pair read and write the fields when the body, or a hook it handed better-auth, does.Readers. The decision letters are read on the merge base and on the head below: none drop, and the new module is anchored by the entry under Path readers. Tenant census and symbol-anchor output are byte-identical at both ends, and the full plugin-auth suite passes at both ends. The four path readers whose text or lists name where the moved lines live are migrated in this commit.
Imports and evaluation order
Fifteen imported names leave
auth-manager.ts, because the body was their last reader there:OrganizationOptions(its wholebetter-auth/plugins/organizationline);./cloud-managed.jsline (CLOUD_MANAGED_REFUSAL_CODE,CLOUD_MANAGED_REFUSAL_MESSAGES);resolveOrgLimit(the@objectstack/typesblock keepsresolveTenancyPostureandisMcpServerEnabled);./membership-limit.jsline (resolveMembershipLimitOption);@objectstack/specblock (MEMBERSHIP_ROLE_DELEGATED_ADMIN,MEMBERSHIP_ROLE_EXTERNAL);withSystemContext(the./objectql-adapter.jsline keepscreateObjectQLAdapterFactoryandwithSystemReadContext);./list-user-invitations-verification.js,./invitation-role-cap.js,./invitation-role-label.jsand./organization-delete.jsblocks (applyDeclaredInvitationVerificationToListing,invitationRoleCapFailure,isPlainMemberInvitation,invitationRoleLabel,isDefaultOrganizationTarget,removeOrganizationAuthStructure);buildOrganizationPluginSchema(the./auth-schema-config.jsblock keeps its other names).One comment and one line are added after cut 14's:
import { buildOrganizationPlugin, type OrganizationPluginHost } from './auth-manager-organization-plugin.js'.isCloudManaged,postureEnforcesWall,resolveTenancyPosture,withSystemReadContextandisPlaceholderEmailhave other readers, so both files import them. One prose mention ofwithSystemContextstays in a docblock (:892at head, in backticks, not a{@link}), so nothing dangles.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 apart from one adjacent pair just before the bundle's own body:@objectstack/platform-objects/identityand@better-auth/core/utils/ipswap places (169 and 170). The bundle's firstplatform-objects/identityimport isinvitation-role-label.ts's (SysMember), and that module's segment now sits later in the bundle (line 4,828 at base, 8,522 at head), after the firstutils/ipimport. Neither module imports the other.utils/ip's top level imports@better-auth/core's env module andzod, builds twozodschemas and declares constants and functions;platform-objects/identityimports three@objectstack/specentries, all evaluated earlier at both, and builds object schemas. Neither writesprocess.envor a global.Module._loadlog fordist/index.jsgives 127 first loads at both. Two move earlier:@better-auth/core/dist/utils/ip.mjsand@better-auth/core/dist/context/index.mjswere the last two loads at base and now come right after@objectstack/spec/identity, ahead ofplatform-objects/identity,rest,observability,metadata-core, node'smoduleandmetadata/view-container. Their top levels are the ones above and the inertcontextchain cut 14 measured (its only load-time reads are ofprocess.env), and none of those five package entries writesprocess.envor a global anywhere in its file (moduleis node's own).init_*calls finds six that run later at both entries:cloud-managed.ts,membership-limit.ts,list-user-invitations-verification.ts,invitation-role-label.ts,organization-delete.tsandgrant-set-name.ts, whose last value import fromauth-manager.tsleft with the body (grant-set-name.tsmoves withorganization-delete.ts, which imports it). Their top levels are imports, constants with no call in their initializers, types and function declarations: no load-time call at all. No importer reads any of their bindings at load time: all 35 references in the 11 importing files are inside functions, andindex.tsre-exportscloud-managed.tswithexport *, which reads nothing.auth-manager.ts, for the nine declarations, andauth-manager.ts's import of it form a cycle with nothing read at load time, as cut 14's does.The decision-letter layer: 0 drop
check-adr-anchors, measured on the merge base and on the head. The gate exits 0 at both.ba9e0c3749361581a546auth-manager.ts, which is anchored, for the new module, which the new entry below anchors, so the count does not move.ADR-0108mentions; the two new files are the module and the entry.Path readers
Four readers outside the move follow it, in this commit, and one anchor entry is added:
api-error-code.pin.test.ts:authManagerFiles, the filesAuthManager's throws are counted over, gainsauth-manager-organization-plugin.ts. The body carries 7new APIError(sites, so the sum over the list is 30 at head, as at base (7 in the module;auth-manager.tsgoes 9 → 2, the two read-fault answers that stay). Without the new entry the sum would be 23, under the floor of 24, and the pin would fail: it is a floor over a list, not a silent zero.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-organization-plugin.ts(the comment above each list now says "any of them" for "either"). The body holds one such import,organization. At base the scan finds 16 factories; at head without the new entry it would find 15, missingorganization, 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:861and the in-test note at:1127, head numbering) that name the files the fivesendTemplatesites live in now nameauth-manager-organization-plugin.ts(the body of the organization plugin's factory) among them; the invitation send moved with the body. No assertion, count or pattern changes.scripts/adr-anchors/packages__plugins__plugin-auth__src__auth-manager-organization-plugin.ts.json(new), withadrs: ["ADR-0108"]and theauth-manager.tsentry's ADR-0108 paragraph verbatim ("better-auth's organization roles map registers the closed framework vocabulary ONLY…"). The body is that mechanism: it builds the roles map from the closed vocabulary and stores it. This is cut 4's precedent (an entry for the new module carrying the paragraph verbatim; the old entry stays unchanged), and ruling6353073966item 1 saysscripts/adr-anchors/is not a governed-register row. Theauth-manager.tsentry is not edited: it keeps ADR-0108, which the file still cites (:771, theadditionalOrgRolesremoval note), and its ADR-0093 D2 paragraph.Read, and not edited:
scripts/check-dispatcher-error-vocabulary.mjs: the body's 7new APIError(sites each carry a registered or standard code, 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 only its scanned-file count moves (3,434 → 3,435).--self-testis among the derived gates.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(753 → 754) 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 566 lines up with the cut's net::4442→:3876). Every statistic is the same apart fromfiles(3,484 → 3,485):tryStatements3,646 anddroppedNotAwaited234 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 names it once, in a comment.scripts/publish-smoke.shnamesauth-manager.tsfor theadmin: pluginConfig.admin ?? scimEffectiveline, in theenabledliteral, which stays.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. Two of their symbols occur as a token on a line of the body:AuthManager(ADR-0135:104), whose declaration is the class, which stays, andORGANIZATION_CREATION_DISABLED_CODE(the attachments-storage checklist area:1116), whose declaration (:1403at base) stays and gains onlyexport. Each resolves to its declaration at all three readings.Proof
Builds and suites ran through
os-verify-lock, and every exit code was captured before any pipe. Baseba9e0c3749. 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 arrow 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): 571 lines and 1,854 tokens, each line between the braces the base line minus four spaces.
The stub's shape, checked by the same run: the arrow is not
asyncand takes no parameter; it holds the two reader closures and the writer closure, one host literal whose keys are exactlyOrganizationPluginHost's, alphabetical, whose 8 method values are each(...a) => this.<key>(...a), whoseconfigis a getter over its reader and whoseorgRolesMapis a getter over its reader and a setter over the writer, thenreturn buildOrganizationPlugin.call(host), and nothing else. The interface types every memberAuthManager['x'], and exactly the getter-only field isreadonly.buildPluginListoutside the arrow is byte-identical apart from the three comment lines.Binding identity: a second proof walks all 496 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 496 resolve the same way at both ends:AuthManagerat base,OrganizationPluginHostat head);./auth-manager.jsnames among them;auth-manager.ts: sevenAuthManagerOptionsmembers read throughthis.config(dataEngine,getI18n,invitationPlacement,loggerand itswarn,onInvitationAcceptedandonOrganizationCreated), and thelocaleofemailLocaleArg's answer;None resolves to a local of
buildPluginList, to an unexported top-level declaration ofauth-manager.tsor to a top-level declaration of the module.Negative controls: each proof reads the module text, and each control changes it in memory only; the file is untouched.
organization(organizationOptions)changed toorganization?.(organizationOptions)fails the token and line checks, and the run exits 1.membership-limitimport 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 eight unexported declarations, and exits 1.An independent reading:
git diff --color-moved=plain --color-moved-ws=allow-indentation-change ba9e0c3749 361581a546over the two source files marks 577 of the 600 deleted lines and 580 of the 717 added lines as moved../objectql-adapter.jsline, rewritten withoutwithSystemContext), the first lines of the eight declarations (now withexport) and the arrow's own line (now withoutasync).return, the eightexportlines, the rewritten./objectql-adapter.jsline, and the new import comment and line.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). None of the eight declarations exported in place,buildOrganizationPluginorOrganizationPluginHostis among them, anddist/index.d.tsnames none of them.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 6 TypeScript 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 anchored-file, citation and file counts, as in the table above, with the decision letters equal.5. Gates.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 71 commands for the 7 paths. All 71 ran at head after the full build, and all 71 exited 0.--ranover the record with each exit code: 71 derived, 71 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 7 paths hit the register), 1,342 changed lines.node scripts/docs-audit/affected-docs.mjs --json ba9e0c3749, exit 0): 41 pages, all name matches of names the moved code carries (theVALIDATION_ERROR,sys_member,sys_organization,sys_invitationandsys_environmentliterals, andAuthManager). 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. 11 of the 41 are release-owned (the release notes andreleases/implementation-status.mdx) and not edited.auth-manager.ts, the new module's path, a reader edited above orscripts/adr-anchors/. The Version Packages PR chore: version packages #24876 touchesplugin-auth'spackage.json, itsCHANGELOG.mdand changesets only.origin/mainhas moved 8 merges past this base, toe073455929; none touchesplugin-auth,scripts/adr-anchors/or a reader named above.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