Skip to content

feat(falcon): v0.1.0 — dual-DNA flight stack first release#9

Merged
avrabe merged 3 commits into
mainfrom
falcon/v0.1
May 19, 2026
Merged

feat(falcon): v0.1.0 — dual-DNA flight stack first release#9
avrabe merged 3 commits into
mainfrom
falcon/v0.1

Conversation

@avrabe
Copy link
Copy Markdown
Contributor

@avrabe avrabe commented May 19, 2026

Summary

First tagged release of falcon, the dual-DNA flight stack inside relay. v0.1 is pre-product: boots, exchanges MAVLink heartbeats with a ground control station over UDP, ships the verified toolchain end-to-end with the rivet evidence chain in CI.

relay routes. falcon flies.

What lands

  • WIT interfaces: relay-mavlink/protocol.wit, relay-control/dynamics.wit, wit/worlds/relay-falcon.wit (falcon-quad / hex / coax world specs).
  • Crates (no_std + no_alloc): relay-mavlink (33 tests, MAVLink v2 codec with CRC-16/MCRF4XX validated against reference vector 0x6F91); relay-ekf-stub (9 tests, placeholder estimator).
  • Example: examples/falcon-hello — runnable --mode vehicle/gcs UDP demo with 9 integration tests including a real-socket round-trip.
  • Scripts / tooling: scripts/falcon-hello-demo.sh end-to-end smoke; scripts/run-falcon-verification.py extracts and runs fields.steps[].run from rivet artifacts (spar pattern); tools/post_verification_comment.py posts the sticky Markdown comment.
  • Rivet jumpstart artifacts (25 total): STKH, 10 SYSREQ, SWARCH (Leeloo cross-DNA), 5 SWDD, 7 SWREQ groups, 10 FEAT (release plan with depends-on), 3 FV with extractable fields.steps.
  • GitHub Actions: ci.yml (fmt + clippy + test multi-OS + smoke), verification-gate.yml (rivet-driven PR gate with sticky comment), release.yml (tag-triggered 5-target build + cosign keyless + SHA-256 + GitHub release).
  • Top-level: README.md, CHANGELOG.md, LICENSE (Apache-2.0), falcon/README.md (full v0.1 → v1.0 release plan), .github/release-notes/v0.1.0.md.

Verification posture

check result
cargo test --workspace 49 test suites green, 0 failures
bash scripts/falcon-hello-demo.sh PASS (14/14 heartbeats over UDP)
python3 scripts/run-falcon-verification.py --markdown ✅ 3/3 falcon FV artifacts, 8/8 steps green
rivet validate 0 broken cross-references

Test plan

  • CI workflow runs and passes (fmt / clippy / test / falcon-hello-demo smoke)
  • Verification gate workflow runs, posts sticky comment with ✅ 3/3 passed
  • Clone the branch locally, run cargo run -p falcon-hello -- --mode gcs in one terminal and --mode vehicle in another; observe heartbeats flow
  • (optional) Connect QGroundControl on 127.0.0.1:14550, verify vehicle appears in QGC list

After merge

git tag -a falcon-v0.1.0 -m "falcon v0.1.0 — boots and waves"
git push origin falcon-v0.1.0

The release.yml workflow then builds five-target binaries (linux x86_64/aarch64, macOS x86_64/aarch64, windows x86_64), cosign-keyless-signs each with Fulcio OIDC, computes SHA-256 checksums, and creates the GitHub Release with notes from .github/release-notes/v0.1.0.md.

Honestly deferred (per the witness-style incremental discipline)

  • Verus SMT proofs on new crates → v0.2 with real EKF
  • witness MC/DC coverage on WASM → v0.2 (needs P3 streams + wit-bindgen)
  • Gazebo SITL hookup → v0.3
  • Hardware bring-up → v0.6
  • Six-domain credit dossier → v1.0

See falcon/README.md for the full release plan.

🤖 Generated with Claude Code

avrabe and others added 2 commits May 19, 2026 06:39
The first tagged release of falcon, the dual-DNA flight stack built
inside relay (cFS-isomorphic mission DNA + PX4-style control DNA
fused at build time by meld). v0.1 is pre-product: boots, exchanges
MAVLink heartbeats with a ground control station over UDP, ships
the verified toolchain end-to-end with the rivet evidence chain in
CI.

What lands:

WIT
- wit/interfaces/relay-mavlink/protocol.wit (heartbeat, frame, codec-error)
- wit/interfaces/relay-control/dynamics.wit (imu-sample, vehicle-state,
  setpoint records for the control cascade)
- wit/worlds/relay-falcon.wit (falcon-quad, -hex, -coax worlds)

