Eliminate parallel type algebra logic in runtime#4046
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
⏭️ Performance benchmarks were skippedPerf benchmarks (CodSpeed) are opt-in on pull requests — they no longer run on every push. They always run automatically after merge to To run them on this PR, do any of the following, then push a commit (or re-run CI):
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThe PR centralizes subtype and equivalence checks on canonical type contexts, removes legacy subtype helpers, changes generic and interface pattern lowering to invariant ChangesCanonical type algebra and fact-free solving
Invariant compiler type-test lowering
VM-backed implementation resolution
Runtime IsType and virtual dispatch
Host contract validation and boundary alignment
Estimated code review effort: 5 (Critical) | ~120 minutes Sequence Diagram(s)sequenceDiagram
participant Compiler
participant BexVM
participant ImplResolver
participant TypeContext
Compiler->>BexVM: emit invariant interface IsType template
BexVM->>TypeContext: evaluate canonical type relation
BexVM->>ImplResolver: resolve interface implementation
ImplResolver->>TypeContext: compare templates and interface arguments
TypeContext-->>ImplResolver: return equivalence or membership result
ImplResolver-->>BexVM: return implementation or proof
Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Binary size checks passed✅ 7 passed
Generated by |
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@baml_language/crates/baml_compiler2_mir/src/lower.rs`:
- Around line 12468-12470: Update the RuntimeTy::Class conversion in the
surrounding lowering method to detect interface declarations, not only keys
present in self.interface_implementors. Seed or consult interface membership
from the declaration metadata so interfaces without local implementors still
convert to RuntimeTy::Interface and undergo membership checks.
In `@baml_language/crates/bex_vm/src/package_baml/ops.rs`:
- Around line 468-478: Add a regression test covering type equality where an
implementing type is absorbed by its interface: assert that type_of<Shape |
Sq>() equals type_of<Shape>() when Sq implements Shape. Place it alongside the
existing union-order equality coverage and exercise the Object::Type comparison
path using vm.equivalent semantics.
In `@baml_language/crates/bex_vm/src/package_baml/resolve.rs`:
- Around line 190-213: Update resolve_implements_rule so non-empty iface_args
return only when rule_args are equivalent; remove the fallback assignment and
return None after all candidates fail to match. Preserve the existing behavior
for empty interface arguments.
In `@baml_language/crates/bex_vm/src/type_match.rs`:
- Around line 100-106: Add a unit test covering union absorption for
ClassWithTypeArgs in addition to the existing class_type_args_are_invariant
coverage. Exercise the widened frame-argument comparison of Shape | Sq against
Shape and assert the expected type relationship, using the existing test setup
and helpers.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: a2e8c157-c1c1-468b-bb73-84e51b9fe7ca
⛔ Files ignored due to path filters (7)
baml_language/crates/baml_tests/snapshots/baml_src/generic_match_typevar.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/baml_src/iter_impl_generics_only.core.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/__baml_std__/baml_tests__compiles____baml_std____04_5_mir.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/__baml_std__/baml_tests__compiles____baml_std____06_codegen.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__01_lexer__generic_match_typevar_arm.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__04_5_mir.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__10_formatter__generic_match_typevar_arm.snapis excluded by!**/*.snap
📒 Files selected for processing (23)
baml_language/crates/baml_compiler2_emit/src/emit.rsbaml_language/crates/baml_compiler2_mir/src/lower.rsbaml_language/crates/baml_tests/baml_src/ns_generic_match_subtype/generic_match_subtype.bamlbaml_language/crates/baml_tests/projects/compiles/generic_match_typevar_arm/generic_match_typevar_arm.bamlbaml_language/crates/baml_type/src/family.rsbaml_language/crates/baml_type/src/lib.rsbaml_language/crates/baml_type/src/normalize.rsbaml_language/crates/baml_type/src/normalize/tests.rsbaml_language/crates/baml_type/src/runtime_ty.rsbaml_language/crates/baml_type_macros/src/lib.rsbaml_language/crates/baml_type_runtime/src/lib.rsbaml_language/crates/bex_engine/src/conversion.rsbaml_language/crates/bex_engine/src/lib.rsbaml_language/crates/bex_engine/tests/host_value_callable.rsbaml_language/crates/bex_external_types/src/host_return.rsbaml_language/crates/bex_sap/src/deserializer/coercer/array_helper.rsbaml_language/crates/bex_vm/src/package_baml/mod.rsbaml_language/crates/bex_vm/src/package_baml/ops.rsbaml_language/crates/bex_vm/src/package_baml/resolve.rsbaml_language/crates/bex_vm/src/package_baml/type_class.rsbaml_language/crates/bex_vm/src/type_context.rsbaml_language/crates/bex_vm/src/type_match.rsbaml_language/crates/bex_vm/src/vm.rs
💤 Files with no reviewable changes (1)
- baml_language/crates/baml_type/src/lib.rs
4d43c04 to
bc17e15
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@baml_language/TYPE_SYSTEM_AUDIT.md`:
- Line 99: Remove audit finding 4.8 for the alleged E0139 double assignment and
remove its corresponding sequencing item in TYPE_SYSTEM_AUDIT.md. Keep the audit
consistent with diagnostic.rs, where IntegerLiteralOutOfRange uses E0150 and
ImplViolatesOrphanRule uses E0139; only update the evidence instead if the audit
is intentionally for an older revision.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 3abfbb3e-5389-4506-b8d8-43f4d6f94992
⛔ Files ignored due to path filters (7)
baml_language/crates/baml_tests/snapshots/baml_src/generic_match_typevar.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/baml_src/iter_impl_generics_only.core.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/__baml_std__/baml_tests__compiles____baml_std____04_5_mir.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/__baml_std__/baml_tests__compiles____baml_std____06_codegen.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__01_lexer__generic_match_typevar_arm.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__04_5_mir.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__10_formatter__generic_match_typevar_arm.snapis excluded by!**/*.snap
📒 Files selected for processing (24)
baml_language/TYPE_SYSTEM_AUDIT.mdbaml_language/crates/baml_compiler2_emit/src/emit.rsbaml_language/crates/baml_compiler2_mir/src/lower.rsbaml_language/crates/baml_tests/baml_src/ns_generic_match_subtype/generic_match_subtype.bamlbaml_language/crates/baml_tests/projects/compiles/generic_match_typevar_arm/generic_match_typevar_arm.bamlbaml_language/crates/baml_type/src/family.rsbaml_language/crates/baml_type/src/lib.rsbaml_language/crates/baml_type/src/normalize.rsbaml_language/crates/baml_type/src/normalize/tests.rsbaml_language/crates/baml_type/src/runtime_ty.rsbaml_language/crates/baml_type_macros/src/lib.rsbaml_language/crates/baml_type_runtime/src/lib.rsbaml_language/crates/bex_engine/src/conversion.rsbaml_language/crates/bex_engine/src/lib.rsbaml_language/crates/bex_engine/tests/host_value_callable.rsbaml_language/crates/bex_external_types/src/host_return.rsbaml_language/crates/bex_sap/src/deserializer/coercer/array_helper.rsbaml_language/crates/bex_vm/src/package_baml/mod.rsbaml_language/crates/bex_vm/src/package_baml/ops.rsbaml_language/crates/bex_vm/src/package_baml/resolve.rsbaml_language/crates/bex_vm/src/package_baml/type_class.rsbaml_language/crates/bex_vm/src/type_context.rsbaml_language/crates/bex_vm/src/type_match.rsbaml_language/crates/bex_vm/src/vm.rs
💤 Files with no reviewable changes (1)
- baml_language/crates/baml_type/src/lib.rs
🚧 Files skipped from review as they are similar to previous changes (19)
- baml_language/crates/baml_tests/projects/compiles/generic_match_typevar_arm/generic_match_typevar_arm.baml
- baml_language/crates/baml_tests/baml_src/ns_generic_match_subtype/generic_match_subtype.baml
- baml_language/crates/baml_compiler2_emit/src/emit.rs
- baml_language/crates/bex_vm/src/package_baml/type_class.rs
- baml_language/crates/bex_vm/src/package_baml/mod.rs
- baml_language/crates/baml_type/src/family.rs
- baml_language/crates/baml_type_macros/src/lib.rs
- baml_language/crates/bex_engine/tests/host_value_callable.rs
- baml_language/crates/bex_vm/src/package_baml/ops.rs
- baml_language/crates/baml_type/src/runtime_ty.rs
- baml_language/crates/bex_vm/src/type_match.rs
- baml_language/crates/baml_type/src/normalize.rs
- baml_language/crates/baml_type/src/normalize/tests.rs
- baml_language/crates/bex_engine/src/conversion.rs
- baml_language/crates/bex_vm/src/type_context.rs
- baml_language/crates/bex_vm/src/package_baml/resolve.rs
- baml_language/crates/bex_vm/src/vm.rs
- baml_language/crates/baml_compiler2_mir/src/lower.rs
- baml_language/crates/baml_type_runtime/src/lib.rs
bc17e15 to
d5bd1d1
Compare
d5bd1d1 to
8ed0178
Compare
|
Caution Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted. Error details |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
baml_language/crates/bex_vm/src/type_match.rs (1)
2-3: 📐 Maintainability & Code Quality | 🔵 Trivial
cargo test --libneeds a full native toolchain.ring v0.17.14currently fails to build without standard C headers likeassert.handstdint.h.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@baml_language/crates/bex_vm/src/type_match.rs` around lines 2 - 3, Ensure the native build prerequisites required by ring v0.17.14, including standard C headers such as assert.h and stdint.h, are installed in the environment used by cargo test --lib. Update the project’s test or CI setup rather than changing the BexVm documentation comment.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@baml_language/crates/bex_vm/src/type_match.rs`:
- Around line 2-3: Ensure the native build prerequisites required by ring
v0.17.14, including standard C headers such as assert.h and stdint.h, are
installed in the environment used by cargo test --lib. Update the project’s test
or CI setup rather than changing the BexVm documentation comment.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: a25b44d5-6b98-4501-98d2-93ec93447843
⛔ Files ignored due to path filters (7)
baml_language/crates/baml_tests/snapshots/baml_src/generic_match_typevar.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/baml_src/iter_impl_generics_only.core.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/__baml_std__/baml_tests__compiles____baml_std____04_5_mir.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/__baml_std__/baml_tests__compiles____baml_std____06_codegen.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__01_lexer__generic_match_typevar_arm.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__04_5_mir.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__10_formatter__generic_match_typevar_arm.snapis excluded by!**/*.snap
📒 Files selected for processing (24)
baml_language/crates/baml_compiler2_emit/src/emit.rsbaml_language/crates/baml_compiler2_mir/src/lower.rsbaml_language/crates/baml_tests/baml_src/ns_generic_match_subtype/generic_match_subtype.bamlbaml_language/crates/baml_tests/projects/compiles/generic_match_typevar_arm/generic_match_typevar_arm.bamlbaml_language/crates/baml_type/src/family.rsbaml_language/crates/baml_type/src/lib.rsbaml_language/crates/baml_type/src/normalize.rsbaml_language/crates/baml_type/src/normalize/tests.rsbaml_language/crates/baml_type/src/runtime_ty.rsbaml_language/crates/baml_type_macros/src/lib.rsbaml_language/crates/baml_type_runtime/src/lib.rsbaml_language/crates/bex_engine/src/conversion.rsbaml_language/crates/bex_engine/src/lib.rsbaml_language/crates/bex_engine/tests/host_value_callable.rsbaml_language/crates/bex_external_types/src/host_return.rsbaml_language/crates/bex_sap/src/deserializer/coercer/array_helper.rsbaml_language/crates/bex_vm/src/package_baml/mod.rsbaml_language/crates/bex_vm/src/package_baml/ops.rsbaml_language/crates/bex_vm/src/package_baml/resolve.rsbaml_language/crates/bex_vm/src/package_baml/type_class.rsbaml_language/crates/bex_vm/src/type_context.rsbaml_language/crates/bex_vm/src/type_match.rsbaml_language/crates/bex_vm/src/vm.rsbaml_language/crates/sys_jinja_types/src/evaluate_type/types.rs
💤 Files with no reviewable changes (1)
- baml_language/crates/baml_type/src/lib.rs
🚧 Files skipped from review as they are similar to previous changes (19)
- baml_language/crates/baml_type_macros/src/lib.rs
- baml_language/crates/baml_type/src/family.rs
- baml_language/crates/baml_tests/baml_src/ns_generic_match_subtype/generic_match_subtype.baml
- baml_language/crates/bex_vm/src/package_baml/mod.rs
- baml_language/crates/baml_tests/projects/compiles/generic_match_typevar_arm/generic_match_typevar_arm.baml
- baml_language/crates/baml_type/src/normalize/tests.rs
- baml_language/crates/bex_vm/src/package_baml/type_class.rs
- baml_language/crates/bex_sap/src/deserializer/coercer/array_helper.rs
- baml_language/crates/bex_engine/src/conversion.rs
- baml_language/crates/bex_vm/src/package_baml/ops.rs
- baml_language/crates/bex_engine/tests/host_value_callable.rs
- baml_language/crates/baml_type/src/runtime_ty.rs
- baml_language/crates/baml_type_runtime/src/lib.rs
- baml_language/crates/baml_type/src/normalize.rs
- baml_language/crates/bex_engine/src/lib.rs
- baml_language/crates/bex_vm/src/type_context.rs
- baml_language/crates/bex_vm/src/package_baml/resolve.rs
- baml_language/crates/baml_compiler2_mir/src/lower.rs
- baml_language/crates/bex_vm/src/vm.rs
8ed0178 to
2a0ddcc
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (1)
baml_language/crates/bex_engine/tests/host_value_callable.rs (1)
1053-1053: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRemove redundant explicit drop.
The explicit
drop(arc);call is redundant here sincearcwill be automatically dropped on the very next line when it goes out of scope at the end of the function. Based on learnings, we should rely onDropimplementations automatically triggering when handles go out of scope.🧹 Proposed fix
- assert_host_callable_throw(&result); - drop(arc); + assert_host_callable_throw(&result);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@baml_language/crates/bex_engine/tests/host_value_callable.rs` at line 1053, Remove the redundant explicit drop(arc) call in the surrounding test function and rely on automatic scope-based destruction when arc goes out of scope; leave the rest of the function unchanged.Source: Learnings
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@baml_language/crates/bex_engine/tests/host_value_callable.rs`:
- Line 1053: Remove the redundant explicit drop(arc) call in the surrounding
test function and rely on automatic scope-based destruction when arc goes out of
scope; leave the rest of the function unchanged.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 5ac127a0-f3fd-474a-a75e-498704243baa
⛔ Files ignored due to path filters (7)
baml_language/crates/baml_tests/snapshots/baml_src/generic_match_typevar.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/baml_src/iter_impl_generics_only.core.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/__baml_std__/baml_tests__compiles____baml_std____04_5_mir.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/__baml_std__/baml_tests__compiles____baml_std____06_codegen.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__01_lexer__generic_match_typevar_arm.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__04_5_mir.snapis excluded by!**/*.snapbaml_language/crates/baml_tests/snapshots/compiles/generic_match_typevar_arm/baml_tests__compiles__generic_match_typevar_arm__10_formatter__generic_match_typevar_arm.snapis excluded by!**/*.snap
📒 Files selected for processing (24)
baml_language/crates/baml_compiler2_emit/src/emit.rsbaml_language/crates/baml_compiler2_mir/src/lower.rsbaml_language/crates/baml_tests/baml_src/ns_generic_match_subtype/generic_match_subtype.bamlbaml_language/crates/baml_tests/projects/compiles/generic_match_typevar_arm/generic_match_typevar_arm.bamlbaml_language/crates/baml_type/src/family.rsbaml_language/crates/baml_type/src/lib.rsbaml_language/crates/baml_type/src/normalize.rsbaml_language/crates/baml_type/src/normalize/tests.rsbaml_language/crates/baml_type/src/runtime_ty.rsbaml_language/crates/baml_type_macros/src/lib.rsbaml_language/crates/baml_type_runtime/src/lib.rsbaml_language/crates/bex_engine/src/conversion.rsbaml_language/crates/bex_engine/src/lib.rsbaml_language/crates/bex_engine/tests/host_value_callable.rsbaml_language/crates/bex_external_types/src/host_return.rsbaml_language/crates/bex_sap/src/deserializer/coercer/array_helper.rsbaml_language/crates/bex_vm/src/package_baml/mod.rsbaml_language/crates/bex_vm/src/package_baml/ops.rsbaml_language/crates/bex_vm/src/package_baml/resolve.rsbaml_language/crates/bex_vm/src/package_baml/type_class.rsbaml_language/crates/bex_vm/src/type_context.rsbaml_language/crates/bex_vm/src/type_match.rsbaml_language/crates/bex_vm/src/vm.rsbaml_language/crates/sys_jinja_types/src/evaluate_type/types.rs
💤 Files with no reviewable changes (1)
- baml_language/crates/baml_type/src/lib.rs
🚧 Files skipped from review as they are similar to previous changes (18)
- baml_language/crates/baml_tests/projects/compiles/generic_match_typevar_arm/generic_match_typevar_arm.baml
- baml_language/crates/baml_type_macros/src/lib.rs
- baml_language/crates/bex_vm/src/package_baml/mod.rs
- baml_language/crates/baml_type/src/family.rs
- baml_language/crates/bex_vm/src/package_baml/type_class.rs
- baml_language/crates/sys_jinja_types/src/evaluate_type/types.rs
- baml_language/crates/baml_type/src/normalize.rs
- baml_language/crates/baml_type/src/normalize/tests.rs
- baml_language/crates/baml_type/src/runtime_ty.rs
- baml_language/crates/bex_engine/src/conversion.rs
- baml_language/crates/baml_type_runtime/src/lib.rs
- baml_language/crates/bex_vm/src/type_match.rs
- baml_language/crates/bex_engine/src/lib.rs
- baml_language/crates/baml_compiler2_emit/src/emit.rs
- baml_language/crates/bex_vm/src/type_context.rs
- baml_language/crates/bex_vm/src/package_baml/resolve.rs
- baml_language/crates/baml_compiler2_mir/src/lower.rs
- baml_language/crates/bex_vm/src/vm.rs
2a0ddcc to
11ddc43
Compare
We now just use `BexVm` directly
It was a "fix" that introduced covariance via type erasure to address a case caused by lack of type normalization. Now that we have type normalization via the canonical type algebra we can move towards eliminating it.
This comment has been minimized.
This comment has been minimized.
- `StructuralEquivCtx` is the coarse-nominal context (coarse to handle cycles, we need a co/inductive solver to fully resolve) - `ImplResolver` unifies free functions to cleanly thread the VM-references through
2956484 to
2ca1100
Compare
Instead of enumerating "all" implementors
2ca1100 to
d0f3f6c
Compare
Not the qualified path: `greet`, `bump`, `println`. Also adapts the reflect native to canary's runtime type-algebra rework (#4046), where the VM itself is the `TypeContext` and `RuntimeTypeContext` is gone.
The
baml_typealgebra is the only canonical type algebra and all parallel implementations in the runtime have now been eliminated (there are some other type algebra implementations that intentionally are different like SAP's attribute-aware normalization but that is separate)Summary by CodeRabbit
Bug Fixes
matchruntime type testing and dispatch-guard selection to use invariant canonical type-argument equality (e.g.,Opt<T>patterns).ischecks so interface-based throws-contract validation behaves correctly (catchable interface values instead of contract panics).Tests