Skip to content

feat(runtime): make connection pooling configurable - #3975

Merged
sxlijin merged 4 commits into
BoundaryML:canaryfrom
dexhunter:feat/opt-in-connection-pooling
Aug 14, 2026
Merged

feat(runtime): make connection pooling configurable#3975
sxlijin merged 4 commits into
BoundaryML:canaryfrom
dexhunter:feat/opt-in-connection-pooling

Conversation

@dexhunter

@dexhunter dexhunter commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Issue Reference

Changes

Adds an explicit http.enable_connection_pooling option for regular HTTP-backed clients.

client<llm> MyClient {
  provider openai
  options {
    model "gpt-4o"
    http {
      enable_connection_pooling true
    }
  }
}
  • Pooling remains disabled when the option is omitted or set to false, preserving the current fork-safe default.
  • AWS clients reject the option because their SDK-managed transport cannot use this runtime setting.
  • Documentation covers asyncio/thread/spawn use, the fork() caveat, and unsupported client types.

In a deterministic local HTTP/1.1 harness, ten sequential requests produced:

Configuration New TCP connections
Default / false 10
true 1

This is a 90% reduction in new connections for repeated calls while leaving existing behavior unchanged by default.

Testing

  • Unit tests added/updated
  • Manual testing performed
  • Tested with deterministic local HTTP/1.1 connection counting

Validation performed:

  • cargo test -p internal-llm-client
  • cargo test -p baml-runtime
  • HTTP configuration validation fixtures, including invalid type and AWS rejection
  • package formatting and Clippy checks
  • pooling connection-count test repeated 20 times
  • strict metric harness repeated three times, each reporting one new connection for ten requests

The metric harness also verifies response payloads, streaming, retries, cancellation, concurrency, forced connection close, recovery, and a fresh forked child process.

Screenshots

Not applicable.

PR Checklist

  • I have read and followed the contributing guidelines
  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code where the behavior is not self-explanatory
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings

Additional Notes

Applications using Python's fork() start method should create the BAML runtime in each child process instead of inheriting a pooled client from the parent. The new option is disabled by default for this reason.

Summary by CodeRabbit

  • New Features

    • Added optional HTTP connection pooling for supported BAML clients via http.enable_connection_pooling.
    • Pooling is disabled by default and can reduce repeated TCP/TLS handshakes.
    • Pooling is unavailable for fallback, round-robin, composite, and AWS Bedrock clients.
  • Documentation

    • Added guidance on connection reuse, limitations, and process-fork compatibility.
  • Bug Fixes / Validation

    • Improved diagnostics for invalid pooling values and unsupported HTTP configuration fields.
  • Tests

    • Added validation and runtime coverage for pooling behavior and connection reuse.

@vercel

vercel Bot commented Jul 10, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
promptfiddle Skipped Skipped Jul 10, 2026 11:22pm

Request Review

@vercel
vercel Bot temporarily deployed to Preview – promptfiddle July 10, 2026 21:02 Inactive
@vercel

vercel Bot commented Jul 10, 2026

Copy link
Copy Markdown

@dexhunter is attempting to deploy a commit to the Boundary Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 75026417-b027-4bb6-9cf4-e8516cbf85e6

📥 Commits

Reviewing files that changed from the base of the PR and between b16ff8d and 7ca85fc.

📒 Files selected for processing (1)
  • fern/03-reference/baml/clients/connection-pooling.mdx
🚧 Files skipped from review as they are similar to previous changes (1)
  • fern/03-reference/baml/clients/connection-pooling.mdx

📝 Walkthrough

Walkthrough

Adds opt-in HTTP connection pooling for supported BAML clients. Provider-aware validation rejects unsupported providers and invalid types. Runtime tests verify connection reuse. Documentation describes configuration, defaults, and limitations.

Changes

HTTP Connection Pooling

Layer / File(s) Summary
Pooling configuration and validation
engine/baml-lib/llm-client/src/clients/helpers.rs, engine/baml-lib/baml/tests/validation_files/client/*
Adds enable_connection_pooling, validates its boolean type and provider support, improves HTTP-field diagnostics, and updates validation fixtures.
Runtime pooling behavior and tests
engine/baml-runtime/src/request/mod.rs
Disables reqwest pooling only when configured and tests connection counts for enabled and disabled pooling.
Connection pooling documentation
fern/03-reference/baml/clients/connection-pooling.mdx, fern/docs.yml
Documents defaults, configuration, fork-related constraints, unsupported clients, and navigation.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Merge Risk: ⚪ Minimal · up to 7ca85

This change makes HTTP connection pooling opt-in while preserving existing behavior by default; no actionable merge-blocking risk remains after normal checks and review.

Sequence Diagram(s)

sequenceDiagram
  participant BAMLClient
  participant create_http_client
  participant ReqwestTCPServer
  BAMLClient->>create_http_client: Configure enable_connection_pooling
  create_http_client->>ReqwestTCPServer: Send three requests
  ReqwestTCPServer-->>create_http_client: Return HTTP responses
  create_http_client-->>BAMLClient: Reuse one connection or open three connections
Loading

Poem

A rabbit sets the pooling key,
Three requests hop across the sea.
One link stays warm when pooling’s on,
Three links appear when it is gone.
The docs record each supported way.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the primary change: making runtime HTTP connection pooling configurable.
Linked Issues check ✅ Passed The PR implements configurable pooling, keeps it disabled by default, supports explicit opt-in, and rejects AWS clients as required by [#3072].
Out of Scope Changes check ✅ Passed The code, tests, and documentation changes directly support configurable HTTP connection pooling and its AWS client restrictions.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

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

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🧹 Nitpick comments (1)
fern/03-reference/baml/clients/connection-pooling.mdx (1)

34-36: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add links to related documentation pages.

The coding guidelines state that documentation should include well-designed links to guide readers to relevant pages. This page mentions fallback, round-robin, and AWS Bedrock clients but does not link to their respective documentation pages.

🔗 Suggested links
-Connection pooling is not available for fallback or round-robin clients. Set it
-on their leaf clients instead. It is also not available for AWS Bedrock clients,
-whose HTTP transport is managed by the AWS SDK.
+Connection pooling is not available for [fallback](/reference/baml/clients/strategy/fallback) or
+[round-robin](/reference/baml/clients/strategy/round-robin) clients. Set it on their leaf
+clients instead. It is also not available for [AWS Bedrock](/reference/baml/clients/providers/aws-bedrock)
+clients, whose HTTP transport is managed by the AWS SDK.
🤖 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 `@fern/03-reference/baml/clients/connection-pooling.mdx` around lines 34 - 36,
Add inline links to the documentation pages for fallback clients, round-robin
clients, and AWS Bedrock clients in the connection-pooling limitation paragraph.
Preserve the existing wording while linking each referenced client type to its
corresponding documentation page.

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.

Inline comments:
In `@fern/03-reference/baml/clients/connection-pooling.mdx`:
- Around line 1-3: Add the required subtitle field to the frontmatter of the
“Connection Pooling” document, preserving the existing title and matching the
specified frontmatter format used by other fern/**/*.mdx files.

---

Nitpick comments:
In `@fern/03-reference/baml/clients/connection-pooling.mdx`:
- Around line 34-36: Add inline links to the documentation pages for fallback
clients, round-robin clients, and AWS Bedrock clients in the connection-pooling
limitation paragraph. Preserve the existing wording while linking each
referenced client type to its corresponding documentation page.
🪄 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: e4f337d3-f5ba-4fe0-853d-918adcd9d41b

📥 Commits

Reviewing files that changed from the base of the PR and between 8349784 and b6265f2.

📒 Files selected for processing (8)
  • engine/baml-lib/baml/tests/validation_files/client/http_config_aws_pooling.baml
  • engine/baml-lib/baml/tests/validation_files/client/http_config_invalid_pooling.baml
  • engine/baml-lib/baml/tests/validation_files/client/http_config_regular_with_total.baml
  • engine/baml-lib/baml/tests/validation_files/client/http_config_valid.baml
  • engine/baml-lib/llm-client/src/clients/helpers.rs
  • engine/baml-runtime/src/request/mod.rs
  • fern/03-reference/baml/clients/connection-pooling.mdx
  • fern/docs.yml

Comment thread fern/03-reference/baml/clients/connection-pooling.mdx
@dexhunter
dexhunter had a problem deploying to boundary-tools-dev July 10, 2026 21:40 — with GitHub Actions Failure
@dexhunter
dexhunter had a problem deploying to boundary-tools-dev July 10, 2026 21:40 — with GitHub Actions Failure
@dexhunter
dexhunter had a problem deploying to boundary-tools-dev July 10, 2026 21:40 — with GitHub Actions Failure
@aaronvg

aaronvg commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

are you using AWS provider with baml?

@dexhunter
dexhunter force-pushed the feat/opt-in-connection-pooling branch from b6265f2 to 7c4a2fd Compare July 10, 2026 23:22
@vercel
vercel Bot temporarily deployed to Preview – promptfiddle July 10, 2026 23:22 Inactive
@dexhunter

Copy link
Copy Markdown
Contributor Author

No, I am not using AWS Bedrock for this path. The target is the regular HTTP-based providers. I kept AWS explicitly unsupported because its HTTP transport is owned by the AWS SDK, so exposing this reqwest pooling option there would be misleading. The motivation is #3072 plus the reproduced connection-count result: 10 requests use 10 connections by default and 1 connection when pooling is explicitly enabled. I have also rebased onto current canary and addressed the documentation review.

@dexhunter

Copy link
Copy Markdown
Contributor Author

One status note, because the red ✗ on this PR are misleading rather than informative.

The two failing checks are Vercel deploy statuses, and both read "Authorization required to deploy" — a fork can't deploy to the Boundary team. The four checks that would actually tell you something (CI - BAML Language, BAML Runtime, Test Rust SDK Cross-Platform, Test Go Client Windows Support) are all sitting in action_required, so they have never run on this branch. They can be authorized whenever it suits you; if anything breaks there, I'll fix it.

Re-checked against canary today: neither file this touches (engine/baml-runtime/src/request/mod.rs, engine/baml-lib/llm-client/src/clients/helpers.rs) has been modified since the PR was opened, and GitHub still reports no conflicts, so the diff applies as written. Behaviour is unchanged unless http { enable_connection_pooling true } is set explicitly, and AWS clients still reject the option.

If the surface is the concern rather than the mechanism, I'm happy to drop the docs page and ship just the flag plus validation, or to narrow it further.

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@sxlijin
sxlijin had a problem deploying to boundary-tools-dev August 14, 2026 21:54 — with GitHub Actions Failure
@sxlijin
sxlijin deployed to boundary-tools-dev August 14, 2026 22:02 — with GitHub Actions Active
@sxlijin
sxlijin added this pull request to the merge queue Aug 14, 2026
Merged via the queue into BoundaryML:canary with commit 521919c Aug 14, 2026
43 of 45 checks passed
meefs pushed a commit to meefs/baml that referenced this pull request Aug 15, 2026
## Summary

- add comprehensive release notes for the independent `baml_language`
0.17.0 release line
- separate user-facing features, breaking and compatibility changes,
fixes, performance work, and internal changes
- synchronize the canary version, SDK packages, bridge runtime
identities, generated Node loader guards, and VS Code extension to
`0.17.0`

## Verified comparison range

- previous release: `baml-language-0.16.0` at
`2e021b3429db8769656e9b8646657c1863789169`
- reviewed product target:
`baml-language-source-c0153b20108bc428b77a53128b9a59ddeb4e2b42` at
`c0153b20108bc428b77a53128b9a59ddeb4e2b42`
- the reviewed product target was also `origin/canary` when the updated
notes were prepared
- full product comparison:
BoundaryML/baml@baml-language-0.16.0...baml-language-source-c0153b20108bc428b77a53128b9a59ddeb4e2b42

The product range contains 43 monorepo commits. The notes cover every
merged PR in the range that touched `baml_language/`, plus the
baml_language-specific macOS test suppression and binary-size baseline
workflow update. The post-BoundaryML#4424 review added BoundaryML#4427, BoundaryML#4431, BoundaryML#4432, BoundaryML#4433,
BoundaryML#4434, BoundaryML#4103, and BoundaryML#4435. BoundaryML#3975 and BoundaryML#3510 are in the monorepo comparison
but are excluded because they change only the main engine/docs release
line. Other unrelated documentation, website, JetBrains, on-call, and
general monorepo changes are also excluded. The five commits in this PR
add and refine the changelog and mechanically prepare release metadata;
they do not add product behavior beyond the reviewed target.

## Release safety

This PR remains draft. Its `baml_language/release.toml` change is the
documented canary release request: merging it to `canary` after green CI
would dispatch the production 0.17.0 release workflow. Do not merge or
mark ready until Sam explicitly approves the release.

No package was published, no release tag was created or pushed, no
artifact was uploaded, and no production release workflow was triggered
during preparation.

## Validation

- `scripts/baml-language-version sync`
- `scripts/baml-language-version check`
- `scripts/baml-language-version show` → `0.17.0`
- `scripts/baml-language-version compute --channel canary` → `0.17.0`
- `python3 -m unittest scripts.tests.test_baml_language_version
scripts.tests.test_release_pipeline_contract` — 39 passed
- `cargo test --manifest-path baml_language/Cargo.toml -p baml_version`
- `mise run validate-markdown` from `baml_language/`
- changed-file `prek` hooks, including Cargo formatting, Clippy, C++
formatting, TOML checks, and Markdown validation
- `git diff --check`


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Added system and filesystem capabilities, cryptography utilities, time
arithmetic, assertions, bitwise operations, improved indexing, toolchain
pinning, and LSP code actions.
  - Added stable merge sorting for array helpers.

- **Bug Fixes**
- Improved language behavior, diagnostics, CLI evaluation, playground
workflows, and language-server synchronization.

- **Breaking Changes**
- Updated string APIs, function field requirements, prompt syntax, and
type-checking behavior.

- **Documentation**
  - Added release notes for version 0.17.0.

- **Release**
  - Published version 0.17.0 across supported SDKs and tooling.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
meefs pushed a commit to meefs/baml that referenced this pull request Aug 15, 2026
# BEP-066: Evaluation, type construction, and reflection

## Summary

This PR implements BEP-066 across the language, compiler, VM, package
format, and host SDK boundary. BAML programs can inspect values and
types, construct runtime types, compile and mount runtime packages,
invoke reflected callables, and isolate dynamic work in sessions without
weakening the static type system.

The resulting model has four properties:

- Reflection uses one sealed, canonical type algebra for all nine public
reflection kinds. Equivalent types normalize to the same representation
and stable digest.
- Runtime generic arguments retain ordered static/runtime provenance
through HIR, MIR, bytecode, serialization, and invocation. Runtime
occurrences never become unconstrained solver variables.
- Compiled and mounted packages preserve declaration identity, interface
metadata, bounds, associated defaults, `requires` clauses,
implementations, and callable targets without fabricated source
locations.
- Dynamic type information is lexically scoped. It can guide checking
and execution inside its owning body, but values escaping that scope are
erased back to their static occurrence type.

## BEP-066 scenarios

| Scenario | Delivered behavior | Primary evidence |
| --- | --- | --- |
| 1. Runtime enums through an LLM | An enum obtained at runtime can be
supplied to an `ai`/provider call and reflected back with the correct
definition identity. |
`baml_language/crates/baml_tests/tests/reflect_call_any.rs` |
| 2. Saved forms become runtime classes | Stored rows can be converted
into runtime class definitions; returned objects retain those
definitions for extraction and field lookup. |
`baml_language/crates/baml_tests/tests/runtime_classes_and_composites.rs`
|
| 3. Runtime tool unions | Runtime class definitions can be composed
into a tool union, passed through model/tool dispatch, and recovered
without losing member identity. |
`baml_language/crates/baml_tests/tests/runtime_classes_and_composites.rs`
|
| 4a. Bounded generics over runtime classes | Runtime class witnesses
participate in generic bounds and interface dispatch using the same
conformance rules as static types. |
`baml_language/crates/baml_tests/tests/runtime_interface_witnesses.rs` |
| 4b. Package views over runtime definitions | Runtime package
reflection exposes local declarations and their relationships with
package-local identity. |
`baml_language/crates/baml_tests/tests/runtime_type_bindings.rs`,
`runtime_package_api_consistency.rs` |
| 5. Model-written schema compilation | A schema produced as data can be
compiled into a package, inspected, mounted, and used for typed
extraction. |
`baml_language/crates/baml_tests/tests/runtime_package_compile.rs` |
| 6. Current and packed package lookup | `Package.current`, package
enumeration, and `get_function` work for live and packed programs with
loc-free callable targets. |
`baml_language/crates/baml_tests/tests/runtime_package_compile.rs`,
`baml_cli/tests/pack_e2e.rs` |
| 7. Session isolation | Sessions provide isolated runtime definitions
and calls while preserving the lexical lifetime and escape-erasure
rules. | `baml_language/crates/baml_tests/tests/runtime_session.rs` |

## Consistency and audit hardening

The implementation closes the consistency gaps found while auditing the
end-to-end feature:

- Constructor lookup has one behavior across parser, checker, and
runtime: reserved words are rejected as constructor names, enum
constructors retain their precise kind, and removed reader spellings
resolve as ordinary missing names. See
`baml_language/crates/baml_tests/tests/constructor_consistency.rs`.
- Runtime rendering keys definitions by semantic identity, not display
name. Non-equivalent same-name definitions fail before rendering with
E0162; equivalent and recursive definitions remain renderable. See
`runtime_render_identity.rs`.
- Runtime and static failures share diagnostic codes and messages for
bare generics, failed bounds, and duplicate serialized keys.
Runtime-only diagnostics are structured and carry null spans instead of
fake locations. See `runtime_diagnostic_consistency.rs`.
- Package reflection includes `get_enum`, `get_interface`, kind-precise
enumeration, null for wrong-kind or missing lookups, package-local
identity, and distinct identity across packages. See
`runtime_package_api_consistency.rs`.
- Every declaration in a compiled package shares one identity across
direct lookup, enumeration, and reflected function signatures. See
`compiled_package_identity.rs`.
- Runtime definition builders validate atomically, support recursive
groups, and produce definitions identical to map-based construction. See
`builder_witness_parity.rs` and `to_baml_witness_roundtrip.rs`.

## Canary reconciliations

- [BoundaryML#4301](BoundaryML#4301) made `hir_ty`
the production inference engine, removed TIR, and established
`TYPE_SYSTEM.md` as the semantic authority. BEP-066 now lowers, checks,
and reports diagnostics through that path only.
- [BoundaryML#4352](BoundaryML#4352) reorganized the
LLM surface around `ai`, provider namespaces, `@spec`, and agents.
Reflection and model-call coverage targets that current surface rather
than the superseded stdlib layout.
- [BoundaryML#4367](BoundaryML#4367) removed Jinja
prompt interpolation. BEP-066 prompts and fixtures use backtick strings
and `${...}` interpolation, and obsolete Jinja metadata is not carried
into runtime packages.

## `hir_ty` port contract

The `hir_ty` implementation preserves the following invariants from
syntax to execution:

- Each explicit type-argument occurrence is recorded in source order as
either a static type or a runtime operand. Static occurrences are solved
normally; runtime occurrences are checked against their static
occurrence type and never enter the solver as unknown variables.
- The authoritative call metadata carries the resolved callable target,
ordered type-argument slots, realized bindings, deferred dependent
checks, and runtime definition identity through MIR and bytecode. Free
functions, methods, and interface calls use symbolic,
source-location-free targets.
- Only checks that depend on runtime definitions are deferred. Static
arity, ordinary argument types, and independent bounds remain
compile-time errors.
- Runtime type refinements live in an overlay keyed by body owner and
statement identity, respect lexical shadowing, and are erased at scope
escape.
- Mounted package metadata is sufficient for normal generic realization
and interface selection: bounds, associated defaults, `requires`,
implementation registrations, and method resolution are not
reconstructed heuristically at runtime.
- `_` remains an exact contextual hole. Let annotations and constructors
solve permitted holes; declaration signatures and explicit call/upcast
type arguments reject them with E0147. A top-level `throws T | _` is
open and exposes `T` plus inferred throws to callers; plain `throws T`
is closed.

Intentional differences from the retired TIR behavior are part of the
contract:

- Multiple generic bounds are conjunctive end to end. Runtime and static
checking require every bound; the prior single-bound asymmetry is not
preserved.
- Existential interface dispatch permits exactly one `Self` witness.
Ambiguous multi-`Self` shapes are rejected instead of being guessed.
- Associated defaults, `Self` substitution, and `requires` realization
follow the current spec and `hir_ty` rules where TIR behavior differed.
- Current diagnostic codes and normalized types are authoritative;
ignored TIR tests and legacy wording do not override them.

The legacy root `engine/` is not an authority for this work.

## Test evidence map

| Contract surface | Evidence |
| --- | --- |
| Canonical reflection algebra and stable identity | `baml_type`
normalization/type-kind unit tests; type-spec tables for reflection
kinds and canonicalization |
| Syntax, formatting, AST, and HIR preservation | lexer/parser/formatter
tests; HIR tests for ordered static/runtime type-argument occurrences |
| Wildcard and open-throws semantics |
`wildcard_hole_in_let_annotation.baml`,
`wildcard_hole_in_constructor_generic_arg.baml`,
`partial_throws_clause.baml`, `wildcard_type_inference.rs`,
`wildcard_expression_holes.rs` |
| Mounted-package and source-package parity |
`hir_ty_package_interface`, `mounted_package_calls`,
`mounted_package_parity` |
| Runtime reflection scenarios | `reflect_call_any.rs`,
`runtime_classes_and_composites.rs`, `runtime_interface_witnesses.rs`,
`runtime_type_bindings.rs`, `runtime_package_compile.rs`,
`runtime_session.rs` |
| Identity, diagnostics, and API consistency |
`compiled_package_identity.rs`, `constructor_consistency.rs`,
`runtime_diagnostic_consistency.rs`,
`runtime_package_api_consistency.rs`, `runtime_render_identity.rs` |
| Builder and round-trip parity | `builder_witness_parity.rs`,
`to_baml_witness_roundtrip.rs` |
| Host and packed-program boundary | host reflection SDK fixtures and
`baml_cli/tests/pack_e2e.rs` |

## Verification state

- Full pinned gate on the gated head (`rustup run 1.93.0 cargo insta
test --test-runner nextest -p baml_tests -p baml_cli -p
baml_lsp2_actions -p baml_lsp2_actions_tests -p baml_surface
--all-features --unreferenced=reject`): **3,265 passed, 0 failed** (23
skipped), all doctests passed or were intentionally ignored, no
unreferenced snapshots, and no pending `.snap.new`.
- Whole-stdlib type census: 121 files, **62,910 typed nodes, 0
error-channel entries, 0 panics**.
- Session soak: the 500-evaluation pin runs with flat latency (eval BoundaryML#10:
3.32s → eval BoundaryML#500: 2.39s) and 0 KiB measured RSS growth.
- The head commit additionally absorbs a final 4-commit canary drift
(BoundaryML#4431 crypto, BoundaryML#3975 connection pooling, BoundaryML#4432 quote prompts, BoundaryML#4433
string standardization) verified by focused validation (targeted
runtime/stdlib/compiler suites + no-update snapshot replays); the
authoritative final signal is this PR's CI on the head commit.

## Handoff notes (for the next agent or human working on this)

**State:** everything above is on the head commit. No temporary port
constructs remain in the tree — the Phase-A stub
(`E_BEP066_PORT_IN_PROGRESS`), fixture exclusions, and port-era test
ignores are all gone (verified by grep).

**Authoritative documents:**
- `CONTRACTS.md` (repo root, this branch) — the binding data-model
contracts (runtime type slots / `CallPlan`, loc-free
`SymbolicCallableTarget`, scoped generic overlay) plus the 35-fact
acceptance checklist with per-fact conditions.
- TIR→hir_ty migration guide: branch `antoniosarosi/hir-ty-research`
(`TIR_HIRTY_MIGRATION_GUIDE.md`) — the architecture map, worked
examples, and risk register the port followed.
- Wildcard adjudication table: branch
`antoniosarosi/wildcard-adjudication` (`WILDCARD_VERDICTS.md`) —
per-test rulings for the formerly ignored B-230/B-247 cases.
- The full port audit trail (per-slice log with every checkpoint,
decision, and accepted snapshot delta) is posted as a comment on this
PR.

**Deep review findings (resolved):** the adversarial review of the six
port commits (`462dad20b..3c22664`) is complete — [full report in this
comment](BoundaryML#4325 (comment)).
All four ratified blockers landed in `f239a032f` and passed the widened
pinned gate:

1. **Union interface dispatch (report finding 1):** virtual dispatch now
requires every union member to resolve to the same declaring-interface
view; heterogeneous unions take the guarded per-member switch, with
executable coverage.
2. **Written union member order (finding 2):** static call slots retain
a canonical checking type and a written emission type, preserving
runtime coercion order. The audited snapshots restore `audio | image`
and the other written forms.
3. **Deferred runtime bounds (finding 3):** bound registration
substitutes the call frame and defers checks that depend on active
scoped runtime bindings, including no-value-argument calls.
4. **Session top-level-let cycles (finding 5):** inference has an error
cycle seed plus RAII in-flight ownership; resolution order preserves
functions, exported values, and reserved package roots, and recursive
lets diagnose without poisoning the Session.

Canary integration and audited follow-ups are recorded in `55f6318f5`,
`957d4514b`, `4fef90eff`, and `8de2d10bb`. Report findings 4, 6, and 8
remain agreed fast-follow work; finding 9 remains explicitly
pre-existing. The report's clean-area conclusions remain valid.

**CI playbook for this branch:**
- darwin cargo-test: Blacksmith runner evictions ("No active SSH
sessions") are infra flakes; cancelled jobs display as failures — check
each job's `.conclusion`, then `gh run rerun <run-id> --failed` (up to 2
attempts).
- tsweb-macos: same infra treatment. Its one real failure mode (vitest
5s default timeout on the worker `Package.compile` test) is already
fixed with an explicit 30s timeout.
- Size Gate: if it fails with the absolute cap **below** the reported
baseline, the ceiling is stale — re-bake and bump the pinned literal in
`baml_language/crates/tools_size_gate/src/config.rs` to baseline×1.03 as
a single-file commit.
- Local CI mirror (all three matter: toolchain, features, package set):
`rustup run 1.93.0 cargo insta test --test-runner nextest -p baml_tests
-p baml_cli -p baml_lsp2_actions -p baml_lsp2_actions_tests -p
baml_surface --all-features --unreferenced=reject`

**Agreed follow-up PRs (deliberately not in this PR):**
1. Add a nextest serialization group for `sdk_test_typescript_web`
(`max-threads = 1`) — prevents concurrent ~8 GiB transient workerd
import peaks from stacking (measured; this OOM'd a dev machine).
2. Investigate the 82.4 MB `bridge_web_core_bg.wasm` (wasm-opt is
currently disabled in its package metadata); consider splitting
compiler-only code out of the runtime web bridge.
3. Build-time precompiled-stdlib artifact + an `emit_units` variant that
accepts it, so `Package.compile`'s first call skips the ~4–5 s full
90-file stdlib recompile (measured; a lazy in-process cache is not
sufficient for the first-call cost).
4. Address report findings 4, 6, and 8 in focused follow-ups; triage the
pre-existing items under finding 9 separately.

**Coordination items:**
- The two schema decisions living in hir_ty's crate
(`SymbolicCallableTarget` in `callable.rs`; the `PackageInterface` Borsh
expansion) should get a review from the hir_ty owner — they were frozen
unilaterally under time pressure and intentionally invalidate cached
package-interface bytes per compiler build.
- GC: BEP-066's runtime-constructed type declarations live in the moving
heap; the ty-heapptr line of work assumes GC-inert type heads. Alignment
needed before that lands (`visit_heads` hook is reserved for this).

**Semantic authority:** `TYPE_SYSTEM.md` + current hir_ty behavior. Do
not "fix" anything back toward TIR-era snapshots or ignored TIR-era test
expectations — several behavior deltas (conjunctive bounds, one-`Self`
existential dispatch, hole/E0147 handling) are intentional and
contract-pinned.

## Reviewer entry points

- Public language and stdlib surface: `baml_language/TYPE_SYSTEM.md`,
the BEP-066 specification, and
`baml_language/crates/baml_builtins2/baml_std/baml/ns_reflect/`.
- Shared type algebra: `baml_language/crates/baml_type/src/type_kind.rs`
and `normalize.rs`.
- Syntax and HIR preservation: AST/HIR type-argument reference
definitions and lowering in `baml_compiler2_hir` and
`baml_compiler2_hir_ty`.
- Inference and mounted metadata:
`baml_language/crates/baml_compiler2_hir_ty/src/infer.rs`,
`callable.rs`, `package_interface.rs`, `impls.rs`, and interface method
resolution.
- MIR and bytecode handoff: the runtime type-argument lowering/provider
code in `baml_compiler2_mir` and its bytecode emitter.
- Runtime identity, reflection, and builders: the
reflection/runtime-definition modules in `baml_language/crates/bex_vm`.
- Behavioral review: start with the seven scenario tests above, then the
audit-hardening tests, then the host SDK and pack coverage.
sxlijin added a commit to ryanmazzolini/baml that referenced this pull request Aug 17, 2026
## Summary

- bump all legacy BAML v0 release surfaces from 0.225.0 to 0.226.0 using
the repository version-bump configuration
- add exactly the two verified external-contributor engine changes:
connection pooling from BoundaryML#3975 and OpenAI transcriptions from BoundaryML#4202
- synchronize the new 0.226.0 sections in the top-level and Fern
changelogs
- regenerate all nine integration clients without test-report churn and
update the engine, Rust SDK, and generated Rust integration lockfile
versions

## Release boundary

- 0.225.0 boundary: release PR BoundaryML#4310 / merge commit
da2a673
- BoundaryML#3975 shipped as 521919c
- BoundaryML#4202 merged from reviewed head
ff96fd4 as squash commit
79b8705; the reviewed-head and squash
diffs have the same stable patch ID
- BoundaryML#4464 and its byte-perfect revert BoundaryML#4469 have zero net diff and are
excluded
- rebased onto current canary after BoundaryML#4202 merged

## Validation

- TypeScript runtime build and nine-client generation
- Python runtime build/install and nine-client generation
- deterministic regeneration: unchanged binary diff hash on repeated
generation
- locked Cargo metadata for the engine and Rust SDK workspaces
- generated Rust integration library build: `cargo test --lib --locked`
- OpenAI transcription wiremock closure tests: 2 passed
- generated Python multipart request test: 1 passed
- connection pooling transport test: 1 passed
- HTTP config validation fixtures: 8 passed
- release metadata and workflow contracts: 50 passed
- stale 0.225.0 audit clean across release-owned surfaces; historical
junit.xml intentionally unchanged
- final release diff matches the 0.225.0 workflow-owned file set,
excludes junit.xml test-report churn, and additionally refreshes the two
tracked Rust SDK/integration lockfiles proven stale by locked builds

## Status

- dependency satisfied; rebased onto current canary with the reviewed
BoundaryML#4202 patch present
- all required GitHub Actions checks are green; local and GitHub
CodeRabbit reviews are green with approval and no review threads or
requested changes
- merge-ready; awaiting normal human review
@sxlijin

sxlijin commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

@dexhunter FYI, this has been released in 0.226.0!

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.

[feat] Make Connection Pooling configurable

3 participants