Context
Rollup of the sub-issues that remained open when the Phase-1 profiling meta #942 was closed. #942 delivered the harness + the major wins (no-op rebuild 108 s → 2.1 s, cold toolchain∥framework overlap, fw-libs workspace-relative, plus correctness/hygiene fixes — 15 PRs). These residuals are genuinely cross-repo, CI-infra, or P3, so they're tracked here rather than blocking the (now-closed) #942.
The same reproducible harness applies: ci/docker-profile/ (#950), NightDriverStrip demo, cold vs hot, fbuild cache not persisted between runs. Compile settings stay frozen — value comes from caching, concurrency, and pipeline overlap only.
Burndown
High value — the real warm-cache win (cross-repo)
CI-infra — makes the guardrails actually enforce
Correctness — rebuild-signature family (continues #951/#956/#957)
Cold-pipeline overlap — further (continues #953/#967)
P3
Acceptance criteria
Decisions
Context
Rollup of the sub-issues that remained open when the Phase-1 profiling meta #942 was closed. #942 delivered the harness + the major wins (no-op rebuild 108 s → 2.1 s, cold toolchain∥framework overlap, fw-libs workspace-relative, plus correctness/hygiene fixes — 15 PRs). These residuals are genuinely cross-repo, CI-infra, or P3, so they're tracked here rather than blocking the (now-closed) #942.
The same reproducible harness applies:
ci/docker-profile/(#950), NightDriverStripdemo, cold vs hot, fbuild cache not persisted between runs. Compile settings stay frozen — value comes from caching, concurrency, and pipeline overlap only.Burndown
High value — the real warm-cache win (cross-repo)
ZccacheServicederives itskey_rootfrom the git root / cwd, not the per-compile request. Fix: add a per-requestworktree_roottoZccacheService::compilein thezackees/zccachecrate, then have fbuild pass each build's workspace through it (both the in-process service path and thezccache wrapfw-libs path). Unlocks sub-second warm sketch/core/fw-libs. Supersedes the remainder of perf(build): framework libs (~150s) recompiled per project; core cache never hydrates #952.CI-infra — makes the guardrails actually enforce
main. cargo-dylint 5.0.0 buildslib<name>.sothen looks forlib<name>@<toolchain>.so; the post-hoc alias loop can't converge because cargo-dylint's check runs at build time. Real fix: wiredylint-linkas the link-time linker for the lint-crate build (so the@<toolchain>name is produced at link time), or upgrade the cargo-dylint/dylint_linting/driver triple together. Until fixed,ban_raw_subprocess+ban_raw_path_prefix_compare(feat(dylint): ban raw Path::{starts_with, strip_prefix} so the #952 cache-key mistake can't recur #963) are authored but not enforced.Correctness — rebuild-signature family (continues #951/#956/#957)
Esp32Compiler::rebuild_signature(and the default/ch32v/renesas overrides) hash raw flags, but the write side stripsbuild_unflagsviaapply_compile_unflagsbefore hashing → persistent recompiles for any project that setsbuild_unflags(latent for NightDriverStrip, which sets none). Fix: apply the same unflag stripping inside the signature computation (prefer centralizing). Needs abuild_unflagsfixture to validate.Cold-pipeline overlap — further (continues #953/#967)
lib_depsdownloads in the background to overlap the toolchain/SDK fetch, and start the core/fw-libs compile as soon as the toolchain + framework core-sources exist while the SDK libs finish extracting.P3
esptoolas a managed package instead of the harness workaround.gen_esp32part.py(framework-parity follow-up to fix(build): project-relative board_build.partitions CSV not found (resolved against framework tools dir) #955).Acceptance criteria
main.build_unflagsregression test.Decisions