Skip to content

fix(bazel): //:falcon-cascade has not built since #393 — wire falcon-core - #408

Merged
avrabe merged 4 commits into
mainfrom
fix/bazel-cascade-falcon-core
Sep 16, 2026
Merged

avrabe merged 4 commits into
mainfrom
fix/bazel-cascade-falcon-core

Conversation

@avrabe

@avrabe avrabe commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

Verify-Filter: (or (has-tag "verification-gate") (has-tag "wasm"))

Closes #397. Refs #407.

What was broken

#393 rewrote the cascade component to wrap falcon_core::FlightCore instead of
composing five stage interfaces. The cargo build was updated. The bazel
target was not, and still carried the comment from when it was true:

# No control-crate dep: the cascade is pure orchestration.
rust_wasm_component_bindgen(name = "falcon-cascade", ...)   # no deps at all

unresolved import falcon_core on every main commit since 2026-09-11 — red, and
blocking nothing, because Bazel is not a required context.

The repair

12 new rust_library targets (falcon-core's closure is 15 crates;
relay-math, relay-iekf and relay-mix-quad already had one). Their deps are
generated from each crate's Cargo.toml rather than hand-listed — a bazel
dep set that drifts from the cargo one is precisely the defect class this target
is being repaired for, and hand-maintaining twelve of them is how it happens
again.

embedded-io + embedded-io-async were the only out-of-repo dependency in
the closure and were not in the bazel crate universe (the only @crates// label
anywhere in BUILD.bazel is wit-bindgen). Both are pure no_std with no build
script, so they get the same http_archive treatment as libm, with the
Cargo.lock checksums as sha256.

Both also needed compile_data = ["README.md"] — their lib.rs does
#![doc = include_str!("../README.md")], so without the README in the sandbox
they do not compile at all.

Verified

  • bazel build //:falcon-cascade — succeeds
  • bazel build //:falcon-cascade-fused — fuses
  • all 19 targets bazel.yml builds — succeed

A correction to #397, which I overclaimed

The issue said this breakage also stopped the cascade's witness MC/DC
coverage
being produced, and called that the real loss. That was wrong:

$ grep -rn 'falcon-cascade-coverage' .github/workflows/
(no output)

//:falcon-cascade-coverage is tags = ["manual"] and is in no workflow,
so CI has never built it — before #393 or after. The regression was narrower
than claimed; the coverage gap is older and separate, now #407.

The same correction is applied inside SWREQ-RELAY-VGATE-P04, as a correction
rather than a silent edit — attributing a long-standing absence to the most
recent change is exactly the failure that requirement exists to prevent.

Uncovered one layer down

With the build fixed, the coverage target now reaches the fuse and fails
differently — duplicate export name cabi_realloc$2 — filed as #407 rather than
folded in here.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HvusAXYbHLyv3uTzfBcMbG

avrabe and others added 3 commits September 16, 2026 06:03
…core (#397)

#393 rewrote the cascade component to wrap `falcon_core::FlightCore` instead of
composing five stage interfaces. The CARGO build was updated. The BAZEL target
was not, and still carried the comment from when it was true:

    # No control-crate dep: the cascade is pure orchestration.
    rust_wasm_component_bindgen(name = "falcon-cascade", ...)   # no deps at all

So it has failed with `unresolved import falcon_core` on every main commit since
2026-09-11, red and blocking nothing (Bazel is not a required context).

THE CLOSURE. falcon-core's transitive closure is 15 crates; relay-math,
relay-iekf and relay-mix-quad already had targets, so 12 were added. Their deps
are GENERATED from each crate's Cargo.toml rather than hand-listed — a bazel dep
set that drifts from the cargo one is the same defect class this target is being
repaired for, and hand-maintaining twelve of them is how it would happen again.

THE ONE OUT-OF-REPO DEPENDENCY. falcon-gnss-ubx needs embedded-io +
embedded-io-async, which were not in the bazel crate universe — the only
`@crates//` label used anywhere in BUILD.bazel is wit-bindgen. Both are pure
no_std with no build script (embedded-io has no deps; embedded-io-async depends
only on embedded-io), so they get the same http_archive treatment as libm, with
the Cargo.lock checksums as sha256.

Both needed `compile_data = ["README.md"]`: their lib.rs does
`#![doc = include_str!("../README.md")]`, so without the README in the sandbox
the crate does not compile at all.

VERIFIED: all 19 targets bazel.yml builds now succeed, and //:falcon-cascade-fused
fuses.

A CORRECTION TO #397, WHICH I OVERCLAIMED. The issue said this also stopped the
cascade's witness MC/DC coverage from being produced. It did not:
//:falcon-cascade-coverage is `tags = ["manual"]` and is referenced by NO
workflow, so CI has never built it — before #393 or after. The real regression
is narrower: a red build gate and a fused image that stopped building. The
coverage target not being in CI is a separate, older gap.

It does now get further and fail differently — `duplicate export name
cabi_realloc$2 already defined` out of the fuse — which is filed separately
rather than folded in here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvusAXYbHLyv3uTzfBcMbG
…407)

The artifact's first draft said the Bazel breakage stopped the cascade's witness
MC/DC coverage being produced. It did not: //:falcon-cascade-coverage is
tags=["manual"] and is in no workflow, so CI has never produced it — before
#393 or after. The breakage was narrower; the coverage gap is older and
separate, now #407.

Kept as a correction inside the artifact rather than a silent edit, because
attributing a long-standing absence to the most recent change is precisely the
failure this requirement exists to prevent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvusAXYbHLyv3uTzfBcMbG
A comment describing a CURRENT breakage becomes false the moment it is fixed —
the same defect class the comment is recording. Caught by the documentation
audit, in this very diff, before it landed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvusAXYbHLyv3uTzfBcMbG
@avrabe
avrabe enabled auto-merge (squash) September 16, 2026 04:14
@avrabe
avrabe merged commit 31cbb2a into main Sep 16, 2026
13 checks passed
@avrabe
avrabe deleted the fix/bazel-cascade-falcon-core branch September 16, 2026 04:43
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.

bazel: //:falcon-cascade has not built since #393 — witness MC/DC coverage of the cascade is silently not being produced

1 participant