Trail alerts

Closed Breakneck Ridge station is closed

What to do instead Get off at Cold Spring for the southern trail, Beacon for the northern.

What to do instead Full notice

No trains stop here. Closed April 2025, being rebuilt as part of the Fjord Trail.

active From Mon, Apr 21, 12:00 AM, until further notice Source: Metro-North

Prototype demonstration

One source, seven surfaces

Close a trail section on the left. Watch every page that mentions it change, from that one action.

The RFP asks for information "managed from a single source and automatically reflected throughout the website." This page is that sentence, running. There is one closure record. Seven surfaces ask about it. None of them holds a copy, so none of them can drift.

What you are looking at

This console stands in for the Craft control panel. The JSON it writes is the contract the production CMS emits — the same notices.json shape, validated against the same schema file that ships with this prototype. The propagation you are about to see is real; the editor chrome is ours.

We made that trade deliberately. Standing up PHP, a database and Craft to render a stock control panel would have consumed two days of a nine-day build and shown you nothing a screenshot could not. Building our own console let us put the editor and every affected surface on one screen — which is a better demonstration, and it is honest about what it is.

Ops Console

Four realistic starting points. Edit anything afterwards.

Trailheads, parking and facilities affected

In Craft these are entry-relation fields — one per affects bucket. They are separate from the trail section because a closure can shut a lot without shutting the path, and the site has to be able to say which.

Critical is announced assertively and cannot be dismissed. Major is announced politely, so a screen-reader user mid-sentence is not interrupted for a detour. Minor and info never reach the bar at all.

The CMS refuses to publish a closure without this. "Breakneck Connector closed" and nothing else has told somebody standing at a trailhead precisely nothing.

There is no status field on this form, and there is no way to add one. Status is derived from these two times and the clock. Nothing on this site needs a human to remember to take a notice down.

Modes affected
Where it shows
Español

Spanish is four fields on the record, not a second website. Clear the title and publish to see the untranslated-notice warning the staff dashboard raises.

Nothing published.


Drag past the end time. The closure retires itself from all seven surfaces with nobody touching anything — because status is a function of starts_at, ends_at and the clock, and no editor can set it. Storm King was still showing "Storm King is closed Thursday, July 16, in response to the poor air quality" on 7 and 8 August, three weeks stale, beside a live "Open today" saying the opposite. That failure is not available here.

1 · The site-wide alert bar

display.site_alert_bar ∧ severity ∈ {critical, major} ∧ status ∈ {active, expiring}

The real bar is at the very top of this page — this panel reports what the query returned for it.

2 · The map

display.map ∧ (active ∨ scheduled within 72h) → geometry from affects.segments
connectors Connector — Forest Trail North Reach (3) Connector — Forest Trail North Reach (5) Connector — Forest Trail South Reach (1) Connector — Forest Trail South Reach (2) Connector — Forest Trail South Reach (4) Connector — Marsh Trail Reach (6) Connector — Marsh Trail Reach (7) main-trail Fjord Trail North — Forest Trail North Reach (1) Fjord Trail North — Forest Trail North Reach (4) Fjord Trail North — Marsh Trail Reach Fjord Trail South — River Reach
Open Closed — hatched and dashed, never colour alone

Indicative alignment traced from published planning figures (FGEIS Jan 2026), not survey data. The full map is at /map/ and runs this same query.

3 · The trail section page

affects.segments ∋ this

4 · Trailhead and parking pages

affects.trailheads ∋ this ∨ affects.parking ∋ this ∨ affects.amenities ∋ this

5 · Plan Your Visit

route.segments ∩ affects.segments, for the chosen date and mode

6 · Events calendar

event.location ∈ affects.* ∧ dates intersect → "may be affected"

7 · Español

the same record, i18n.es

The record itself

content/v1/notices.json
 

One record. Seven queries. No copies. The live version of this file is at /api/v1/notices.json, and it is offered publicly — today, NYS Parks, 511NY and the MTA all publish HHFT's operational status while hhft.org's only alert slot carries a promotion for the annual report.

Is it really the same query?

The surfaces above run in your browser, which means the query had to be a pure function rather than something that only exists at build time. Two implementations of one query is exactly the drift this whole contract exists to prevent — so the equivalence is checked when the site is built, and the result is printed here rather than promised.

All 10 query shapes agree between this page's query and content.ts#noticesFor, over the 2 authored records, checked when this page was built.

selectNotices(allNotices(), q) versus content.ts#noticesFor(q), over 2 authored notice records. The surfaces above run the same function over all 9 records, authored plus feed-ingested.
Query Agree Returned
all live yes notice-breakneck-station-rebuild:active
alert bar yes notice-breakneck-station-rebuild:active
map yes notice-breakneck-station-rebuild:active
planner yes notice-breakneck-station-rebuild:active
critical + major only yes notice-breakneck-station-rebuild:active
MTA-sourced yes notice-breakneck-station-rebuild:active
wheelchair mode yes —
any status yes notice-river-reach-boardwalk-works:scheduled, notice-breakneck-station-rebuild:active
segment seg-fjord-trail-south-river-reach-2 yes —
place th-little-stony-point yes —

What this demonstrates, in the RFP's own terms

The live conditions this same model carries — weather from two National Weather Service offices, NOAA tide predictions, Metro-North arrivals, 511NY road events, and sunrise and sunset computed on your device — are at Visit → Conditions.