Crates (no_std + no_alloc)
- relay-mavlink — MAVLink v2 codec with CRC-16/MCRF4XX validated against
  reference vector 0x6F91, HEARTBEAT encode/decode (id=0, CRC_EXTRA=50),
  bounds-checked frame parsing. 33 unit + proptest cases.
- relay-ekf-stub — v0.1 placeholder estimator; emits identity attitude,
  healthy innovation. 9 unit + proptest cases. Real EKF in v0.2.

Example
- examples/falcon-hello — runnable demo binary with --mode vehicle and
  --mode gcs; exchanges MAVLink heartbeats over UDP loopback. 9
  integration tests including a real-socket round-trip.

Scripts and tooling
- scripts/falcon-hello-demo.sh — end-to-end smoke runner
- scripts/run-falcon-verification.py — spar-style extractor that runs
  fields.steps[].run from rivet artifacts, emits Markdown summary
- tools/post_verification_comment.py — sticky-comment poster for the
  verification gate

Rivet jumpstart artifacts (25 total)
- STKH-FALCON-001 stakeholder requirement
- SYSREQ-FALCON-001..010 system requirements
- SWARCH-FALCON-001 architecture (Leeloo cross-DNA composition)
- SWDD-FALCON-{EKF,RATE,ATT,POS,MIX}-001 detailed designs
- SWREQ-FALCON-{EKF,RATE,ATT,POS,MIX,MAVLINK,WORLD}-P0* sw reqs
- FEAT-FALCON-v0.1..v1.0 release-plan milestones with depends-on
- FV-FALCON-{MAVLINK,EKF-STUB,WORLD}-001 verification artifacts each
  carrying fields.method + fields.steps[{run: ...}] in the same shape
  spar uses, so the verification gate can extract and execute them.

GitHub Actions
- .github/workflows/ci.yml — fmt + clippy + cargo test (linux/macos/
  windows) + falcon-hello-demo smoke
- .github/workflows/verification-gate.yml — rivet-driven PR gate that
  runs the extracted steps and posts a sticky Markdown comment
- .github/workflows/release.yml — tag-triggered (falcon-v*) build of
  five-target binaries with cosign keyless OIDC signing + SHA-256
  checksums + GitHub release creation

Top-level
- README.md, CHANGELOG.md, LICENSE (Apache-2.0)
- falcon/README.md (full v0.1 → v1.0 release plan)
- .github/release-notes/v0.1.0.md (release body)
- .gitignore: ignore .claude/

Verification posture
- cargo test --workspace: 49 test suites green
- bash scripts/falcon-hello-demo.sh: PASS (14/14 heartbeats over UDP)
- python3 scripts/run-falcon-verification.py: 3/3 PASS, 8/8 steps green
- rivet validate: 0 broken cross-references

Honestly deferred (per the witness-style incremental discipline)
- Verus SMT proofs on new crates → v0.2 with real EKF
- witness MC/DC coverage on WASM → v0.2 (needs P3 streams + wit-bindgen)
- Gazebo SITL hookup → v0.3
- Hardware bring-up → v0.6
- Six-domain credit dossier → v1.0

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pre-existing cFS engine crates use `#[cfg(kani)]` without a
corresponding `check-cfg` declaration. The `unexpected_cfgs` lint
fires on those, and our workflow-level RUSTFLAGS=-D warnings
promoted it to a hard error on ubuntu + macos test jobs.

Fix: keep clippy strict (`-- -D warnings` on the falcon-scoped
clippy invocation), but stop setting RUSTFLAGS=-D warnings at
workflow level. Each cFS crate will get its own check-cfg cleanup
in a follow-up commit; that's out of v0.1 scope.

Verified: cargo test --workspace passes locally and on github-hosted
runners after this change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@temper-pulseengine
Copy link
Copy Markdown

Automated review for PR #9

pulseengine/relay:falcon/v0.1 → pulseengine/relay:main

Verdict: 💬 Comment

Summary: The PR introduces several new features and dependencies, including the relay-mavlink crate for MAVLink communication, the relay-ekf-stub crate as a placeholder for an EKF (Extended Kalman Filter) implementation, and updates to the Bazel build system. The changes are well-documented in the commit messages and the PR description.

Findings: 0 mechanical (rivet) · 3 from local AI model.

Findings (3):

  1. examples/falcon-hello/Cargo.toml:1

    [package]
    

    The relay-mavlink crate is not listed as a dependency of the falcon-hello example.

  2. crates/relay-ekf-stub/Cargo.toml:1

    [package]
    

    The relay-mavlink crate is not listed as a dependency of the relay-ekf-stub crate.

  3. crates/relay-mavlink/Cargo.toml:1

    [package]
    

    The relay-mavlink crate is not listed as a dependency of the relay-ekf-stub crate.


Generated by a local AI model and post-validated against a strict JSON contract. Each finding includes the verbatim line being criticised — verify by reading the file at the cited location.

Reviewed at 6a743cd

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 19, 2026

running 33 tests
test crc::tests::empty_input_keeps_seed ... ok
test crc::tests::mavlink_reference_vector_123456789 ... ok
test crc::tests::order_matters ... ok
test crc::tests::accumulate_slice_equals_individual ... ok
test crc::tests::single_byte_zero ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test frame::tests::frame_msg_id_three_bytes_little_endian ... ok
test frame::tests::frame_payload_length_byte_matches ... ok
test frame::tests::frame_starts_with_magic_v2 ... ok
test frame::tests::peek_message_id_finds_heartbeat ... ok
test frame::tests::peek_rejects_v1_magic ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::rejects_truncated_header ... ok
test frame::tests::rejects_truncated_payload ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test heartbeat::tests::crc_extra_is_fifty ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::decode_rejects_long_payload ... ok
test heartbeat::tests::decode_rejects_short_payload ... ok
test heartbeat::tests::field_offsets_match_spec ... ok
test heartbeat::tests::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::payload_length_constant ... ok
test heartbeat::tests::round_trip_falcon_default ... ok
test heartbeat::tests::round_trip_gcs_default ... ok
test heartbeat::tests::round_trip_max_values ... ok
test heartbeat::tests::round_trip_zero ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test heartbeat::tests::round_trip_arbitrary ... ok
test frame::tests::parser_never_panics ... ok

test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 33 tests
test crc::tests::mavlink_reference_vector_123456789 ... ok
test crc::tests::accumulate_slice_equals_individual ... ok
test crc::tests::empty_input_keeps_seed ... ok
test crc::tests::order_matters ... ok
test crc::tests::single_byte_zero ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test frame::tests::frame_msg_id_three_bytes_little_endian ... ok
test frame::tests::frame_payload_length_byte_matches ... ok
test frame::tests::frame_starts_with_magic_v2 ... ok
test frame::tests::peek_message_id_finds_heartbeat ... ok
test frame::tests::peek_rejects_v1_magic ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::rejects_truncated_payload ... ok
test frame::tests::rejects_truncated_header ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test heartbeat::tests::crc_extra_is_fifty ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::decode_rejects_long_payload ... ok
test heartbeat::tests::decode_rejects_short_payload ... ok
test heartbeat::tests::field_offsets_match_spec ... ok
test heartbeat::tests::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::payload_length_constant ... ok
test heartbeat::tests::round_trip_falcon_default ... ok
test heartbeat::tests::round_trip_gcs_default ... ok
test heartbeat::tests::round_trip_max_values ... ok
test heartbeat::tests::round_trip_zero ... ok
test heartbeat::tests::round_trip_arbitrary ... ok
test frame::tests::parser_never_panics ... ok

test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 33 tests
test crc::tests::accumulate_slice_equals_individual ... ok
test crc::tests::empty_input_keeps_seed ... ok
test crc::tests::order_matters ... ok
test crc::tests::mavlink_reference_vector_123456789 ... ok
test crc::tests::single_byte_zero ... ok
test frame::tests::encode_rejects_payload_length_mismatch ... ok
test frame::tests::encode_rejects_too_small_output ... ok
test frame::tests::frame_msg_id_three_bytes_little_endian ... ok
test frame::tests::frame_payload_length_byte_matches ... ok
test frame::tests::frame_starts_with_magic_v2 ... ok
test frame::tests::peek_message_id_finds_heartbeat ... ok
test frame::tests::peek_rejects_v1_magic ... ok
test frame::tests::rejects_bad_crc ... ok
test frame::tests::rejects_truncated_header ... ok
test frame::tests::rejects_truncated_payload ... ok
test frame::tests::rejects_v1_magic ... ok
test frame::tests::rejects_wrong_crc_extra ... ok
test frame::tests::round_trip_heartbeat_through_frame ... ok
test heartbeat::tests::crc_extra_is_fifty ... ok
test heartbeat::tests::custom_mode_little_endian ... ok
test heartbeat::tests::decode_empty_payload ... ok
test heartbeat::tests::decode_rejects_long_payload ... ok
test heartbeat::tests::decode_rejects_short_payload ... ok
test heartbeat::tests::field_offsets_match_spec ... ok
test heartbeat::tests::mav_mode_flag_or_and_contains ... ok
test heartbeat::tests::payload_length_constant ... ok
test heartbeat::tests::round_trip_falcon_default ... ok
test heartbeat::tests::round_trip_gcs_default ... ok
test heartbeat::tests::round_trip_max_values ... ok
test heartbeat::tests::round_trip_zero ... ok
test frame::tests::encode_parse_round_trip_arbitrary_seq ... ok
test heartbeat::tests::round_trip_arbitrary ... ok
test frame::tests::parser_never_panics ... ok

