Skip to content

Address remaining Blazor integration PR feedback#17384

Merged
davidfowl merged 5 commits into
microsoft:mainfrom
javiercn:javiercn/blazor-integration-follow-ups
May 27, 2026
Merged

Address remaining Blazor integration PR feedback#17384
davidfowl merged 5 commits into
microsoft:mainfrom
javiercn:javiercn/blazor-integration-follow-ups

Conversation

@javiercn
Copy link
Copy Markdown
Contributor

@javiercn javiercn commented May 22, 2026

Summary

Addresses remaining unresolved review threads from #15691 and adds Docker Compose publish support for the Blazor gateway.

PR Feedback Fixes

  • Add [ResourceName] attribute to AddBlazorGateway, AddBlazorWasmProject<T>, and AddBlazorWasmApp name parameters
  • Replace null-forgiving operator with explicit ?? throw in EndpointsManifestTransformer
  • Use StringComparison.OrdinalIgnoreCase for route comparison
  • Fix '.NET Aspire' phrasing in playground README files
  • Extract "Aspire:Store:Path" magic string to a const
  • Re-add OTLP misconfiguration warning at call site (where logger is available)

Docker Compose Publish Support

The ClientConfigValueProvider class (IValueProvider + IManifestExpressionProvider) is replaced with a static BuildConfigExpression() method that returns a ReferenceExpression. This makes the ConfigResponse environment variable natively understood by all publishers.

How it works:

  1. Build JSON with a brace-free __ORIGIN__ token in place of the gateway URL
  2. Serialize with UnsafeRelaxedJsonEscaping (we control all values, no braces present)
  3. Escape structural JSON braces ({ -> {{) for string.Format safety
  4. Replace __ORIGIN__ with {0} to create the format string
  5. Build a ReferenceExpression with GatewayOriginReference as the argument

Result:

  • Dev mode: endpoint resolves to https://localhost:PORT — ConfigResponse contains absolute URLs
  • Docker Compose publish: publisher emits $${GATEWAY_BINDINGS_HTTPS_URL} — deployer fills .env

New file: GatewayOriginReference.cs — lightweight IValueProvider + IManifestExpressionProvider that wraps an EndpointReference, trims trailing slashes, and emits manifest expressions for publishers.

@javiercn javiercn force-pushed the javiercn/blazor-integration-follow-ups branch from 0fa6022 to 910da9e Compare May 22, 2026 15:41
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 17384

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 17384"

@javiercn javiercn force-pushed the javiercn/blazor-integration-follow-ups branch 2 times, most recently from 9b4238d to 4be1b69 Compare May 22, 2026 17:07
@javiercn javiercn marked this pull request as ready for review May 22, 2026 18:08
Copilot AI review requested due to automatic review settings May 22, 2026 18:08
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR refactors how the Blazor gateway generates the WASM client configuration response, aiming to produce deployer-configurable manifest expressions while keeping dev-time behavior working, and also improves gateway publish/build inputs (image tag stamping, file locations).

Changes:

  • Replace the per-app IValueProvider config generator with a ReferenceExpression-based JSON builder using a gateway-origin placeholder.
  • Improve manifest processing robustness (explicit deserialization failure) and make the index.html route match case-insensitive.
  • Stamp/control the .NET Docker image tag via assembly metadata and adjust where gateway/publish artifacts are written/copied.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/Aspire.Hosting.Blazor/Scripts/Gateway.cs.in Tighten nullability for ConfigResponse emission in the gateway script.
src/Aspire.Hosting.Blazor/Manifests/EndpointsManifestTransformer.cs Add explicit deserialize failure and case-insensitive index.html detection.
src/Aspire.Hosting.Blazor/GatewayOriginReference.cs New helper to emit a deployer-resolvable origin placeholder while resolving dev-time values.
src/Aspire.Hosting.Blazor/GatewayConfigurationBuilder.cs Major refactor: build config JSON as a ReferenceExpression and remove logger-based warning path.
src/Aspire.Hosting.Blazor/BlazorHostedExtensions.cs Adjust call site for the new config builder signature.
src/Aspire.Hosting.Blazor/BlazorGatewayExtensions.cs Add [ResourceName], change artifact paths, and revise .NET image tag resolution logic.
src/Aspire.Hosting.Blazor/Aspire.Hosting.Blazor.csproj Add BlazorGatewayDotNetImageTag property and stamp it into assembly metadata.
playground/BlazorStandalone/README.md Documentation wording update (“Aspire” instead of “.NET Aspire”).
playground/BlazorHosted/README.md Documentation wording update (“Aspire” instead of “.NET Aspire”).

Comment thread src/Aspire.Hosting.Blazor/GatewayConfigurationBuilder.cs
Comment thread src/Aspire.Hosting.Blazor/GatewayConfigurationBuilder.cs
Comment thread src/Aspire.Hosting.Blazor/GatewayConfigurationBuilder.cs
Comment thread src/Aspire.Hosting.Blazor/GatewayConfigurationBuilder.cs
Comment thread src/Aspire.Hosting.Blazor/BlazorGatewayExtensions.cs Outdated
PR feedback from microsoft#15691:
- Add [ResourceName] attribute to all Add* API name parameters
- Replace null-forgiving operator with explicit throw in EndpointsManifestTransformer
- Use StringComparison.OrdinalIgnoreCase for route comparison
- Fix '.NET Aspire' phrasing in README files

Docker Compose publish fixes for Blazor gateway:
- Add GatewayOriginReference (IValueProvider + IManifestExpressionProvider)
- Use ReferenceExpression for ConfigResponse so publishers emit proper placeholders
- Use TextEncoderSettings to escape braces in JSON string values
- Simplify Gateway.cs.in (serve ConfigResponse directly, no Replace logic)
- Add System.Text.Unicode dependency for brace-escaping encoder

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@javiercn javiercn force-pushed the javiercn/blazor-integration-follow-ups branch from 4be1b69 to ae9ce87 Compare May 22, 2026 18:20
Copy link
Copy Markdown
Member

@JamesNK JamesNK left a comment

Choose a reason for hiding this comment

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

One issue found: missing OTLP misconfiguration warning in the hosted Blazor path (BlazorHostedExtensions.cs). The rest of the changes look correct.

Comment thread src/Aspire.Hosting.Blazor/BlazorHostedExtensions.cs
Comment thread src/Aspire.Hosting.Blazor/GatewayConfigurationBuilder.cs
Comment thread src/Aspire.Hosting.Blazor/GatewayConfigurationBuilder.cs Outdated
javiercn and others added 2 commits May 25, 2026 18:18
The standalone gateway path already logged a warning when telemetry proxying
was requested but no HTTP OTLP endpoint could be resolved. The hosted model
(ProxyBlazorTelemetry via BlazorHostedExtensions) was missing the equivalent
diagnostic.

- Add LogWarning in BlazorHostedExtensions.EnsureEnvironmentCallback
- Add tests verifying the warning fires (and does not fire) in both scenarios

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use the standard OpenTelemetry environment variable name instead of a custom
Aspire-specific one. The value remains a relative path that the WASM client
resolves against its page origin to stay same-origin.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Member

@JamesNK JamesNK left a comment

Choose a reason for hiding this comment

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

Overall, looks good.

One thing I noticed is when running with blazor hosted mode, telemetry being sent to the dashboard is recorded as telemetry:

Image

Comment thread tests/Aspire.Hosting.Blazor.Tests/BlazorHostedExtensionsTests.cs Outdated
Replace private ListLogger and LogMessage with shared TestSink and
TestLogger from Microsoft.Extensions.Logging.Testing. Also moves the
OTLP warning in the standalone gateway path before the build step so
it is testable, and adds two tests for that path.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@javiercn
Copy link
Copy Markdown
Contributor Author

image image

Log showing on both cases.

@javiercn
Copy link
Copy Markdown
Contributor Author

Overall, looks good.

One thing I noticed is when running with blazor hosted mode, telemetry being sent to the dashboard is recorded as telemetry:

Image

Ah, let me check that. Might need the filter

The gateway and hosted server YARP proxies forward /_otlp/* requests
to the dashboard. Without filtering, those forwarding requests are
themselves traced and exported, creating recursive telemetry entries.

- Gateway (Gateway.cs.in): Simplified filter to use Contains for
  /_otlp/ paths (handles prefix-mounted apps like /app/_otlp/...).
  Removed IsStaticAssetOrOtlpRequest helper since static asset
  requests don't go through YARP.
- Hosted server (Program.cs): Added PostConfigure to wrap existing
  OTEL filters with /_otlp/ and /v1/ exclusions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@javiercn
Copy link
Copy Markdown
Contributor Author

Fixed the OTLP proxy trace feedback loop in b11bae8 — added trace filtering for both gateway (\Gateway.cs.in) and hosted server (\Program.cs). The gateway filters /_otlp/\ from ASP.NET Core traces and /v1/\ from HttpClient traces. The hosted server uses \PostConfigure\ to wrap existing filters with the same exclusions. Verified both scenarios manually — OTLP proxy traffic no longer appears in dashboard traces.

@davidfowl davidfowl added this to the 13.4 milestone May 27, 2026
@JamesNK
Copy link
Copy Markdown
Member

JamesNK commented May 27, 2026

In the hosted sample I noticed there is a different between blazorapp and blazorapp (client). Is the first for telemetry from the host (i.e. serving web request from the browser and app) and second for telemetry from the blazor wasm app? I would have expected the route change events to be in the wasm client, not the host.

image

@JamesNK
Copy link
Copy Markdown
Member

JamesNK commented May 27, 2026

Let me know if the issue above is something to fix and if you want to fix it now. Or we can just merge now and I'll backport this to the release branch.

@javiercn
Copy link
Copy Markdown
Contributor Author

Let me know if the issue above is something to fix and if you want to fix it now. Or we can just merge now and I'll backport this to the release branch.

In the hosted sample I noticed there is a different between blazorapp and blazorapp (client). Is the first for telemetry from the host (i.e. serving web request from the browser and app) and second for telemetry from the blazor wasm app? I would have expected the route change events to be in the wasm client, not the host.

image

https://github.com/microsoft/aspire/blob/main/playground/BlazorHosted/BlazorHosted.Server/Components/App.razor#L16C6-L16C13

By design. I made the hosted app use "island architecture" (SSR with islands of interactivity) to make sure this case was covered

@javiercn
Copy link
Copy Markdown
Contributor Author

Let me know if the issue above is something to fix and if you want to fix it now. Or we can just merge now and I'll backport this to the release branch.

We can merge now

@JamesNK JamesNK enabled auto-merge (squash) May 27, 2026 07:04
@davidfowl davidfowl closed this May 27, 2026
auto-merge was automatically disabled May 27, 2026 07:06

Pull request was closed

@davidfowl davidfowl reopened this May 27, 2026
@davidfowl davidfowl enabled auto-merge (squash) May 27, 2026 07:06
@microsoft-github-policy-service microsoft-github-policy-service Bot modified the milestones: 13.4, 13.5 May 27, 2026
/// </summary>
internal sealed class GatewayOriginReference(EndpointReference endpoint) : IValueProvider, IManifestExpressionProvider
{
public string ValueExpression => $"{{{endpoint.Resource.Name}.bindings.{endpoint.EndpointName}.url}}";
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.

??

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

When I tried aspire publish with docker compose, the endpoint url was resolving to the internal docker host URL as opposed to the "public" one and the deployed app was failing. The only way I found to solve it is to make it an expression that then gets converted into a parameter in the docker compose file and populated with the appropriate value.

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.

Ah this problem. Did you try other targets as well?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I did try ACA in the original prototype, but as far as I remember, it didn't have this problem. I believe there is something unique to the docker-compose support, where it picks the internal endpoint over the public one.

To be very clear and fair, I'm a bit on an unsecure footing in this area of aspire yet.

I can try other targets in the following days too, but which ones would you recommend me to try?

@davidfowl
Copy link
Copy Markdown
Contributor

PR Testing Report

PR Information

CLI Version Verification

  • Expected Commit: b11bae8
  • Installed Version: 13.5.0-pr.17384.gb11bae81
  • Status: Verified. The installed PR CLI version contains the PR head short SHA b11bae8.
  • Note: Local macOS arm64 install could not run because workflow run 26496344543 did not publish cli-native-archives-osx-arm64; testing switched to the repo container runner, where Linux arm64 artifacts were available.

Changes Analyzed

Files Changed

  • playground/BlazorHosted/BlazorHosted.ClientServiceDefaults/Extensions.cs
  • playground/BlazorHosted/BlazorHosted.Server/Program.cs
  • playground/BlazorHosted/README.md
  • playground/BlazorStandalone/BlazorStandalone.ClientServiceDefaults/Extensions.cs
  • playground/BlazorStandalone/README.md
  • src/Aspire.Hosting.Blazor/Aspire.Hosting.Blazor.csproj
  • src/Aspire.Hosting.Blazor/BlazorGatewayExtensions.cs
  • src/Aspire.Hosting.Blazor/BlazorHostedExtensions.cs
  • src/Aspire.Hosting.Blazor/GatewayConfigurationBuilder.cs
  • src/Aspire.Hosting.Blazor/GatewayOriginReference.cs
  • src/Aspire.Hosting.Blazor/Manifests/EndpointsManifestTransformer.cs
  • src/Aspire.Hosting.Blazor/Scripts/Gateway.cs.in
  • tests/Aspire.Hosting.Blazor.Tests/BlazorHostedExtensionsTests.cs
  • tests/Aspire.Hosting.Blazor.Tests/GatewayConfigurationBuilderTests.cs

Change Categories

  • CLI changes detected
  • Hosting integration changes detected: Aspire.Hosting.Blazor gateway/hosted telemetry, service proxy, config response, publish-related changes
  • Dashboard changes detected
  • Template changes detected
  • Client/Component changes detected
  • Test changes detected

Test Scenarios Executed

Scenario 1: PR CLI install/version verification

Objective: Install the PR CLI from the dogfood command and verify it matches the PR head commit.
Coverage Type: Happy path
Status: Passed in container; local macOS artifact unavailable.

Steps:

  1. Fetched PR metadata and dogfood command.
  2. Attempted local macOS arm64 install; artifact was missing.
  3. Switched to repo-local container runner.
  4. Installed PR CLI and NuGet hive from workflow run 26496344543.
  5. Verified aspire --version.

Evidence:

  • logs/container-install.log
  • logs/version.txt

Observations:

  • CLI installed to /workspace/.aspire/dogfood/pr-17384/bin/aspire.
  • NuGet packages installed to /workspace/.aspire/hives/pr-17384/packages.

Scenario 2: Empty AppHost baseline

Objective: Verify PR CLI can create and run a fresh C# Aspire AppHost after the container receives the required .NET SDK.
Coverage Type: Happy path / environment baseline
Status: Passed.

Steps:

  1. Created aspire-empty with --source set to the PR hive and --version set to the PR CLI version.
  2. Confirmed the bare container lacked dotnet and AppHost start failed with the expected SDK error.
  3. Installed .NET SDK 10.0.300 into /workspace/.dotnet.
  4. Started and stopped the empty AppHost with the PR CLI.

Evidence:

  • logs/scenario-empty-create.log
  • logs/scenario-empty-start.log
  • logs/dotnet-install.log
  • logs/scenario-empty-start-after-sdk.log

Observations:

  • The AppHost started successfully after installing SDK 10.0.300.

Scenario 3: Standalone Blazor gateway service proxy smoke

Objective: Create a fresh standalone Blazor WASM + Web API app, attach it to AddBlazorGateway, and verify gateway routing/config response for proxied services.
Coverage Type: Happy path
Status: Passed.

Steps:

  1. Created a fresh aspire-empty AppHost.
  2. Created a dotnet new blazorwasm client and dotnet new webapi service.
  3. Added #:package Aspire.Hosting.Blazor@13.5.0-pr.17384.gb11bae81.
  4. Configured AddBlazorWasmApp("store", ...), WithReference(weatherApi), and AddBlazorGateway("gateway").WithBlazorClientApp(store).
  5. Started the AppHost, waited for gateway and weatherapi to be up, and fetched /store/_blazor/_configuration from the gateway.

Evidence:

  • logs/scenario-standalone-gateway.log
  • logs/scenario-standalone-describe.json
  • logs/scenario-standalone-describe-gateway.json
  • logs/scenario-standalone-client-config.json

Observations:

  • gateway, store, and weatherapi reached Running/Healthy.
  • Gateway YARP route/cluster environment variables were present.
  • The browser-visible config included service discovery keys:
{"webAssembly":{"environment":{"services__weatherapi__https__0":"https://localhost:38077/store/_api/weatherapi","services__weatherapi__http__0":"https://localhost:38077/store/_api/weatherapi"}}}

Scenario 4: Standalone Blazor gateway telemetry config

Objective: Verify WithBlazorClientApp emits browser-visible OTLP settings using OTEL_EXPORTER_OTLP_ENDPOINT when telemetry proxying is enabled.
Coverage Type: Happy path / targeted behavior
Status: Failed.

Steps:

  1. Created a fresh standalone gateway app like Scenario 3.
  2. Added .WithOtlpExporter(OtlpProtocol.HttpProtobuf) to the gateway.
  3. Started the AppHost and fetched /store/_blazor/_configuration.
  4. Checked for OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_PROTOCOL, and absence of OTEL_EXPORTER_OTLP_HEADERS in the browser-visible config.

Evidence:

  • logs/scenario-standalone-gateway-otel.log
  • logs/scenario-standalone-otel-client-config.json
  • logs/scenario-standalone-otel-describe.json
  • logs/scenario-standalone-otel-describe-gateway.json

Expected:

  • Client config includes OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_EXPORTER_OTLP_PROTOCOL for WASM telemetry proxying.
  • Client config does not expose OTEL_EXPORTER_OTLP_HEADERS.

Actual:

  • Client config only contained proxied service URLs; OTLP client settings were absent:
{"webAssembly":{"environment":{"services__weatherapi__https__0":"https://localhost:40909/store/_api/weatherapi","services__weatherapi__http__0":"https://localhost:40909/store/_api/weatherapi"}}}

Analysis:

  • The running gateway resource had server-side OTLP environment variables, but ClientApps__store__ConfigResponse omitted client OTLP settings.
  • The captured logs did not contain the expected warning text OTLP telemetry proxying was requested but no dashboard HTTP endpoint could be resolved.
  • This means a WASM client would not be configured to send telemetry through the gateway in this CLI-hosted scenario.

Scenario 5: Hosted Blazor telemetry config

Objective: Verify ProxyBlazorTelemetry() emits browser-visible OTLP settings for a hosted Blazor Web App.
Coverage Type: Happy path / targeted behavior
Status: Failed.

Steps:

  1. Created a fresh aspire-empty AppHost.
  2. Created a dotnet new blazor --interactivity WebAssembly --all-interactive hosted app and a Web API service.
  3. Configured .ProxyBlazorService(weatherApi).ProxyBlazorTelemetry() on the hosted project.
  4. Started the AppHost and inspected Client__ConfigResponse in aspire describe hostedapp --format Json.

Evidence:

  • logs/scenario-hosted-blazor-telemetry-fixed.log
  • logs/scenario-hosted-fixed-describe-hostedapp.json

Expected:

  • Client__ConfigResponse includes OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_EXPORTER_OTLP_PROTOCOL.
  • Browser-visible config does not expose OTEL_EXPORTER_OTLP_HEADERS.

Actual:

  • Client__ConfigResponse only contained the proxied service URL:
{"webAssembly":{"environment":{"services__weatherapi__http__0":"http://localhost:44627/_api/weatherapi"}}}

Analysis:

  • The hosted resource itself had server-side OTLP variables, including headers, but those headers were not in the browser-visible Client__ConfigResponse.
  • The browser-visible config still omitted the expected OTLP endpoint/protocol keys, so WASM telemetry would not be configured.

Scenario 6: Existing output directory negative case

Objective: Verify non-interactive aspire new fails safely when the output directory already exists and is non-empty.
Coverage Type: Unhappy path
Status: Passed.

Steps:

  1. Created a non-empty output directory.
  2. Ran aspire new aspire-empty targeting that directory.
  3. Verified non-zero exit and clear error text.

Evidence:

  • logs/scenario-new-existing-output.log
  • logs/scenario-new-existing-output-summary.log

Observed outcome:

  • Exit code 4.
  • Error: The output directory '/workspace/scenarios/new-existing-output/ExistingOutput' already exists and is not empty. Specify --output with a different location.

Scenario 7: Publish pipeline boundary

Objective: Exercise aspire publish for the generated standalone gateway app and inspect generated artifacts if present.
Coverage Type: Boundary / publish path
Status: Inconclusive.

Steps:

  1. Ran aspire publish --list-steps against the standalone gateway AppHost.
  2. Ran aspire publish --output-path ....

Evidence:

  • logs/scenario-publish-list-steps.log
  • logs/scenario-publish-full.log

Observations:

  • Publish pipeline completed successfully.
  • No output directory/artifacts were generated for this app, so Docker/gateway publish artifact inspection was not possible in this scenario.

Summary

Scenario Status Notes
PR CLI install/version verification Passed Container install/version matched b11bae8; local macOS arm64 artifact unavailable
Empty AppHost baseline Passed Required installing .NET SDK 10.0.300 into runner workspace
Standalone gateway service proxy Passed Gateway and API reached healthy; service config emitted
Standalone gateway telemetry config Failed Browser config missing OTEL_EXPORTER_OTLP_ENDPOINT/protocol
Hosted Blazor telemetry config Failed Client__ConfigResponse missing OTEL_EXPORTER_OTLP_ENDPOINT/protocol
Existing output negative case Passed Failed safely with clear non-zero error
Publish boundary Inconclusive Publish completed but generated no artifacts to inspect

Overall Result

Issues found. The PR build installs and basic Blazor gateway service proxying works, but both standalone and hosted telemetry-proxy scenarios failed to emit the expected browser-visible OTLP configuration keys. This appears to prevent WASM client telemetry from being configured through the gateway under the tested CLI/dashboard setup.

Recommendation

Investigate why ResolveHttpOtlpEndpointUrl does not lead to OTEL_EXPORTER_OTLP_ENDPOINT in ClientApps__...__ConfigResponse / Client__ConfigResponse during normal PR CLI AppHost runs, and why the expected warning was not visible in captured logs when the browser-visible OTLP config was omitted.

@github-actions
Copy link
Copy Markdown
Contributor

Re-running the failed jobs in the CI workflow for this pull request because 1 job was identified as retry-safe transient failures in the CI run attempt.
GitHub was asked to rerun all failed jobs for that attempt, and the rerun is being tracked in the rerun attempt.
The job links below point to the failed attempt jobs that matched the retry-safe transient failure rules.

@davidfowl davidfowl merged commit 30c1cc5 into microsoft:main May 27, 2026
623 of 627 checks passed
@JamesNK
Copy link
Copy Markdown
Member

JamesNK commented May 27, 2026

/backport to release/13.4

@github-actions
Copy link
Copy Markdown
Contributor

Started backporting to release/13.4 (link to workflow run)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants