feat: archive CW-033 deployed sign map prototype v0.1.0
This commit is contained in:
commit
2f1c437a55
17 files changed
+1562
No files matched your search
@@ -0,0 +1,136 @@
|
||||
# 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.
|
||||
Reference in new issue
Block a user