Skip to content

Preserve typed nested unions in SDK codegen - #2486

Closed
gokhanarkan wants to merge 6 commits into
mainfrom
gokhanarkan/expose-catalogue-search
Closed

Preserve typed nested unions in SDK codegen#2486
gokhanarkan wants to merge 6 commits into
mainfrom
gokhanarkan/expose-catalogue-search

Conversation

@gokhanarkan

@gokhanarkan gokhanarkan commented Sep 2, 2026

Copy link
Copy Markdown
Member

Summary

  • derive discriminators and unknown-variant policy from resolved JSON Schema variants in shared codegen metadata
  • select the proven failure shape without method or type name checks: a closed discriminated result whose variant directly owns an array of another closed discriminated union
  • propagate that policy only through nested closed unions below the selected list elements
  • keep all unrelated generated RPC output byte-identical

Part of #2106.

Narrow generated scope

For the exact current schema, the structural selector matches only catalog.search and derives exactly this policy graph:

  • CatalogSearchResult
  • CatalogCandidate
  • CatalogCandidateSource

Generation conformance asserts both facts, so any future widening fails for explicit review instead of silently changing generated APIs.

Language mapping remains idiomatic and limited to that graph:

  • TypeScript projects the selected response through generated schema metadata
  • Go rejects unknown selected variants while retaining existing raw wrapper types for source compatibility
  • .NET rejects unknown selected variants and requires their discriminator fields
  • Python emits explicit CodeQL-safe failure paths for the selected loaders
  • Java promotes the selected nested unions instead of List<Object> / Object
  • Rust already models the variants safely; only conformance coverage changes

No generator source checks CatalogCandidate, Catalog*, or catalog.search. A synthetic non-catalogue result proves the same structural selection, TypeScript projection, and Java promotion.

Schema input

Exact Copilot CLI 1.0.83-5, resolved from the canonical published release package. Java's npm schema input is exact and both the Maven update profile and dependency workflow use --save-exact.

Conformance

Published catalogue result types exercise the selected graph across all six SDKs:

  • known outer and nested variants
  • refusal and failure variants
  • opaque candidate handles
  • unknown and missing outer discriminators
  • unknown and missing candidate/source discriminators
  • extra untrusted fields at result, candidate, and nested source levels

Validation

  • shared and Java generation drift: clean
  • focused six-language conformance: passed
  • Node format, lint, typecheck, build, and release package verification: passed
  • Python Ruff, changed-file ty, focused tests, and package build: passed
  • Go focused and package tests: passed
  • .NET focused conformance and package build: passed
  • Rust format, Clippy, package, and focused conformance: passed
  • Java full mvn verify: passed
  • independent final diff review: no actionable issues

The final diff is 33 files against current main. It contains no unrelated generated RPC output, session-event churn, E2E adaptations, downloader, materialisation policy, or planning/apply generated types or business logic.

@gokhanarkan
gokhanarkan requested a review from a team as a code owner September 2, 2026 15:30
Copilot AI balanced review requested due to automatic review settings September 2, 2026 15:30
@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.

Copilot review overview

🟡 Changes recommended

Go can still expose raw catalogue fields, Rust gains a source-breaking public field, and Java’s update profile can undo the exact schema pin.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review tier: Balanced
Findings: 2 Medium severity

New issues introduced by this change (2)
Severity Finding
Medium severity go/​rpc/​catalogue_conformance_test.go — This assertion only exercises the two known candidate variants, which decode into typed structs and…
Medium severity java/​scripts/​codegen/​package.json — The documented Java schema-update profile does not preserve this exact pin:…
What changed in this PR

Adds schema-pinned, typed catalog.search bindings across all SDKs, including union generation, raw-card filtering, and conformance tests.

Changes:

  • Pins code generation to @github/copilot@1.0.83-2.
  • Generates catalogue APIs and nested candidate/result types for six languages.
  • Adds cross-language conformance coverage and regenerates newer schema surfaces.
