feat: Skywatch.brief — AIM 7-1-5 weather brief composition layer#12
Merged
Conversation
Composition layer over existing Briefer + Nimbus primitives, shaped to AIM 7-1-5's 9-element Standard Preflight Briefing. MVP scope is single-airport input, JSON-only output, and a committed validation report — the goal is to confirm the LLM-briefer thesis works on what's already built before expanding (route input, coord input, ETD-aware, Sectional/NOTAMs). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
12-task TDD plan covering: AirportLocator (METAR coords + NWS /points WFO lookup), AdverseFilter (polygon-intersect + distance + urgency partition), Brief envelope (AIM 7-1-5 + supplementary AFD), Composer (happy-path + per-slot error wrapping + adverse partial_failures), top-level Skywatch.brief, CLI subcommand, integration spec, validation report capture, and follow-up GH issues. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…enarios Three scenarios (KCDW VFR-clear, KACK IFR, KMSY IFR + active convection) validated against the canonical 7-question protocol. Verdict: PASS — Q1–Q6 substantively correct on all 3 scenarios, Q7 anti-hallucination clean on all 3. AIRMET self-intersection bug surfaced (filed as #11) — degrade-gracefully behavior held, partial_failures shape worked as designed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Skywatch.brief(airport:)andskywatch brief AIRPORT— a single composition layer over existing Briefer + Nimbus primitives that produces an AIM 7-1-5-shaped weather brief for a single airport.{ available: false, reason: ... }via the per-slotwraphelper. Adverse-conditions slot tracks per-sourcepartial_failuresindependently.AirportLocator(METAR-derived coordinates + WFO lookup, cached 1 day) andAdverseFilter(polygon-intersect + distance + urgency partition).docs/superpowers/specs/2026-04-27-skywatch-brief-validation-results.md.Spec:
docs/superpowers/specs/2026-04-27-skywatch-brief-design.md.Plan:
docs/superpowers/plans/2026-04-27-skywatch-brief.md.Validation thesis confirmed
The thesis — can an LLM produce a useful 1-800-WX-BRIEF-quality answer from current Skywatch primitives? — is confirmed for the single-airport MVP scope. The AIM-7-1-5 envelope shape, uniform
{ available, ... }slot contract, and per-slotreasonstrings did the load-bearing work: when slots were unavailable, the LLM degraded honestly using slot-adjacent data (AFD as synopsis substitute, PIREP temperatures as winds-aloft proxies) without inventing missing facts. KMSY exercised the system hardest — a SPECI METAR captured a 30-minute drop to IFR with -RA, and the adverse-conditions slot's polygon-intersect logic correctly surfaced both convective SIGMET 74C and an urgent low-level wind-shear PIREP at the field.Bug surfaced during validation
AIRMET ingest fails uniformly with
RGeo::Error::InvalidGeometry: Self-intersection, captured cleanly underpartial_failureson every brief — exactly the degrade-gracefully behavior the spec required. Filed as #11.Follow-up issues (deferred from MVP)
Test plan
bundle exec rspec— 414 examples, 0 failuresbundle exec rubocop— 108 files, 0 offensesexe/skywatch brief KCDW— JSON to stdoutexe/skywatch brief KACK— IFR scenario, JSON to stdoutexe/skywatch brief KMSY— convective + IFR scenario, JSON to stdout🤖 Generated with Claude Code