[Split 1/3] Restructure into Ably.PubSub.Core (assembly rename, drop Xamarin heads and push satellites, version 2.0.0) - #1333
umair-ably wants to merge 9 commits into
Conversation
Per PDR-091b plan decisions 5b and 6: - delete the `IO.Ably.Android` (monoandroid) and `IO.Ably.iOS` (Xamarin.iOS) platform heads. They were 30-line `Platform.cs` heads whose only functional difference from the netstandard2.0 head was reporting the agent runtime as `xamarin`, no test workflow covered them, and they are what pinned the packaging workflow to windows-2022 plus a legacy Xamarin VS installer. Classic Xamarin / .NET for Android+iOS / MAUI consumers now receive the netstandard2.0 asset. - delete the `IO.Ably.Push.Android` / `IO.Ably.Push.iOS` satellites, their nuspecs and the `package-push` scripts. `ably.io.push.android` / `ably.io.push.ios` 1.x continue from the 1.x maintenance line; a modern net8.0-android/net8.0-ios port is a post-GA 2.x follow-up. - delete the `AndroidSample` and `DotnetPush` examples (they target the removed heads and satellites; they live on in the 1.x maintenance line). - delete `IO.Ably.PackagePush.sln`, `IO.Ably.Xamarin.sln` and `IO.Ably.DotNetPush.sln`, which only existed for the removed projects, and drop the removed projects from the remaining solutions. - drop the ILRepack `_Package_Merge_All` task, the `PushPackage` target and the Xamarin build tasks from the Cake build. The ILRepack helper itself stays: `Update.AblyUnity` still uses it to build the Unity plugin assembly. - drop the Android SDK and legacy Xamarin installer steps and the whole `package-push` job from `.github/workflows/package.yml`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Per PDR-091b plan decision 2: the package/assembly identity changes, the code namespace does not. `namespace IO.Ably` and every public type name are untouched; the compiled assembly becomes `Ably.PubSub.Core.dll`. The distinct assembly name is the load-bearing half of the decision: with `IO.Ably.dll` kept, an app that transitively pulled both `ably.io` and the new core would have MSBuild pick the higher version with only an MSB3277 warning and fail at runtime. With a distinct assembly name and a shared namespace, mixing the two produces loud CS0433 compile errors instead. Moves (via `git mv`, so history follows): src/IO.Ably.NETStandard20 -> src/Ably.PubSub.Core src/IO.Ably.NETFramework -> src/Ably.PubSub.Core.NETFramework src/IO.Ably.Shared -> src/Ably.PubSub.Shared src/IO.Ably.Shared.MsgPack -> src/Ably.PubSub.Shared.MsgPack src/IO.Ably.Tests.Shared -> src/Ably.PubSub.Tests.Shared src/IO.Ably.Tests.DotNET -> src/Ably.PubSub.Tests.DotNET src/IO.Ably.Tests.NETFramework -> src/Ably.PubSub.Tests.NETFramework src/IO.Ably.sln -> src/Ably.PubSub.sln src/IO.Ably.Package.sln -> src/Ably.PubSub.Package.sln src/IO.Ably.NetStandard.sln -> src/Ably.PubSub.NetStandard.sln src/IO.Ably.NetFramework.sln -> src/Ably.PubSub.NetFramework.sln Target frameworks are unchanged: `netstandard2.0;net6.0;net7.0` plus the `net462` head (decision 5). Also updated: every project/solution/shared-project import path, the `AssemblyName` and XML documentation file names on both heads, the `InternalsVisibleTo` entries for the renamed test assemblies, `AssemblyTitle`, the Cake paths/targets and the test-assembly names they look for, and `tools/list-test-categories.fsx`. `IO.Ably.ruleset`, `IO.Ably.Tests.ruleset`, `stylecop.json` and `IO.Ably.snk` keep their names: the strong-name key must stay byte-identical and renaming the rulesets buys nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`ably.io` is never published from this branch again — 1.x fixes ship from the 1.x maintenance line — so `nuget/io.ably.nuspec` is deleted rather than retargeted, and `nuget/ably.pubsub.core.nuspec` takes its place. - `<id>Ably.PubSub.Core</id>`, same `$version$` token, authors/owners/license/ icon/readme/repository metadata as before, copyright year bumped to 2026. - The `<description>` states plainly that this is an internal implementation package for Ably's own `Ably.PubSub.Device` / `Ably.PubSub.Server` packages and is not intended for direct use (PDR-091b §1). NuGet consumers receive it transitively, so "internal" is a statement in metadata and docs, not something the dependency graph can enforce. - Dependency groups: netstandard2.0 / net6.0 / net7.0 / net46, each declaring Newtonsoft.Json 13.0.1 and System.Threading.Channels. The monoandroid / Xamarin.iOS / monotouch groups are gone with their heads. - The net46 assets now come from the plain build output rather than an ILRepack-merged `Packaged/` directory, hence Newtonsoft.Json is a declared net46 dependency instead of a merged-in one. - `IO.Ably.DeltaCodec.*` now needs explicit `files` entries: the old `IO.Ably.*` glob happened to pick the delta codec up, and `Ably.PubSub.Core.*` does not. `_Package_Create_NuGet` now packs a list of nuspecs so stack PR 2 can add the device and server nuspecs to it, and `package.cmd` / `package-unity.sh` no longer name `ably.io`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`Ably.PubSub.Core` starts at 2.0.0 and, from stack PR 2 on, releases in lockstep with `Ably.PubSub.Device` and `Ably.PubSub.Server`. Bump the single source of the runtime version (`src/CommonAssemblyInfo.cs`, read back by `Defaults.GetVersion()`) and the Unity package version, and move the copyright year to 2026. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The Unity package ships a single ILRepack-merged plugin assembly. Point everything that names it at the new assembly name: the `Update.AblyUnity` Cake task (input and output), `link.xml`'s `<assembly fullname>`, the `precompiledReferences` of the AblySandbox / EditMode / PlayMode asmdefs, and the `unity/CONTRIBUTING.md` note. The stale `unity/Assets/Ably/Plugins/IO.Ably.dll` is removed rather than regenerated: ILRepack needs Mono or Windows, neither of which is available in the environment this branch was prepared in, so the merged `Ably.PubSub.Core.dll` has to be produced by running `unity-plugins-updater.sh 2.0.0` (or the `.cmd`) on a machine that has Mono. The plugin's `.meta` is renamed in place so the importer settings and asset GUID survive; the regenerated dll drops straight into it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Minimal docs pass only; the full README rewrite and the migration guide are a later phase of the plan. - README: a "2.0 is in development" note at the top describing the new package set (`Ably.PubSub.Device` / `Ably.PubSub.Server` in the next PR, `Ably.PubSub.Core` internal), the unchanged `IO.Ably` namespace, the never-mix rule, and that `ably.io` 1.x continues from a maintenance branch. The "Supported platforms" table drops the Xamarin.Android/iOS/Mac rows for ".NET for Android, .NET for iOS and MAUI via netstandard2.0", and the MAUI `TrimmerRootAssembly` snippet now names `Ably.PubSub.Core`. Install and usage sections still describe 1.x and say so. - CONTRIBUTING: the "working from source" project paths, and the release-step artifact names. - cake-build/README: new project names, the `Build.Xamarin` target is gone, and the packaging section documents `package.cmd` producing `Ably.PubSub.Core.*.nupkg` from the nuspec list plus `package-unity.sh`. - PushNotifications.md: a note that it describes the 1.x push-receive packages, which are not in the 2.0 set, and that push admin is unaffected. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`IoC`'s static constructor located the platform head's `IO.Ably.Platform` type by loading an assembly literally named "IO.Ably". After the assembly rename that load throws `FileNotFoundException`, which the ctor swallows, leaving `Platform` null. Every platform service then silently degraded: the transport factory and `PlatformId` fell back (so the agent string lost its `dotnetN` / OS entries), and `IoC.MobileDevice` threw `NullReferenceException` because only `NotImplementedException` is caught there — which is what 18 `RestInitSpecs` tests hit. `Platform.cs` is compiled into the same assembly as this shared code by every head, so look the type up in this assembly instead. That is also immune to any later rename. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`FindTestAssemblies` defaults to a filename pattern, which still looked for `IO.Ably.Tests.*.dll` and so found nothing after the test assemblies were renamed. The Cake helper only warns when it finds no assemblies and the task then returns early, so the .NET Framework test legs would have gone green without running a single test. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Important Review skippedToo many files! This PR contains 521 files, which is 421 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: ⛔ Files ignored due to path filters (61)
📒 Files selected for processing (521)
You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
- D9: remove the committed 1.6 MB test-results .trx artifact and ignore *.trx and test-results/ - D27: add a pinned root nuget.config (nuget.org only, with source mapping) and drop the four solutions' dangling .nuget\NuGet.Config solution item - D29: align built-against System.Threading.Channels to 4.6.0 (matching the nuspec) and System.Threading.Tasks.Extensions to 4.5.2 (matching the net46 head) - D11: document the transitive ably.io/Ably.PubSub.* mixed-graph failure (CS0433, type identity) plus the dotnet-nuget-why detection and extern alias isolation recipe - D32: replace the false "rewritten later in this stack" Installation/Usage promise with an honest before-2.0-GA sequencing note - D33: discourage the direct core AblyRealtime/AblyRest constructors in XML docs (summary one-liner plus remarks rationale), pointing at the door factories - D34: drop the stale 1.x ably.io NuGet badge from the README - D35: fix stale doc cross-references (PushNotifications.md Dart link, unity/README.md dead anchor, past-dated protocol-v1 deprecation line) - D17 (change 1): sign the net46 core head under package builds only, matching the SDK-style core - D8 (guard): fail _Package_Unity packaging when the committed Unity plugin Ably.PubSub.Device.dll is missing PubSub device/server split rollout (PDR-091b2) review follow-ups.
b15e725 to
86be74e
Compare
maratal
left a comment
There was a problem hiding this comment.
Verdict: the shape is right, requesting a few changes before merge. Renaming the artefact while keeping the namespace, bumping to 2.0.0, minimal docs, no CHANGELOG edits, and no agent or door changes is exactly the right scope for the first PR of the stack. The two bugs the rename surfaced are real and correctly fixed. But one packaging bug leaked in from PR 2, the new nuspec is born with stale URLs, and the integration branch itself is well behind main.
Must fix
- The Unity package task can never succeed on this branch. The guard added in the last commit checks for
unity/Assets/Ably/Plugins/Ably.PubSub.Device.dll, but everything else in this PR produces and referencesAbly.PubSub.Core.dll(the merge task,link.xml, the three asmdefs, the renamed.meta). That is PR 2's name, where the Unity plugin becomes the Device assembly. As merged,UnityPackageand thepackage-unityCI job throw unconditionally. Fix the name here, and define the plugin file name once inpaths.cakeso the build task and the packaging guard cannot drift. Since PR 2 renames the plugin again anyway, consider skipping the intermediate Core rename in Unity and going straight to the final name, so the.metais renamed in place once. - The new nuspec and README note use the old repo URL. The repo was renamed on 9 September (#1332 merged to
main), yetnuget/ably.pubsub.core.nuspecis a brand-new file pointing atgithub.com/ably/ably-dotnet. The PR description's claim thatfeatures.yml"keepsrepository-name: ably-dotnet" is also stale: the base branch already saysably-pubsub-dotnet. New files should not inherit the pre-rename URL. integration/v2is behindmain. It lacks #1331 (the RTN23 connection fixes), #1332 (rename references), #1338 (1.2.19) and #1339. Mergemainintointegration/v2before landing this PR. After 400+git mvs every later sync needs rename-aware conflict resolution, so the cheapest moment is now.
CI and verification
The Features check is red with Not authorized to perform sts:AssumeRoleWithWebIdentity. The pattern across the stack: every pull request into an integration/* base fails with repository-name: ably-pubsub-dotnet, pull requests into main pass, and the one green run in the stack (split-3 at b2c9e77) had flipped the value back to ably-dotnet. That points at the new IAM role's trust policy being scoped to base branch main, or the old role being looser. It is an infrastructure item (infrastructure#13005), not this PR's code, but we should get a no-op PR into integration/v2 fully green before stacking on it, and PR 3 should not be reverting the repository name.
Things the description asked reviewers to confirm, which I checked:
-
The net46 legs ran real tests, so the
FindTestAssembliesglob fix works. Both legs also retried a handful of flaky failures and went green.Leg Unit Integration macOS Mono 1113 244 Windows .NET Framework 1113 244 -
The
FindTestAssembliesfootgun remains, though: it still warns and returns green on zero assemblies. Make it throw. -
No dangling old-name references outside
lib/,common/andCHANGELOG.md. The only hits are pre-existingIO.Ably.Tests.Sharednamespaces. -
The Unity
.metais byte-identical after the rename, so the asset GUID survives. -
The door names in the new XML docs (
PubSubDevice.CreateClient,PubSubServer.CreateRealtimeClient,PubSubServer.CreateHttpClient) match #1334's actual API. -
The
IoCfix is correct: the platform type is compiled into the same assembly in every head, including the ILRepack-merged Unity dll.
Smaller points
- Public XML docs promise platform behaviour. The constructor docs say an unclassified client "will be rejected once MAU-based pricing is live". PDR-091b §5 says that about the old package's constructors. For 2.x core constructors, which the doors themselves call, rejection could only be server-side. Verify the wording against the PDR or soften it to the classification and billing dependency. Same for the
PushNotifications.mdnote that commits to anet8.0-android/net8.0-iospush port "post-GA"; decision 6 only says parked. - net46 package contents. The
lib\net46glob now readsbin\Releaserather than the old ILRepackPackaged\folder, so it will also sweep inAbly.PubSub.Core.dll.config(MSBuild copiesapp.configas<TargetFileName>.configfor libraries) and the pdbs. Harmless but noisy. The netstandard output was verified but not this one; list the net46 files explicitly or check them on the Windows Package run. - net46 is strong-named for the first time under the Package configuration. Fine and consistent with the SDK-style head, but state it in the PR next to the "no longer ILRepack-merged" note, and watch the Package build for CS8002 against
IO.Ably.DeltaCodecif that submodule is unsigned. I could not check it locally because the submodule is not checked out. - Package downgrade.
System.Threading.Tasks.Extensionsgoes 4.5.3 → 4.5.2 to match the net46packages.config. Align upward by bumping the legacy head instead. - Root namespace hints.
Import_RootNamespacebecomesAbly.PubSub.Sharedand the test project'sRootNamespacebecomesAbly.PubSub.Tests.NETFramework. Visual Studio will propose those for new files while the code namespace is intentionallyIO.Ably. Keep the old values. - A 1.6 MB
.trxis in the history. It was added in the IoC commit and removed in the last one. Squash-merge, or drop it from that commit. - Stack sequencing in durable docs. README,
cake-build/README.mdand thepackage.cakecomment say "added in the next PR in this stack". Acceptable now, but PR 2 must remove the phrasing; docs should carry facts that outlive the rollout. - Branch CI. Workflows only trigger pushes on
main, so nothing runs onintegration/v2after merge. Addingintegration/**to the push triggers is cheap, and PR 3 already touches every workflow. - Pre-existing, agree it needs its own issue: the net8.0 and net9.0 test legs run zero tests because the test project only targets net6.0 and net7.0.
One more thing for PR 3: .NET has two version sites (src/CommonAssemblyInfo.cs and unity/Assets/Ably/version.txt). The release pre-flight should assert they agree.
|
Correction to my review above, on the Features check. I said the base branch already had |
First of a stack of PRs applying PDR-091b (PubSub device/server package split, major releases) to this repo, targeting the long-lived
integration/v2branch. Reference implementation: ably-js#2293; sibling port: ably-java#1232.What this PR does
Assembly rename, namespace unchanged. The core assembly becomes⚠️ 091d pass so it is decided once across SDKs. The distinct assembly name is the load-bearing half: keeping
Ably.PubSub.Core.dll(AssemblyName, output dll, XML doc file).namespace IO.Ablyand every public type name are untouched — the namespace question is bundled into theIO.Ably.dllwould let an app that transitively pulled bothably.ioand the new core resolve with only an MSB3277 warning and fail at runtime; a distinct assembly name over a shared namespace turns mixing into loud CS0433 compile errors instead.Layout (pure
git mv, so history follows; TFMs unchanged,netstandard2.0;net6.0;net7.0plus thenet462head):src/IO.Ably.NETStandard20src/Ably.PubSub.Coresrc/IO.Ably.NETFrameworksrc/Ably.PubSub.Core.NETFrameworksrc/IO.Ably.Shared,src/IO.Ably.Shared.MsgPacksrc/Ably.PubSub.Shared,src/Ably.PubSub.Shared.MsgPacksrc/IO.Ably.Tests.{Shared,DotNET,NETFramework}src/Ably.PubSub.Tests.{Shared,DotNET,NETFramework}src/IO.Ably.sln,.Package.sln,.NetStandard.sln,.NetFramework.slnsrc/Ably.PubSub.sln,.Package.sln,.NetStandard.sln,.NetFramework.slnEvery project/solution/shared-project import path,
InternalsVisibleTo,AssemblyTitle, Cake path and test-assembly glob follows.IO.Ably.ruleset,IO.Ably.Tests.ruleset,stylecop.jsonandIO.Ably.snkkeep their names — the strong-name key must stay byte-identical and renaming the rulesets buys nothing.Legacy Xamarin heads dropped (decision 5b):
IO.Ably.Android(monoandroid) andIO.Ably.iOS(Xamarin.iOS) are gone, along withIO.Ably.Xamarin.sln, the ILRepack_Package_Merge_Alltask, theBuild.Xamarintarget, and the Android-SDK plus legacy-Xamarin-installer steps inpackage.yml. Classic Xamarin / .NET for Android+iOS / MAUI consumers receive thenetstandard2.0asset.Push satellites parked (decision 6):⚠️ 091d.
IO.Ably.Push.Android/IO.Ably.Push.iOS,nuget/io.ably.push.*.nuspec,IO.Ably.PackagePush.sln, thePushPackageCake target,package-push.sh/.cmdand the wholepackage-pushjob are removed, as are theAndroidSampleandDotnetPushexamples that target them (both live on in the 1.x maintenance line). Push admin is untouched — it stays in the core and is exposed by both doors untilPackaging:
nuget/io.ably.nuspecdeleted (ably.iois never published from this branch again) and replaced bynuget/ably.pubsub.core.nuspec—<id>Ably.PubSub.Core</id>, same$version$token and authors/owners/license/icon/readme/repository metadata, dependency groups fornetstandard2.0/net6.0/net7.0/net46, and a<description>that states plainly that this is an internal implementation package for Ably's ownAbly.PubSub.Device/Ably.PubSub.Serverpackages and is not intended for direct use._Package_Create_NuGetnow packs a list of nuspecs so PR 2 can add the door nuspecs to it.Version 2.0.0 in
src/CommonAssemblyInfo.cs(the single source read back byDefaults.GetVersion()) andunity/Assets/Ably/version.txt; copyright year to 2026.Unity:
Update.AblyUnity,link.xml, the three test asmdefs'precompiledReferencesandunity/CONTRIBUTING.mdall now nameAbly.PubSub.Core.dll; the.unitypackageis namedably.pubsub.<version>.Docs, minimal: a "2.0 is in development" note at the top of README describing the new package set and the never-mix rule, the Xamarin rows in "Supported platforms" replaced by ".NET for Android, .NET for iOS and MAUI via
netstandard2.0", the MAUITrimmerRootAssemblysnippet fixed toAbly.PubSub.Core, plusCONTRIBUTING.md,cake-build/README.mdand a note at the top ofPushNotifications.md.Two real bugs the rename surfaced
Both were pre-existing footguns that the rename tripped, and both are fixed here in their own commits:
IoClooked the platform head up by assembly name (Assembly.Load(new AssemblyName("IO.Ably"))). After the rename that throwsFileNotFoundException, which the static ctor swallows, leavingPlatformnull: the transport factory andPlatformIdsilently fall back (so the agent string loses itsdotnetN/OS entries) andIoC.MobileDevicethrowsNullReferenceException, because onlyNotImplementedExceptionis caught there. 18RestInitSpecstests failed on it.Platform.csis compiled into the same assembly as the shared code by every head, so it now looks the type up intypeof(IoC).Assembly— correct, and immune to any later rename.FindTestAssembliesdefaulted to the globIO.Ably.Tests.*.dll. The Cake task only warns when it finds no assemblies and then returns, so the two .NET Framework test legs would have gone green having run zero tests. NowAbly.PubSub.Tests.*.dll.What this PR deliberately does not do
Ably.PubSub.Device/Ably.PubSub.Server, the sharedSidesource and the agent assertions land in PR 2.Agent.AblySdkIdentifieris stillably-dotnet/<version>; the family rename toably-pubsub-dotnetand the versionless side flags land in PR 2, because ably-common#361 (the registry PR) is still open and no identifier ships unregistered.Agent.csis otherwise only moved.publish.yml, lockstep ordering and trusted publishing are PR 3.features.ymlkeepsrepository-name: ably-dotnet(the rename and its references PR are a separate, later step).ably.io1.x is never published from this branch. Fixes ship from a 1.x maintenance branch cut before the integration merge;ably.io.push.android/ably.io.push.ios1.x likewise.Notes for reviewers
Ably.PubSub.Core.dll, namespaceIO.Ablykept), 5 (core TFMs unchanged), 5b (Xamarin heads dropped) and 6 (push satellites parked) are implemented exactly as recorded on 2026-09-02 — this PR does not reopen them.net462head is untested locally. No Mono/MSBuild in the environment this branch was prepared in, soBuild.NetFrameworkand the twoTest.NetFramework.*legs were not run; CI'srun-tests-macos-monoandrun-tests-windows-netframeworkworkflows cover them. TheFindTestAssembliesfix above is what those legs depend on, so please check they report a real test count and not zero.unity/Assets/Ably/Plugins/IO.Ably.dllis removed rather than replaced: someone needs to run./unity-plugins-updater.sh 2.0.0(or the.cmd) on a machine with Mono and commit the resultingAbly.PubSub.Core.dll. The plugin's.metawas renamed in place, so the importer settings and asset GUID survive and the regenerated dll drops straight into it. Until then the Unity package is incomplete.nuget packcould not be run locally (needsnuget.exe/Mono). Instead everyfilesentry was checked against the actualReleasebuild output —src/Ably.PubSub.Core/bin/Release/{netstandard2.0,net6.0,net7.0}/each containAbly.PubSub.Core.{dll,pdb,xml,deps.json}andIO.Ably.DeltaCodec.{dll,pdb,xml}, which the two globs per TFM match.IO.Ably.DeltaCodec.*needed explicitfilesentries. The old nuspec'sIO.Ably.*glob happened to sweep the delta codec into eachlib/folder;Ably.PubSub.Core.*does not, so the codec would have gone missing silently. Worth a second pair of eyes._Package_Merge_Allis gone with the Xamarin heads.Newtonsoft.Jsonis therefore a declarednet46dependency rather than a merged-in one, andIO.Ably.DeltaCodec.dllships alongside as it already did for the netstandard assets. This is a real change in shape fornet46consumers and the main thing I would want confirmed before GA.cake-build/helpers/tools.cakeis kept even though the plan says to remove it with_Package_Merge_All:Update.AblyUnitystill needs it to merge the Unity plugin assembly, and the Unity package steps are explicitly in scope. Deliberate deviation.net8.0andnet9.0legs of the threeTest.NetStandard.*workflows run zero tests.Ably.PubSub.Tests.DotNETtargetsnet6.0;net7.0, sodotnet test --framework net8.0matches nothing and the leg passes vacuously. Same onmaintoday. Worth its own issue; the plan's step 5 already flags the relatedPlatform.csruntime detection gap (.NET 8/9/10 apps reportdotnet-standard).src/IO.Ably/CustomSerialisers/GeneratedSerializers/**is dead: three generated MsgPack serializers referenced by no project. Consciously left alone.Import_RootNamespacein the renamed.projitemsfollows the shared-project names (e.g.Ably.PubSub.Shared). It is a Visual-Studio-only hint for new-file namespaces and does not affect compilation; the code namespace is unchanged.git grepfinds no danglingIO.Ably.NETStandard20/IO.Ably.NETFramework/IO.Ably.Tests.*/IO.Ably.dll/io.ably.nuspec/PackagePush/IO.Ably.Android/IO.Ably.iOS/IO.Ably.Push.*/Build.Xamarin/package-pushreferences outsidelib/,common/andCHANGELOG.md. The remainingably.io.push.*mentions are inPushNotifications.md, which now opens with a note that it documents the 1.x packages.Verification
Run on macOS with .NET SDKs 6.0.428 / 7.0.410 / 8.0.424 / 9.0.317, via the same Cake targets CI uses:
dotnet build src/Ably.PubSub.NetStandard.sln -c Release./build.sh --target=Test.NetStandard.Unit.WithRetry --framework=net6.0./build.sh --target=Test.NetStandard.Unit.WithRetry --framework=net7.0./build.sh --target=Test.NetStandard.Unit.WithRetry --framework=net8.0Build.NetFramework,Test.NetFramework.*./build.sh --target=Package --version=2.0.0nuget.exe/Mono; nuspecfilesentries verified against real build output instead🤖 Generated with Claude Code