# FT-N-03 — Extended outage triggers operator re-loc request

**Task**: AZ-425_ft_n_03_outage_reloc
**Name**: ≥3 consecutive frames AND ≥2 s without estimate → STATUSTEXT `OPERATOR_RELOC_REQUEST` + `dead_reckoned` propagation (AC-3.4)
**Description**: Implement FT-N-03 — Derkachi replay with synthetic 3-frame outage injector; SUT fails to produce estimates for 3+ frames; after ≥2 s, STATUSTEXT containing `OPERATOR_RELOC_REQUEST` is emitted to mavproxy listener; estimates labeled `dead_reckoned` continue; FC uses last-known + IMU extrapolation.
**Complexity**: 3 points
**Dependencies**: AZ-406, AZ-407, AZ-408
**Component**: Blackbox Tests / Negative / Resilience (epic AZ-262)
**Tracker**: AZ-425
**Epic**: AZ-262 (E-BBT)

## Problem

The operator must be alerted when the SUT enters a sustained no-estimate state — without a STATUSTEXT-based signal the mission is silently degraded. AC-3.4 is the operator-experience cornerstone of the failure-mode contract.

## Outcome

- pytest scenario at `e2e/tests/negative/test_ft_n_03_outage_reloc.py`.
- Replays Derkachi with a 3-consecutive-frame failure injector (corrupt frames force C3 matcher to fail).
- After 2 s of no SUT estimate: assert STATUSTEXT containing `OPERATOR_RELOC_REQUEST` is captured in mavproxy `.tlog`.
- During outage: assert outbound estimates carry `source_label = dead_reckoned` (FC IMU-extrapolated propagation continues).

## Scope

### Included
- 3-frame failure injector (a thin extension of `injectors/outlier.py` that emits all-zero frames instead of crops).
- mavproxy listener regex match on `OPERATOR_RELOC_REQUEST`.
- `dead_reckoned`-label observation during outage.

### Excluded
- 5/15/35 s blackout-with-spoof — owned by FT-N-04 (AZ-426).
- Multi-segment re-loc — owned by FT-P-08 (AZ-415).

## Acceptance Criteria

**AC-1: outage onset**
Given the injector emits 3 consecutive corrupt frames
Then the SUT fails to produce estimates for ≥3 frames (observable via gap in outbound stream).

**AC-2: STATUSTEXT emission**
Given ≥2 s elapses without SUT estimate
Then mavproxy `.tlog` contains a STATUSTEXT with payload matching regex `OPERATOR_RELOC_REQUEST` within ≤500 ms of the 2 s mark.

**AC-3: dead_reckoned during outage**
Given the outage window
Then outbound emissions during the window carry `source_label = dead_reckoned` (estimates continue, just IMU-extrapolated).

**AC-4: FC IMU-only continues**
Given the `dead_reckoned` emissions reach the FC
Then the FC's EKF uses last-known + IMU extrapolation (observable via SITL state read; no EKF divergence event).

**AC-5: parameterization**
Given conftest parameterization
Then the scenario runs per `(fc_adapter, vio_strategy)`.

## System Under Test Boundary

End-to-end through public boundaries.

- **Allowed**: mavproxy listener `.tlog`, outbound message stream, SITL state read.
- **Forbidden**: monkeypatching the `OPERATOR_RELOC_REQUEST` emitter, stubbing the no-estimate detector.

## Constraints

- The STATUSTEXT regex is `OPERATOR_RELOC_REQUEST` (exact substring match within the STATUSTEXT payload; case-sensitive).
- The 2 s threshold is per AC-3.4; the test's tolerance is ±500 ms around that threshold.

## Document Dependencies

- `_docs/02_document/tests/blackbox-tests.md` § FT-N-03
- `_docs/02_document/tests/test-data.md` § Resilience (FT-N-03 row)