File Description
.github/​workflows/​update-copilot-dependency.yml Updates codegen dependencies exactly.
dotnet/​src/​Generated/​Rpc.cs Generates catalogue and newer RPC types.
dotnet/​src/​Generated/​SessionEvents.cs Regenerates session events.
dotnet/​test/​Unit/​CatalogueConformanceTests.cs Tests catalogue model conformance.
go/​rpc/​catalogue_conformance_test.go Tests catalogue decoding and leakage.
go/​rpc/​zrpc.go Generates catalogue and newer RPC APIs.
go/​rpc/​zsession_encoding.go Encodes added session events.
go/​rpc/​zsession_events.go Generates session-event models.
go/​zsession_events.go Exports added event types.
java/​scripts/​codegen/​java.ts Supports nested discriminated unions.
java/​scripts/​codegen/​package-lock.json Locks the schema package.
java/​scripts/​codegen/​package.json Pins the Java schema dependency.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​AgentModelPolicy.java Adds generated model policy.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​AssistantFusionPhaseActivityEvent.java Adds Fusion activity event.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​CompletionReceiptEventRange.java Adds receipt range type.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​CompletionReceiptFinalTool.java Adds receipt tool type.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​CompletionReceiptStopReason.java Adds receipt stop reasons.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​CompletionReceiptToolStatus.java Adds receipt tool statuses.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​CustomAgentsUpdatedAgent.java Regenerates agent event data.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​FusionPhaseActivityKind.java Adds Fusion activity kinds.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​FusionPhasePlanStep.java Adds Fusion plan steps.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​PermissionRequestedEvent.java Regenerates permission events.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​SessionCompletionReceiptEvent.java Adds completion receipt event.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​SessionEvent.java Registers added event variants.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​SessionFusionResolvedEvent.java Regenerates Fusion event data.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​SubagentCompletedEvent.java Regenerates completion data.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​SubagentFailedEvent.java Regenerates failure data.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​UserMessageEvent.java Regenerates message event data.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​AgentInfo.java Adds model policy metadata.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​AgentModelPolicy.java Adds RPC model policy.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogAiSkillCandidate.java Models AI skill candidates.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogAiSkillCandidateProvenance.java Models skill provenance.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogCandidate.java Adds candidate union base.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogCandidateSource.java Adds source union base.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogCandidateSourceEmbedded.java Models embedded sources.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogCandidateSourceUrl.java Models URL sources.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogMcpServerCandidate.java Models MCP candidates.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogMcpServerCandidateProvenance.java Models MCP provenance.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogMcpServerInstallability.java Models installation status.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​CatalogSearchSucceeded.java Models successful searches.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​DiscoveredHook.java Adds hook discovery type.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​HookOrigin.java Adds hook origins.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​HookType.java Regenerates hook types.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​HooksDiscoverParams.java Adds hook discovery input.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​HooksDiscoverResult.java Adds hook discovery output.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​QueuePendingItems.java Adds queued-message identity.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SandboxConfigUserPolicyNetwork.java Updates network documentation.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SandboxConfigUserPolicyNetworkProxy.java Updates proxy constraints.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​ServerHooksApi.java Adds hook discovery API.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​ServerRpc.java Exposes generated namespaces.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​ServerSessionsApi.java Adds persisted-event reads.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SessionModelSwitchToParams.java Updates model-switch semantics.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SessionsReadPersistedEventsParams.java Adds persisted-event parameters.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SessionsReadPersistedEventsResult.java Adds persisted-event results.
java/​sdk/​src/​generated/​java/​com/​github/​copilot/​generated/​rpc/​SubagentSettingsEntry.java Adds subagent model policy.
java/​sdk/​src/​test/​java/​com/​github/​copilot/​RpcSessionStateExtrasE2ETest.java Updates session-state fixtures.
java/​sdk/​src/​test/​java/​com/​github/​copilot/​generated/​CatalogConformanceTest.java Tests Java catalogue semantics.
java/​sdk/​src/​test/​java/​com/​github/​copilot/​generated/​rpc/​GeneratedRpcRecordsCoverageTest.java Updates generated-record coverage.
nodejs/​src/​generated/​rpc.ts Adds typed catalogue RPC and filtering.
nodejs/​src/​generated/​session-events.ts Regenerates session-event types.
nodejs/​test/​catalogue-conformance.test.ts Tests TypeScript catalogue behavior.
nodejs/​test/​e2e/​disabled_mcp_servers.e2e.test.ts Updates E2E configuration.
nodejs/​test/​e2e/​session_config.e2e.test.ts Updates E2E configuration.
python/​copilot/​generated/​rpc.py Generates catalogue and newer RPC types.
python/​copilot/​generated/​session_events.py Regenerates session events.
python/​test_rpc_generated.py Tests generated catalogue behavior.
rust/​src/​generated/​api_types.rs Generates catalogue and newer API types.
rust/​src/​generated/​rpc.rs Adds typed catalogue RPC access.
rust/​src/​generated/​session_events.rs Regenerates session events.
rust/​tests/​catalogue_conformance_test.rs Tests Rust catalogue semantics.
rust/​tests/​e2e/​rpc_session_state_extras.rs Updates subagent settings fixture.
scripts/​codegen/​catalogue-conformance.ts Validates catalogue schema invariants.
scripts/​codegen/​package-lock.json Locks codegen schema dependencies.
scripts/​codegen/​package.json Adds schema pin and conformance command.
scripts/​codegen/​python.ts Normalizes the AI acronym.
scripts/​codegen/​typescript.ts Generates catalogue response sanitization.
scripts/​codegen/​utils.ts Uses dedicated codegen dependencies.
Files not reviewed (5)
  • go/rpc/zsession_encoding.go: Generated file
  • go/rpc/zsession_events.go: Generated file
  • go/zsession_events.go: Generated file
  • java/scripts/codegen/package-lock.json: Generated file
  • scripts/codegen/package-lock.json: Generated file

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

Comment thread go/rpc/discriminated_union_conformance_test.go
Comment thread java/scripts/codegen/package.json Outdated
@gokhanarkan
gokhanarkan marked this pull request as draft September 2, 2026 15:42
@gokhanarkan
gokhanarkan force-pushed the gokhanarkan/expose-catalogue-search branch from bc93c27 to de78eae Compare September 2, 2026 15:43
@gokhanarkan
gokhanarkan changed the base branch from main to update-copilot-1.0.83-2 September 2, 2026 15:43
@gokhanarkan gokhanarkan changed the title Expose typed catalogue search bindings Preserve typed catalogue unions in SDK codegen Sep 2, 2026
Comment thread python/copilot/generated/rpc.py Fixed
@github-actions

This comment has been minimized.

@stephentoub
stephentoub force-pushed the update-copilot-1.0.83-2 branch from b2ac890 to 0cc1b2c Compare September 2, 2026 17:19
Base automatically changed from update-copilot-1.0.83-2 to main September 2, 2026 23:31
@gokhanarkan
gokhanarkan force-pushed the gokhanarkan/expose-catalogue-search branch from de78eae to c0813e4 Compare September 3, 2026 07:35
@gokhanarkan
gokhanarkan marked this pull request as ready for review September 3, 2026 07:36
@SteveSandersonMS
SteveSandersonMS marked this pull request as draft September 3, 2026 12:24
@SteveSandersonMS

Copy link
Copy Markdown
Contributor

Thanks for fixing the Java List<Object> regression; I verified that this is a real nested-union codegen issue.

The remaining blocker is broader: we should not solve this by special-casing CatalogCandidate or catalog.search in individual generators. The generator needs a general, schema-driven mechanism for nested unions and for handling unknown variants/untrusted payload fields. Otherwise the next catalogue RPC (including the planned plan/apply surfaces) can regress in the same way, and the six SDKs can diverge again.

Please rework the solution around that general mechanism, with conformance coverage across all six SDKs for known nested-union variants and unknown variants. For tracking, I've moved this to draft - please mark as ready to review when appropriate.

@gokhanarkan
gokhanarkan force-pushed the gokhanarkan/expose-catalogue-search branch from c0813e4 to 784dc1d Compare September 4, 2026 10:40
@gokhanarkan gokhanarkan changed the title Preserve typed catalogue unions in SDK codegen Preserve typed nested unions in SDK codegen Sep 4, 2026
@github-actions

This comment has been minimized.

@gokhanarkan

Copy link
Copy Markdown
Member Author

@SteveSandersonMS Addressed the blocker from your review comment at 784dc1d6102184b9a7ebe0bb317798343e48e934.

The generator now has a shared scripts/codegen/schema-unions.ts analysis that resolves variants, derives the discriminator, and sets the unknown-variant policy from schema shape alone: when every variant declares additionalProperties: false, the union is closed and unknown or missing discriminators reject. There are no CatalogCandidate, Catalog*, or catalog.search branches in generator source.

Language mapping is derived from that policy:

  • TypeScript emits reusable result-projection metadata, validates outer and nested discriminators, and drops fields outside closed variant schemas.
  • Go closed RPC union decoders fail instead of selecting raw fallback data; existing raw wrapper types remain only for source compatibility.
  • .NET emits FailSerialization, explicit unrecognised-discriminator rejection, and required discriminator metadata.
  • Python RPC dispatchers end in explicit post-match failures, removing the CodeQL fall-through.
  • Java promotes nested discriminated unions under any discriminated RPC result. This also reproducibly types the existing mcp.planInstall nested shapes, without adding planning/apply business logic.
  • Rust retains its schema-derived tagged value semantics and rejects the same invalid fixtures.

A synthetic SyntheticChoice/SyntheticSource graph proves the same analysis, TypeScript projection, and Java promotion without catalogue names. Published CLI 1.0.83-5 conformance covers known variants, refusals/failures, opaque handles, unknown and missing outer/candidate/source discriminators, and extra untrusted fields across all six SDKs.

Both generation-drift checks, all six required SDK checks, CodeQL, and the cross-SDK consistency review are green. There are zero unresolved review threads; the final diff is 46 files against current main.

@gokhanarkan
gokhanarkan marked this pull request as ready for review September 4, 2026 11:19
SteveSandersonMS
SteveSandersonMS approved these changes Sep 4, 2026
@SteveSandersonMS
SteveSandersonMS marked this pull request as draft September 4, 2026 11:53

@SteveSandersonMS SteveSandersonMS 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.

Thanks for the update. The current revision is still too broad for this PR.

To move forward, please keep this change strictly minimal and schema-driven: ensure the new logic does not modify unrelated RPC codegen output at all.

If you want to continue, please submit that narrowly scoped alternative. Otherwise, please close this PR.

For tracking, I have moved this to draft - please mark as ready to review when appropriate.

@gokhanarkan
gokhanarkan force-pushed the gokhanarkan/expose-catalogue-search branch from 784dc1d to cf2ebef Compare September 4, 2026 12:10
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@gokhanarkan
gokhanarkan force-pushed the gokhanarkan/expose-catalogue-search branch from 4aec5d5 to 6f8e817 Compare September 4, 2026 12:39
@github-actions

This comment has been minimized.

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

SDK Consistency Review — PR #2486

Scope: This PR extends the codegen pipeline (scripts/codegen/schema-unions.ts + language-specific generators) to support closed discriminated unions that reject unknown/missing type discriminators instead of silently falling back to a raw/base-type variant, and applies this to the new Catalog* (CatalogSearchResult, CatalogCandidate, CatalogCandidateSource) types.

Cross-SDK coverage checked:

SDK Generated types updated Conformance test added
Node.js/TS nodejs/src/generated/rpc.ts discriminated-union-conformance.test.ts, discriminated-union-codegen.test.ts
Python python/copilot/generated/rpc.py python/test_rpc_generated.py (new cases)
Go go/rpc/zrpc_encoding.go (+unknownVariantPolicy) go/rpc/discriminated_union_conformance_test.go
.NET dotnet/src/Generated/Rpc.cs (FailSerialization, IgnoreUnrecognizedTypeDiscriminators=false, [JsonRequired]) dotnet/test/Unit/DiscriminatedUnionConformanceTests.cs
Java java/sdk/src/generated/java/.../rpc/Catalog*.java + java.ts codegen (nested-union promotion) DiscriminatedUnionConformanceTest.java
Rust (via shared schema-unions logic, serde) discriminated_union_conformance_test.rs

All six language SDKs received matching generated types, matching runtime rejection semantics (unknown/missing discriminator → error, not silent fallback), and equivalent test coverage for the same scenarios (typed nested variants, opaque handle preservation, secret/rawCard stripping, rejection of unknown/missing discriminators at both top-level and nested-candidate levels).

Naming/API parity: Generated type names follow each language's conventions correctly (e.g. CatalogMcpServerCandidate/CatalogAiSkillCandidate in Java/.NET/TS PascalCase-ish generated names, CatalogMCPServerCandidate/CatalogAISkillCandidate in Python per its acronym convention, CatalogCandidate::McpServer/AiSkill enum variants in Rust). No divergent behavior found.

