Ticket Backlog¶
63 implemented · 15 planned · 1272 tests passing
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 | estimate, JSON envelopes, golden fixtures, public API |
| Energy & feasibility | 010–012, 061, 063, 097, 099 | Energy budget, mass/density/SoC energy fidelity, 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, 100 | Fidelity v2, layered/spatiotemporal wind, terrain alt, 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, 085, 091 | batch command, 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 | Wind-triangle divert correction, stochastic spatial infeasibility tracking |
| 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, 081, 082, 083 | flight-trace.v1 ingestion, phase-segments.v1 segmentation, validation-report.v1 predicted-vs-observed metrics via the validate command, calibration-profile.v1 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 |
| 090 | Schema migration tooling | bvlos-sim migrate command to auto-upgrade YAML files when schema versions bump |
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: 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.
Core simulation gaps¶
| # | Ticket | What it adds |
|---|---|---|
| 062 | LZ reachability wind correction | Apply wind-triangle correction to landing-zone reachability energy (divert already done) |
| 064 | Batch scenario & propagate | Extend batch command to run scenario and propagate jobs, not only estimates |
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) | planned |
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.v6,vehicle.v4,scenario.v1,uncertainty.v1,stochastic.v1,batch.v1 - Examples:
examples/missions/,examples/vehicles/,examples/scenarios/ - CLI commands:
estimate,scenario,sample,propagate,batch,convert,export,sitl,compare,size-battery,sora - 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 (78 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 v2 — 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 (LZ reachability TAS-only remaining — Ticket 062)
- 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 mitigation depth — M1–M3 and tactical air-risk reduction
- 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