Skip to content

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.v1bvlos-sim schema-versions prints 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)

  1. 001 Estimator CLI and envelope
  2. 002 Versioning and golden fixtures
  3. 003 Technical debt hardening
  4. 010 Deterministic energy feasibility
  5. 011 Static geofence feasibility
  6. 012 Static landing-zone reachability
  7. 020 Scenario runner core
  8. 021 Comms link and contingency policies
  9. 030 Fidelity controls plus independent layered wind and sub-segments
  10. 031 Fidelity v2 — turns and fixed-wing loiter
  11. 032 Terrain-referenced altitude execution
  12. 033 Continuous spatiotemporal wind grid
  13. 034 Resource and link feasibility abstractions
  14. 035 Dynamic landing-zone availability
  15. 036 Computed divert routing
  16. 037 Monte Carlo uncertainty modelling
  17. 038 Bank-angle and Dubins path optimisation
  18. 039 Path planning model gaps
  19. 040 SITL adapter contract and evidence schema
  20. 041 ArduPilot SITL launch and mission upload
  21. 042 SITL telemetry recorder and evidence bundle
  22. 043 SITL scenario comparison report
  23. 047 Stochastic state propagation
  24. 048 Observation model and twin-state EKF
  25. 049 Stochastic closed-loop control
  26. 052 Real-world data fetch scripts
  27. 053 Airspace geofence fetch script
  28. 055 GeoJSON and KML route export
  29. 056 Community vehicle profiles
  30. 057 Summary output format
  31. 059 Infeasible demo mission
  32. 060 Import, export, and batch workflows
  33. 062 Wind-corrected divert energy
  34. 063 Return-to-home reserve check
  35. 065 Geofence and LZ in stochastic propagation
  36. 069 Per-event lost-link policy override
  37. 072 Route altitude profile report
  38. 073 Pre-flight checklist output
  39. 074 Energy reserve sensitivity report
  40. 075 Minimum battery sizing command
  41. 085 QGC convert vehicle profile selection
  42. 086 Stochastic propagator module split
  43. 094 SORA Ground Risk Class (iGRC)
  44. 095 SORA Air Risk Class and SAIL determination
  45. 091 QGC mission export
  46. 092 Weather minimums and automatic GO/NO-GO
  47. 093 Time-varying geofence activation
  48. 096 Documentation site on GitHub Pages
  49. 099 Energy-model fidelity
  50. 100 Obstacle database and vertical clearance checks
  51. 101 SORA 2.5 mitigation depth (original M1–M3/tactical-credit design superseded)
  52. 097 Opt-in RTH reserve feasibility gate
  53. 061 3D geofence altitude bounds
  54. 080 Flight log ingestion and trace normalization
  55. 081 Flight phase segmentation
  56. 082 Predicted vs. observed validation metrics
  57. 098 Version bump and release tooling
  58. 083 Calibration profile data and fitting
  59. 104 Atomic output writes and clean cancellation
  60. 105 Contract-version discovery command
  61. 106 Machine-readable run progress
  62. 107 Machine-readable preflight validation report
  63. 044 Geodesic Dubins divert path
  64. 064 Batch scenario and batch propagate modes
  65. 090 Schema-version migration tooling (migrate, mission.v6mission.v7)
  66. 102 Binary flight-log ingestion (.bin, ULog)
  67. 103 Backend-facing CLI exit-code contract
  68. 109 Wind coverage fails closed (WIND_COVERAGE_MISSING)
  69. 110 usable_capacity_curve replaced by scalar usable_capacity_fraction