Skip to content

Follow up on the reflection stack reviews - #5297

Merged
antoniosarosi merged 9 commits into
canaryfrom
antoniosarosi/reflect-review-fixes
Oct 17, 2026
Merged

antoniosarosi merged 9 commits into
canaryfrom
antoniosarosi/reflect-review-fixes

Conversation

@antoniosarosi

@antoniosarosi antoniosarosi commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Fixes the open review items from the reflection stack (#5283), one commit per item.

  • A user's own reflect.TypeView works everywhere a TypeView is accepted (Accept reflect kind views anywhere a type is #5277). The natives only unwrapped the nine built-in kind views. Every entry point that takes a TypeView now calls as_type() in BAML before it reaches the native, and lowering does the same for a let type operand.

    class IntView {
        implements reflect.TypeView {
            function as_type(self) -> reflect.Type throws never { int.type() }
        }
    }
    
    reflect.Class.new("Row", { "n": IntView {} })
    // before: throws "class fields must be type values or reflect.WithMeta<reflect.Type> rows"
    // after:  a class with `n: int`
    
    let type T = IntView {};
    // before: VM internal error: type error: expected type, got instance
    // after:  T is int
  • TYPE_SYSTEM.md (Replace type T = unreflect(e) with let type T = e, with a bounded form #5278, Add a static type() method to every type #5272). "Scoped runtime type bindings" documents let type, including the bounded form, as proposed on Replace type T = unreflect(e) with let type T = e, with a bounded form #5278 with its correction. A new subsection documents type() on baml.Concrete.

  • reflect natives throw reflect.errors.InvalidArgument, never baml.errors.InvalidArgument (Add a static type() method to every type #5272). This covers an uninitialized reflect.Package or reflect.Session, a bad compile artifact and a failed runtime link. No throws clause changes.

    reflect.Package { _inner: 1 }.get_class("Foo")
    // before: throws baml.errors.InvalidArgument
    // after:  throws reflect.errors.InvalidArgument
  • A bounded let type needs an else block (Replace type T = unreflect(e) with let type T = e, with a bounded form #5278). Its bounds are checked when it runs, so it has to say what a miss does. A miss always runs the else block now; it never throws. The BOUND_MISMATCH instruction is gone, so FORMAT_VERSION goes to 20.

    let type U extends Named = t;
    // before: throws reflect.errors.TypeMismatch if the type does not implement Named
    // after:  error E0111: `let type U extends …` checks its bounds when it runs,
    //         so it needs an `else` block for a type that misses them
    
    let type U extends Named = t else { return null };  // unchanged
  • let type no longer takes a class builder's pending type (Replace type T = unreflect(e) with let type T = e, with a bounded form #5278). It threw CompilationError at run time when the builder was not built yet. Call build() and bind the class.

    let builder = reflect.Class.builder("Node");
    let type T = builder.type();
    // before: throws reflect.errors.CompilationError until builder.build() has run
    // after:  error E0001: `let type` cannot bind a class builder's pending type;
    //         call `build()` and bind the class it returns
    
    let type T = builder.build();  // ok

Summary by CodeRabbit

  • New Features
    • Reflection APIs now accept caller-defined type views across class, union, map, package, builder, and interface-checking operations.
    • Runtime type bindings can use types provided by those views. The baml.Concrete interface also provides a static type() member for eligible receivers.
  • Breaking Changes
    • Bounded let type bindings now require a diverging else branch, which runs when a type fails its bounds.
    • Class-builder pending types can no longer be bound directly; call build() first. The previous static alias form and unreflect syntax now produce an error.
  • Bug Fixes
    • Invalid reflection receivers now report reflect.errors.InvalidArgument consistently.

A class of the caller's own that implements reflect.TypeView reached the
natives unchanged, and they only unwrap the nine built-in kind views:
reflect.Class.new threw "class fields must be type values or
reflect.WithMeta<reflect.Type> rows", Union.new and Map.new hit an
unreachable!, and implements() answered false.

Every public entry point that takes a TypeView is now a BAML wrapper that
calls as_type() on it, so interface dispatch runs the user's own
implementation, and hands plain type values to a private native:
Class.new, Class.extends, Union.new, Map.new, class.Builder.field,
class.PendingType.union, Package.with_types, and Type.implements /
implemented_by (TypeView's defaults already delegate to these). Public
signatures and throws clauses are unchanged. The natives no longer unwrap
views themselves.

The field-row wrappers (Class.new, Class.extends, Builder.field) test a row
against TypeView, which reads a WithMeta row's class type arguments.
Rows allocated natively (Type.meta, PendingType.meta, builder rows) had
none, which trips the VM's instance invariant; they now carry
reflect.Type or reflect.class.PendingType like any generic instance.

The stdlib guard test runs every new wrapper, since they loop over lists
and map keys inside reflect.
let type T = e accepts any reflect.TypeView, but the VM's type-operand
boundary only unwraps reflect.Type, the nine kind views and a builder's
pending type. A class of the user's own that implements TypeView
type-checked and then failed with "VM internal error: type error:
expected type, got instance".

Lowering now dispatches TypeView.as_type() on the operand when its static
type holds anything else: a user class, the TypeView interface, a type
parameter bounded by it, or a union with one of those. reflect.Type, the
kind views and a pending type keep the existing path. The checker admits
a pending type only on its own, so an operand that gets the call always
holds a TypeView.
The docs on reflect.Type.implements said an interface operand always pins
its associated types and that there is no way to ask "is this any
iterator". That holds only for an interface built with
reflect.Type.of<I<...>>(), which names every associated type (defaults
filled in). One looked up by name (Package.get_interface, find_interface,
interfaces) names none, and the runtime treats an empty request as open,
so it matches any implementation, at any type arguments. Standard-library
interfaces cannot be looked up by name, so for those the associated types
must be named.

The docs on Type.implements, the TypeView defaults and get_interface now
say so, and tests pin both forms in both directions, including a
defaulted associated type and a generic interface.
"Scoped runtime type bindings" still documented the removed
`type T = unreflect(e)` statement, E0168 for unreflect elsewhere, and the
bounded form as future work. It now documents `let type T = e`, the
bounded `let type T extends I = e` with its optional diverging `else`,
the runtime bound check (a bound, not an interface type), and E0098 for
the removed spellings, as proposed on #5278 with its correction. A
TypeView operand binds the type its as_type() returns.

A new subsection documents the static type() that baml.Concrete gives
every concrete type, with its two lookup rules, rewritten from the #5272
proposal for the final design: type() lives on baml.Concrete and returns
reflect.Type.of<Self>(); there is no reflect.Reflectable.
reflect does not depend on baml, but several of its natives still threw
baml.errors.InvalidArgument: an uninitialized reflect.Package receiver
(get_class and the other lookups, with_types, tests, Session.new's
packages), a bad or consumed compile artifact and a dependency mismatch in
Package._finish and Session._finish, a failed runtime link, and an
uninitialized reflect.Session in Session.eval's compile step. They all
throw reflect.errors.InvalidArgument now, with the same messages; no
throws clause changes.

The heap-only helpers return a message and the native allocates the
error. graft.rs gets its own LinkError, which the loading native throws.
@vercel

vercel Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
developer-docs Ready Ready Preview Oct 17, 2026 12:34am UTC

Request Review

@github-actions

Copy link
Copy Markdown

⏭️ Performance benchmarks were skipped

Perf benchmarks (CodSpeed) are opt-in on pull requests — they no longer run on every push. They always run automatically after merge to canary/main.

To run them on this PR, do any of the following, then push a commit (or re-run CI):

  • Add RUN_CODSPEED=1 to the PR description, or
  • Include run-perf or /perf in the PR title or any commit message.

@coderabbitai

coderabbitai Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: f2d44461-969e-4f80-a590-e3698d29203e
📥 Commits

Reviewing files that changed from the base of the PR and between dbb0293 and 83f1d48.

⛔ Files ignored due to path filters: 7
  • baml_language/crates/baml_cli/src/snapshots/baml_cli__describe_command_tests__render_keyword_type.snap is excluded by !**/*.snap
  • baml_language/crates/baml_cli/src/snapshots/baml_cli__describe_command_tests__render_reflect_package_listing.snap is excluded by !**/*.snap
  • baml_language/crates/baml_tests/snapshots/compiler2_mir/baml_tests__compiler2_mir__bounded_type_binding_checks_its_bounds_after_binding_the_slot.snap is excluded by !**/*.snap
  • baml_language/crates/baml_tests/snapshots/diagnostic_errors/scoped_type_binding_forms/baml_tests__diagnostic_errors__scoped_type_binding_forms__03_hir.snap is excluded by !**/*.snap
  • baml_language/crates/baml_tests/snapshots/diagnostic_errors/scoped_type_binding_forms/baml_tests__diagnostic_errors__scoped_type_binding_forms__05_diagnostics.snap is excluded by !**/*.snap
  • baml_language/crates/baml_tests/snapshots/diagnostic_errors/scoped_type_binding_forms/baml_tests__diagnostic_errors__scoped_type_binding_forms__10_formatter__scoped_type_binding_forms.snap is excluded by !**/*.snap
  • baml_language/crates/baml_tests/snapshots/diagnostic_errors/scoped_type_is_rigid/baml_tests__diagnostic_errors__scoped_type_is_rigid__10_formatter__scoped_type_is_rigid.snap is excluded by !**/*.snap
📒 Files selected for processing: 34
  • baml_language/TYPE_SYSTEM.md
  • baml_language/crates/baml_artifact/src/lib.rs
  • baml_language/crates/baml_builtins2/baml_std/reflect/reflect.baml
  • baml_language/crates/baml_builtins2/baml_std/reflect/type.baml
  • baml_language/crates/baml_builtins2/keyword_docs/baml_keywords.yaml
  • baml_language/crates/baml_compiler2_ast/src/ast.rs
  • baml_language/crates/baml_compiler2_emit/src/emit.rs
  • baml_language/crates/baml_compiler2_emit/src/pull_semantics.rs
  • baml_language/crates/baml_compiler2_emit/src/stack_carry.rs
  • baml_language/crates/baml_compiler2_hir_ty/src/diagnostics.rs
  • baml_language/crates/baml_compiler2_hir_ty/src/infer.rs
  • baml_language/crates/baml_compiler2_mir/src/ir.rs
  • baml_language/crates/baml_compiler2_mir/src/lower.rs
  • baml_language/crates/baml_compiler2_mir/src/memory.rs
  • baml_language/crates/baml_compiler2_mir/src/optimize.rs
  • baml_language/crates/baml_compiler2_mir/src/pretty.rs
  • baml_language/crates/baml_compiler_diagnostics/src/runtime_type.rs
  • baml_language/crates/baml_db/src/check.rs
  • baml_language/crates/baml_ide/src/info.rs
  • baml_language/crates/baml_ide/src/tokens.rs
  • baml_language/crates/baml_tests/baml_src/ns_kind_views_as_types/user_type_views.baml
  • baml_language/crates/baml_tests/baml_src/ns_let_type_bounds/let_type_bounds.baml
  • baml_language/crates/baml_tests/baml_src/ns_runtime_builders_phase1/ns_frozen_mutation_and_pending_let_type/frozen_mutation_and_pending_let_type.baml
  • baml_language/crates/baml_tests/projects/diagnostic_errors/scoped_type_binding_forms/scoped_type_binding_forms.baml
  • baml_language/crates/baml_tests/projects/diagnostic_errors/scoped_type_is_rigid/scoped_type_is_rigid.baml
  • baml_language/crates/baml_tests/src/compiler2_mir/mod.rs
  • baml_language/crates/bex_project/src/runtime_compile.rs
  • baml_language/crates/bex_vm/src/debug.rs
  • baml_language/crates/bex_vm/src/lang_items.rs
  • baml_language/crates/bex_vm/src/package_reflect/runtime_class_builder.rs
  • baml_language/crates/bex_vm/src/package_reflect/type_class.rs
  • baml_language/crates/bex_vm/src/vm.rs
  • baml_language/crates/bex_vm_types/src/bytecode.rs
  • baml_language/crates/bex_vm_types/src/relink.rs
💤 Files with no reviewable changes: 7
  • baml_language/crates/baml_compiler2_emit/src/stack_carry.rs
  • baml_language/crates/bex_vm/src/lang_items.rs
  • baml_language/crates/baml_compiler2_emit/src/pull_semantics.rs
  • baml_language/crates/baml_compiler2_mir/src/pretty.rs
  • baml_language/crates/bex_vm_types/src/relink.rs
  • baml_language/crates/baml_compiler2_emit/src/emit.rs
  • baml_language/crates/bex_vm/src/package_reflect/runtime_class_builder.rs
🚧 Files skipped from review as they are similar to previous changes: 1
  • baml_language/crates/bex_vm/src/package_reflect/type_class.rs

Included review availability: This review used your included allowance. Your plan provides up to 8 included reviews per hour; 7 remain after this review.

📝 Walkthrough

Scoped let type bindings now accept reflect.Type or reflect.TypeView values, and bounded bindings require a diverging else branch. Reflection APIs convert TypeView inputs before native calls. Package and session reflection errors use reflect.errors.InvalidArgument.

Changes: Runtime Type Binding

Layer / File(s) Summary
Scoped binding and bound-miss flow
baml_language/TYPE_SYSTEM.md, baml_language/crates/baml_compiler2_*/*, baml_language/crates/baml_compiler_diagnostics/*, baml_language/crates/bex_vm*/*, baml_language/crates/bex_project/runtime_compile.rs, baml_language/crates/baml_tests/*, baml_language/crates/baml_ide/src/*, baml_language/crates/baml_artifact/src/lib.rs
Bounded let type bindings now require an else branch that diverges on a failed bound check. The compiler converts TypeView operands, rejects pending builder types with a diagnostic, and removes BoundMismatch from MIR and bytecode. Tests and runtime binding replay are updated for the new form.

Reflection TypeView APIs

Layer / File(s) Summary
TypeView conversion in reflection APIs
baml_language/crates/baml_builtins2/baml_std/reflect/*, baml_language/crates/bex_vm/src/package_reflect/*, baml_language/crates/baml_tests/baml_src/ns_kind_views_as_types/*, baml_language/crates/baml_tests/tests/reflect_without_baml_dependency.rs
Reflection wrappers convert TypeView arguments for class, union, map, builder, package, and type-binding operations. Tests cover user-defined views and the resulting reflected types.
Interface implementation checks
baml_language/crates/baml_builtins2/baml_std/reflect/type.baml, baml_language/crates/bex_vm/src/package_reflect/type_class.rs, baml_language/crates/baml_tests/baml_src/ns_kind_views_as_types/user_type_views.baml
The implements and implemented_by wrappers convert TypeView arguments and delegate to the shared native _implements method. Tests cover views as receivers and arguments.

Package and Session Error Handling

Layer / File(s) Summary
Package and session error handling
baml_language/crates/bex_engine/src/lib.rs, baml_language/crates/bex_vm/src/package_reflect/*, baml_language/crates/baml_builtins2/baml_std/reflect/ns_errors/errors.baml, baml_language/crates/baml_tests/baml_src/ns_reflect_lookups/reflect_lookups.baml, baml_language/crates/baml_tests/baml_src/ns_runtime_session_phase1/*, baml_language/crates/baml_tests/tests/runtime_session.rs
Package and session receiver validation and artifact or graft failures now map to reflect.errors.InvalidArgument at native boundaries. Read-only lookup methods retain their non-throwing behavior for invalid receivers. Tests check uninitialized receivers and updated error handling.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~60 minutes

Change: Bug fix

Sequence Diagram(s)

sequenceDiagram
  participant Compiler
  participant BexVm
  participant ElseBranch
  Compiler->>BexVm: Emit and execute SatisfiesBound check
  BexVm-->>Compiler: Return bound-check result
  alt bound satisfied
    Compiler->>BexVm: Bind the runtime type
  else bound missed
    Compiler->>ElseBranch: Evaluate required diverging else branch
  end
Loading

Possibly related PRs

  • BoundaryML/baml#3933: The PR updates runtime interface checks that use the implementation-rule matching behavior changed there.
  • BoundaryML/baml#4325: The PR extends the TypeView contract and reflection APIs introduced there.
Merge Risk: ⚪ Minimal · up to 83f1d

The change makes bounded type bindings route misses to a required else block and converts TypeView inputs in reflection APIs. No actionable merge-blocking issue was found.

Security architecture risk: 🔵 Low · up to 83f1d

The inspected changes preserve type checks, builder mutation guards, and compatibility rejection. No new privilege escalation or boundary bypass was established. Some affected execution paths remain partially verified, so the assessment does not establish complete security coverage.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The demonstrated exposure is language-level caller-controlled type operands and compiled-program consumers. Custom as_type code now executes before scoped binding reaches its native representation boundary; this does not itself establish new host authority.

Trust Boundaries and Controls

  • observed — Reflection package receivers must still contain an Object::Package, and supplied dependencies must retain their compilation-pinned object identities. Changing the error namespace does not remove these inspected checks.

Resilience and Maintainability Implications

  • observed — Scoped compiler metadata is truncated on normal block completion. On a lowering error, function-body lowering propagates failure before building the MIR result, and its owning function discards the local lowering context; the inspected path does not reuse partially mutated compiler state.
Pre-merge checks: Passed 4 · Inconclusive 1

Failed Failed checks: 1 inconclusive

Check name Status Explanation Resolution
Docstring Coverage Inconclusive Docstring coverage is 54.13% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 109 functions across 22 files. (12 skippe… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title accurately relates to the pull request, which addresses review items from the reflection stack work. It is broad and does not identify the main changes, but it remains clear and relevant.
Full details: Docstring Coverage

Explanation

Docstring coverage is 54.13% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 109 functions across 22 files. (12 skipped: 9 unsupported, 3 too large.)

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

✨ Finishing Touches: 💡 1
📝 Generate docstrings: 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

A rabbit checks a type by moonlit fern,
Then lets each bound its turn to learn.
If one says no, the else-path springs,
While views become the types they bring.
The rabbit hops past mismatch things.

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Binary size checks failed

❌ 2 violations · ✅ 1 passed

⚠️ Please fix the size gate issues or acknowledge them by updating baselines.

Artifact Platform File Gzip Gated on Baseline Delta Status
✅ baml-cli Linux 🔒 61.7 MB 26.3 MB file 73.1 MB -11.4 MB (-15.5%) OK
❌ packed-program Linux 🔒 39.9 MB 16.3 MB file 29.2 MB +10.8 MB (+36.9%) FAIL
❌ bridge_wasm WASM 26.1 MB 🔒 7.7 MB gzip 5.7 MB +2.0 MB (+35.4%) FAIL

🔒 = the size this artifact is GATED on (ceiling + delta). Binaries gate on file size (installed binary); WASM gates on gzip (download size). The other size is shown for information only.

Details & how to fix

Violations:

  • packed-program (Linux) file_bytes: 39.9 MB exceeds limit of 30.1 MB (exceeded by +9.8 MB, policy: max_file_bytes)
  • packed-program (Linux) file_delta_pct: +36.9% exceeds limit of 3.0% (exceeded by +33.9pp, policy: max_delta_pct)
  • bridge_wasm (WASM) gzip_bytes: 7.7 MB exceeds limit of 5.9 MB (exceeded by +1.8 MB, policy: max_gzip_bytes)
  • bridge_wasm (WASM) gzip_delta_pct: +35.4% exceeds limit of 3.0% (exceeded by +32.4pp, policy: max_delta_pct)

Add/update baselines:

.ci/size-gate/wasm32-unknown-unknown.toml:

[artifacts.bridge_wasm]
file_bytes = 26133693
gzip_bytes = 7664554

.ci/size-gate/x86_64-unknown-linux-gnu.toml:

[artifacts.packed-program]
file_bytes = 39920296
gzip_bytes = 16258025

Generated by cargo size-gate · workflow run

Comment thread baml_language/TYPE_SYSTEM.md Outdated
type S = Wrapper<int>; // a static right-hand side fills the slot with its realized template
let type T = e; // `e: reflect.Type | reflect.TypeView`, evaluated once when the statement runs
// (a builder's pending type is accepted too, once the builder is built)
let type U extends I & J = e; // bounded: each bound is checked when the statement runs

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.

we shouldn't allow fallible checks without an else

@2kai2kai2

Copy link
Copy Markdown
Contributor

The .get_interface("Source") workaround sounds like it is itself a bug. You shouldn't be able to get a version of the interface existential type without all associated types pinned.

@2kai2kai2

Copy link
Copy Markdown
Contributor

I'm curious if this bug also applies with generics?

This reverts commit 7f6dee7. An interface from Package.get_interface
leaves its associated types blank, which no interface type written in code
can do: the compiler rejects `Source` without `Item`. The runtime accepts it
only because bounds and interface types share one representation, a flaw to
be fixed separately, so the docs should not promise it and tests should not
pin it.

Type.implements, implemented_by and the TypeView defaults again say that an
interface operand pins its associated types and only an exact
implementation matches; the get_interface note and the new tests are gone.
The describe snapshot is regenerated.
`let type U extends I & J = e;` checked its bounds when it ran and threw
reflect.errors.TypeMismatch on a miss, a runtime failure the statement did
not say how to handle. A bounded let type must now have an else block, and
a type that misses a bound runs it:

    let type U extends I & J = e;                // error E0111
    let type V extends I = e else { return x };  // unchanged

The checker reports E0111, the code of a refutable `let` pattern, on the
statement: "`let type U extends …` checks its bounds when it runs, so it
needs an `else` block for a type that misses them". The statement no longer
adds reflect.errors.TypeMismatch to an inferred throws set, and lowering
sends every bound miss to the else block.

Nothing else used the BOUND_MISMATCH instruction or the VM's TypeMismatch
error builder, so both are gone. The instruction was the last one, so no
other discriminant moves; FORMAT_VERSION goes to 20. A session re-binds an
earlier bounded binding with an else block that panics, since that step
already checked the bounds.

Tests that relied on the throw now check the else path; the diagnostics
project covers the missing else, and a session test covers it in eval.
TYPE_SYSTEM.md and the `type` keyword docs say the else block is required.
`let type T = builder.type();` compiled and, if the builder was not built
yet, threw CompilationError when the statement ran. A plain let type has no
else block, so it should never fail at run time. The operand must now be a
reflect.Type or a reflect.TypeView; a reflect.class.PendingType is an E0001
compile error: "`let type` cannot bind a class builder's pending type; call
`build()` and bind the class it returns".

PendingType does not implement reflect.TypeView, so the user-view as_type()
path cannot reach it either. With the operand checked statically, nothing
hands the VM's type-operand boundary a pending type: call type arguments
come from LoadType and bound checks read the bound slot. The pending branch
in type_operand_value and its helpers in runtime_class_builder are gone,
and MIR no longer counts a pending type among the operands the VM unwraps.

The runtime builder test that bound an unbuilt pending type now checks the
compile error through a session; the diagnostics project covers it too.
TYPE_SYSTEM.md and the `type` keyword docs say what the operand may be.
@antoniosarosi
antoniosarosi added this pull request to the merge queue Oct 17, 2026
Merged via the queue into canary with commit 8afeb7e Oct 17, 2026
96 checks passed
@antoniosarosi
antoniosarosi deleted the antoniosarosi/reflect-review-fixes branch October 17, 2026 01:09

This branch was successfully deployed

1 active deployment
Preview – developer-docs — 83f1d482 Deployed Oct 17, 2026 by vercel[bot]
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.

2 participants