Skip to content

Add WASM bridge for sandboxed Salesforce API access#71

Merged
jlantz merged 42 commits into
mainfrom
claude/adapt-agent-standards-KzMkw
Feb 4, 2026
Merged

Add WASM bridge for sandboxed Salesforce API access#71
jlantz merged 42 commits into
mainfrom
claude/adapt-agent-standards-KzMkw

Conversation

@jlantz

@jlantz jlantz commented Jan 31, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR introduces a complete WASM bridge architecture enabling untrusted or declarative code to run in sandboxed WASM plugins while securely accessing Salesforce APIs. The host manages all credentials — WASM guests never see access tokens.

Key Changes

  • sf-wasm-types (new crate): Pure serde types shared by host and guest, compiling to both native and wasm32-unknown-unknown. Defines BridgeResult<T> for all ABI boundary values and host function name constants.

  • sf-bridge (new crate): Extism host implementation that registers 13 host functions (sf_query, sf_create, sf_get, sf_update, sf_delete, sf_upsert, sf_describe_global, sf_describe_sobject, sf_search, sf_composite, sf_create_multiple, sf_delete_multiple, sf_limits). Each function wraps the native SalesforceRestClient, deserializes requests from guest memory, executes async Salesforce API calls via Handle::block_on(), and returns typed BridgeResult responses.

  • sf-guest-sdk (new crate): Ergonomic Rust wrappers for WASM plugin authors. Provides functions like query(), create(), get(), etc. that call host function imports and handle serialization. Excluded from workspace (targets wasm32-unknown-unknown only).

  • examples/wasm-guest-plugin (new): Example WASM guest plugin demonstrating the guest SDK usage.

  • Workspace configuration: Updated Cargo.toml to include new crates and exclude guest-only targets.

  • Documentation: Added comprehensive WASM Bridge Architecture section to copilot-instructions.md covering design, credential isolation, concurrency model, and adding new host functions.

Implementation Details

Credential Isolation

  • WASM guests cannot make raw HTTP calls, read environment variables, or access the filesystem
  • All Salesforce API calls go through host functions registered by sf-bridge
  • The host authenticates using sf-auth and injects tokens into requests
  • Guests only see API response data

Concurrency Model

  • SfBridge::call() uses tokio::task::spawn_blocking() to run each WASM invocation on a blocking thread
  • Inside host function callbacks, Handle::block_on() bridges back to the async runtime for Salesforce API calls
  • The underlying reqwest::Client connection pool is shared across all concurrent guest invocations

Type Safety

  • Request/response types are defined in sf-wasm-types with #[derive(Serialize, Deserialize)]
  • BridgeResult<T> is a tagged enum (ok/err) for all ABI boundary values
  • Type conversion between bridge types and sf-rest types is handled in host function implementations

https://claude.ai/code/session_014bCFaRUfSfuRjSaJTy3XoJ

Implements a three-crate bridge design using Extism that allows WASM
guest plugins to invoke Salesforce APIs without ever seeing access
tokens. The host manages all authentication and credentials.

New crates:
- sf-wasm-types: shared ABI types (BridgeResult<T>, request/response
  structs) that compile to both native and wasm32-unknown-unknown
- sf-bridge: Extism host that registers 13 host functions (query,
  create, get, update, delete, upsert, describe, search, composite,
  collections, limits) wrapping SalesforceRestClient
- sf-guest-sdk: ergonomic Rust wrappers for WASM plugin authors

Also includes an example guest plugin and updated copilot instructions
documenting the bridge architecture, workspace membership, credential
isolation model, and concurrency design.

https://claude.ai/code/session_014bCFaRUfSfuRjSaJTy3XoJ
… Metadata)

Expands the bridge from 13 REST-only operations to 40 host functions
covering all four Salesforce API crates. This addresses the CI coverage
gap (40.14% -> target 50%+) by adding comprehensive tests (134 total
across sf-bridge and sf-wasm-types).

- sf-wasm-types: Add 65 new types for Bulk, Tooling, and Metadata APIs
  with 78 serialization roundtrip tests
- sf-bridge: Add 27 new host function handlers (10 Bulk, 5 Tooling,
  6 Metadata, 6 new REST), 56 tests with wiremock-based integration
- sf-bridge/lib.rs: Wire all 40 host functions with BridgeState holding
  REST, Bulk, Tooling clients + on-demand MetadataClient construction
- sf-guest-sdk: Add all 40 ergonomic wrappers for guest WASM plugins

https://claude.ai/code/session_014bCFaRUfSfuRjSaJTy3XoJ

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.

Pull request overview

This PR introduces a comprehensive WASM bridge architecture that enables sandboxed WASM plugins to access Salesforce APIs while maintaining credential isolation. The host manages all authentication tokens, which never cross into WASM guest memory.

Changes:

  • Added three new crates: sf-wasm-types (shared ABI types), sf-bridge (Extism host), and sf-guest-sdk (guest SDK)
  • Created an example WASM guest plugin demonstrating the bridge usage
  • Updated workspace configuration to include/exclude appropriate crates
  • Added comprehensive documentation to copilot-instructions.md explaining the WASM bridge architecture

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
Cargo.toml Adds new workspace members (sf-wasm-types, sf-bridge) and excludes WASM-only crates (sf-guest-sdk, wasm-guest-plugin)
crates/sf-wasm-types/src/lib.rs Defines 1987 lines of shared ABI types with extensive test coverage (846+ lines of tests)
crates/sf-wasm-types/Cargo.toml Minimal configuration for the pure-serde types crate
crates/sf-bridge/src/lib.rs Extism host implementation with 1118 lines registering 40 host functions
crates/sf-bridge/src/host_functions.rs Business logic for all 40 host functions with comprehensive unit tests
crates/sf-bridge/src/error.rs Bridge-level error types covering all Salesforce API clients
crates/sf-bridge/Cargo.toml Dependencies for the host bridge including extism, tokio, and all SF clients
crates/sf-guest-sdk/src/lib.rs Ergonomic Rust wrappers for WASM plugin authors
crates/sf-guest-sdk/Cargo.toml Guest SDK dependencies (extism-pdk, wasm-types)
examples/wasm-guest-plugin/src/lib.rs Example plugin demonstrating query, create, composite, and limits operations
examples/wasm-guest-plugin/Cargo.toml Example plugin configuration
.github/copilot-instructions.md Adds 66 lines documenting WASM bridge architecture, credential isolation, and concurrency model

Comment thread examples/wasm-guest-plugin/src/lib.rs Outdated
Comment thread crates/sf-bridge/src/lib.rs Outdated
Comment thread crates/sf-bridge/src/host_functions.rs Outdated
Comment thread crates/sf-bridge/src/host_functions.rs Outdated
Comment thread crates/sf-guest-sdk/src/lib.rs Outdated
Comment thread crates/sf-guest-sdk/src/lib.rs Outdated
Comment thread examples/wasm-guest-plugin/src/lib.rs Outdated
Comment thread crates/sf-guest-sdk/src/lib.rs
Comment thread crates/sf-bridge/src/lib.rs
Comment thread crates/sf-wasm-types/src/lib.rs
Brings in CI coverage workflow fix and latest changes from main.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Jason Lantz <jason@muselab.com>
@jlantz

jlantz commented Jan 31, 2026

Copy link
Copy Markdown
Contributor Author

@copilot open a new pull request to apply changes based on the comments in this thread

Copilot AI commented Jan 31, 2026

Copy link
Copy Markdown
Contributor

@jlantz I've opened a new pull request, #73, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 4 commits January 31, 2026 12:30
…error sanitization

- Fix type from UpdateRecord to UpdateMultipleRecord in update_multiple
- Fix type from u32 to u64 for max_records parameter
- Update default API version from 62.0 to 65.0 (sf-wasm-types and example)
- Use Arc<str> for access_token and instance_url to reduce memory copies
- Sanitize error codes instead of exposing Debug format to WASM guests
- Update security documentation to clarify SOQL injection responsibility

Co-authored-by: jlantz <1697127+jlantz@users.noreply.github.com>
… sf-guest-sdk

