# X-4 Nyx Rail channel integration

Status: implemented and verified on 2026-07-22.

## Product boundary

Nyx is a V1-owned house channel projected into the V10 Rail as `v1.nyx`. The
Rail owns delivery policy; Nyx owns astronomical computation and forecast truth.
The channel manifest therefore declares tiles, drips, optional media, and
daypart affinity without priority, interruption, or elevation controls.

The surface follows one visual thesis: an observatory glance line rather than a
celestial dashboard. The next visible event and its time dominate; source and
coarse location context remain supporting detail. There is no autoplay motion.

## Real sources

- `NyxRailEphemerisAdapter` samples the real `@nyx/ephemeris` engine across the
  requested night. It emits the Moon's computed above-horizon culmination and
  only genuinely close (three degrees or less), simultaneously visible planet
  conjunctions. It does not label ordinary planet visibility as a conjunction.
- `NyxSkyClockBriefingSource` passes those events through `@nyx/sky-clock`'s
  materialiser. That boundary validates the observer, filters below-horizon
  events, assigns visibility rank, and caches exactly one briefing per
  one-degree location bucket and local night.
- `NyxNoaaAuroraForecastSource` uses the existing `@nyx/events` NOAA SWPC client
  and Nyx geomagnetic visibility forecaster. A forecast becomes a drip candidate
  only when its period overlaps the requested night and its Kp value can
  plausibly reach the observer's geomagnetic latitude. Missing, failed,
  out-of-window, or locally implausible data never becomes a fabricated alert.
- `createNyxSkyCamSource` accepts an explicit provider and source reference and
  can add that feed to the channel's video lane only as `docked-third-party`.
  The production directory currently declares no camera, because no verified
  feed is configured in this deployment.

## Contract and privacy properties

- The tile exposes only the sky-clock's one-degree location bucket, never the
  observer's precise latitude or longitude.
- Source outputs are parsed strictly, event ids must be unique, events must be
  chronological, and timestamps require explicit offsets.
- Drip reads are bounded to 48 hours and emit only `nyx.sky-event` or
  `nyx.aurora`; their payloads contain no channel-controlled delivery fields.
- The manifest declares `punishesAbsence: false`, no micro-act, no live-moment
  elevation, and strongest affinity (`1`) for `wind-down`.
- Desktop, browser, mobile, watch, and TV receive the text-first tile. Optional
  camera playback remains a larger-surface lane concern.

## Verification evidence

- Nyx channel: typecheck and lint pass; 11/11 focused tests pass, including real
  ephemeris calculations, sky-clock materialisation/caching, NOAA forecast
  adaptation, low-latitude suppression, strict source failure, privacy, drip
  bounds, text truncation, absence semantics, and optional camera
  classification.
- Nyx sky-clock substrate: its Nx project metadata now truthfully declares
  `type:lib`; its own test and lint targets pass.
- Cross-channel invariants: Nyx joins the post-pilot invariant manifest set
  without being reclassified as a Phase A pilot. Phase A typecheck/lint and all
  29/29 tests pass, including no-absence-punishment, no-autoplay, elevation
  budget, surface, consolidation, and adult-ring gates.
- V10 web: typecheck and lint pass; 166/166 unit/component tests pass.
- Playwright production directory: 4/4 pass across desktop and mobile Chromium,
  including the visible Nyx entry and horizontal-overflow guard.
- The workspace lockfile validates in frozen offline mode for the affected
  package filters.

This adapter is the Nyx content authority required by the morning Thread. Tara
and Arete remain separate X-4 adapter tasks before X-3 can honestly compose all
house-channel content.
