Add _handle_reset() and _make_setup_screen() to main.py; integrate ButtonHoldDetector
and LEDController into the radar loop; LED lights immediately on hold, config is wiped,
setup screen shown, then os.execvp hands off to planemapper-provision. Wipe failures
log ERROR and abort without exec. Completes epic-4.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Review passed all criteria; update sprint-status to done, close the
story file, and record two deferred items (GPIO pins into constants.py,
ButtonHoldDetector init-time GPIO dependency) in deferred-work.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All 10 review criteria pass. No code changes required: implementation
matches spec exactly. Added two deferred-work items for only
requests.Timeout being caught (other fetch errors propagate without
stale marking) and the growing _run_one_cycle signature (RendererState
dataclass suggested for future). 103 tests pass, ruff clean.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All 10 review criteria pass with no code changes required. 99 tests
pass, ruff clean. Added 4 deferred items (WaveshareDisplay stub, HAT
crash-on-boot, dumb fixed sleep, startup text position). Epic-2
marked done as all 7 stories are now in done state.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Code review of stateful Renderer and DisplayInterface: all 10 review
criteria pass with no code changes required. Add two deferred items for
WaveshareDisplay NotImplementedError stub (wired in 2-7) and pixel-space
trail staleness on re-provisioning. Mark story done in story file and
sprint-status.yaml.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All 7 ACs verified. No code fixes required: boundary logic (<=), category
map, callsign prefix guard, altitude fallback thresholds, empty-category
guard, and type annotations are all correct. 89/89 tests pass, ruff clean.
Added two deferred items: hardcoded _AIRLINE_PREFIXES subset and A-category
military aircraft misclassification. Story and sprint-status marked done.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All 10 review criteria pass without any code fixes required. Two tech-debt
items added to deferred-work: non-Polygon geometry types silently skipped
(intentional for MVP) and null-geometry GeoJSON features would raise
AttributeError (acceptable for controlled OpenAIP input).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All 10 review criteria pass without fixes. Deferred two tech-debt items
(equirectangular distortion at high latitudes, missing dimension assertion
in basemap.load()). Story and sprint-status marked done.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All 5 ACs verified clean: field mapping, safe defaults, timeout propagation,
MLAT detection, and FileFixtureFetcher. 64 tests pass, ruff check and format
clean. Sprint status updated to done, deferred-work updated with runtime
verification note for HttpFetcher on live dump1090.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All 5 ACs verified: ICAO lookup via importlib.resources, Nominatim
geocoding with User-Agent and timeout, exact error messages, mocked
HTTP in tests, portal POST /find-location returns 200 on success and
error. 45 tests pass, ruff clean. Sprint status updated to done.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All 4 ACs verified, 7 tests pass, ruff clean. No issues found.
Story status updated to done; no new deferred items.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>