test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.38s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 9 tests
test tests::args_default_ports_for_gcs_mode ... ok
test tests::args_default_ports_for_vehicle_mode ... ok
test tests::args_rejects_unknown_mode ... ok
test tests::args_rejects_missing_mode ... ok
test tests::handle_inbound_propagates_bad_crc ... ok
test tests::handle_inbound_rejects_unsupported_message ... ok
test tests::handle_inbound_truncated ... ok
test tests::current_timestamp_is_monotone_within_a_run ... ok
test tests::vehicle_and_gcs_exchange_heartbeats_over_udp ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s

[falcon-hello-demo] building release binary...
[falcon-hello-demo] launching gcs on 127.0.0.1:14700
[falcon-hello-demo] launching vehicle (4 Hz × 4s)
[falcon-hello-demo] vehicle sent 13 heartbeat(s)
[falcon-hello-demo] gcs received 13 heartbeat(s)
[falcon-hello-demo] PASS

running 9 tests
test tests::deterministic_across_ticks_with_same_time ... ok
test tests::fresh_stub_has_zero_time ... ok
test tests::innovation_is_quiet_in_stub ... ok
test tests::tick_passes_time_through ... ok
test tests::tick_returns_identity_quaternion ... ok
test tests::tick_returns_zero_position_and_velocity ... ok
test tests::unit_quaternion_check_rejects_clearly_non_unit ... ok
test tests::tick_innovation_within_healthy_range ... ok
test tests::tick_always_emits_unit_quaternion ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 9 tests
test tests::deterministic_across_ticks_with_same_time ... ok
test tests::fresh_stub_has_zero_time ... ok
test tests::innovation_is_quiet_in_stub ... ok
test tests::tick_passes_time_through ... ok
test tests::tick_returns_identity_quaternion ... ok
test tests::tick_returns_zero_position_and_velocity ... ok
test tests::unit_quaternion_check_rejects_clearly_non_unit ... ok
test tests::tick_innovation_within_healthy_range ... ok
test tests::tick_always_emits_unit_quaternion ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

running 9 tests
test tests::deterministic_across_ticks_with_same_time ... ok
test tests::fresh_stub_has_zero_time ... ok
test tests::innovation_is_quiet_in_stub ... ok
test tests::tick_passes_time_through ... ok
test tests::tick_returns_identity_quaternion ... ok
test tests::tick_returns_zero_position_and_velocity ... ok
test tests::unit_quaternion_check_rejects_clearly_non_unit ... ok
test tests::tick_innovation_within_healthy_range ... ok
test tests::tick_always_emits_unit_quaternion ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

falcon verification gate (filter: (has-tag "falcon"))

3 artifact(s) matched: FV-FALCON-MAVLINK-001, FV-FALCON-WORLD-001, FV-FALCON-EKF-STUB-001

[ PASS] ( 1.54s) FV-FALCON-MAVLINK-001: cargo test -p relay-mavlink
[ PASS] ( 1.44s) FV-FALCON-MAVLINK-001: cargo test -p relay-mavlink --release
[ PASS] ( 0.45s) FV-FALCON-MAVLINK-001: PROPTEST_CASES=4096 cargo test -p relay-mavlink
[ PASS] ( 0.41s) FV-FALCON-WORLD-001: cargo test -p falcon-hello
[ PASS] ( 4.75s) FV-FALCON-WORLD-001: scripts/falcon-hello-demo.sh
[ PASS] ( 0.35s) FV-FALCON-EKF-STUB-001: cargo test -p relay-ekf-stub
[ PASS] ( 0.75s) FV-FALCON-EKF-STUB-001: cargo test -p relay-ekf-stub --release
[ PASS] ( 0.16s) FV-FALCON-EKF-STUB-001: PROPTEST_CASES=4096 cargo test -p relay-ekf-stub

✅ Rivet verification gate — falcon

3/3 passed

count
Passed 3
Failed 0
Skipped (no steps) 0

Source of truth: artifacts/verification/FV-FALCON-*.yaml.

scripts/tag-and-release.sh wraps the post-PR-merge sequence:
ff-only-pull origin main, sanity-check via falcon-hello-demo,
create annotated falcon-v0.1.0 tag, push (triggering release.yml),
poll for the published release URL.

This is the script the user runs *after* PR #9 lands.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@avrabe avrabe merged commit d30a5e3 into main May 19, 2026
7 checks passed
@avrabe avrabe deleted the falcon/v0.1 branch May 19, 2026 04:57
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.

1 participant