Skip to content

feat: Skywatch.brief — AIM 7-1-5 weather brief composition layer#12

Merged
jayrav13 merged 13 commits into
mainfrom
skywatch-brief
May 1, 2026
Merged

feat: Skywatch.brief — AIM 7-1-5 weather brief composition layer#12
jayrav13 merged 13 commits into
mainfrom
skywatch-brief

Conversation

@jayrav13

@jayrav13 jayrav13 commented May 1, 2026

Copy link
Copy Markdown
Owner

Summary

  • Adds Skywatch.brief(airport:) and skywatch 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.
  • Six slots fillable in MVP (current_conditions, destination_forecast, winds_aloft, adverse_conditions, vfr_not_recommended, afd), four hardcoded-unavailable per spec (synopsis, enroute_forecast, notams, atc_delays), one supplementary (afd).
  • METAR is the only hard-fail — every other source degrades to { available: false, reason: ... } via the per-slot wrap helper. Adverse-conditions slot tracks per-source partial_failures independently.
  • Two new infra additions: AirportLocator (METAR-derived coordinates + WFO lookup, cached 1 day) and AdverseFilter (polygon-intersect + distance + urgency partition).
  • Bundled validation report against the canonical 7-question protocol (3 scenarios, naive-context LLM run): PASS — Q1–Q6 substantively correct on all 3 scenarios, Q7 anti-hallucination clean on all 3. See 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-slot reason strings 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 under partial_failures on every brief — exactly the degrade-gracefully behavior the spec required. Filed as #11.

Follow-up issues (deferred from MVP)

  • #5 — Route input
  • #6 — Coordinate input
  • #7 — ETD-aware TAF/winds windowing
  • #8 — AFD synopsis extraction
  • #9 — Parallelize source fetches
  • #10 — Human-readable text formatter
  • #11 — AIRMET self-intersection (filed during validation)

Test plan

🤖 Generated with Claude Code

jayrav13 and others added 13 commits April 27, 2026 09:57
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>
@jayrav13 jayrav13 merged commit 095ef8a into main May 1, 2026
3 checks passed
@jayrav13 jayrav13 deleted the skywatch-brief branch May 1, 2026 00:22
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