Skip to content

feat(bridges): internal-API + dylint sweep (#844) — phase 1 + initial migrations#849

Merged
zackees merged 1 commit into
mainfrom
fix/internal-bridges-844
Jun 29, 2026
Merged

feat(bridges): internal-API + dylint sweep (#844) — phase 1 + initial migrations#849
zackees merged 1 commit into
mainfrom
fix/internal-bridges-844

Conversation

@zackees

@zackees zackees commented Jun 29, 2026

Copy link
Copy Markdown
Member

Summary

Phase 1 + initial Phase 2 of #844. Establishes the internal bridge API + dylint ban pattern across 7 new bridges + 10 new lint crates, then migrates the highest-impact production sites for each.

Bridges added (Phase 1)

Bridge Replaces Notes
fbuild_core::http::{client, client_with_timeout, blocking_client} reqwest::Client::new, reqwest::get, reqwest::blocking::* Hoisted from fbuild_packages; old module re-exports
fbuild_core::fs::* + write_atomic tokio::fs::* direct import; std::fs::write for state files Curated re-export with atomic-write helper
fbuild_core::time::{sleep, +10 named constants} std::thread::sleep; bare Duration::from_secs(N) SHORT/MEDIUM/LONG_HTTP_TIMEOUT, POLL_50/100/200/500MS, REAL_BUILD_TIMEOUT, etc.
fbuild_core::channel::{bounded, unbounded} std::sync::mpsc, direct tokio::sync::mpsc tokio wrapper
fbuild_core::path::canonicalize_existing std::fs::canonicalize Strips Windows \?\ UNC, returns NormalizedPath
fbuild_paths::temp_subdir(name) bare tempfile::TempDir::new() Roots under `~/.fbuild/{dev
fbuild_cli::output::{progress, result, warn, error, debug} println!/eprintln! in CLI tracing-backed

Lint crates added (10, all zero allowlist where possible)

ban_bare_reqwest, ban_std_fs_in_async (daemon-scoped Phase 1), ban_tokio_fs_direct_import, ban_std_thread_sleep, ban_std_mpsc_in_async_reachable, ban_tokio_mpsc_direct_import, ban_std_fs_canonicalize, ban_runtime_new_outside_main, ban_poison_panic, ban_print_in_production.

Migrations applied (Phase 2)

Area Sites Approach
HTTP 11 All reqwest::Client::new() calls in fbuild-python/cli/daemon-tests → fbuild_core::http::client*
Runtime::new 5 Module OnceLock<Runtime> (fbuild-packages); pyo3_async_runtimes::tokio::get_runtime() (fbuild-python)
Channels 8 tokio::sync::mpsc direct usage in daemon/build → fbuild_core::channel
Canonicalize / std::fs in async 10 + 2 2 daemon-handler std::fs::*fbuild_core::fs::*; 10 sync canonicalize sites allowlisted with in-code justification (async cascade out of scope)
Atomic writes 5 std::fs::write for state files → fbuild_core::fs::write_atomic (build_info, status_manager, symbols_cmd, clang_tools, clangd_config)
Tempfile root 4 Production tempfile::TempDir::new()tempfile::tempdir_in(temp_subdir(name))
Sleep + Duration 10 + 5 Named-constant applications + run_command(None) explicit-timeout audit
Poison-panic 22 Mutex::lock().unwrap() → `unwrap_or_else(
CLI println 256 All print macros in fbuild-cli/src/cli/**crate::output::{progress,result,warn,error,debug}
Linker println 9 Per-platform linker eprintln! + tracing::info! pairs → single tracing::debug! with platform-scoped target

Test plan

  • `soldr cargo check --workspace --all-targets` — clean
  • `soldr cargo clippy --workspace --all-targets -- -D warnings` — clean (fixed 9 `needless_borrow` + `needless_borrows_for_generic_args` lints)
  • `soldr cargo test --workspace --no-fail-fast` — exit 0

What's NOT in this PR (deferred follow-ups, still tracked in #844)

  • Item 11 (unwrap discipline sweep) — 2,238 production unwraps workspace-wide. Highest-impact files identified; per-crate sweep is multi-day work.
  • Item 10 (tempfile allowlist drive-to-zero) — 92 entries currently allowlisted in `ban_unrooted_tempdir`; most are test-only and the audit confirms only 4 production sites needed migration (done here). The allowlist cleanup is mechanical follow-up.
  • `ban_std_fs_in_async` is scoped to `fbuild-daemon/src/**` in Phase 1; broader HIR-based detection deferred.

References #844 (rolls up #845-#848).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a unified CLI output style for progress, results, warnings, errors, and debug messages.
    • Introduced shared helpers for HTTP, filesystem, time, path, and channel handling.
  • Bug Fixes

    • Improved reliability by using atomic file writes and safer temporary directories.
    • Reduced crashes from poisoned locks and added better timeout handling.
  • Chores

    • Added new lint checks to prevent direct use of banned APIs and standard printing in production code.

… migrations

Phase 1 — bridge APIs + lint crates:
- fbuild_core::http::{client, client_with_timeout, blocking_client}
  (hoisted from fbuild_packages; fbuild_packages::http now re-exports)
- fbuild_core::fs::* (curated re-export of tokio::fs::* + write_atomic)
- fbuild_core::time::{sleep, timeout, interval, Duration, +10 named constants}
- fbuild_core::channel::{bounded, unbounded, Sender, Receiver, UnboundedSender, UnboundedReceiver}
- fbuild_core::path::{canonicalize_existing, strip_unc_prefix}
- fbuild_paths::{dev_or_prod_temp_root, temp_subdir}
- fbuild_cli::output::{progress, result, warn, error, debug}

10 new dylint crates (all with zero allowlist where possible):
- ban_bare_reqwest
- ban_std_fs_in_async (scoped to fbuild-daemon/src/** in Phase 1)
- ban_tokio_fs_direct_import
- ban_std_thread_sleep
- ban_std_mpsc_in_async_reachable
- ban_tokio_mpsc_direct_import
- ban_std_fs_canonicalize
- ban_runtime_new_outside_main
- ban_poison_panic
- ban_print_in_production

Phase 2 — migrations:
- HTTP: 11 reqwest::Client::new sites → fbuild_core::http::client*
- Runtime::new(): 4 sites in fbuild-packages + 1 in fbuild-python → module
  OnceLock or pyo3_async_runtimes::tokio::get_runtime()
- Channels: 8 tokio::sync::mpsc direct usages → fbuild_core::channel
- Canonicalize: 10 sites kept sync, allowlisted by file-path (async cascade
  out of scope); 2 daemon-handler std::fs::* in async → fbuild_core::fs::*
- Atomic writes: 5 state-file writers → fbuild_core::fs::write_atomic
- Tempfile root: 4 production sites → fbuild_paths::temp_subdir(name)
- Sleep + Duration: 10 named-constant applications across daemon_client,
  deploy, library_compiler; 5 run_command(None) audit decisions
- Poison-panic: 22 Mutex/RwLock sites → unwrap_or_else(|e| e.into_inner())
- CLI println: 256 sites in fbuild-cli/src/cli/** → crate::output::*
- Linker println: 9 per-platform linker eprintln+tracing::info pairs →
  single tracing::debug! with platform-scoped target

References #844 (rolls up #845-#848). The unwrap discipline sweep
(item 11, 2,238 sites) and the bulk tempfile migration to drive
allowlist to zero (item 10) remain for follow-up — both production-
code sites in those audits got their highest-impact entries fixed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@zackees
zackees merged commit f70e5cd into main Jun 29, 2026
83 of 101 checks passed
@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a9bfa5e6-92d1-4706-934c-d5eddb4f1f9e

📥 Commits

Reviewing files that changed from the base of the PR and between ba1ed30 and 1fa069e.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (138)
  • Cargo.toml
  • ci/hooks/crate_guard.py
  • crates/fbuild-build/src/avr/avr_linker.rs
  • crates/fbuild-build/src/build_info.rs
  • crates/fbuild-build/src/build_output.rs
  • crates/fbuild-build/src/ch32v/ch32v_linker.rs
  • crates/fbuild-build/src/esp8266/esp8266_linker.rs
  • crates/fbuild-build/src/generic_arm/arm_linker.rs
  • crates/fbuild-build/src/lib.rs
  • crates/fbuild-build/src/nrf52/nrf52_linker.rs
  • crates/fbuild-build/src/renesas/renesas_linker.rs
  • crates/fbuild-build/src/sam/sam_linker.rs
  • crates/fbuild-build/src/script_runtime.rs
  • crates/fbuild-build/src/silabs/silabs_linker.rs
  • crates/fbuild-build/src/teensy/teensy_linker.rs
  • crates/fbuild-cli/src/cli/bloat_lookup.rs
  • crates/fbuild-cli/src/cli/bringup.rs
  • crates/fbuild-cli/src/cli/build.rs
  • crates/fbuild-cli/src/cli/clang_tools.rs
  • crates/fbuild-cli/src/cli/clangd_config.rs
  • crates/fbuild-cli/src/cli/compile_many.rs
  • crates/fbuild-cli/src/cli/daemon_cmd.rs
  • crates/fbuild-cli/src/cli/deploy.rs
  • crates/fbuild-cli/src/cli/device.rs
  • crates/fbuild-cli/src/cli/dispatch.rs
  • crates/fbuild-cli/src/cli/graph_cmd.rs
  • crates/fbuild-cli/src/cli/lnk.rs
  • crates/fbuild-cli/src/cli/port_scan.rs
  • crates/fbuild-cli/src/cli/purge.rs
  • crates/fbuild-cli/src/cli/reset.rs
  • crates/fbuild-cli/src/cli/serial_probe.rs
  • crates/fbuild-cli/src/cli/show.rs
  • crates/fbuild-cli/src/cli/symbols_cmd.rs
  • crates/fbuild-cli/src/daemon_client.rs
  • crates/fbuild-cli/src/lib_select.rs
  • crates/fbuild-cli/src/main.rs
  • crates/fbuild-cli/src/output.rs
  • crates/fbuild-core/Cargo.toml
  • crates/fbuild-core/src/build_log.rs
  • crates/fbuild-core/src/channel.rs
  • crates/fbuild-core/src/fs.rs
  • crates/fbuild-core/src/http.rs
  • crates/fbuild-core/src/lib.rs
  • crates/fbuild-core/src/path.rs
  • crates/fbuild-core/src/time.rs
  • crates/fbuild-core/src/usb/data.rs
  • crates/fbuild-daemon/src/device_manager.rs
  • crates/fbuild-daemon/src/handlers/emulator/avr8js_headless.rs
  • crates/fbuild-daemon/src/handlers/emulator/avr8js_npm.rs
  • crates/fbuild-daemon/src/handlers/emulator/runners.rs
  • crates/fbuild-daemon/src/handlers/emulator/shared.rs
  • crates/fbuild-daemon/src/handlers/operations/build.rs
  • crates/fbuild-daemon/src/handlers/websockets.rs
  • crates/fbuild-daemon/src/handlers/websockets_tests.rs
  • crates/fbuild-daemon/src/status_manager.rs
  • crates/fbuild-daemon/tests/build_streaming.rs
  • crates/fbuild-daemon/tests/test_emu_endpoint.rs
  • crates/fbuild-deploy/src/lib.rs
  • crates/fbuild-header-scan/src/walker.rs
  • crates/fbuild-library-select/src/lib.rs
  • crates/fbuild-packages/src/disk_cache/index/mod.rs
  • crates/fbuild-packages/src/disk_cache/index/queries.rs
  • crates/fbuild-packages/src/http.rs
  • crates/fbuild-packages/src/lib.rs
  • crates/fbuild-packages/src/library/arduino_api.rs
  • crates/fbuild-packages/src/library/esp32_framework/libs.rs
  • crates/fbuild-packages/src/library/library_compiler.rs
  • crates/fbuild-packages/src/library/library_manager.rs
  • crates/fbuild-packages/src/lnk/resolver.rs
  • crates/fbuild-packages/src/toolchain/avr.rs
  • crates/fbuild-packages/src/toolchain/esp32_metadata.rs
  • crates/fbuild-paths/src/lib.rs
  • crates/fbuild-python/src/async_serial_monitor.rs
  • crates/fbuild-python/src/daemon.rs
  • crates/fbuild-python/src/outcome.rs
  • crates/fbuild-python/src/serial_monitor.rs
  • dylints/README.md
  • dylints/ban_bare_reqwest/Cargo.toml
  • dylints/ban_bare_reqwest/README.md
  • dylints/ban_bare_reqwest/rust-toolchain.toml
  • dylints/ban_bare_reqwest/src/README.md
  • dylints/ban_bare_reqwest/src/allowlist.txt
  • dylints/ban_bare_reqwest/src/lib.rs
  • dylints/ban_poison_panic/Cargo.toml
  • dylints/ban_poison_panic/README.md
  • dylints/ban_poison_panic/rust-toolchain.toml
  • dylints/ban_poison_panic/src/README.md
  • dylints/ban_poison_panic/src/allowlist.txt
  • dylints/ban_poison_panic/src/lib.rs
  • dylints/ban_print_in_production/Cargo.toml
  • dylints/ban_print_in_production/README.md
  • dylints/ban_print_in_production/rust-toolchain.toml
  • dylints/ban_print_in_production/src/README.md
  • dylints/ban_print_in_production/src/allowlist.txt
  • dylints/ban_print_in_production/src/lib.rs
  • dylints/ban_runtime_new_outside_main/Cargo.toml
  • dylints/ban_runtime_new_outside_main/README.md
  • dylints/ban_runtime_new_outside_main/rust-toolchain.toml
  • dylints/ban_runtime_new_outside_main/src/README.md
  • dylints/ban_runtime_new_outside_main/src/allowlist.txt
  • dylints/ban_runtime_new_outside_main/src/lib.rs
  • dylints/ban_std_fs_canonicalize/Cargo.toml
  • dylints/ban_std_fs_canonicalize/README.md
  • dylints/ban_std_fs_canonicalize/rust-toolchain.toml
  • dylints/ban_std_fs_canonicalize/src/README.md
  • dylints/ban_std_fs_canonicalize/src/allowlist.txt
  • dylints/ban_std_fs_canonicalize/src/lib.rs
  • dylints/ban_std_fs_in_async/Cargo.toml
  • dylints/ban_std_fs_in_async/README.md
  • dylints/ban_std_fs_in_async/rust-toolchain.toml
  • dylints/ban_std_fs_in_async/src/README.md
  • dylints/ban_std_fs_in_async/src/allowlist.txt
  • dylints/ban_std_fs_in_async/src/lib.rs
  • dylints/ban_std_mpsc_in_async_reachable/Cargo.toml
  • dylints/ban_std_mpsc_in_async_reachable/README.md
  • dylints/ban_std_mpsc_in_async_reachable/rust-toolchain.toml
  • dylints/ban_std_mpsc_in_async_reachable/src/README.md
  • dylints/ban_std_mpsc_in_async_reachable/src/allowlist.txt
  • dylints/ban_std_mpsc_in_async_reachable/src/lib.rs
  • dylints/ban_std_thread_sleep/Cargo.toml
  • dylints/ban_std_thread_sleep/README.md
  • dylints/ban_std_thread_sleep/rust-toolchain.toml
  • dylints/ban_std_thread_sleep/src/README.md
  • dylints/ban_std_thread_sleep/src/allowlist.txt
  • dylints/ban_std_thread_sleep/src/lib.rs
  • dylints/ban_tokio_fs_direct_import/Cargo.toml
  • dylints/ban_tokio_fs_direct_import/README.md
  • dylints/ban_tokio_fs_direct_import/rust-toolchain.toml
  • dylints/ban_tokio_fs_direct_import/src/README.md
  • dylints/ban_tokio_fs_direct_import/src/allowlist.txt
  • dylints/ban_tokio_fs_direct_import/src/lib.rs
  • dylints/ban_tokio_mpsc_direct_import/Cargo.toml
  • dylints/ban_tokio_mpsc_direct_import/README.md
  • dylints/ban_tokio_mpsc_direct_import/rust-toolchain.toml
  • dylints/ban_tokio_mpsc_direct_import/src/README.md
  • dylints/ban_tokio_mpsc_direct_import/src/allowlist.txt
  • dylints/ban_tokio_mpsc_direct_import/src/lib.rs
  • dylints/ban_unrooted_tempdir/src/allowlist.txt

📝 Walkthrough

Walkthrough

Introduces shared bridge modules in fbuild-core (channel, fs, http, time, path) centralizing tokio mpsc, atomic file writes, reqwest HTTP clients, and timeout constants. Adds 10 custom dylint lints enforcing exclusive use of these bridges. Migrates all affected call sites across fbuild-build, fbuild-cli, fbuild-daemon, fbuild-packages, and fbuild-python. Adds a structured output.rs module in fbuild-cli and migrates all CLI stdout/stderr to it. Hardens mutex poison handling and subprocess timeout handling throughout.

Changes

Bridge Sweep: Core APIs, Dylints, and Codebase Migration

Layer / File(s) Summary
fbuild-core bridge modules
crates/fbuild-core/Cargo.toml, crates/fbuild-core/src/channel.rs, crates/fbuild-core/src/fs.rs, crates/fbuild-core/src/http.rs, crates/fbuild-core/src/time.rs, crates/fbuild-core/src/path.rs, crates/fbuild-core/src/lib.rs, crates/fbuild-core/src/build_log.rs
Adds channel (tokio mpsc aliases bounded/unbounded), fs (write_atomic + tokio::fs re-exports), http (shared reqwest::Client singleton via OnceLock, blocking_client), time (named Duration constants + tokio::time re-exports), and path (strip_unc_prefix, canonicalize_existing); wires all into lib.rs; migrates BuildLog.sender to crate::channel::UnboundedSender.
fbuild-paths temp helpers + rooted temp dirs
crates/fbuild-paths/src/lib.rs, crates/fbuild-build/src/script_runtime.rs, crates/fbuild-packages/src/library/arduino_api.rs, crates/fbuild-packages/src/library/esp32_framework/libs.rs, dylints/ban_unrooted_tempdir/src/allowlist.txt
Adds dev_or_prod_temp_root() and temp_subdir(name) to fbuild-paths; migrates script_runtime, arduino_api, and esp32_framework temp directory creation to tempdir_in(temp_subdir(...)) instead of system temp; removes script_runtime.rs from the ban_unrooted_tempdir allowlist.
Dylint import-banning lints (7 lints)
dylints/ban_tokio_fs_direct_import/*, dylints/ban_tokio_mpsc_direct_import/*, dylints/ban_bare_reqwest/*, dylints/ban_std_fs_canonicalize/*, dylints/ban_std_fs_in_async/*, dylints/ban_std_mpsc_in_async_reachable/*, dylints/ban_std_thread_sleep/*
Seven new deny-level LateLintPass crates, each with Cargo.toml, README.md, rust-toolchain.toml, allowlist.txt, and lib.rs implementing production-scope filtering, bridge-module exemptions, DefId path matching, and unit tests; ban direct tokio::fs imports, tokio::sync::mpsc imports, bare reqwest client construction, std::fs::canonicalize/tokio::fs::canonicalize, std::fs::* in async contexts, std::sync::mpsc, and std::thread::sleep.
Dylint behavior-banning lints (3 lints)
dylints/ban_runtime_new_outside_main/*, dylints/ban_poison_panic/*, dylints/ban_print_in_production/*
Three new deny-level lints: ban_runtime_new_outside_main detects tokio::runtime::Runtime::new/Builder::new_* outside main.rs/src/bin/tests via HIR cfg(test) parent-walk; ban_poison_panic detects .unwrap()/.expect() on LockResult/TryLockResult from std::sync::Mutex/RwLock methods; ban_print_in_production detects println!/eprintln!/print!/eprint! in fbuild-cli and fbuild-build scopes except output.rs.
Workspace exclusions and CI guard
Cargo.toml, ci/hooks/crate_guard.py, dylints/README.md
Adds 10 new dylints/* entries to workspace exclude; adds matching entries to APPROVED_CRATE_DIRS in the CI guard hook; documents all 10 lints in dylints/README.md.
CLI output bridge module + full migration
crates/fbuild-cli/src/output.rs, crates/fbuild-cli/src/main.rs, crates/fbuild-cli/src/cli/... (18 files)
Creates output.rs with five typed functions (progresstracing::info!, resultprintln!, warntracing::warn!, errortracing::error!, debugtracing::debug!); migrates all println!/eprintln! in dispatch, build, bringup, bloat_lookup, clang_tools, clangd_config, compile_many, daemon_cmd, deploy, device, graph_cmd, lnk, port_scan, purge, reset, serial_probe, show, and symbols_cmd to use these helpers.
Channel and HTTP call-site migration
crates/fbuild-build/src/..., crates/fbuild-daemon/src/handlers/..., crates/fbuild-cli/src/daemon_client.rs, crates/fbuild-packages/src/http.rs, crates/fbuild-python/src/...
Migrates all tokio::sync::mpsc usage to fbuild_core::channel across BuildParams, build_output, BuildLog, daemon emulator/build/websocket handlers; migrates all reqwest::Client::new() to fbuild_core::http::client() or client_with_timeout() across daemon client, packages HTTP module (converted to re-export), fbuild-python, and integration tests; replaces hardcoded timeout literals in DaemonClient with named fbuild_core::time constants.
Atomic write adoption + mutex poison hardening
crates/fbuild-build/src/build_info.rs, crates/fbuild-daemon/src/status_manager.rs, crates/fbuild-cli/src/cli/clangd_config.rs, crates/fbuild-cli/src/cli/symbols_cmd.rs, crates/fbuild-cli/src/cli/clang_tools.rs, crates/fbuild-daemon/src/device_manager.rs, crates/fbuild-packages/src/disk_cache/index/..., crates/fbuild-core/src/usb/data.rs, crates/fbuild-packages/src/lib.rs
Adopts fbuild_core::fs::write_atomic (via tokio bridging) in build_info, status_manager, clangd_config, symbols_cmd, and clang_tools. Replaces all mutex.lock().unwrap() with `unwrap_or_else(
Runtime lifecycle, subprocess timeouts, linker logging, misc
crates/fbuild-packages/src/library/library_manager.rs, crates/fbuild-packages/src/lnk/resolver.rs, crates/fbuild-packages/src/toolchain/esp32_metadata.rs, crates/fbuild-python/src/serial_monitor.rs, crates/fbuild-packages/src/library/library_compiler.rs, crates/fbuild-daemon/src/handlers/emulator/..., crates/fbuild-deploy/src/lib.rs, crates/fbuild-build/src/*/...linker.rs
Adds OnceLock-based fallback_runtime() helper in library_manager, lnk/resolver, and esp32_metadata; migrates SerialMonitor to &'static Runtime from pyo3; adds explicit timeouts to compile_one_source, archive_objects, find_node, find_simavr, and npm install; switches emulator runners to fbuild_core::fs async APIs; replaces deploy post_deploy_recovery hardcoded durations with fbuild_core::time constants; migrates 9 linker verbose-logging sites from eprintln!+tracing::info! to tracing::debug!; adds allowlist-rationale comments to sync canon() helpers.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related issues

Possibly related PRs

Poem

🐇 Hoppity-hop through the code I go,
No bare reqwest, no eprintln! show,
Ten lints to guard each async gate,
One write_atomic sets the state.
Bridges built, the sweep is done—
This bunny's work has just begun! 🌿

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/internal-bridges-844

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.

@zackees
zackees deleted the fix/internal-bridges-844 branch June 29, 2026 21:29
zackees added a commit that referenced this pull request Jun 29, 2026
Releases the post-#813 / #802 / #826 / #844 work landed across:
- PR #843 — workspace-wide timeout sweep (#802 family)
- PR #837, #849, #850, #851 — internal-bridges + dylint sweep (#826 + #844)
- PR #842 — async migration follow-ups (#813)

15 dylints now ship in dylints/ (4 from earlier, 10 from #826/#844,
plus the renamed ban_unwrap_in_production). 7 internal bridge APIs:
fbuild_core::{http, fs, time, channel, path::canonicalize_existing},
fbuild_paths::temp_subdir, fbuild_cli::output.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@fastled-project-sync fastled-project-sync Bot moved this to Triage in FastLED Tracker Jun 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Triage

Development

Successfully merging this pull request may close these issues.

1 participant