tools/manual_tests/frb-local-docker-dev-env.md
Verify that the per-worktree FRB Docker development container can run the normal headless local validation surface: Rust tests, Dart native tests, Dart web tests, Flutter web tests, Linux Flutter native tests, Linux Flutter release builds, and the internal development entrypoint. This test also records that Docker is not the Android emulator, iOS Simulator, or macOS GUI runtime strategy.
.claude/skills/frb-manual-test/SKILL.md, .claude/skills/frb-dev-env/SKILL.md, .claude/skills/frb-docker/SKILL.md, .claude/skills/frb-test/SKILL.mdRun this after changing the FRB Docker image, devcontainer setup, per-worktree Docker helper, Rust/Dart/web/Linux Flutter test tooling, Linux Flutter build tooling, or Flutter/Rust/Dart versions. It is also useful before relying on a new local machine or worktree for headless FRB development.
fzyzcjy/flutter_rust_bridgechromedriver on PATH and a headless WebDriver setup for the container architecture. The Docker image must provide this for both amd64 and arm64 local containers.rust-src and llvm-tools-preview on the pinned nightly Rust toolchain because build-web --dart-coverage builds the standard library with -Z build-std under cargo llvm-cov.xvfb-run.flutter --version inside the Docker container.dart --version inside the Docker container.rustc --version and cargo --version inside the Docker container.linux device inside the container.Run preparation commands from the repository root of the checkout being tested.
git rev-parse --show-toplevel
git status --short
git submodule update --init --recursive
docker version
.claude/skills/frb-dev-env/frb_dev_env.py docker info
.claude/skills/frb-dev-env/frb_dev_env.py docker create
Confirm the container can run commands at the host-like worktree path.
.claude/skills/frb-dev-env/frb_dev_env.py docker exec -- bash -lc 'pwd && ./frb_internal --help'
Verify the Docker image already contains the pinned nightly Rust toolchain components needed by the Flutter web coverage step.
.claude/skills/frb-dev-env/frb_dev_env.py docker exec -- bash -lc '
set -euo pipefail
nightly_version="$(awk -F= '"'"'/^ARG RUST_NIGHTLY_VERSION=/{print $2; exit}'"'"' .devcontainer/Dockerfile)"
nightly_toolchain="nightly-${nightly_version}"
rustup toolchain list | grep "${nightly_toolchain}"
rustup component list --toolchain "${nightly_toolchain}" --installed | grep rust-src
rustup component list --toolchain "${nightly_toolchain}" --installed | grep llvm-tools
'
frb_rust, frb_dart, and frb_example/pure_dart.Record container tool versions and browser availability.
.claude/skills/frb-dev-env/frb_dev_env.py docker exec -- bash -lc '
set -euo pipefail
flutter --version
dart --version
rustc --version
cargo --version
uname -a
cmake --version
ninja --version
pkg-config --version
xvfb-run --help >/dev/null
"${CHROME_BIN:-google-chrome}" --version || chromium --version || chromium-browser --version
chromedriver --version
'
Run a focused Rust package test in Docker.
.claude/skills/frb-dev-env/frb_dev_env.py docker exec -- ./frb_internal test-rust-package --package frb_rust
Run a focused Dart native test in Docker.
.claude/skills/frb-dev-env/frb_dev_env.py docker exec -- ./frb_internal test-dart-native --package frb_dart
Run a focused Dart web test in Docker.
.claude/skills/frb-dev-env/frb_dev_env.py docker exec -- ./frb_internal test-dart-web --package frb_example/pure_dart
Run a focused Flutter web coverage test in Docker.
.claude/skills/frb-dev-env/frb_dev_env.py docker exec -- ./frb_internal test-flutter-web --package frb_example/flutter_via_create --coverage
Run a focused Linux Flutter native integration test in Docker through a headless display.
.claude/skills/frb-dev-env/frb_dev_env.py docker exec -- xvfb-run -a ./frb_internal test-flutter-native --package frb_example/flutter_via_create --flutter-test-args '--device-id linux'
Smoke-test the Linux Flutter release build command in Docker.
.claude/skills/frb-dev-env/frb_dev_env.py docker exec -- ./frb_internal build-flutter --target linux
Confirm the checkout did not gain unexpected generated or cache files.
git status --short
The Docker environment coverage test passes when every command exits successfully and the terminal log shows that the commands ran inside the per-worktree container. The web step must run through a headless browser without requiring a visible GUI session. The Linux Flutter native step must run against Flutter's linux device through a headless display, and the Linux build step must copy release artifacts into target/build_flutter_output.
./frb_internal test-rust-package --package frb_rust
./frb_internal test-dart-native --package frb_dart
./frb_internal test-dart-web --package frb_example/pure_dart
./frb_internal test-flutter-web --package frb_example/flutter_via_create --coverage
xvfb-run -a ./frb_internal test-flutter-native --package frb_example/flutter_via_create --flutter-test-args '--device-id linux'
./frb_internal build-flutter --target linux
The test fails if any of the following happens:
Unable to start a WebDriver session because no compatible chromedriver is available.linux device, cannot start under xvfb-run, or exits non-zero unexpectedly.target/build_flutter_output.git status --short shows unexpected local changes after the run.The test is blocked, not failed, if the Docker image cannot be pulled because of network or registry access.
docker info.git status --short output.git submodule update --init --recursive and record the output..claude/skills/frb-dev-env/frb_dev_env.py docker create and record the helper output.Cargo.lock under the nightly standard library source, verify the container is using the current Docker image and that the image has rust-src installed for the pinned nightly toolchain.can't find crate for profiler_builtins, verify the container is using the current Docker image and that the image has llvm-tools-preview installed for the pinned nightly toolchain.flutter devices, xvfb-run --help, and whether the log mentions GTK, display, OpenGL, or missing Linux desktop dependencies.flutter doctor -v, cmake --version, ninja --version, and pkg-config --version from inside the container.git status --short output and inspect whether the tested command intentionally regenerated it.The per-worktree Docker container may be kept for future local FRB development. Delete it only when the worktree no longer needs the cached environment.
git status --short
.claude/skills/frb-dev-env/frb_dev_env.py docker info
If cleanup requires deleting the container, run:
.claude/skills/frb-dev-env/frb_dev_env.py docker delete
Most commands in this report are already suitable for automation. Keep this manual report as a local environment acceptance check for machines, worktrees, and Docker helper changes that are outside the normal CI runner lifecycle.