Skip to content

Graduate user secrets APIs from experimental to stable - #20817

Merged
Mitch Denny (mitchdenny) merged 3 commits into
mainfrom
mitchdenny-stable-user-secrets-apis
Oct 9, 2026
Merged

Mitch Denny (mitchdenny) merged 3 commits into
mainfrom
mitchdenny-stable-user-secrets-apis

Conversation

@mitchdenny

Copy link
Copy Markdown
Member

Description

Graduate the ASPIREUSERSECRETS001 API family so consumers can use Aspire's user-secrets manager without suppressing an experimental diagnostic.

Re-enumerated current main: the only actual source declarations are IUserSecretsManager and IDistributedApplicationBuilder.UserSecretsManager. Remove their experimental attributes and all 23 associated warning suppression directives across hosting, testing, browser, and test consumers. Remove the now-unused attribute namespace import.

This is attribute-only graduation. All signatures, defaults, compatibility implementations, availability and file-path behavior, persistence semantics, locking, and lifecycle behavior remain unchanged, including TryDeleteSecret's default false, GetOrSetSecret, and SaveStateAsync. ATS exports and adapters are unchanged. A structural comparison confirms every other nonblank source line is identical to main.

No related documentation explicitly describes these APIs as experimental, and no playground/configuration suppressions were found. Generated api/*.cs baselines remain untouched, as do all other experimental families and package/version settings. This is an independent branch from main, not stacked on another graduation PR.

User-facing usage

Existing usage is unchanged and no longer requires an ASPIREUSERSECRETS001 suppression:

var builder = DistributedApplication.CreateBuilder(args);
IUserSecretsManager userSecrets = builder.UserSecretsManager;

Validation

All validation ran locally on macOS arm64. Existing tests were reused; no new tests were added for the attribute-only change. Test commands without --no-build also built the affected projects and their project-reference dependencies, including Hosting, Hosting.Testing, Hosting.Browsers, TestUtilities, and TypeScript code generation.

  • ./restore.sh — passed, 0 warnings/errors.
  • git diff --check origin/main...HEAD — passed.
  • Repository-wide diagnostic audit — only the two intentionally untouched generated baseline entries remain.
  • Structural comparison against main — passed: exactly two experimental attributes and 23 suppression directives removed; all remaining nonblank source lines unchanged apart from the unused import.
MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj --no-launch-profile -- --filter-class '*.SecretsStoreTests' --filter-class '*.UserSecretsParameterDefaultTests' --filter-class '*.ParameterProcessorTests' --filter-class '*.VersionCheckServiceTests' --filter-class '*.PersistentContainerWarningTests' --filter-class '*.DeploymentStateManagerTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Passed: 173 tests, covering user-secrets manager/factory operations, concurrent persistence, deletion, configuration, and deployment-state consumers.

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj --no-build --no-launch-profile -- --filter-class '*.DistributedApplicationBuilderTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Passed: 44 tests, including polyglot user-secrets ID and file-path behavior. Used the Hosting test build from the preceding command.

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Browsers.Tests/Aspire.Hosting.Browsers.Tests.csproj --no-launch-profile -- --filter-method '*.WithBrowserLogs_ConfigureCommand*' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Passed: 10 tests, including user-secrets availability and persistence-failure handling.

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Testing.Tests/Aspire.Hosting.Testing.Tests.csproj --no-launch-profile -- --filter-method '*.TestingBuilderHasAllPropertiesFromRealBuilder' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Passed: 1 test.

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests.csproj --no-launch-profile -- --filter-method '*.Generate_HostingAssembly_IncludesCoreFrameworkPolyglotHelpers' --filter-method '*.TwoPassScanning_DeduplicatesCapabilities' --filter-method '*.TwoPassScanning_MergesHandleTypesFromAllAssemblies' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Passed: 3 tests, including generated getUserSecretsManager and saveStateJson helpers. Total: 231 tests passed, none failed or skipped.

Limitations: full solution build/full test suite, Windows/Linux validation, and other language generator suites were not run. Quarantined and outerloop tests were excluded.

Fixes # (issue)

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

🚀 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 -- 20817

Or

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

@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot October 8, 2026 06:47
@github-actions github-actions Bot added the area-app-model Issues pertaining to the APIs in Aspire.Hosting, e.g. DistributedApplication label Oct 8, 2026
@github-actions

This comment has been minimized.

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.

🟢 Approval recommended

The changes consistently graduate the intended API and remove only obsolete diagnostics without altering behavior.

0 open findings

What changed in this PR

Graduates the user-secrets API from experimental to stable without changing runtime behavior.

Changes:

  • Removes Experimental attributes from the public user-secrets API.
  • Removes obsolete ASPIREUSERSECRETS001 suppressions and an unused import.
  • Leaves API baselines, ATS exports, and behavior unchanged.
File Description
tests/​Aspire.Hosting.TestUtilities/​Utils/​MockUserSecretsManager.cs Removes obsolete suppression.
tests/​Aspire.Hosting.Tests/​VersionChecking/​VersionCheckServiceTests.cs Removes obsolete suppression.
tests/​Aspire.Hosting.Tests/​PersistentContainerWarningTests.cs Removes obsolete suppression.
tests/​Aspire.Hosting.Tests/​Orchestrator/​ParameterProcessorTests.cs Removes obsolete suppression.
tests/​Aspire.Hosting.Tests/​DistributedApplicationBuilderTests.cs Removes obsolete suppression.
tests/​Aspire.Hosting.Tests/​Dcp/​DcpExecutorTests.cs Removes obsolete suppression.
tests/​Aspire.Hosting.Browsers.Tests/​BrowserLogsBuilderExtensionsTests.cs Removes obsolete suppression directives.
src/​Aspire.Hosting/​VersionChecking/​VersionCheckService.cs Removes obsolete suppression.
src/​Aspire.Hosting/​UserSecrets/​UserSecretsManagerFactory.cs Removes obsolete suppression.
src/​Aspire.Hosting/​UserSecrets/​NoopUserSecretsManager.cs Removes obsolete suppression.
src/​Aspire.Hosting/​UserSecrets/​IUserSecretsManager.cs Graduates the interface and removes its unused import.
src/​Aspire.Hosting/​Pipelines/​Internal/​UserSecretsDeploymentStateManager.cs Removes obsolete suppression.
src/​Aspire.Hosting/​ParameterResourceBuilderExtensions.cs Removes obsolete suppression.
src/​Aspire.Hosting/​Orchestrator/​ParameterProcessor.cs Removes obsolete suppression.
src/​Aspire.Hosting/​IDistributedApplicationBuilder.cs Graduates the user-secrets manager property.
src/​Aspire.Hosting/​DistributedApplicationBuilder.cs Removes obsolete suppression.
src/​Aspire.Hosting/​Dcp/​DcpExecutor.cs Removes obsolete suppression.
src/​Aspire.Hosting/​BuiltInDistributedApplicationEventSubscriptionHandlers.cs Removes obsolete suppression.
src/​Aspire.Hosting/​Ats/​UserSecretsExports.cs Removes obsolete ATS suppression.
src/​Aspire.Hosting/​ApplicationModel/​UserSecretsParameterDefault.cs Removes obsolete suppression.
src/​Aspire.Hosting.Testing/​DistributedApplicationTestingBuilder.cs Removes obsolete suppression.
src/​Aspire.Hosting.Browsers/​BrowserLogsConfigurationManager.cs Removes obsolete suppression directives.

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Found 1 issue: a stale generated TypeScript snapshot causes the code-generation regression test to fail on Windows and Linux. No other high-confidence findings. Local structural comparison and diff checks passed; CI failure output was inspected, but tests were not rerun locally.

Comment thread src/Aspire.Hosting/UserSecrets/IUserSecretsManager.cs

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approval submitted as requested. The previously posted finding about the stale TypeScript snapshot remains outstanding; it caused the code-generation snapshot test to fail on Windows and Linux.

@github-actions

This comment has been minimized.

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.

🟢 Approval recommended

The changes consistently remove experimental metadata and suppressions while preserving API signatures and behavior.

0 open findings

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

@github-actions

This comment has been minimized.

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.

🟢 Approval recommended

The attribute-only graduation is internally consistent, preserves behavior, and updates affected generated output and consumers.

0 open findings

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@mitchdenny
Mitch Denny (mitchdenny) force-pushed the mitchdenny-stable-user-secrets-apis branch from 3b176ce to 4741061 Compare October 8, 2026 22:45
@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot October 8, 2026 22:48
@github-actions

This comment has been minimized.

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.

🟢 Approval recommended

The changes consistently remove only experimental metadata and obsolete suppressions, with the generated snapshot aligned and no behavioral changes found.

0 open findings

🧠 Review effort: Balanced

Remove ASPIREUSERSECRETS001 attributes and obsolete consumer suppressions without changing API signatures, compatibility defaults, implementations, or ATS exports.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Remove generated experimental JSDoc for the graduated user secrets manager and builder property without changing generated signatures or runtime code.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The rebased builder interface no longer has experimental attributes after both pipeline and user-secrets API graduation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Tests selector

50 / 98 PR test projects · 4 PR jobs, from 23 changed files.

Selected PR test projects (50 / 98)

Aspire.Cli.EndToEnd.Tests, Aspire.Hosting.Analyzers.Tests, Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Kusto.Tests, Aspire.Hosting.Azure.Provisioning.Tests, Aspire.Hosting.Azure.Tests, Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Browsers.Tests, Aspire.Hosting.CodeGeneration.Go.Tests, Aspire.Hosting.CodeGeneration.Java.Tests, Aspire.Hosting.CodeGeneration.Python.Tests, Aspire.Hosting.CodeGeneration.Rust.Tests, Aspire.Hosting.CodeGeneration.TypeScript.Tests, Aspire.Hosting.Containers.Tests, Aspire.Hosting.DevTunnels.Tests, Aspire.Hosting.Docker.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.EntityFrameworkCore.Tests, Aspire.Hosting.Foundry.Tests, Aspire.Hosting.Garnet.Tests, Aspire.Hosting.Go.Tests, Aspire.Hosting.Java.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Kafka.Tests, Aspire.Hosting.Keycloak.Tests, Aspire.Hosting.Kubernetes.Tests, Aspire.Hosting.Maui.Tests, Aspire.Hosting.Milvus.Tests, Aspire.Hosting.MongoDB.Tests, Aspire.Hosting.MySql.Tests, Aspire.Hosting.Nats.Tests, Aspire.Hosting.OpenAI.Tests, Aspire.Hosting.Oracle.Tests, Aspire.Hosting.Orleans.Tests, Aspire.Hosting.PostgreSQL.Tests, Aspire.Hosting.Python.Tests, Aspire.Hosting.Qdrant.Tests, Aspire.Hosting.RabbitMQ.Tests, Aspire.Hosting.Radius.Tests, Aspire.Hosting.Redis.Tests, Aspire.Hosting.RemoteHost.Tests, Aspire.Hosting.Rust.Tests, Aspire.Hosting.Seq.Tests, Aspire.Hosting.SqlServer.Tests, Aspire.Hosting.Testing.Tests, Aspire.Hosting.Tests, Aspire.Hosting.Valkey.Tests, Aspire.Hosting.Yarp.Tests, Aspire.Playground.Tests

Selected PR jobs (4)

cli-starter-validation, extension-e2e, polyglot, typescript-api-compat


How these were chosen — grouped by what changed

⚠️ 30 of the 50 selected test projects come from a single change — tests/Aspire.Hosting.TestUtilities/Utils/MockUserSecretsManager.cs.

🧪 tests/Aspire.Hosting.TestUtilities/Utils/MockUserSecretsManager.cs (changed test)
→ 30 via the project graph

show 30

Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Kusto.Tests, Aspire.Hosting.DevTunnels.Tests, Aspire.Hosting.Docker.Tests, Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.EntityFrameworkCore.Tests, Aspire.Hosting.Foundry.Tests, Aspire.Hosting.Garnet.Tests, Aspire.Hosting.Go.Tests, Aspire.Hosting.Java.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Kafka.Tests, Aspire.Hosting.Keycloak.Tests, Aspire.Hosting.Kubernetes.Tests, Aspire.Hosting.Milvus.Tests, Aspire.Hosting.MongoDB.Tests, Aspire.Hosting.MySql.Tests, Aspire.Hosting.Nats.Tests, Aspire.Hosting.Oracle.Tests, Aspire.Hosting.Orleans.Tests, Aspire.Hosting.PostgreSQL.Tests, Aspire.Hosting.Python.Tests, Aspire.Hosting.Qdrant.Tests, Aspire.Hosting.RabbitMQ.Tests, Aspire.Hosting.Redis.Tests, Aspire.Hosting.Rust.Tests, Aspire.Hosting.Seq.Tests, Aspire.Hosting.SqlServer.Tests, Aspire.Hosting.Valkey.Tests, Aspire.Hosting.Yarp.Tests

🔧 src/Aspire.Hosting/ApplicationModel/UserSecretsParameterDefault.cs (changed source)
→ 9 via the project graph: Aspire.Hosting.Analyzers.Tests (2 hops), Aspire.Hosting.Azure.Provisioning.Tests (3 hops), Aspire.Hosting.Azure.Tests, Aspire.Hosting.CodeGeneration.Go.Tests, Aspire.Hosting.CodeGeneration.Java.Tests, Aspire.Hosting.CodeGeneration.Python.Tests, Aspire.Hosting.CodeGeneration.Rust.Tests, Aspire.Hosting.Maui.Tests, Aspire.Hosting.RemoteHost.Tests

🔧 src/Aspire.Hosting.Testing/DistributedApplicationTestingBuilder.cs (changed source)
→ 1 directly: Aspire.Hosting.Testing.Tests
→ 3 via the project graph: Aspire.Hosting.Containers.Tests, Aspire.Hosting.OpenAI.Tests, Aspire.Playground.Tests

🧪 tests/Aspire.Hosting.Tests/Dcp/DcpExecutorTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests
→ 3 via the project graph: Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.Radius.Tests

📦 affected project Aspire.Hosting
→ 1 test: Aspire.Cli.EndToEnd.Tests

🔧 src/Aspire.Hosting.Browsers/BrowserLogsConfigurationManager.cs (changed source)
→ 1 directly: Aspire.Hosting.Browsers.Tests

🧪 tests/Aspire.Hosting.Browsers.Tests/BrowserLogsBuilderExtensionsTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Browsers.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts (changed test)
→ 1 directly: Aspire.Hosting.CodeGeneration.TypeScript.Tests

🧪 tests/Aspire.Hosting.Tests/DistributedApplicationBuilderTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Orchestrator/ParameterProcessorTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/PersistentContainerWarningTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/VersionChecking/VersionCheckServiceTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests

Job reasons

Job Triggered by
cli-starter-validation affected project Aspire.Hosting.PostgreSQL
extension-e2e • src/Aspire.Hosting/ApplicationModel/UserSecretsParameterDefault.cs, src/Aspire.Hosting/Ats/UserSecretsExports.cs, src/Aspire.Hosting/BuiltInDistributedApplicationEventSubscriptionHandlers.cs, src/Aspire.Hosting/Dcp/DcpExecutor.cs, src/Aspire.Hosting/DistributedApplicationBuilder.cs, src/Aspire.Hosting/IDistributedApplicationBuilder.cs, src/Aspire.Hosting/Orchestrator/ParameterProcessor.cs, src/Aspire.Hosting/ParameterResourceBuilderExtensions.cs, src/Aspire.Hosting/Pipelines/Internal/UserSecretsDeploymentStateManager.cs, src/Aspire.Hosting/UserSecrets/IUserSecretsManager.cs, src/Aspire.Hosting/UserSecrets/NoopUserSecretsManager.cs, src/Aspire.Hosting/UserSecrets/UserSecretsManagerFactory.cs, src/Aspire.Hosting/VersionChecking/VersionCheckService.cs
• affected project Aspire.Hosting
polyglot • affected project Aspire.Hosting
• affected project Aspire.Hosting.Azure.Provisioning
typescript-api-compat affected project Aspire.Hosting.Browsers

Selection computed for commit b9b2495.

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.

🟢 Approval recommended

The changes consistently graduate the intended API family while preserving signatures, behavior, ATS adapters, and generated API baselines.

0 open findings

🧠 Review effort: Balanced

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@mitchdenny
Mitch Denny (mitchdenny) merged commit b01702d into main Oct 9, 2026
585 of 588 checks passed
@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 17.0 milestone Oct 9, 2026
aspire-repo-bot Bot added a commit to microsoft/aspire.dev that referenced this pull request Oct 9, 2026
Document that IUserSecretsManager and
IDistributedApplicationBuilder.UserSecretsManager have graduated from
experimental to stable in Aspire 17.0, following microsoft/aspire#20817.

- Update ASPIREUSERSECRETS001 diagnostic page to reflect the graduation,
  matching the pattern used for ASPIREACADOMAINS001.
- Add a What's new in Aspire 17.0 entry announcing the graduation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Pull request created: #1854

Generated by PR Documentation Check · copilot · auto · 123.7 AIC · ⌖ 10.7 AIC · ⊞ 20.4K

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

📝 Documentation has been drafted in microsoft/aspire.dev#1854 targeting release/17.0.

Triggered signals: pr_body_has_user_facing_section (PR body's "User-facing usage" section shows builder.UserSecretsManager used without suppression) and pr_body_has_cli_flag_mention (test command flags in the body). Updated diagnostics/aspireusersecrets001.mdx to state the diagnostic no longer applies as of Aspire 17.0 (mirroring the ASPIREACADOMAINS001 graduation pattern) and added a new "User secrets manager APIs are stable" section to whats-new/aspire-17.mdx announcing the graduation with a code sample and cross-link.

Note

This draft PR needs human review before merging.

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

Labels

area-app-model Issues pertaining to the APIs in Aspire.Hosting, e.g. DistributedApplication

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants