Skip to content

Drop the .Common suffix from the three GDS projects - #4438

Merged
marcschier merged 2 commits into
masterfrom
romanett/gds-drop-common-suffix
Sep 7, 2026
Merged

Drop the .Common suffix from the three GDS projects#4438
marcschier merged 2 commits into
masterfrom
romanett/gds-drop-common-suffix

Conversation

@romanett

@romanett romanett commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Description

Every other companion specification in the stack ships as <Family>, <Family>.Client and <Family>.ServerOpc.Ua.Di, Opc.Ua.ISA95, Opc.Ua.Positioning, Opc.Ua.Robotics, Opc.Ua.Vision, Opc.Ua.WotCon, Opc.Ua.XRegistry, and Opc.Ua.Lds.Server without a family package. GDS was the one exception, carrying a .Common suffix that named nothing.

Before After
src/Opc.Ua.Gds.Common src/Opc.Ua.Gds
src/Opc.Ua.Gds.Client.Common src/Opc.Ua.Gds.Client
src/Opc.Ua.Gds.Server.Common src/Opc.Ua.Gds.Server

No source changes were needed

RootNamespace was already the final name in all three projects — the namespaces have always been Opc.Ua.Gds, Opc.Ua.Gds.Client and Opc.Ua.Gds.Server, and only AssemblyName and PackageId disagreed. Nothing that compiles against these assemblies changes a using directive; the diff outside the moves is entirely ids, paths and prose.

Directories were moved with git mv, and every one of the 73 file moves is detected as a rename at 100% similarity (bar the handful that also had a name in their text), so git log --follow and blame survive.

Consumer impact

The package ids change, which is visible to anyone consuming the NuGet packages:

1.5.378 package 2.0 package
OPCFoundation.NetStandard.Opc.Ua.Gds.Common OPCFoundation.NetStandard.Opc.Ua.Gds
OPCFoundation.NetStandard.Opc.Ua.Gds.Client.Common OPCFoundation.NetStandard.Opc.Ua.Gds.Client
OPCFoundation.NetStandard.Opc.Ua.Gds.Server.Common OPCFoundation.NetStandard.Opc.Ua.Gds.Server

docs/migrate/2.0.x/packages.md gains a renamed-packages section — it is the document that undertakes to cover NuGet renames, and had no GDS entry — and the migration skill's package table gains the two rows a 1.5.378 consumer needs. That is the only hand-written content in this PR; everything else is mechanical.

Assembly names follow the package ids, so the section also notes that binding redirects, trimming descriptors and signing manifests naming the files directly have to be updated.

Build infrastructure

Everything naming the projects or their output moves with them:

  • UA.slnx and tools/MigrationAnalyzer.slnx (both re-sorted — the project lists are alphabetical, and Gds now sorts before Gds.Client).
  • .azurepipelines/expected-packages.txt — 3 ids, also re-sorted for the same reason.
  • .azurepipelines/signlistDebug.txt and signlistRelease.txt — 18 paths each. Their internal ordering is left alone: that group was already unsorted, and reordering a signing manifest is diff noise.
  • samples/Reference/ConsoleReferenceServer/Dockerfile, the two metapackage nuspecs, the analyzer nuspec's package dependencies, and 8 .csproj references across tests, samples and tools.

preview-pack.slnx is generated from UA.slnx by generate-slnx.ps1, so there is nothing static to edit. Nothing under .github/workflows, and no .ps1/.yml in .azurepipelines, names these projects.

The migration analyzer's shim tree mirrors the source project layout by its own documented convention, so Gds.Client.Common/ becomes Gds.Client/ and its readme table follows.

Deliberately not changed

Prose naming past work: plans/23 still records that its deferral happened during the "GDS Client.Common modernization", which is the name that effort had. File paths in the same document were updated.

Validation

net10.0:

  • UA.slnx: 0 errors. 14 warnings, all pre-existing CA1861/CA1850/CA1307 in XRegistry, Types.Tests and WotCon.Tests — none in anything this PR touches.
  • Assemblies build as Opc.Ua.Gds.dll, Opc.Ua.Gds.Client.dll, Opc.Ua.Gds.Server.dll, with no *.Common.dll produced anywhere.
  • Opc.Ua.Gds.Tests: 1,116 passed, 0 failed, 54 skipped.
  • Opc.Ua.MigrationAnalyzer.Core.Tests: 10 passed, 3 skipped.
  • A repo-wide grep for the old names returns only the intentional old → new mappings in the migration docs.

Checklist

  • Existing tests pass
  • No new tests — this is a rename with no behaviour change
  • Consumer-visible package rename documented in the migration guide

🤖 Generated with Claude Code

romanett and others added 2 commits September 7, 2026 15:08
Every other companion specification in the stack ships as <Family>,
<Family>.Client and <Family>.Server -- Di, ISA95, Positioning, Robotics,
Vision, WotCon, XRegistry, and Lds.Server without a family package. GDS
was the one exception, carrying a .Common suffix that named nothing: the
namespaces have always been Opc.Ua.Gds, Opc.Ua.Gds.Client and
Opc.Ua.Gds.Server, and only the assembly and package ids disagreed.

    src/Opc.Ua.Gds.Common          -> src/Opc.Ua.Gds
    src/Opc.Ua.Gds.Client.Common   -> src/Opc.Ua.Gds.Client
    src/Opc.Ua.Gds.Server.Common   -> src/Opc.Ua.Gds.Server

No source changes were needed. RootNamespace was already the final name
in all three projects, so this moves AssemblyName, PackageId, the
directories and everything that names them; nothing that compiles
against these assemblies has to change a using directive.

The package ids do change, which is consumer-visible, so
docs/migrate/2.0.x/packages.md gains a renamed-packages section -- it is
the document that undertakes to cover NuGet renames -- and the migration
skill's package table gains the two rows a 1.5.378 consumer needs.

Build infrastructure that names the projects or their output moves with
them: the two solution files, the expected-packages list (re-sorted, it
is maintained alphabetically), both signing manifests, the reference
server Dockerfile, the metapackage nuspecs and the analyzer's package
dependencies. preview-pack.slnx is derived from UA.slnx and needs no
edit. The migration analyzer's shim tree follows the source layout by
its own convention, so Gds.Client.Common/ becomes Gds.Client/.

Prose naming past work is left alone: plan 23 still records that its
deferral happened during the "GDS Client.Common modernization", which is
the name that effort had.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs/migrate/2.0.x is mirrored into the migration plugin's offline doc
bundle, and validate-migration-plugin.ps1 fails the build when the two
drift. Adding the renamed-packages section to the shipped doc without
re-running the sync left the bundle a section short.

Generated with './.azurepipelines/validate-migration-plugin.ps1 -Update'.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@romanett
romanett marked this pull request as ready for review September 7, 2026 13:36
Copilot AI lite review requested due to automatic review settings September 7, 2026 13:36
@romanett

romanett commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Do NOT squash, merge to keep history

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The PR introduces a few correctness/quality issues in changed code (notably object-based locking and avoidable allocations in trust-list transfer) that should be addressed before approval.

Pull request overview

This PR aligns the Global Discovery Server (GDS) family with the stack’s established companion-spec naming convention by removing the .Common suffix from the three GDS projects/packages, updating solution entries, references, and migration documentation accordingly.

Changes:

  • Renamed the three GDS projects/packages to Opc.Ua.Gds, Opc.Ua.Gds.Client, and Opc.Ua.Gds.Server (assembly/package IDs and paths).
  • Updated project references across tools, tests, samples, NuGet metapackages, and signing/expected-package manifests.
  • Added/updated migration documentation to call out the GDS NuGet rename for 2.0 consumers.
File summaries
File Description
UA.slnx Update solution project paths for renamed GDS projects
tools/Opc.Ua.SourceGeneration.Tester/Opc.Ua.SourceGeneration.Tester.csproj Update embedded-resource path to moved GDS design assets
tools/Opc.Ua.MigrationAnalyzer/Opc.Ua.MigrationAnalyzer.nuspec Update dependency from Gds.Client.Common → Gds.Client
tools/Opc.Ua.MigrationAnalyzer.Core/readme.md Update shim-tree mapping table for GDS client rename
tools/Opc.Ua.MigrationAnalyzer.Core/Opc.Ua.MigrationAnalyzer.Core.csproj Update project reference to renamed GDS client
tools/Opc.Ua.MigrationAnalyzer.Core/Gds.Client/ServerPushConfigurationClient.cs Migration shim file path updates under renamed GDS client
tools/Opc.Ua.MigrationAnalyzer.Core/Gds.Client/LocalDiscoveryServerClient.cs Migration shim file path updates under renamed GDS client
tools/Opc.Ua.MigrationAnalyzer.Core/Gds.Client/GlobalDiscoveryServerClient.cs Migration shim file path updates under renamed GDS client
tools/MigrationAnalyzer.slnx Update MigrationAnalyzer solution project paths for renamed GDS projects
tests/Opc.Ua.SourceGeneration.Tests/Opc.Ua.SourceGeneration.Tests.csproj Update embedded-resource path to moved GDS design assets
tests/Opc.Ua.SourceGeneration.Core.Tests/GenerateCodeTests.cs Update commentary reference from Gds.Common → Gds
tests/Opc.Ua.Server.Tests/Opc.Ua.Server.Tests.csproj Update project reference to renamed GDS server
tests/Opc.Ua.MigrationAnalyzer.Core.Tests/Opc.Ua.MigrationAnalyzer.Core.Tests.csproj Update project reference to renamed GDS client
tests/Opc.Ua.Gds.Tests/Opc.Ua.Gds.Tests.csproj Update project references to renamed GDS client/server
tests/Opc.Ua.Gds.Tests/GdsApplicationDirectoryTests.cs Update source-path reference in test comment
tests/Opc.Ua.Core.Tests/Opc.Ua.Core.Tests.csproj Update project reference to renamed GDS base project
tests/Opc.Ua.Core.TestFramework/Opc.Ua.Core.TestFramework.csproj Update project reference to renamed GDS base project
tests/Opc.Ua.Core.Security.Tests/Opc.Ua.Core.Security.Tests.csproj Update project references to renamed GDS client/server
tests/Opc.Ua.Aot.Tests/Opc.Ua.Aot.Tests.csproj Update project references to renamed GDS client/server
src/Opc.Ua.Gds/Properties/AssemblyInfo.cs Assembly metadata under renamed GDS base project
src/Opc.Ua.Gds/Opc.Ua.Gds.csproj Update AssemblyName/PackageId to drop .Common
src/Opc.Ua.Gds/NugetREADME.md Update package IDs/names in NuGet README
src/Opc.Ua.Gds.Server/RoleBasedUserManagement/GdsRole.cs GDS server role/identity types under renamed project path
src/Opc.Ua.Gds.Server/Properties/AssemblyInfo.cs Assembly metadata under renamed GDS server project
src/Opc.Ua.Gds.Server/Opc.Ua.Gds.Server.csproj Update AssemblyName/PackageId and base-project reference
src/Opc.Ua.Gds.Server/Onboarding/MemoryTicketStore.cs Onboarding ticket-store file under renamed project path
src/Opc.Ua.Gds.Server/Onboarding/MemoryManagedApplicationRegistry.cs Onboarding registry file under renamed project path
src/Opc.Ua.Gds.Server/Onboarding/ITicketStore.cs Onboarding ticket-store abstractions under renamed project path
src/Opc.Ua.Gds.Server/Onboarding/IManagedApplicationRegistry.cs Onboarding registry abstractions under renamed project path
src/Opc.Ua.Gds.Server/Onboarding/DeviceRegistrarAdminExtensions.cs Onboarding wiring extensions under renamed project path
src/Opc.Ua.Gds.Server/NugetREADME.md Update package IDs and references in NuGet README
src/Opc.Ua.Gds.Server/IGdsUserDatabase.cs GDS server user DB contract under renamed project path
src/Opc.Ua.Gds.Server/Identity/GdsApplicationSelfAdminProvider.cs Identity augmenter under renamed project path
src/Opc.Ua.Gds.Server/IConfigurationDataStore.cs Managed-app config persistence abstraction under renamed project path
src/Opc.Ua.Gds.Server/ICertificateRequest.cs Certificate-request abstraction under renamed project path
src/Opc.Ua.Gds.Server/ICertificateGroup.cs Certificate-group abstraction under renamed project path
src/Opc.Ua.Gds.Server/IAccessTokenProvider.cs Auth token provider abstraction under renamed project path
src/Opc.Ua.Gds.Server/Hosting/OpcUaGdsServerBuilderExtensions.cs DI extension docs update to renamed assembly name
src/Opc.Ua.Gds.Server/Hosting/IGdsServerBuilder.cs Fluent builder interface under renamed project path
src/Opc.Ua.Gds.Server/Hosting/GdsServerOptions.cs Hosted-server options under renamed project path
src/Opc.Ua.Gds.Server/Hosting/GdsDefaultIdentityAuthenticatorOptions.cs Default-auth options under renamed project path
src/Opc.Ua.Gds.Server/Hosting/AuthorizationServiceOptions.cs Authorization-service options under renamed project path
src/Opc.Ua.Gds.Server/GlobalDiscoveryServerConfiguration.cs GDS configuration types under renamed project path
src/Opc.Ua.Gds.Server/EventIds.cs Update assembly name mention in event-id docs
src/Opc.Ua.Gds.Server/AuthorizationServiceManager.cs Authorization manager under renamed project path
src/Opc.Ua.Gds.Server/ApplicationsDatabase/JsonApplicationsDatabase.cs JSON DB impl under renamed project path
src/Opc.Ua.Gds.Server/ApplicationsDatabase/IApplicationsDatabase.cs Applications DB abstraction under renamed project path
src/Opc.Ua.Gds.Client/TrustListFileTransferHelper.cs Trust-list transfer helper under renamed project path
src/Opc.Ua.Gds.Client/ServerStatusChangedEventArgs.cs Client event args under renamed project path
src/Opc.Ua.Gds.Client/ServerCapabilities.cs Capabilities surface under renamed project path
src/Opc.Ua.Gds.Client/RegisteredApplication.xsd RegisteredApplication schema under renamed project path
src/Opc.Ua.Gds.Client/RegisteredApplication.cs RegisteredApplication type under renamed project path
src/Opc.Ua.Gds.Client/Properties/AssemblyInfo.cs Assembly metadata under renamed GDS client project
src/Opc.Ua.Gds.Client/OpcUaGdsClientBuilderExtensions.cs DI extension docs update to renamed assembly name
src/Opc.Ua.Gds.Client/Opc.Ua.Gds.Client.csproj Update AssemblyName/PackageId and base-project reference
src/Opc.Ua.Gds.Client/OnboardingClient.cs Onboarding client wrapper under renamed project path
src/Opc.Ua.Gds.Client/NugetREADME.md Update package ID in NuGet README
src/Opc.Ua.Gds.Client/KeyCredentialServiceClient.cs KeyCredential client wrapper under renamed project path
src/Opc.Ua.Gds.Client/ILocalDiscoveryServerClient.cs LDS client interface under renamed project path
src/Opc.Ua.Gds.Client/IGdsClientBuilder.cs Client builder interface under renamed project path
src/Opc.Ua.Gds.Client/GlobalDiscoveryClientConfiguration.cs Client configuration type under renamed project path
src/Opc.Ua.Gds.Client/GdsClientOptions.cs Client options under renamed project path
src/Opc.Ua.Gds.Client/GdsAccessTokenProvider.cs Access-token provider under renamed project path
src/Opc.Ua.Gds.Client/EventIds.cs Update assembly name mention in event-id docs
src/Opc.Ua.Gds.Client/CertificateWrapper.cs Certificate wrapper under renamed project path
src/Opc.Ua.Gds.Client/BuildSchema.bat Schema build script under renamed project path
src/Opc.Ua.Gds.Client/AdminCredentialsRequiredEventArgs.cs Client event args under renamed project path
samples/Reference/ConsoleReferenceServer/Dockerfile Update Docker build COPY paths for renamed GDS projects
samples/Quickstarts.Servers/Quickstarts.Servers.csproj Update project reference to renamed GDS server
samples/Gds/OnboardingRegistrar/OnboardingRegistrar.csproj Update project references to renamed GDS base/server
samples/Gds/OnboardingClient/OnboardingClient.csproj Update project references to renamed GDS base/client
plans/ServerRuntimeAnalysis.md Update referenced source path for renamed GDS server
plans/ServerDesignExploration.md Update plan text references to renamed GDS server
plans/23-gds-client-x509-modernization.md Update plan references to renamed GDS client/server paths
nuget/Opc.Ua.Symbols.nuspec Update metapackage dependencies to renamed GDS packages
nuget/Opc.Ua.nuspec Update metapackage dependencies to renamed GDS packages
nuget/MetaPackageREADME.md Update metapackage documentation to renamed GDS packages
docs/RoleBasedUserManagement.md Update link path to renamed GDS server file
docs/migrate/2.0.x/sessions-subscriptions.md Update migration doc references to renamed GDS client package
docs/migrate/2.0.x/packages.md Add/extend migration doc section for GDS package renames
docs/GDS.md Update package table and references to renamed GDS packages
docs/DependencyInjection.md Update DI doc references to renamed GDS client/server paths
.azurepipelines/signlistRelease.txt Update signing manifest paths for renamed GDS outputs
.azurepipelines/signlistDebug.txt Update signing manifest paths for renamed GDS outputs
.azurepipelines/expected-packages.txt Update expected package IDs to renamed GDS packages
.agents/skills/opcua-v20-migration/references/stack-migration/sessions-subscriptions.md Update migration-skill reference docs for renamed GDS client
.agents/skills/opcua-v20-migration/references/stack-migration/packages.md Update migration-skill reference docs for renamed GDS packages
.agents/skills/opcua-v20-migration/references/runtime-shim.md Update runtime-shim doc path reference for renamed GDS server
.agents/skills/opcua-v20-migration/references/package-install.md Update package-install guidance for renamed GDS packages
Review details
  • Files reviewed: 48/111 changed files
  • Comments generated: 0
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@marcschier marcschier added the ready Ready to merge once CI Passes label Sep 7, 2026
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown

Code coverage

Coverage gate passed.

Check Result Threshold
✅ Project line rate 86.84% (243554/280453 lines) >= 70.00%
✅ Project branch rate 76.81% >= 60.00%
ℹ️ Patch coverage no coverable changed lines -
ℹ️ Baseline delta (advisory) +13.24 pp 73.60% recorded

Coverage is above the recorded baseline - consider ratcheting coverage-thresholds.json.

Thresholds live in coverage-thresholds.json. Whole report before exclusions: line 85.93%, branch 75.94%.

@codecov

codecov Bot commented Sep 7, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 80.89%. Comparing base (e8bec27) to head (053609a).

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##           master    #4438   +/-   ##
=======================================
  Coverage   80.88%   80.89%           
=======================================
  Files        2000     2000           
  Lines      280453   280453           
  Branches    48901    48901           
=======================================
+ Hits       226857   226874   +17     
+ Misses      36749    36746    -3     
+ Partials    16847    16833   -14     
Flag Coverage Δ
actions 80.89% <ø> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...Ua.Gds.Client/AdminCredentialsRequiredEventArgs.cs 100.00% <ø> (ø)
...rc/Opc.Ua.Gds.Client/AuthorizationServiceClient.cs 71.96% <ø> (ø)
src/Opc.Ua.Gds.Client/CertificateWrapper.cs 73.33% <ø> (ø)
src/Opc.Ua.Gds.Client/GdsAccessTokenProvider.cs 3.44% <ø> (ø)
src/Opc.Ua.Gds.Client/GdsClientOptions.cs 100.00% <ø> (ø)
...a.Gds.Client/GlobalDiscoveryClientConfiguration.cs 100.00% <ø> (ø)
...c/Opc.Ua.Gds.Client/GlobalDiscoveryServerClient.cs 61.34% <ø> (ø)
...rc/Opc.Ua.Gds.Client/KeyCredentialServiceClient.cs 0.00% <ø> (ø)
...rc/Opc.Ua.Gds.Client/LocalDiscoveryServerClient.cs 8.45% <ø> (ø)
src/Opc.Ua.Gds.Client/OnboardingClient.cs 67.74% <ø> (ø)
... and 30 more

... and 31 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@marcschier
marcschier merged commit 1af191e into master Sep 7, 2026
272 checks passed
@marcschier
marcschier deleted the romanett/gds-drop-common-suffix branch September 7, 2026 18:08
romanett added a commit that referenced this pull request Sep 7, 2026
Merging the .Common rename (#4438) left this project's AdditionalFiles
entries naming ..\Opc.Ua.Gds.Common\Design, a directory the rename had
just removed. Git could not see the conflict: those lines are additions
from this branch, so there was nothing for it to mark, and the merge
resolved cleanly onto a broken path.

The design now resolves at ..\Opc.Ua.Gds\Design, and the three comments
that still named the old project follow.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
marcschier added a commit that referenced this pull request Sep 8, 2026
# Description

Make startup-composed application NodeManagers participate in the live
lifecycle and bind imported NodeSet2 Method argument properties to their
typed `MethodState` children.

This change:

- adopts application NodeManagers created before startup into
`INodeManagerLifecycle.Registrations` after server startup succeeds,
while keeping diagnostics, configuration, and core managers protected;
- retains per-manager startup external-reference ownership and exact
routing positions so reload, removal, rollback, overlapping namespaces,
synchronous adapters, and server restart preserve existing behavior;
counted immutable reference snapshots avoid quadratic startup matching;
- rejects duplicate factory output across active, unpublished, and
retired lifecycle generations without deleting or disposing the live
manager; callers can catch the public
`NodeManagerAlreadyRegisteredException`;
- binds valid namespace-zero `Argument[]` `PropertyType`
`InputArguments` and `OutputArguments` Variables to
`MethodState.InputArguments` and `MethodState.OutputArguments` from
either `HasProperty` direction, without requiring `ParentNodeId`,
including local namespace-URI reference targets;
- preserves authored metadata during NodeSet typed-child promotion
without changing the initialization behavior of unrelated generated
nodes;
- retains generic-import guards for custom and malformed signatures,
duplicate standard-signature validation, and upstream factory-driven
generated-slot replacement and reconciliation callbacks;
- updates lifecycle and Runtime NodeSet documentation and clarifies
`OnServerStartedAsync` timing for both `StartAsync` overloads, including
the unopened default host returned to the caller.

This is a focused follow-up to #4418. That PR preserves registrations
from multiple fluent builders, but does not change lifecycle ownership
or NodeSet child typing. The branch includes upstream `master` through
`da7412c42`, including #4396, #4432, #4437, #4438, and #4440.

The completed review fixes in `686d0561f` are included. The latest base
merge (`a29fc6ca8`) combines them with #4432's shared batch/fluent
importer and generated state factories. One iterative linker supports
available parent nodes, deferred parent side tables, application-owned
handles, and placeholder reconciliation while retaining reference-driven
Method argument binding and URI handling. Upstream cancellation, GDS
assembly renames, certificate leak scoping, and xRegistry changes are
preserved.

## Related Issues

- Fixes #4421
- Fixes #4422

## CI regression fix

`e1a4436f0` fixes the GDS failure reported on Ubuntu and macOS. Copying
permission metadata in general `NodeState` initialization applied
`SecurityAdmin`-only defaults to generated GDS custom certificate groups
and denied their existing GDS-admin Browse requests. Metadata
preservation is now confined to NodeSet typed-child promotion; imported
Method argument permissions remain intact, while unrelated generated
nodes retain their existing initialization behavior.

Local Release validation also exposed a 260-character certificate path
in the startup-failure test added by this PR. Its isolated PKI now uses
a short temporary path. No assertions, authorization checks, or CI gates
were weakened, and no pre-existing tests were changed.

## macOS ARM64 NativeAOT suspension

Per maintainer request, `a15971f32` suspends only the failing
`macos-latest` / `osx-arm64` NativeAOT matrix entry. Re-enabling it once
the compiler contains the runtime fix is tracked in #4443. Intel macOS,
Linux, and Windows NativeAOT coverage, managed macOS tests, and all
other CI gates remain enabled. This is an explicit coverage suspension,
not a claim that the underlying compiler/linker defect is fixed.

The macOS ARM64 NativeAOT job on `a29fc6ca8` fails during native linking
with
`ld: Assertion failed: (_addend == uniqueIndex && "too many large
addends")`.
Both attempts of [run
34191755950](https://github.com/OPCFoundation/UA-.NETStandard/actions/runs/34191755950)
hit the same assertion before the native test executable can run; the
build/test summary failure is downstream.

This matches the NativeAOT Mach-O relocation issue in
dotnet/runtime#119380, fixed by relocation-anchor emission in
dotnet/runtime#124721 and its .NET 10 backport dotnet/runtime#132171.
The failing `Microsoft.DotNet.ILCompiler` 10.0.11 package's nuspec
points to `dotnet/dotnet` commit
`e2f47b0110ed922f21a1522da67279133ce28f32` (July 23); its object writer
does not contain the anchor fix merged on August 12. Version 10.0.11 is
currently the latest stable package.

The base commit passed on the same runner image and SDK, so this is not
being dismissed as a generally broken runner or a test flake. The
precise PR-specific object-layout trigger has not been isolated. A
compiler containing the relocation fix is needed before restoring the
lane. No test code, assertions, coverage thresholds, or shared tooling
settings were changed.

## Validation

Latest base-merge validation on both `net10.0` and `net48`, Release:

- Import helpers and argument-binding regressions: 51 passed per
framework.
- Batch/fluent import, generated-state overlays, runtime/startup
lifecycle, cross-source references, routing, reference snapshots, and
node-authoring selection: 344 passed per framework.
- Merge-specific cases cover available Method parents with
forward/inverse and URI/index references while retaining an
application-owned `NodeId` handle.
- The unchanged upstream `NodeSetImportIntegrationTests.cs:210` CA1861
warning remains; no diagnostic suppression or unrelated cleanup was
added.

Release CI-fix validation on both `net10.0` and `net48`:

- `CustomCertificateGroupIntegrationTest`: 4 passed, including the
unchanged CI failure.
- `UANodeSetHelpersTests`: 8 passed, including imported security
metadata.
- `StartupRuntimeNodeSetLifecycleTests`: 5 passed.

Earlier Debug merge and review validation on both frameworks:

- Lifecycle, RuntimeNodeSet, fluent, and OperationContext selection
after merging `978e6d1af`: 638 passed per framework.
- Startup/transport-binding and RuntimeNodeSet integration selection
after merging `017856f4a`: 28 passed per framework.
- Public exception contract and duplicate-registration selection in
`fbf08428b`: 6 passed per framework.

Targeted test invocations rebuilt the affected projects successfully.
The full `UA.slnx` suite was not rerun locally.

## Checklist

- [ ] I have signed the
[CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf)
and read the
[CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md)
doc.
- [x] I have added tests that prove my fix is effective or that my
feature works and increased code coverage.
- [x] I have added all necessary documentation.
- [x] I have verified that my changes do not introduce (new) build or
analyzer warnings.
- [ ] I ran **all** tests locally using the **UA.slnx** solution against
at least .net **framework** and .net **10**, and all passed.
- [ ] I fixed **all** failing and flaky tests in the CI pipelines and
**all** CodeQL warnings.
- [x] I have addressed **all** PR feedback received.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2bb8a834-7695-4ae6-84cb-2471c76d1b12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready Ready to merge once CI Passes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants