Files
deployed-sign-map/README.md
T

137 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Deployed Sign Map
Map deployed transit signs and kiosks against verified GTFS stops and routes, with player health and phone navigation.
**CoWork project:** CW-033 — Deployed Sign Map
**Version:** 0.1.0
**Type / status:** Tool / Beta prototype
**Owner:** Bryan Gilliom
**Contributor:** Codex
**Updated:** October 28, 2026
**Git repository:** https://git2.mpm.to/mpm/deployed-sign-map
## Overview
This working prototype combines a read-only OnSign player snapshot, an official public GTFS feed, and a native CAD/AVL stop-ID crosswalk. It supports service technicians, salespeople, and implementation teams who need to see deployed devices alongside their stops and scheduled routes. It preserves the difference between a bus-stop coordinate and the surveyed location of a physical sign. It does not modify OnSign or the CAD/AVL system.
The captured RTC Washoe pilot is complete as a snapshot. Conversion into an installable skill or plugin, live refresh, and other-agency support remain future work. There is no SKILL.md, plugin manifest, or new MCP server in this package.
## Capabilities and planned skill entry points
| Capability | Current behavior | Potential trigger |
|---|---|---|
| Deployment map | Shows field signs and kiosks with online/offline icons and excluded test/showroom records | “Map the deployed signs for this agency” |
| Native stop crosswalk | Resolves each OnSign `-S` ID through native `SrcStopID` to GTFS `stop_id`; retains comma-separated kiosk IDs individually | “Crosswalk the player stop IDs to GTFS” |
| Route geometry | Joins resolved stops to active GTFS trips; renders ordered shapes using `route_color` | “Show the routes serving these signs” |
| Service navigation | Provides Apple Maps and Google Maps driving links using GTFS coordinates | “Navigate to this stop” |
| Quiet basemaps | CARTO Positron vector, labels or no labels; hidden POIs; Esri gray, original streets, and plain background | “Use a quieter basemap” |
| Predeployment planning | Not built; planned spreadsheet/list intake with the same reconciliation rules | “Map these planned stop installations” |
These are prototype capabilities and proposed skill triggers, not already installed tools.
## Contents
- `source/`: Python preparation, read-only native API fetch, renderer, integrity checks, HTML template, and pinned third-party map libraries.
- `sample-work/rtc-washoe/`: credential-free HTML map, source snapshots, public GTFS ZIP, resolved crosswalk, verification results, and PNG previews. Keep operational sample data in Coordination Drive, not in the public Git repository.
- `HANDOFF-BRIEF.md`: accepted decisions, evidence, open work, and exact continuation steps.
- `Wiki V2.md`: source for the native Google Docs wiki.
- `file-manifest.json`: file sizes and SHA-256 values for the archived package.
## Tools and interfaces used
| System | Read operations used in this work |
|---|---|
| Existing OnSign MCP (CW-032) | `find_players`, `account_summary`, `get_player`; investigation also used `get_data_feed` and `whats_playing` |
| Native Vontas traveler API | `GetStop`; `GetStopRouteTrip` was used to establish stop/trip identifier evidence; `?WSDL` exposed the read operation schema |
| Public GTFS | `feed_info`, `calendar`, `calendar_dates`, `stops`, `stop_times`, `trips`, `routes`, `shapes` |
| Browser map | Leaflet 1.9.4, MapLibre GL JS 5.6.2, MapLibre–Leaflet integration 0.1.3 |
## Reproduce the captured snapshot
Python 3 is sufficient for the data scripts. Third-party map libraries and their license notices are included under `source/vendor/`.
From the package root, with the source and sample-work archives extracted into sibling directories:
```bash
python3 source/scripts/prepare_data.py \
--players sample-work/rtc-washoe/onsign-players.json \
--native sample-work/rtc-washoe/native-stops.json \
--gtfs sample-work/rtc-washoe/rtc-gtfs.zip \
--service-date 2026-10-28 \
--output-dir dist
python3 source/scripts/verify_snapshot.py \
--data dist/rtc-map-data.json \
--native sample-work/rtc-washoe/native-stops.json \
--gtfs sample-work/rtc-washoe/rtc-gtfs.zip
python3 source/scripts/render_map.py \
--data dist/rtc-map-data.json \
--output dist/rtc-washoe-sign-map.html
python3 -m http.server 8765 --bind 127.0.0.1
```
Open `http://127.0.0.1:8765/dist/rtc-washoe-sign-map.html`. The archive contains no API key. It defaults to Esri Gray Canvas; selecting a CARTO style asks for a basemap key held in that tab only. Rendering with `--include-carto-key` explicitly embeds `RTC_CARTO_BASEMAP_KEY`; use that only for an approved browser-key distribution.
The snapshot feed covers September 5, 2026–January 1, 2027. Replaying the captured date is intentional. A live rebuild requires a newly downloaded official feed, a fresh OnSign snapshot, and fresh native responses; do not present this capture as current health.
### Read native stops for a new snapshot
Set `RTC_NATIVE_API_BASE` to the approved HTTPS ASMX service URL and `RTC_NATIVE_API_KEY` through a secure local environment. Do not put credentials in a command, Git file, report, or handoff.
```bash
python3 source/scripts/fetch_native_stops.py \
--players input/onsign-players.json \
--output input/native-stops.json
```
The script calls only `GetStop`, validates the returned `StopID`, stores credential-free responses, throttles requests, and exits with an error if any requested ID fails. It does not fetch player records itself; the host must supply the existing OnSign MCP export.
### Setup checklist
- [ ] Extract source and private sample-work packages into the expected directory structure.
- [ ] Use Python 3 and a browser with WebGL for vector basemaps.
- [ ] Run preparation and integrity verification before rendering.
- [ ] Choose an approved CARTO basemap key or a key-free alternative.
- [ ] Preserve attribution for CARTO/OpenStreetMap or Esri and the bundled library notices.
- [ ] For live work, refresh inputs and label the OnSign/native/feed timestamps separately.
## Connection and credential model
| Field | Behavior |
|---|---|
| OnSign | Existing account-scoped, read-only MCP; no new direct OnSign API key is required by this tool |
| Native stop API | HTTPS GET; key stays in the acquisition process; authenticated URLs are not printed |
| Basemaps | Online CARTO vector service uses a browser basemap key; Esri/OSM raster and plain alternatives are available |
| Map data | Stops, routes, shapes, crosswalk, and player health are embedded as a captured snapshot |
| Remote writes | None to OnSign or native CAD/AVL |
## Workflow rules
1. Verify the agency's current official feed and service-date coverage before matching stops.
2. Extract native `-S` IDs, including each comma-separated kiosk ID. Preserve excluded records without inventing positions.
3. Use the native API's explicit `SrcStopID` crosswalk. Never assume a numeric native stop ID equals GTFS `stop_id`.
4. Use GTFS latitude/longitude for all markers and navigation. OnSign GPS, manually placed positions, and IP geolocation are not coordinate authority.
5. Derive route associations from resolved stop IDs, `stop_times`, and active `trips`; derive line geometry from ordered `shapes`. Never infer a route from a nearby line or equate native and GTFS route IDs.
6. For kiosks, use a clearly labeled parent-station anchor; derive routes from the resolved bay list, not every bay at the station.
7. Report ID failures, name conflicts, and native-versus-GTFS coordinate differences separately. The current 25 m flag is a review threshold, not a measured GPS accuracy claim.
8. Preserve keys outside published maps by default. Maintain private customer snapshots separately from public code.
## Known limits and troubleshooting
| Symptom / limit | Action |
|---|---|
| Source-stop ID is missing from current GTFS | Stop the build and obtain an agency crosswalk; do not guess coordinates |
| Kiosk bays do not share one GTFS parent station | Require explicit review; the current prototype stops rather than selecting an arbitrary anchor |
| CARTO background is missing | Check basemap key, connectivity, WebGL, and attribution; choose Esri or plain background |
| Feed has expired | Download the official current feed for a live rebuild; use the captured service date only to replay this sample |
| Source template has RTC-specific dates and copy | Generalize these before using another agency; current data scripts expose a service-date argument but the UI is still a pilot template |
| Rapid basemap switching logs an abort | A removed vector map can cancel an outstanding request; verify the selected basemap finishes loading |
| Phone navigation | Links and destinations were verified in the browser; physical iPhone/Android launch was not tested |
| Live device health / detours / arrivals | Not implemented; captured health and static scheduled service only |
## Requirements and licenses
Python 3 standard library; Leaflet 1.9.4; MapLibre GL JS 5.6.2; MapLibre–Leaflet integration 0.1.3; optional CARTO basemap access; authorized existing OnSign MCP and native API access for acquisition. Bundled upstream licenses are in `source/vendor/`. No redistribution license has been selected for MPM-authored source; creating a public repository does not by itself grant an open-source license.