Conclusion: No cross-SDK consistency issues identified — this PR maintains full feature parity across Node.js, Python, Go, .NET, Java, and Rust, with each SDK receiving equivalent generated code and dedicated conformance tests.

Generated by SDK Consistency Review Agent for #2486 · copilot · sonnet50 · 40.5 AIC · ⌖ 12.1 AIC · ⊞ 9.7K ·

@gokhanarkan

Copy link
Copy Markdown
Member Author

@SteveSandersonMS I have applied the narrower interpretation from your changes-requested review at 3a0524e51f7566aeb273e3f2fbcc7eadc5921fba, rebased on current main 604c7166fca6a69f985570de27522fe73c3e080d.

The structural trigger is now deliberately narrow and schema-only: a closed discriminated RPC result whose variant directly owns an array of another closed discriminated union. The policy graph then includes only nested closed unions below those list elements. No generator checks a catalogue method or type name.

The exact 1.0.83-5 schema conformance gate asserts that this trigger currently selects only catalog.search and exactly CatalogSearchResult, CatalogCandidate, and CatalogCandidateSource. If a future schema causes the trigger to widen, generation fails for explicit review rather than changing unrelated output.

A neutral synthetic SyntheticResult / SyntheticChoice / SyntheticSource graph proves the general mechanism, including closed-vs-open unknown handling, nested TypeScript projection, and Java promotion without catalogue names.

I also compared every real generated artefact against main. The exact generated allowlist is:

  • dotnet/src/Generated/Rpc.cs: only strict metadata on the three selected catalogue unions (+9/-3)
  • go/rpc/zrpc_encoding.go: only the three selected catalogue unmarshallers (+3/-6); raw wrapper types remain API-compatible
  • nodejs/src/generated/rpc.ts: one schema-derived projection table/helper and only the catalog.search call site (+297/-1); mcp.planInstall and all unrelated methods remain unchanged
  • python/copilot/generated/rpc.py: only catalogue candidate/source/result classes, aliases, and loaders (+65/-181, primarily replacing quicktype-flattened catalogue classes)
  • Java: only CatalogSearchSucceeded plus the nine catalogue candidate/source/provenance/installability classes
  • Rust generated output: no changes

There are no MCP plan generated types, unrelated RPC hunks, session-event changes, or E2E adaptations. The final PR diff is 33 files, including generator/conformance sources and six-language behavioural tests.

Generation drift, Java generation drift, all six required SDK checks, CodeQL, exact package checks, and the independent minimality review pass. Conformance covers known variants, refusal/failure variants, opaque handles, unknown/missing outer and nested discriminators, and extra untrusted fields.

I have kept the PR draft and will not mark it ready while your CHANGES_REQUESTED decision remains active.

@SteveSandersonMS

Copy link
Copy Markdown
Contributor

Sorry but it doesn't look like this is working out. Even just looking at the first file in the PR dotnet/src/Generated/Rpc.cs, it clearly makes a lot of API-impacting changes like swapping JsonUnknownDerivedTypeHandling.FallBackToBaseType to JsonUnknownDerivedTypeHandling.FailSerialization and adding [JsonRequired]. Even if the PR makes some desired improvements, we can't also break other things.

If I've misunderstood some reason why these changes are 100% safe please let me know but please don't drop a lot more code changes here without first addressing this core point. I'll close to indicate to your bot that we don't want more similar iterations.

@SteveSandersonMS

Copy link
Copy Markdown
Contributor

@gokhanarkan According to Copilot, the only language where existing RPC codegen didn't handle the nested unions properly was Java. If that sounds right to you, and if you can streamline the PR down to only impact Java (and confirm it's nonbreaking, as in doesn't change the RPC output in a way that affects types other than the experimental Catalog ones), we can definitely take an objective fix like that. Hope that's OK!

@gokhanarkan

Copy link
Copy Markdown
Member Author

@gokhanarkan According to Copilot, the only language where existing RPC codegen didn't handle the nested unions properly was Java. If that sounds right to you, and if you can streamline the PR down to only impact Java (and confirm it's nonbreaking, as in doesn't change the RPC output in a way that affects types other than the experimental Catalog ones), we can definitely take an objective fix like that. Hope that's OK!

thank you @SteveSandersonMS , this works for me! I will create a separate & focused pr and tag you! tysm!

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