# Leftover: `mission_executor` state-machine polling race

**Timestamp**: 2026-05-20T17:08:00+03:00 (originally 2026-05-20T08:30:00+02:00)
**Origin**: Batch 8 (mission_executor state machine). Surfaced in batches 11, 12, 13, 17 as intermittent. Reproduces more reliably on dev box under workspace test load.

**Affected tests**:
- `ac3_bounded_retry_then_success` (original)
- `ac1_multirotor_happy_path_reaches_done` (batch 17 — same `await_state` polling race in the same file)
**Severity**: Medium (test design, not production code)
**Not blocking**: pre-existing failure in unrelated area; production `mission_executor` behaviour is correct — the test simply has a polling race.

## Symptom

```
test ac3_bounded_retry_then_success ... FAILED
thread 'ac3_bounded_retry_then_success' panicked at
crates/mission_executor/tests/state_machine.rs:116:
FSM did not reach MissionUploaded; stuck at WaitAuto
```

`WaitAuto` is the FSM state *after* `MissionUploaded`. The FSM passed *through* `MissionUploaded` faster than the test's 5 ms polling cadence could observe it. The post-assertion (`matches!(state, WaitAuto | MissionUploaded)`) acknowledges either is fine, but `await_state(target=MissionUploaded)` panics before that assertion runs.

## Root cause

`crates/mission_executor/tests/state_machine.rs` lines 100-118 — `await_state` polls every 5 ms; FSM `tick_interval` is also 5 ms; a successful retry+upload can complete in less than one polling interval.

## Recommended fix (out of scope for current batch)

Replace polling with an event latch:

- Have `MissionExecutorHandle::state_stream()` (or expose `tokio::sync::watch::Receiver<MissionState>`) so tests can `await` on the channel changing through the target state.
- Or: record a `Vec<MissionState>` history in `Inner` and assert the target is *in* the history at the end, not the current state.

Either approach is ~30 lines of test-only refactor. Production code does not need to change.

## Replay instructions

When working on `mission_executor` next (e.g. batch that touches the state machine or tick loop):

1. Pick one of the two fixes above.
2. Re-run `cargo test --workspace` to confirm flake is gone.
3. Delete this leftover.
