Files
kaptan/firmware/verification.toml
Onur Özkan 62b18d5b2e build: replace argument dispatch and retain source-bound verification
Replace argument recovery with direct build targets. Run host, target,
board, coverage, Miri and selected Kani checks while retaining source
identities, logs and artifacts, including failed attempts.

Keep the PID proof diagnostic exception explicit and match its exact
identity alongside passing contract assertions and covers.

Validation: final-source verification matrix, assembled workflow tests
and documentation build.
2026-11-07 18:12:11 +03:00

167 lines
7.4 KiB
TOML

format = 1
[miri]
toolchain = "nightly-2026-06-23"
target = "x86_64-unknown-linux-gnu"
packages = ["kaptan-spi", "kaptan-err-reportable", "kaptan-log"]
seeds = [0, 1, 2, 3, 4, 5, 6, 7]
flags = [
"-Zmiri-strict-provenance",
"-Zmiri-symbolic-alignment-check",
"-Zmiri-preemption-rate=1",
]
claim = "Existing unit tests and bounded concurrent ownership tests execute with provenance, aliasing, validity and race checks enabled."
limits = "Executed schedules only. Host memory stands in for DMA. No device quiescence, interrupt or MMIO claim."
[kani]
version = "0.68.0"
toolchain = "nightly-2026-08-21"
target = "x86_64-unknown-linux-gnu"
solver = "cadical"
harness_timeout_seconds = 300
[[properties]]
id = "math.sqrt-domain"
package = "kaptan-math"
source = "libs/kaptan-math/src/kani_proofs.rs"
harnesses = ["kani_proofs::sqrt_preserves_domain_and_zero_sign"]
covers = [6]
claim = "All f32 input bit patterns obey square-root domain classification and preserve signed zero. Positive finite inputs return positive finite values."
assumptions = "Kani's floating-point arithmetic model; actual four-iteration implementation, with unwind bound 5."
limits = "No accuracy bound, normalization proof or target floating-point equivalence."
[[properties]]
id = "control.pid-state"
package = "kaptan-control"
source = "libs/kaptan-control/src/kani_proofs.rs"
harnesses = [
"kani_proofs::pid_constructor_establishes_invariant",
"kani_proofs::pid_update_preserves_bounds_or_state",
]
covers = [3, 3]
intermediate_nan_line = 196
claim = "The constructor establishes the PID invariant. One update returns finite bounded output and integral, or retains the complete previous state on error. Reset establishes zero integral."
assumptions = "Validated arbitrary configuration and any finite prior integral within its configured bound. Dynamic inputs span all f32 bit patterns."
limits = "Raw Kani reports Failure for one reviewed intermediate-NaN diagnostic at the declared location. Contract assertions and covers pass; the implementation rejects that NaN before state mutation. No tracking-performance, vehicle-stability or complete controller proof."
[[properties]]
id = "safety.commit-authority"
package = "kaptan-safety"
source = "libs/kaptan-safety/src/kani_proofs.rs"
harnesses = [
"kani_proofs::commit_requires_current_health_and_completed_dwell",
"kani_proofs::failed_commit_preserves_error_and_latches_inhibition",
"kani_proofs::clock_regression_requires_successful_inhibited_reset",
]
covers = [4, 1, 2]
claim = "Named public-operation histories check health and dwell before commit, preserve commit errors, latch inhibition, and require successful inhibition to reset a regressed clock."
assumptions = "Positive dwell, arbitrary u64 times and health flags. Callbacks return normally. Each harness declares its finite operation history."
limits = "No arbitrary-history, complete flight-runtime or physical-output proof."
[[properties]]
id = "actuator.dshot-format"
package = "kaptan-actuator"
source = "libs/kaptan-actuator/src/kani_proofs.rs"
harnesses = [
"kani_proofs::dshot_frame_preserves_payload_and_checksum",
"kani_proofs::dshot_symbols_round_trip_and_end_low",
"kani_proofs::dshot_timer_rounding_keeps_compares_inside_period",
"kani_proofs::arming_duration_product",
"kani_proofs::arming_frame_count",
]
covers = [3, 2, 2, 2, 3]
claim = "Packet payload/checksum, MSB-first symbol encoding, trailing low symbols and timer rounding satisfy their integer contracts. Arming counts compose a bounded duration/cadence product with a separately proved minimum-frame conversion."
assumptions = "Supported DShot rates and constructor-admitted throttle values. Timer clocks, durations and dispatch cadences span their complete integer types; duration construction admits 1..=8,000 ms. Frame conversion spans all u64 products; frames_at composition is source-reviewed."
limits = "This reference crate is not linked to a physical actuator route. No electrical or execution-timing claim."
# Every workspace package must belong to exactly one area. New owners require
# an explicit account of their evidence and outstanding obligations.
[[areas]]
name = "Numerical core"
packages = ["kaptan-math", "kaptan-navigation", "kaptan-control"]
checks = ["host", "coverage", "targets"]
gap = "Independent numerical tests and strict coverage remain necessary. Complete estimator correctness, error enclosures and target floating-point behavior are not formally established."
[[areas]]
name = "Flight authority"
packages = ["kaptan-safety", "kaptan-flight-runtime"]
checks = ["host", "coverage", "targets"]
gap = "Named safety proofs do not cover every runtime history, mission requirement or physical output consumer."
[[areas]]
name = "Actuator reference"
packages = ["kaptan-actuator"]
checks = ["host", "coverage"]
gap = "No composed physical actuator route or vehicle qualification."
[[areas]]
name = "Unsafe library ownership"
packages = ["kaptan-spi", "kaptan-log", "kaptan-err-reportable"]
checks = ["host", "coverage", "miri"]
gap = "Miri explores finitely many executions. Actual DMA completion and interrupt interference remain hardware obligations."
[[areas]]
name = "Configuration"
packages = [
"kaptan-config",
"kaptan-config-derive",
"kaptan-flight-config",
"kaptan-ports",
]
checks = ["host", "coverage"]
gap = "Schema compiler fixtures, runtime validation and journal tests do not constitute exhaustive parser or physical power-loss proofs."
[[areas]]
name = "Drivers and observations"
packages = ["kaptan-drivers", "kaptan-sensor", "kaptan-i2c", "kaptan-time"]
checks = ["host", "coverage"]
gap = "Mock bus tests do not establish sensor accuracy, wiring, timing, freshness or recovery on silicon."
[[areas]]
name = "Communication"
packages = [
"kaptan-mavlink",
"kaptan-file-mavlink",
"kaptan-diagnostics-mavlink",
"kaptan-data-channel",
"kaptan-tx",
]
checks = ["host", "coverage"]
gap = "Protocol and queue tests do not exhaust every hostile input, transport failure or interleaving."
[[areas]]
name = "Compiler-generated error identities"
packages = ["kaptan-err-reportable-macros"]
checks = ["host", "coverage"]
gap = "Compiler fixtures and final-link checks cover named cases. Runtime-harness coverage does not measure macro expansion coverage."
[[areas]]
name = "MCU platform"
packages = ["platform-stm32f7"]
checks = ["host", "coverage", "targets", "boards"]
gap = "USB wait deadlines and terminal faults have host regression checks. MMIO, assembly, caches, DMA quiescence, interrupt timing, WCET and peak stack remain outside host proof and interpreter evidence."
[[areas]]
name = "Board images"
packages = ["kaptan-geprc-f722-v2", "kaptan-kakute-f7-mini-v3"]
checks = ["targets", "boards"]
gap = "Linked ELF placement checks and image hashes do not qualify physical hardware or flight."
[[areas]]
name = "Configurator"
packages = ["kaptan-configurator"]
checks = ["host", "coverage", "targets"]
gap = "Hosted serial/HTTP and browser-state tests are not exhaustive OS, UI or security verification."
[[components]]
name = "Ground suite"
path = "ground_suite"
checks = ["host: native UTF conversion helper"]
gap = "Flutter/native product builds and operational behavior need their separate documented platform gates."
[[components]]
name = "Build scripts and documentation"
path = "."
checks = ["host: formatting, script tests, API documentation and mdBook"]
gap = "The evidence runner and tools remain trusted software requiring review. No tool qualification or certification credit is asserted."