Commit Graph

26 Commits

Author SHA1 Message Date
Matt Edholm be32469284 review(2-4): pass story 2-4 — altitude colour bands & aircraft type icons
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>
2026-04-22 23:23:37 -04:00
Matt Edholm 2c86ffd422 feat(2-4): implement altitude colour bands and aircraft type icons
Implements altitude_to_colour() mapping altitude bands to the 6 e-ink
palette colours, and classify_aircraft_type() resolving ADS-B category,
callsign prefix, and altitude fallback to AircraftType enum. Adds 21
new tests (13 parametrised boundary cases + 8 icon classification);
89 tests total, all quality gates green.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:21:50 -04:00
Matt Edholm b9ccdc4916 bmad: create story 2-4 (altitude colour bands and aircraft type icons)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:19:33 -04:00
Matt Edholm 2ba3d03c96 Review story 2.3: home marker and airspace outlines passes all ACs
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>
2026-04-22 23:17:42 -04:00
Matt Edholm e8ce0602a4 feat(story-2.3): implement home marker and airspace outline rendering
Adds draw_home_marker() in overlay.py (red cross at projected home
position) and draw_airspace() in airspace.py (GeoJSON Polygon
boundaries in blue, graceful FileNotFoundError handling). Includes
airspace fixture and three tests covering all acceptance criteria.
All 70 tests pass; ruff check and format clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:16:03 -04:00
Matt Edholm 5a18d0867a bmad: create story 2-3 (home marker and airspace outlines)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:13:58 -04:00
Matt Edholm 34e3736c10 Review story 2.2: coordinate projection and base map loading passes all ACs
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>
2026-04-22 23:12:14 -04:00
Matt Edholm 037ce3e193 Implement story 2.2: coordinate projection and base map loading
Add MapBounds dataclass and equirectangular project() function in
projection.py, basemap.load() forcing pixels into memory via .copy(),
and full test coverage for both modules (4 new tests). All quality
gates pass: 67 tests, ruff clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:10:38 -04:00
Matt Edholm f8e763d734 bmad: create story 2-2 (coordinate projection & base map loading)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:08:45 -04:00
Matt Edholm 2fdb58c516 Review story 2.1: aircraft data model and fetcher passes all ACs
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>
2026-04-22 23:04:44 -04:00
Matt Edholm 7d89166880 Create story 2.1: aircraft data model and fetcher
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:00:39 -04:00
Matt Edholm 9c53ccb524 Review story 1.5: provisioning execution passes all ACs — Epic 1 complete
Fix portal.py error handling so validate_cache failures return retry HTML while
kill_wifi ProvisioningError propagates (re-raise) per AC4. All 56 tests pass.
Update sprint-status.yaml: 1-5 → done, epic-1 → done. Append story 1.5 deferred
items to deferred-work.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:57:55 -04:00
Matt Edholm 4aeeefb488 Implement story 1.5: provisioning execution tile download cache validation wifi kill
Add tiles.py, airspace.py, wifi.join_home_wifi, portal /submit route, and rewire
provision.py main loop; all tasks and quality gates pass (56 tests, ruff clean).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:54:34 -04:00
Matt Edholm a6a6a2796d Create story 1.5: provisioning execution tile download cache validation and wifi kill 2026-04-22 22:50:31 -04:00
Matt Edholm 6216e933a6 Review story 1.4: location resolution passes all ACs
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>
2026-04-22 22:48:02 -04:00
Matt Edholm d388cca478 Create story 1.4: location resolution ICAO and address
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:44:01 -04:00
Matt Edholm b2b55ac11b Review story 1.3: WiFi hotspot and captive portal form passes all ACs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:42:20 -04:00
Matt Edholm 563b0d4665 Implement story 1.3: WiFi hotspot and captive portal form
Implement wifi.py (start_ap/stop_ap/kill_wifi with subprocess and ProvisioningError),
portal.py (Flask captive portal with Android/iOS/Windows probe redirects and 404 catch-all),
updated provision.py provisioning loop, and full test suite (38 passing).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:41:05 -04:00
Matt Edholm 76c2d66ed1 Create story 1.3: WiFi hotspot and captive portal form
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:38:18 -04:00
Matt Edholm c08ec9fc89 Review story 1.2: config read/write/wipe passes all ACs
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>
2026-04-22 22:36:37 -04:00
Matt Edholm 826f1d98fa Implement story 1.2: config read/write/wipe
Add provisioning/config.py with read/write/wipe functions, update
conftest.py with autouse CONFIG_PATH patch fixture, write 7 tests
covering all acceptance criteria, and extend pyproject.toml
per-file-ignores so conftest.py may import from provisioning.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:35:11 -04:00
Matt Edholm 8682b8714e Create story 1.2: configuration read/write/wipe
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:33:13 -04:00
Matt Edholm f3e6586a7a Review story 1.1: project scaffold passes all acceptance criteria
Fix ruff import-boundary enforcement: replace stray TID252 ignore with
proper TID251 banned-api rule so `planemapper.main` cannot import from
`planemapper.provisioning.*`. Add deferred-work.md. Advance sprint
status 1-1 → done.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:30:01 -04:00
Matt Edholm 85c8acf767 Implement story 1.1: project scaffold and verified entry points
Creates the complete src/planemapper/ layout with all module stubs,
provisioning and renderer subpackages, airports.csv data bundle,
systemd unit files, and full test scaffold. All three quality gates
pass: pytest 12/12, ruff check zero violations, ruff format clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:26:53 -04:00
Matt Edholm 0612e0fe02 Create story 1.1: project scaffold and verified entry points
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:22:39 -04:00
Matt Edholm b2afa7fb4b Add sprint-status.yaml and promote planning artifacts to sprint branch
Initialises implementation-artifacts/ with sprint-status.yaml covering all
14 stories across 4 epics. Promotes architecture.md and epics.md from
untracked state. Sprint 1 branch is now ready for autopilot execution.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:20:13 -04:00