- Add integration tests for sf-bridge (module loading, WASM validation)
- Document why unit tests aren't feasible for sf-guest-sdk (requires Extism runtime)
- Explain that guest SDK is tested via bridge integration tests and examples
- Add busbar-sf-bridge to dev-dependencies for integration tests

Co-authored-by: jlantz <1697127+jlantz@users.noreply.github.com>
- Make invalid WASM test assertion specific (expect rejection at construction)
- Move testing strategy documentation to module-level doc comment for visibility
- Remove duplicate testing notes at end of sf-guest-sdk file

Co-authored-by: jlantz <1697127+jlantz@users.noreply.github.com>
Replace serde_json with rmp_serde (MessagePack) for the host<->guest
serialization at the WASM boundary. This is faster and produces smaller
payloads than JSON while remaining self-describing for forward
compatibility. The HTTP layer still uses JSON since that's what
Salesforce expects.

Uses to_vec_named() to include field names in the MessagePack output,
preserving compatibility with serde's named-field deserialization.

https://claude.ai/code/session_014bCFaRUfSfuRjSaJTy3XoJ
Signed-off-by: Jason Lantz <jason@muselab.com>
@jlantz

jlantz commented Feb 2, 2026

Copy link
Copy Markdown
Contributor Author

@copilot please resolve the error I introduced trying to resolve the merge conflict with main and expand the wasm ABI to include all the new endpoints we've added

Updated the integration test command to use a multi-line run block for better readability.

Signed-off-by: Jason Lantz <jason@muselab.com>
Modified the run command to use a multi-line format for better readability.

Signed-off-by: Jason Lantz <jason@muselab.com>
@jlantz

jlantz commented Feb 3, 2026

Copy link
Copy Markdown
Contributor Author

@copilot all of your wasm integration tests seem to be failing? And, you should have access to the SF_AUTH_URL secret in your copilot workspace environment to run a real integration test against out test scratch org. Please fully test your fix before committing.

running 33 tests
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
test bridge::test_bridge_bulk_ingest ... ok
test bridge::test_bridge_bulk_query ... ok
test bridge::test_bridge_batch_operations ... ok
test bridge::test_bridge_composite_batch_operation ... ok
test bridge::test_bridge_composite_operation ... ok
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
test bridge::test_bridge_crud_operations ... ok
test bridge::test_bridge_describe_global ... ok
test bridge::test_bridge_composite_tree_operation ... ok
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
⚠️ Test WASM plugin not found at: /home/runner/work/busbar-sf-api/busbar-sf-api/../target/wasm32-unknown-unknown/release/wasm_test_plugin.wasm
Build it with: cargo build --manifest-path tests/wasm-test-plugin/Cargo.toml --target wasm32-unknown-unknown --release
test bridge::test_bridge_get_compact_layouts ... ok
test bridge::test_bridge_describe_sobject ... ok
test bridge::test_bridge_execute_anonymous_apex ... ok
test bridge::test_bridge_get_deleted ... ok
test bridge::test_bridge_get_sobject_layouts ... ok
test bridge::test_bridge_list_global_quick_actions ... ok
24: integration::bridge::test_bridge_rejects_invalid_wasm
at ./tests/integration/bridge.rs:144:6
25: integration::bridge::test_bridge_rejects_invalid_wasm::{closure#0}
at ./tests/integration/bridge.rs:127:44
26: <integration::bridge::test_bridge_rejects_invalid_wasm::{closure#0} as core::ops::function::FnOnce<()>>::call_once
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/ops/function.rs:250:5
27: core::ops::function::FnOnce::call_once
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace.
test bridge::test_bridge_rejects_invalid_wasm ... FAILED

failures:

failures:
bridge::test_bridge_rejects_invalid_wasm

test result: FAILED. 32 passed; 1 failed;

Copilot AI commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

@jlantz I've opened a new pull request, #85, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 2 commits February 3, 2026 17:22
Co-authored-by: jlantz <1697127+jlantz@users.noreply.github.com>
Co-authored-by: jlantz <1697127+jlantz@users.noreply.github.com>
Fix WASM test plugin path in bridge integration tests
@jlantz

jlantz commented Feb 4, 2026

Copy link
Copy Markdown
Contributor Author

@copilot - we are still failing tests??? You should have access to the SF_AUTH_URL in your copilot env?

For the wasm tests, you are supposed to be reusing or recreating the same test interactions with the org as our integration tests

running 33 tests
test bridge::test_bridge_can_load_wasm_plugin ... ok
test bridge::test_bridge_bulk_query ... ok
test bridge::test_bridge_composite_batch_operation ... ok
test bridge::test_bridge_composite_operation ... ok

thread 'bridge::test_bridge_composite_tree_operation' (15018) panicked at tests/integration/bridge.rs:342:5:
Composite tree should succeed: {"error":"INVALID_REQUEST: invalid tree records: missing field referenceId","success":false}
stack backtrace:
0: __rustc::rust_begin_unwind
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/panicking.rs:689:5
1: core::panicking::panic_fmt
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/panicking.rs:80:14
2: integration::bridge::test_bridge_composite_tree_operation::{closure#0}
at ./tests/integration/bridge.rs:342:5
3: <core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>> as core::future::future::Future>::poll
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/future/future.rs:133:9
4: <core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>> as core::future::future::Future>::poll
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/future/future.rs:133:9
5: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:753:70
6: tokio::task::coop::with_budget::<core::task::poll::Poll<()>, tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/task/coop/mod.rs:167:5
7: tokio::task::coop::budget::<core::task::poll::Poll<()>, tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/task/coop/mod.rs:133:5
8: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:753:25
9: tokio::runtime::scheduler::current_thread::Context::enter::<core::task::poll::Poll<()>, tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:442:19
10: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:752:44
11: tokio::runtime::scheduler::current_thread::CoreGuard::enter::<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:840:68
12: <tokio::runtime::context::scoped::Scopedtokio::runtime::scheduler::Context>::set::<tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}, (alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>)>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context/scoped.rs:40:9
13: tokio::runtime::context::set_scheduler::<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context.rs:176:38
14: <std::thread::local::LocalKeytokio::runtime::context::Context>::try_with::<tokio::runtime::context::set_scheduler<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>::{closure#0}, (alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>)>
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/thread/local.rs:513:12
15: <std::thread::local::LocalKeytokio::runtime::context::Context>::with::<tokio::runtime::context::set_scheduler<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>::{closure#0}, (alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>)>
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/thread/local.rs:477:20
16: tokio::runtime::context::set_scheduler::<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context.rs:176:17
17: tokio::runtime::scheduler::current_thread::CoreGuard::enter::<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:840:27
18: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:740:24
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:188:9
22: tokio::runtime::runtime::Runtime::block_on_inner::<core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/runtime.rs:368:52
23: tokio::runtime::runtime::Runtime::block_on::<core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/runtime.rs:342:18
24: integration::bridge::test_bridge_rejects_invalid_wasm
at ./tests/integration/bridge.rs:144:6
25: integration::bridge::test_bridge_rejects_invalid_wasm::{closure#0}
at ./tests/integration/bridge.rs:127:44
26: <integration::bridge::test_bridge_rejects_invalid_wasm::{closure#0} as core::ops::function::FnOnce<()>>::call_once
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/ops/function.rs:250:5
27: core::ops::function::FnOnce::call_once
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace.
test bridge::test_bridge_rejects_invalid_wasm ... FAILED
test bridge::test_bridge_query_operation ... ok
test bridge::test_bridge_upsert_operation ... ok
test bridge::test_bridge_tooling_query ... ok
test bridge::test_bridge_versions ... ok
test bridge::test_bridge_search ... ok

failures:

failures:
bridge::test_bridge_composite_tree_operation
bridge::test_bridge_parameterized_search
bridge::test_bridge_rejects_invalid_wasm

test result: FAILED. 30 passed; 3 failed; 0 ignored; 0 measured; 136 filtered out; finished in 41.22s

error: test failed, to rerun pass -p busbar-sf-api --test integration
error: process didn't exit successfully: /home/runner/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/cargo test --manifest-path /home/runner/work/busbar-sf-api/busbar-sf-api/Cargo.toml --target-dir /home/runner/work/busbar-sf-api/busbar-sf-api/target/llvm-cov-target --workspace --all-features --test integration -- --nocapture 'bridge::' (exit status: 101)
Error: Process completed with exit code 101.


Integration test failure... not quite sure how this one changed?

thread 'rest::test_invocable_actions_describe_custom' (3257) panicked at tests/integration/rest.rs:1389:18:
describe_custom_action should succeed: Error { kind: Salesforce { error_code: "INVALID_ACTION", message: "Invalid action name" }, source: None }
stack backtrace:
test rest::test_invocable_actions_describe_standard ... ok
0: __rustc::rust_begin_unwind
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/panicking.rs:689:5
1: core::panicking::panic_fmt
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/panicking.rs:80:14
2: core::result::unwrap_failed
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/result.rs:1867:5
3: <core::result::Result<busbar_sf_rest::invocable_actions::InvocableActionDescribe, busbar_sf_rest::error::Error>>::expect
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/result.rs:1185:23
4: integration::rest::test_invocable_actions_describe_custom::{closure#0}
at ./tests/integration/rest.rs:1389:18
5: <core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>> as core::future::future::Future>::poll
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/future/future.rs:133:9
6: <core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>> as core::future::future::Future>::poll
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/future/future.rs:133:9
7: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:753:70
8: tokio::task::coop::with_budget::<core::task::poll::Poll<()>, tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/task/coop/mod.rs:167:5
9: tokio::task::coop::budget::<core::task::poll::Poll<()>, tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/task/coop/mod.rs:133:5
10: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:753:25
11: tokio::runtime::scheduler::current_thread::Context::enter::<core::task::poll::Poll<()>, tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:442:19
12: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:752:44
13: tokio::runtime::scheduler::current_thread::CoreGuard::enter::<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:840:68
14: <tokio::runtime::context::scoped::Scopedtokio::runtime::scheduler::Context>::set::<tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}, (alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>)>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context/scoped.rs:40:9
15: tokio::runtime::context::set_scheduler::<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context.rs:176:38
16: <std::thread::local::LocalKeytokio::runtime::context::Context>::try_with::<tokio::runtime::context::set_scheduler<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>::{closure#0}, (alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>)>
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/thread/local.rs:513:12
17: <std::thread::local::LocalKeytokio::runtime::context::Context>::with::<tokio::runtime::context::set_scheduler<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>::{closure#0}, (alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>)>
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/thread/local.rs:477:20
18: tokio::runtime::context::set_scheduler::<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context.rs:176:17
19: tokio::runtime::scheduler::current_thread::CoreGuard::enter::<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:840:27
20: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:740:24
21: tokio::runtime::scheduler::current_thread::CurrentThread::block_on::<core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:200:33
22: tokio::runtime::context::runtime::enter_runtime::<tokio::runtime::scheduler::current_thread::CurrentThread::block_on<core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>::{closure#0}, ()>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context/runtime.rs:65:16
23: tokio::runtime::scheduler::current_thread::CurrentThread::block_on::<core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:188:9
24: tokio::runtime::runtime::Runtime::block_on_inner::<core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/runtime.rs:368:52
25: tokio::runtime::runtime::Runtime::block_on::<core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/runtime.rs:342:18
26: integration::rest::test_invocable_actions_describe_custom
at ./tests/integration/rest.rs:1395:87
27: integration::rest::test_invocable_actions_describe_custom::{closure#0}
at ./tests/integration/rest.rs:1370:50
28: <integration::rest::test_invocable_actions_describe_custom::{closure#0} as core::ops::function::FnOnce<()>>::call_once
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/ops/function.rs:250:5
29: core::ops::function::FnOnce::call_once
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace.

Copilot AI commented Feb 4, 2026

Copy link
Copy Markdown
Contributor

@jlantz I've opened a new pull request, #89, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 2 commits February 4, 2026 01:09
Co-authored-by: jlantz <1697127+jlantz@users.noreply.github.com>
Fix composite tree record structure in WASM test plugin
@jlantz

jlantz commented Feb 4, 2026

Copy link
Copy Markdown
Contributor Author

@copilot There are still test failures, same as last time?

thread 'bridge::test_bridge_composite_tree_operation' (15011) panicked at tests/integration/bridge.rs:342:5:
Composite tree should succeed: {"error":"INVALID_FIELD: Client error: Salesforce API error: INVALID_FIELD - No such column 'referenceId' on sobject of type Contact","success":false}
stack backtrace:
0: __rustc::rust_begin_unwind
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/panicking.rs:689:5
1: core::panicking::panic_fmt
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/panicking.rs:80:14
2: integration::bridge::test_bridge_composite_tree_operation::{closure#0}
at ./tests/integration/bridge.rs:342:5
3: <core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>> as core::future::future::Future>::poll
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/future/future.rs:133:9
4: <core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>> as core::future::future::Future>::poll
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/future/future.rs:133:9
5: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:753:70
6: tokio::task::coop::with_budget::<core::task::poll::Poll<()>, tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/task/coop/mod.rs:167:5
7: tokio::task::coop::budget::<core::task::poll::Poll<()>, tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/task/coop/mod.rs:133:5
8: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:753:25
9: tokio::runtime::scheduler::current_thread::Context::enter::<core::task::poll::Poll<()>, tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:442:19
10: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:752:44
11: tokio::runtime::scheduler::current_thread::CoreGuard::enter::<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:840:68
12: <tokio::runtime::context::scoped::Scopedtokio::runtime::scheduler::Context>::set::<tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}, (alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>)>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context/scoped.rs:40:9
13: tokio::runtime::context::set_scheduler::<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>::{closure#0}
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context.rs:176:38
14: <std::thread::local::LocalKeytokio::runtime::context::Context>::try_with::<tokio::runtime::context::set_scheduler<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>::{closure#0}, (alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>)>
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/thread/local.rs:513:12
15: <std::thread::local::LocalKeytokio::runtime::context::Context>::with::<tokio::runtime::context::set_scheduler<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>::{closure#0}, (alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>)>
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/thread/local.rs:477:20
16: tokio::runtime::context::set_scheduler::<(alloc::boxed::Boxtokio::runtime::scheduler::current_thread::Core, core::option::Option<()>), tokio::runtime::scheduler::current_thread::CoreGuard::enter<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>::{closure#0}>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context.rs:176:17
17: tokio::runtime::scheduler::current_thread::CoreGuard::enter::<tokio::runtime::scheduler::current_thread::CoreGuard::block_on<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>::{closure#0}, core::option::Option<()>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:840:27
18: tokio::runtime::scheduler::current_thread::CoreGuard::block_on::<core::pin::Pin<&mut core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/current_thread/mod.rs:740:24
22: tokio::runtime::runtime::Runtime::block_on_inner::<core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/runtime.rs:368:52
23: tokio::runtime::runtime::Runtime::block_on::<core::pin::Pin<&mut dyn core::future::future::Future<Output = ()>>>
at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/runtime.rs:342:18
24: integration::bridge::test_bridge_rejects_invalid_wasm
at ./tests/integration/bridge.rs:144:6
25: integration::bridge::test_bridge_rejects_invalid_wasm::{closure#0}
at ./tests/integration/bridge.rs:127:44
26: <integration::bridge::test_bridge_rejects_invalid_wasm::{closure#0} as core::ops::function::FnOnce<()>>::call_once
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/ops/function.rs:250:5
27: core::ops::function::FnOnce::call_once
at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace.
test bridge::test_bridge_rejects_invalid_wasm ... FAILED
test bridge::test_bridge_query_all_operation ... ok
test bridge::test_bridge_query_operation ... ok
test bridge::test_bridge_tooling_query ... ok
test bridge::test_bridge_upsert_operation ... ok
test bridge::test_bridge_versions ... ok
test bridge::test_bridge_search ... ok

failures:

Copilot AI commented Feb 4, 2026

Copy link
Copy Markdown
Contributor

@jlantz I've opened a new pull request, #90, to work on those changes. Once the pull request is ready, I'll request review from you.

@jlantz jlantz merged commit f233707 into main Feb 4, 2026
9 of 11 checks passed
@jlantz jlantz deleted the claude/adapt-agent-standards-KzMkw branch February 4, 2026 04:17
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