Ticket Backlog¶
69 implemented · 17 planned · 86 tickets · 2200 tests
Counts are the files in this directory. Verify them:
ls docs/tickets/*.md | grep -v README | wc -l and
uv run pytest --collect-only -q | tail -1.
This directory tracks every capability from idea to implementation. Completed tickets are kept as historical records. Open tickets describe what to build next and why.
What's already built¶
| Area | Tickets | Ships as |
|---|---|---|
| Core schemas & CLI | 001–003, 090, 103 | estimate, JSON envelopes, golden fixtures, public API, migrate schema upgrades, the per-command exit-code contract |
| Energy & feasibility | 010–012, 061, 063, 097, 099, 110 | Energy budget, mass/density/SoC energy fidelity, scalar usable_capacity_fraction derating, geofence (2D + altitude bounds), landing-zone reachability, RTH reserve timeline with opt-in feasibility gate |
| Scenario runner | 020–021, 069 | Lost-link policies, per-event contingency overrides, contingency events, assertions |
| Route physics | 030–039, 044, 100 | Fidelity v2, layered/spatiotemporal wind, terrain alt, geodesic Dubins divert, obstacle and terrain clearance |
| SITL (ArduPilot) | 040–043 | sitl command, MAVLink upload, telemetry recording, compare |
| Stochastic propagation | 047–049, 086 | propagate command, twin-state EKF, closed-loop tracking controller; split into propagation/ subpackage |
| Output formats | 055, 057, 072–075 | GeoJSON/KML exports, summary, checklist, profile, sensitivity, size-battery |
| Batch, import & export | 060, 064, 085, 091 | batch command with estimate/scenario/propagate run types, convert QGC importer with --vehicle-profile, --format csv, export mission→QGC .plan writer |
| Real-world data | 052–053, 056, 059 | Fetch scripts, community vehicle profiles, infeasible Alpine demo |
| Regulatory pre-assessment | 094–095 | SORA Ground Risk Class (iGRC), Air Risk Class, and GRC×ARC→SAIL with applicable OSOs via the sora command |
| Weather & GO/NO-GO | 092–093 | Enforced max_wind_mps/max_crosswind_mps weather minimums with a checklist Weather-limits row; time-varying geofence activation windows |
| Correctness fixes | 062, 065, 109 | Wind-triangle divert correction, stochastic spatial infeasibility tracking, WIND_COVERAGE_MISSING so an out-of-coverage wind query is missing evidence instead of a silently clamped value |
| Documentation | 096 | MkDocs Material site published to GitHub Pages, auto-built from main |
| Release tooling | 098 | bump command (semver bump + changelog roll + --check drift guard); version-agnostic golden fixtures |
| Calibration & validation | 080–083, 102 | flight-trace.v1 ingestion (incl. binary .bin/ULog), phase-segments.v1 segmentation, validation-report.v2 predicted-vs-observed metrics and acceptance gate via the validate command, calibration-profile.v2 parameter fitting via the calibrate command |
Full feature list: docs/tickets/README.md implemented section · Test coverage: uv run pytest
Planned work¶
Items are ordered by impact. Pick one, read its ticket file, open a PR.
Quick wins¶
| # | Ticket | What it adds |
|---|---|---|
| 088 | Performance benchmarks | pytest-benchmark suite + CI regression gates (no production code changes) |
| 089 | Preflight report command | Single preflight command combining estimate + scenario + Monte Carlo into one operator briefing |
Backend integration readiness¶
Gaps surfaced while reviewing whether the engine can be driven cleanly from a long-running service (the Mission Control web backend) as a one-process-per-job subprocess. None blocks single-shot CLI use; each sharpens the contract a queue worker depends on.
This track is complete: the per-command exit-code contract (103), atomic output writes and clean cancellation (104), contract-version discovery (105), machine-readable run progress (106), and the machine-readable preflight validation envelope (107) are all implemented — see the full list below.
Model fidelity gaps¶
| # | Ticket | What it adds |
|---|---|---|
| 108 | Terrain-aware contingency paths | Make RTH and divert paths obey the same terrain, obstacle, and geofence evidence the planned route already obeys; today they are energy-only. Deferred because closing it changes the meaning of rth_is_feasible and every divert verdict |
Output & visualisation gaps¶
| # | Ticket | What it adds |
|---|---|---|
| 076 | Departure window finder | Scan a forecast window for the first feasible departure time |
| 077 | Mission comparison report | Side-by-side diff of two mission estimates |
| 066 | Stochastic GeoJSON export | --format geojson/kml for propagate command |
| 067 | Propagation progress feedback | Progress bar / stderr updates during long particle runs |
| 068 | Divert route GeoJSON layer | Add computed divert paths as a separate layer in scenario GeoJSON/KML |
Hardware validation ladder¶
| # | Ticket | What it adds |
|---|---|---|
| 045 | PX4 SITL — launch & upload | PX4 SITL adapter behind the existing evidence contract |
| 046 | PX4 SITL — telemetry & evidence | PX4 artifact recording and evidence bundle assembly |
| 087 | HITL adapter | Real flight controller hardware (Pixhawk) in the validation loop |
Integrations & platform¶
| # | Ticket | What it adds |
|---|---|---|
| 054 | Reference calibration inputs | Curated reference datasets for model calibration and import |
| 058 | NOTAM / live airspace | Dynamic no-fly zone ingestion from live NOTAM feeds |
| 050 | REST API & web UI | HTTP service wrapper and browser-based preflight interface |
| 070 | Operational integration seams | Hooks for flight-ops systems, flight plans, and operator dashboards |
| 071 | Live comms, Remote ID, traffic | UTM/U-space, Remote ID broadcast, and traffic awareness |
Calibration & validation track¶
A separate track for post-flight model calibration from real flight logs. Tickets 080, 081, 082, and 083 are complete; only 084 (holdout validation reports) remains.
| # | Ticket | Status |
|---|---|---|
| 080 | Flight log ingestion & trace normalisation | implemented |
| 081 | Flight phase segmentation | implemented |
| 082 | Predicted vs. observed validation metrics | implemented |
| 083 | Calibration profile data & fitting | implemented |
| 084 | Holdout validation reports | planned |
| 102 | Binary flight-log ingestion (.bin, ULog) | implemented |
Contributing¶
Before opening a PR, read the ticket file for the work you're doing. Each ticket states its acceptance criteria, composition with existing code, and what tests are expected.
Rules¶
- Keep core execution deterministic. Randomness lives in Monte Carlo and stochastic layers only.
- Add adapter layers only after core contracts are stable.
- All schemas and public outputs are versioned. Bump the version string when the shape changes.
- Reject unsupported inputs explicitly — never approximate silently.
- No live external network calls in core CI.
- Update docs, tests, and golden fixtures in the same commit when public behaviour changes.
Integration standard¶
Every new ticket must compose through the existing surfaces:
- YAML schemas:
mission.v7,vehicle.v6,scenario.v1,uncertainty.v2,stochastic.v2,batch.v1—bvlos-sim schema-versionsprints the authoritative set - Examples:
examples/missions/,examples/vehicles/,examples/scenarios/ - CLI commands:
estimate,scenario,sample,propagate,batch,convert,export,migrate,sitl,compare,verify,size-battery,sora,ingest-log,validate,calibrate,bump,schema-versions - Output contracts: canonical JSON envelopes, Markdown reports, golden fixtures
- Public Python API:
estimator.try_estimate_mission_distance_time,estimator.run_scenario,estimator.execution.monte_carlo.run_monte_carlo
New capabilities should work with existing pieces, not alongside them in isolation.
Implemented tickets¶
Full list (69 tickets)¶
- 001 Estimator CLI and envelope
- 002 Versioning and golden fixtures
- 003 Technical debt hardening
- 010 Deterministic energy feasibility
- 011 Static geofence feasibility
- 012 Static landing-zone reachability
- 020 Scenario runner core
- 021 Comms link and contingency policies
- 030 Fidelity controls plus independent layered wind and sub-segments
- 031 Fidelity v2 — turns and fixed-wing loiter
- 032 Terrain-referenced altitude execution
- 033 Continuous spatiotemporal wind grid
- 034 Resource and link feasibility abstractions
- 035 Dynamic landing-zone availability
- 036 Computed divert routing
- 037 Monte Carlo uncertainty modelling
- 038 Bank-angle and Dubins path optimisation
- 039 Path planning model gaps
- 040 SITL adapter contract and evidence schema
- 041 ArduPilot SITL launch and mission upload
- 042 SITL telemetry recorder and evidence bundle
- 043 SITL scenario comparison report
- 047 Stochastic state propagation
- 048 Observation model and twin-state EKF
- 049 Stochastic closed-loop control
- 052 Real-world data fetch scripts
- 053 Airspace geofence fetch script
- 055 GeoJSON and KML route export
- 056 Community vehicle profiles
- 057 Summary output format
- 059 Infeasible demo mission
- 060 Import, export, and batch workflows
- 062 Wind-corrected divert energy
- 063 Return-to-home reserve check
- 065 Geofence and LZ in stochastic propagation
- 069 Per-event lost-link policy override
- 072 Route altitude profile report
- 073 Pre-flight checklist output
- 074 Energy reserve sensitivity report
- 075 Minimum battery sizing command
- 085 QGC convert vehicle profile selection
- 086 Stochastic propagator module split
- 094 SORA Ground Risk Class (iGRC)
- 095 SORA Air Risk Class and SAIL determination
- 091 QGC mission export
- 092 Weather minimums and automatic GO/NO-GO
- 093 Time-varying geofence activation
- 096 Documentation site on GitHub Pages
- 099 Energy-model fidelity
- 100 Obstacle database and vertical clearance checks
- 101 SORA 2.5 mitigation depth (original M1–M3/tactical-credit design superseded)
- 097 Opt-in RTH reserve feasibility gate
- 061 3D geofence altitude bounds
- 080 Flight log ingestion and trace normalization
- 081 Flight phase segmentation
- 082 Predicted vs. observed validation metrics
- 098 Version bump and release tooling
- 083 Calibration profile data and fitting
- 104 Atomic output writes and clean cancellation
- 105 Contract-version discovery command
- 106 Machine-readable run progress
- 107 Machine-readable preflight validation report
- 044 Geodesic Dubins divert path
- 064 Batch scenario and batch propagate modes
- 090 Schema-version migration tooling (
migrate,mission.v6→mission.v7) - 102 Binary flight-log ingestion (
.bin, ULog) - 103 Backend-facing CLI exit-code contract
- 109 Wind coverage fails closed (
WIND_COVERAGE_MISSING) - 110
usable_capacity_curvereplaced by scalarusable_capacity_fraction