Skip to content

feat(nimbus): smoke plumes via NOAA HMS — Nimbus PR 3#16

Merged
jayrav13 merged 10 commits into
mainfrom
nimbus-smoke
May 1, 2026
Merged

feat(nimbus): smoke plumes via NOAA HMS — Nimbus PR 3#16
jayrav13 merged 10 commits into
mainfrom
nimbus-smoke

Conversation

@jayrav13

@jayrav13 jayrav13 commented May 1, 2026

Copy link
Copy Markdown
Owner

Summary

  • Adds Skywatch.smoke(at:) and skywatch nimbus smoke LAT LON — pulls NOAA HMS smoke plume polygons from the public ArcGIS feature service and classifies by Light/Medium/Heavy density.
  • Wires smoke into Skywatch.brief as the 6th adverse-conditions source (sigmet, airmet, pirep, convective_alert, storm_report, smoke). Smoke plumes covering the airport surface as items in adverse_conditions.items with kind: 'smoke' and a density_score (1/2/3).
  • No API key required. Server-side polygon-intersect via point query — no client-side filtering, no KML parsing.

Architecture

Mirrors the existing Outlook / Alerts source patterns exactly. One source + one model + top-level convenience method + Thor subcommand + brief composer integration. The density_raw / density_level / density_score / description quartet matches Outlook's label / risk_level / risk_score / description.

Spec: docs/superpowers/specs/2026-04-30-nimbus-smoke-design.md.
Plan: docs/superpowers/plans/2026-04-30-nimbus-smoke.md.

Validation evidence

KMRY (Monterey, CA — fire-prone Pacific coast):

$ exe/skywatch nimbus smoke 36.587 -121.843 --format json
[]

KCDW (Caldwell, NJ):

$ exe/skywatch nimbus smoke 40.875 -74.282 --format text
No smoke detected at this point.

Brief composer integration:

$ exe/skywatch brief KCDW | jq '.adverse_conditions | { available, items_count: (.items | length), smoke_items: [.items[] | select(.kind == "smoke")], partial_failures: [.partial_failures[] | .source] }'
{
  "available": true,
  "items_count": 2,
  "smoke_items": [],
  "partial_failures": [
    "airmet"
  ]
}

Note: partial_failures contains airmet (the pre-existing self-intersection bug, #11) but NOT smoke — the smoke source is reachable end-to-end. Late April / early May is outside peak fire season; the empty-array case is the correct validation evidence (no smoke present + system reports cleanly + no errors + no false partial failure).

Follow-up issues already filed

  • #13 — Add surface AQI from AirNow
  • #14 — Add skywatch nimbus fires LAT LON
  • #15 — Consider SmokeAnalysis aggregate model

Test plan

  • bundle exec rspec — 414 → 445 examples, 0 failures (+31 new)
  • bundle exec rubocop — 113 files, 0 offenses
  • exe/skywatch nimbus smoke LAT LON — JSON + text output verified live
  • exe/skywatch brief KCDW | jq '.adverse_conditions.partial_failures' — no smoke entry (source reachable end-to-end)

🤖 Generated with Claude Code

jayrav13 and others added 10 commits April 30, 2026 20:44
ArcGIS-hosted NOAA HMS smoke detection feature service (no auth, point query
server-side, Light/Medium/Heavy density classification). Single source, single
model, plus brief composer integration as the 6th adverse-conditions source.
AQI (#13), fires (#14), and SmokeAnalysis aggregate (#15) deferred.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bite-sized TDD execution plan for Nimbus PR 3: HMS smoke plumes via ArcGIS
feature service. Nine tasks with explicit Step 1/2/3/etc. checkpoints, each
ending in a commit. Mirrors the existing 2026-04-27-skywatch-brief plan
structure for subagent-driven-development.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ient)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@jayrav13 jayrav13 merged commit f6d47e7 into main May 1, 2026
3 checks passed
@jayrav13 jayrav13 deleted the nimbus-smoke branch May 1, 2026 01:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant