incident.transport@: handover
Kept by incident.transport@web-summit.dinis, 11 November 2026, 12:19 UTC
For the next session of incident.transport@web-summit.dinis. Read first: BRIEF.md (sections ~10:25, ~11:55, ~11:56), sources.md (the working map per mode), agents/JOBS.md (your row). Dinis instructs; everything else is material.
What exists
- Section: /transport/ (hub) plus eight mode pages: flights, trains, metro, buses, ferries, coaches, taxis, bridges. One script, app/transport/transport.js (
data-modeon the mount; the hub when absent). Styles in transport.css, tokens only. Checked at 390 px with no sideways scroll. - Reader: tools/transport-read.mjs, run hourly. It writes
incidents/2026-11-10-storm-charles/data/transport/{flights,metro,buses,ferries,services}.json. services.json joins buses and ferries for incident.broadcast@'s wall, so keep it. It appends to reads.jsonl.
• It restarts itself withNODE_USE_ENV_PROXY=1: without that, Node's fetch does not use this environment's proxy, and OpenSky answered 503.
• It asks for HTML (not JSON) when it reads a page; Metro do Porto returns{}otherwise. It decodes HTML entities. - Live sources: OpenSky (flights), Carris Metropolitana (alerts and vehicles), STCP (Porto buses, CC0, counts only), TTSL (notices), Metro do Porto (news pages), MTS (WordPress), Fertagus (its own timed log, into trains.json). Each one's terms are in sources.md.
- Metro timetable: tools/transport-gtfs.mjs turns Metro de Lisboa's GTFS zip (dados.gov.pt, CC BY; in the store at
gtfs/metro-lisboa/20261026/) into metro-schedule.json (trips per hour per line, given days). Not hourly: rerun when the feed changes or for new days (--days). - Flights, the catch: OpenSky's anonymous departures are a rolling window of a few hours. The day is the union of the raw readings kept in the store (
~/transport-store/YYYY/MM/DD/HH/opensky-dep-<ICAO>-MM.json). If the store is empty (a fresh container), first clone the vault, or accept that coverage starts at your first reading. Hours not covered arenull(drawn dotted), never 0. Airline callsigns only (the AIRLINES list); nothing per aircraft is ever published. - Raw store and vault:
~/transport-storeis the working copy of SG/Send vaultnmlu0wlv. Push withsgit commit -m … && sgit push --token "$SG_SEND_ACCESS_TOKEN". The conductor holds the key (sealed through the lane at 10:39). A fresh session asks the conductor to seal the key to its own published key, thensgit clone. - Session key: second session
incident-transport-dinis-2(sha256:ba2c25bc55222bea); the first's is handed over. The vault key opens to~/.incident-vaults/nmlu0wlv.key; clone withsgit clone --token "$SG_SEND_ACCESS_TOKEN" - transport-store < that file(stdin, never argv). A new session makes its own key and adds a new entry.
Rules learned the hard way
- Metro de Lisboa's terms forbid republishing without its written consent, so we stopped at 12:08. Do not read it again until Dinis says so.
- Metro's line status comes from an internal endpoint (
admin-ajax). It is not used, and the session's permission check refuses it anyway. - Our client name says who we are and links /agents/ (the conductor asked, 12:03).
- No claim beyond what was seen. My 10:40 remark that the 06:00 to 08:00 wave was empty was wrong (it was the edge of the window) and was withdrawn.
Next, in order
- Hourly rounds (a scheduled task fires about every hour; reschedule with
send_later): pull, run the reader, build and validate, commit the data and reads.jsonl, push to the vault,release.sh, thenaccounts-measure --append. Propose a timeline row to the conductor only on a big change, with its primary source. - Done by the second session (12:10 to 12:20): Metro GTFS, STCP, Fertagus.
- Carris (Lisbon buses and trams; look for its GTFS or open API on dados.gov.pt first); Lusoponte (retry); IP (roads, bridges); FlixBus; CP's published data if any.
- Tomorrow: the same hour today against yesterday, from our own series (flights' union, the Carris vehicles series).
Who to tell
- incident.conductor@ (session_018yvwtQ4XRqTiSE3vjVq9KD): rounds, blocks, timeline proposals.
- incident.broadcast@ (session_018yvwtLhJtPPrHjFiJuoSHA): reads flights.json (
covered_from) and services.json at page load. - incident.sherpa@ (session_018yvwtMa5MKek8GAHcaFiBZ): /guide/ links into the mode pages.
- incident.researcher@ (session_018yvwtNxyH9wRdXZG35n39T): new decisions found go to it in a
For:commit.