Use when running focused flutter_rust_bridge GitHub Actions CI via ci_filter, adding/removing the ci-manual-dispatch PR label, choosing exact CI jobs or matrix entries, documenting intentionally partial CI runs, or repeatedly validating an exact CI target on one commit.
70
86%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Use this skill when CI feedback is too expensive and the current task needs a focused GitHub Actions signal instead of automatic full CI.
The preferred mechanism is the formal workflow_dispatch input in .github/workflows/ci.yaml:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=<filter>'Do not temporarily hack workflow jobs just to get partial CI unless the formal filter cannot express the target.
full
job_id
job_a,job_b
job_id[dimension=value]
job_id[dimension=value|other_value,other_dimension=value]
job_a,job_b[dimension=value]full or * runs the normal full CI plan.job_id runs the whole job, including its full matrix if it has one.job_id[...] runs only matching matrix entries.dimension=value.dimension=value conditions inside brackets are ANDed.| means OR within one dimension.image, package, device, api-level, sanitizer, platforms, and nested matrix.info keys such as platform, target, version.api-level=35.Plan :: CI job.Use the ci-manual-dispatch PR label when an agent or human wants to prevent automatic PR CI from running the full surface while iterating.
gh pr edit <pr-number> --add-label ci-manual-dispatchWith the label present:
workflow_dispatch remains available for explicit focused runsBefore final readiness:
gh pr edit <pr-number> --remove-label ci-manual-dispatchThen let the normal full CI surface run. Removing the label triggers PR CI because the workflow listens to labeled and unlabeled pull request events.
Manual workflow_dispatch runs of .github/workflows/ci.yaml comment from Plan :: CI on the matching open PR with the selected ci_filter and run link; normal push and pull_request runs do not comment.
Before dispatching an expensive manual run, smoke the filter locally:
./frb_internal plan-ci --filter 'test_dart_web[package=frb_example--pure_dart_pde]'The command emits a GitHub Actions output line:
plan={...}The workflow consumes it with paths like:
fromJSON(needs.plan_ci.outputs.plan).test_dart_web.enable
fromJSON(needs.plan_ci.outputs.plan).test_dart_web.matrixThat output shape is intentional; each CI job has its own top-level entry containing enable, and matrix jobs also contain matrix.
Use repeated precise validation when a flaky fix needs several independent executions of one CI job or matrix entry on exactly the same commit.
./frb_internal plan-ci --filter '<filter>' before dispatching.workflow_dispatch runs, not one run with five matrix copies and not five attempts of one run.ci_filter to every dispatch.headSha; a branch name alone is not evidence that queued runs used the same commit.Record the immutable input:
branch=codex/example-fix
expected_sha=$(git rev-parse HEAD)
filter='test_dart_web[package=frb_example--pure_dart]'
git push -u origin "$branch"Dispatch five independent runs. Manual dispatches use unique concurrency groups, so these runs do not cancel one another:
for run_number in 1 2 3 4 5; do
gh workflow run ci.yaml --ref "$branch" -f "ci_filter=$filter"
doneList the candidate runs once, then select the five runs created for this validation window:
gh run list \
--workflow ci.yaml \
--branch "$branch" \
--event workflow_dispatch \
--limit 10 \
--json databaseId,createdAt,headSha,status,conclusion,urlFor each selected run:
headSha == expected_sha.Plan :: CI creates only the requested job or matrix entry.Do not claim “5/5” from any of these shapes:
headSha values differ.These examples are protected by tools/frb_internal/test/ci_plan_test.dart; update that test whenever adding or changing examples here.
Full CI:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=full'One non-matrix job:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=lint_dart_primary'Several whole jobs:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=lint_dart_primary,test_dart_web'One non-matrix job plus one matrix entry:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=lint_dart_primary,test_dart_web[package=frb_example--pure_dart]'One Dart web package:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=test_dart_web[package=frb_example--pure_dart_pde]'Two Dart web packages:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=test_dart_web[package=frb_dart|frb_example--pure_dart_pde]'Two Dart web packages plus one non-matrix job:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=test_dart_web[package=frb_dart|frb_example--pure_dart_pde],lint_rust_primary'Two precise matrix tuples in the same job:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=test_rust[image=ubuntu-latest,version=nightly],test_rust[image=ubuntu-latest,version=1.85.0]'One Dart native package on Linux:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=test_dart_native[image=ubuntu-24.04,package=tools--frb_internal]'Rust tests on selected toolchains:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=test_rust[image=ubuntu-latest,version=nightly|1.85.0]'One Flutter desktop package on Linux:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=test_flutter_native_desktop[platform=linux,package=frb_example--gallery]'One Android emulator matrix entry:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=test_flutter_native_android[package=frb_example--flutter_via_create,device=pixel,api-level=35]'One iOS simulator matrix entry:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=test_flutter_native_ios[device=iPhone 16 Pro Max Simulator (18.6),package=frb_example--rust_ui_counter--ui]'One codegen command-generate entry:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=generate_run_frb_codegen_command_generate[image=ubuntu-24.04,package=frb_example--integrate_third_party]'One OHOS command-integrate entry:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=generate_run_frb_codegen_command_integrate[platforms=ohos]'One sanitizer entry:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=test_dart_sanitizer[sanitizer=asan,package=frb_example--pure_dart]'One benchmark runner:
gh workflow run ci.yaml --ref <branch> -f 'ci_filter=bench_dart_native[image=ubuntu-24.04]'For intentional red reproduction PRs:
ci_filter in the PR body.For ordinary iteration branches:
ci-manual-dispatch and run normal CI.Before pushing changes to the filter mechanism or examples:
cd tools/frb_internal
dart test test/ci_plan_test.dartUseful smoke check:
./frb_internal plan-ci --filter 'test_dart_web[package=frb_example--pure_dart_pde]'8f2ab1b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.