schema: openmapstack-project/v1
runs:
  latest:
    id: run-20261029-180826
    started_at: '2026-10-29T18:08:26.514035+00:00'
    completed_at: '2026-10-29T18:09:18.658777+00:00'
    status: warning
    inputs_hash: sha256:ed482347b7d8e590b7feab39e05315b7059880f321c41ce02600377dd3f4ef6f
    outputs_hash: sha256:fc0aa60ebb7a3ccca2b5349d5ccb265e46a12334efad3b703d33a6aa24ab8c51
    record:
      path: runs/run-20261029-180826.json
    validation_report:
      path: validation/latest-report.json
delivery:
  schema: openmapstack-delivery/v1
  targets:
  - id: dashboard
    kind: dashboard
    mode: local
    output: dashboard
    inputs:
    - stops
    - routes
    - stations
    evidence: dashboard_evidence
project:
  id: tallinn-transit
  title: Tallinn liigub · ühistransport ja uksest ukseni reisiplaneerija
  question: Loo Tallinna ühistranspordi kaart ja uksest ukseni reisiplaneerija koos aadressiotsingu, sõidukite
    asukohtade, päris jalgsimarsruutide ning võrguta kasutamisega.
  created_at: '2026-10-28T20:57:21.105924+00:00'
  updated_at: '2026-10-29T18:09:18.658777+00:00'
  status: warning
  aoi:
    bbox:
    - 24.3
    - 59.2
    - 25.2
    - 59.65
    crs: EPSG:4326
  author:
    name: Jaak Laineste
    email: jaak.laineste@gmail.com
    url: https://github.com/jaakla
  generated_with:
    tool: OpenMapStack
    url: https://jaakla.github.io/openmapstack-skills/
interpretation:
  objective: Eestikeelne reisiplaneerija võrdleb kõiki jalgsikäigu ulatuses peatuseid. Marsruudid arvutatakse
    seadmes; veebis lisanduvad In-ADS-i aadressiotsing ja GPS-asukohad.
  assumptions:
  - id: A1
    statement: Sama peatuse lähestikku paiknevad platvormid koondatakse kuni 400 m vahedega. Nimesid „Balti
      jaam 1” ja „Balti jaam” käsitletakse ühise peatusena ainult siis, kui numbrita nimi on lähteandmetes
      olemas. Loendid ja kaugvaade näitavad peatust; sõidujuhised määravad täpse platvormi. Veebis lisanduvad
      In-ADS-i aadressid.
    rationale: Üks peatus võib teenindada mitut suunda. Eraldi kaugel paiknevaid samanimelisi peatusi
      ei ühendata.
  - id: A2
    statement: Kõnniteed järgitakse OpenStreetMapi jalakäijate teedevõrgus. Vaikimisi võrreldakse kõiki
      kuni 1000 m jalgsikäigu kaugusel platvorme; ümberistumiste jalgsitee võib olla kuni 600 m. Kõndimise
      kiirus on 1,25 m/s; ümberistumisel lisandub 120 sekundit varuaega.
    rationale: Pikem jalgsikäik võib anda kiirema ühenduse. Lähim peatus ei ole ainus kandidaat.
  - id: A3
    statement: Kuupäev ja kellaaeg käivad Europe/Tallinn ajavööndi järgi. Arvesse lähevad kalendrierandid,
      südaööd ületavad reisid ning eelmine, valitud ja järgmine teeninduspäev.
    rationale: Teekond peab jääma õigeks ka välismaa ajavööndis seadmes.
  - id: A4
    statement: Veebirežiimis uuendatakse GPS-i iga 10 sekundi järel. Võrguta režiimi valimine salvestab
      kogu andmepaketi ja eemaldab GPS-asukohad. Paus peatab uuendamise, jätkamine küsib asukohad kohe
      uuesti.
    rationale: GPS vajab võrguühendust. Tallinn ei anna üksiksõiduki mõõtmisaega; Elron annab selle Europe/Tallinn
      ajavööndis.
  - id: A5
    statement: Hoone või platvorm ühendatakse lähima sobiva teelõiguga kuni 70 m piires. Edasine teekond
      järgib olemasolevat võrku. Arvestatakse foot/access piiranguid, suletud tõkkeid ja oneway:foot suundi.
    rationale: Hoone viitepunkt ei ole alati sissepääs. Viimaste meetrite ühendus võib olla ligikaudne;
      ligipääsetavus ja ajutised sulgemised vajavad kohapealset kontrolli.
  - id: A6
    statement: Rongid osalevad samas sõiduplaanipõhises teekonnaotsingus bussi ja trammiga. Elroni GTFS-i
      peatus Tallinn on koondatud Balti jaamaga; säilivad eri suundade peatused ja tegelikud jalgsikäigud.
      Puuduvaid perrooni numbreid ei tuletata peatuse ID-st.
    rationale: Linna sees võib rong anda kiireima ühenduse, ent ümberistumine peab järgima jalgteid.
sources:
  gtfs:
    role: authoritative_input
    provider: Tallinn public transport / Tallinna Linnatransport
    dataset: gtfs
    source_url: https://transport.tallinn.ee/data/gtfs.zip
    access:
      method: https
      retrieved_at: '2026-10-28T20:47:31.294314+00:00'
      file:
        name: gtfs.zip
        format: zip
        size_bytes: 2629267
      request_spec: https://transport.tallinn.ee/data/gtfs.zip?download=1
    version:
      identifier: 0d3de862ba1aed7724f3e0d14f112018d3c6dfd8eac574dffc4d17e727bf7899
    pin:
      class: local_snapshot
      path: data/source/gtfs.zip
      sha256: sha256:0d3de862ba1aed7724f3e0d14f112018d3c6dfd8eac574dffc4d17e727bf7899
      captured_at: '2026-10-28T20:47:31.294314+00:00'
    selection:
      filter: Complete municipal archive; only stops referenced by trips are retained.
      semantic_predicates:
      - field: route_type
        domain_value: 0 or 900–906 = tram; 3 = bus; 800 = trolleybus (bus group). Original GTFS codes
          are retained.
      - field: stop_name
        domain_value: Same-name platforms within 400 m are grouped; a trailing platform number is removed
          only when the unsuffixed stop name exists in the source. Original names remain in detailed instructions.
    license:
      name: Public municipal transport export; attribution retained; no explicit standard license identified
      url: https://transport.tallinn.ee/
    schema:
      crs: EPSG:4326
      key: trip_id
      columns:
      - route_id
      - route_type
      - trip_id
      - service_id
      - stop_id
      - stop_lat
      - stop_lon
      - arrival_time
      - departure_time
      - pickup_type
      - drop_off_type
      - shape_id
    rationale: Official Tallinn export contains city route shapes and the same route names as its GPS
      CSV. Complete ZIP chosen over a national archive with unrelated stops.
  basemap:
    role: context
    provider: OpenStreetMap contributors / Protomaps / goplex.ee
    dataset: basemap
    source_url: https://tiles.goplex.ee/planet-20261006.json
    access:
      method: https
      retrieved_at: '2026-10-28T20:47:58.086245+00:00'
      file:
        name: tallinn.pmtiles
        format: pmtiles
        size_bytes: 9773382
      request_spec: https://tiles.goplex.ee/planet-20261006/{z}/{x}/{y}.mvt
    version:
      identifier: 18ea851437db6c32c41a8dfd000eb26505d603eb55bc2615abda865d958203f6
    pin:
      class: local_snapshot
      path: data/source/tallinn.pmtiles
      sha256: sha256:18ea851437db6c32c41a8dfd000eb26505d603eb55bc2615abda865d958203f6
      captured_at: '2026-10-28T20:47:58.086245+00:00'
    selection:
      filter: Tallinn bounded snapshot; GPS runtime is independent and is never replayed as live data.
      semantic_predicates: []
    license:
      name: OpenStreetMap ODbL 1.0; Protomaps basemap styles BSD-3-Clause
      url: https://www.openstreetmap.org/copyright
    schema:
      crs: EPSG:3857
      key: tile_id
      columns:
      - tile_id
      - z
      - x
      - y
    rationale: Bounded city extract of the configured 2026-10-06 Protomaps snapshot; 1040 vector tiles
      at zoom 0–14, with local styles, fonts and sprites. Offline requirement favors self-hosted vector
      tiles over regional WMS.
  gps_reference:
    role: context
    provider: Tallinn public transport GPS
    dataset: gps_reference
    source_url: https://transport.tallinn.ee/gps.txt
    access:
      method: https
      retrieved_at: '2026-10-28T20:47:31.323720+00:00'
      file:
        name: gps-snapshot.txt
        format: txt
        size_bytes: 16819
      request_spec: https://transport.tallinn.ee/gps.txt?x=1
    version:
      identifier: 2dfaa786daca98aa07f89059094c0b2b0ef73572c81af4f2ef2565dfad430b4b
    pin:
      class: local_snapshot
      path: data/source/gps-snapshot.txt
      sha256: sha256:2dfaa786daca98aa07f89059094c0b2b0ef73572c81af4f2ef2565dfad430b4b
      captured_at: '2026-10-28T20:47:31.323720+00:00'
    selection:
      filter: Tallinn bounded snapshot; GPS runtime is independent and is never replayed as live data.
      semantic_predicates: []
    license:
      name: Public municipal GPS export; attribution retained; no explicit standard license identified
      url: https://transport.tallinn.ee/
    schema:
      crs: EPSG:4326
      key: vehicle_id
      columns:
      - mode
      - route
      - longitude_microdegrees
      - latitude_microdegrees
      - speed
      - bearing
      - vehicle_id
      - low_floor
      - route_code
      - headsign
    rationale: Captured only for deterministic parser tests and schema evidence; never used as runtime
      live data.
  walk_osm:
    role: authoritative_input
    provider: OpenStreetMapi kaasautorid / BBBike
    dataset: Tallinna jalakäijate teedevõrk
    source_url: https://download.bbbike.org/osm/bbbike/Tallinn/Tallinn.osm.pbf
    access:
      method: https
      retrieved_at: '2026-10-28T21:35:19.543345+00:00'
      request_spec: Tallinna BBBike PBF-i tervikväljavõte; kohalik lõige bbox 24.44,59.27,25.05,59.58
      file:
        name: tallinn-walk.osm.pbf
        format: OSM PBF
        size_bytes: 23767559
    version:
      identifier: 57150708d5cb2b3157ab037019ea2c866127d7aedc5c6e920d762995d8442710
      published_at: Sat, 24 Oct 2026 16:34:18 GMT
    pin:
      class: local_snapshot
      path: data/source/tallinn-walk.osm.pbf
      sha256: sha256:57150708d5cb2b3157ab037019ea2c866127d7aedc5c6e920d762995d8442710
      captured_at: '2026-10-28T21:35:19.543345+00:00'
    selection:
      bbox:
      - 24.44
      - 59.27
      - 25.05
      - 59.58
      filter: highway present; excluded motorways, construction, private/no foot access and locked or
        impermeable barriers
      semantic_predicates:
      - field: foot
        domain_value: no/private/customers/permit/delivery/use_sidepath are excluded; explicit yes/designated/permissive
          overrides general access restrictions
      - field: oneway:foot
        domain_value: yes/1 = forward only; -1 = backward only; otherwise two-way for pedestrians
    license:
      name: Open Database License 1.0 (ODbL)
      url: https://www.openstreetmap.org/copyright
    schema:
      crs: EPSG:4326
      key: osm_way_id
      columns:
      - highway
      - foot
      - access
      - barrier
      - locked
      - oneway:foot
      - nodes
      - name
    rationale: Kogu linna päris jalgteed on vajalikud nii aadressipõhiseks planeerimiseks kui võrguta
      kasutamiseks. Väike fikseeritud OSM-i väljavõte asendab sirgjoonelised jalgsikäigu lähendid.
  elron_gtfs:
    role: authoritative_input
    provider: Elron / Regionaal- ja Põllumajandusministeerium
    dataset: elron_gtfs
    source_url: https://eu-gtfs.remix.com/elron.zip
    access:
      method: https
      retrieved_at: '2026-10-29T07:29:50.256742+00:00'
      file:
        name: elron-gtfs.zip
        format: zip
        size_bytes: 1290597
      request_spec: https://eu-gtfs.remix.com/elron.zip
    version:
      identifier: 'Updated: Oct 1, 2026, 3:09 PM'
    pin:
      class: local_snapshot
      path: data/source/elron-gtfs.zip
      sha256: sha256:e76e0675df53c373b24f0b28c30fce60079b3382aa90daf04948e6ea90bf4208
      captured_at: '2026-10-29T07:29:50.256742+00:00'
    selection:
      bbox:
      - 24.45
      - 59.28
      - 25.04
      - 59.57
      filter: Rail (route_type=2), only contiguous spans of at least two stops inside the existing offline
        map coverage. Preserve source calendar, times, boarding restrictions, headsigns and rail shape
        vertices; namespace all identifiers elron:. Tallinn rail station aliases Balti jaam; original
        source names retained.
    license:
      name: Public national GTFS export; publisher attribution retained; standard license not verified
        for this distribution
      url: https://mobilitydatabase.org/feeds/gtfs/mdb-3153
    schema:
      crs: EPSG:4326
      key: trip_id
      columns:
      - route_id
      - route_type
      - trip_id
      - service_id
      - stop_id
      - stop_name
      - stop_lat
      - stop_lon
      - arrival_time
      - departure_time
      - shape_id
    rationale: MobilityData identifies this producer URL as the official Elron GTFS feed. Existing compact
      Tallinn map and pedestrian graph bound train coverage.
overrides: []
processing:
  analysis_crs: EPSG:3301
  storage_crs: EPSG:4326
  steps:
  - id: load_gtfs
    operation: parse_gtfs
    inputs:
    - gtfs
    - elron_gtfs
    output: gtfs_parsed
  - id: compile_walk
    operation: compile_pedestrian_topology
    input: walk_osm
    output: walk_graph
    crs: EPSG:3301
  - id: transfer_graph
    operation: pedestrian_shortest_paths
    output: transfers
    crs: EPSG:3301
    max_distance_m: 600
    inputs:
    - gtfs_parsed
    - walk_graph
  - id: export_network
    operation: export
    inputs:
    - gtfs_parsed
    - transfers
    output:
    - network
    - stops
    - routes
    - stations
  - id: package_map
    operation: copy_pinned_map
    input: basemap
    output: local_basemap
  - id: render_dashboard
    operation: vite_build
    inputs:
    - network
    - stops
    - routes
    - local_basemap
    output:
    - dashboard
    - dashboard_evidence
  - id: render_findings
    operation: render_findings
    inputs:
    - network
    - stops
    - routes
    output: findings
outputs:
  network:
    path: data/derived/network.json
    kind: document
    format: JSON
    generated_by: export_network
    note: Local timetable, service calendars, restrictions and precomputed metric transfer graph. Consumed
      by the browser worker.
  stops:
    path: data/derived/stops.geojson
    format: GeoJSON (EPSG:4326)
    generated_by: export_network
    crs: EPSG:4326
  routes:
    path: data/derived/routes.geojson
    format: GeoJSON (EPSG:4326)
    generated_by: export_network
    crs: EPSG:4326
  dashboard:
    path: dist/index.html
    format: HTML
    kind: document
    generated_by: render_dashboard
  dashboard_evidence:
    path: delivery/dashboard-evidence.json
    format: JSON
    kind: document
    generated_by: render_dashboard
  findings:
    path: findings.md
    format: Markdown
    kind: document
    generated_by: render_findings
  walking:
    path: data/derived/walk-network.json
    kind: document
    format: JSON
    generated_by: compile_walk
    note: 'Jalakäijate graaf: ngraph.path leiab seadmes päris teid järgivad lühimad rajad; punktid ja
      meetrid EPSG:3301.'
  stations:
    path: data/derived/stations.geojson
    format: GeoJSON (EPSG:4326)
    generated_by: export_network
    crs: EPSG:4326
findings:
  schema: openmapstack-findings/v1
  output: findings
validation:
  required:
  - geometry_valid
  - crs_known
  - row_count_gt_zero
  - source_result_complete
  - gtfs_references
  - gtfs_monotonic_times
  - layer_extent_within_aoi
  - metric_transfer_bound
  - crs_roundtrip
  - route_modes_known
  - live_fix_time
  - walking_network
  domain_checks: []
presentation:
  intent: analytical_workspace
  primary_view: map
  layout:
    type: map_with_sidebar
    sidebar:
      position: left
      width: medium
      organization: tabs
      section_state: collapsible
      tabs:
      - id: journey
        title: Teekond
        sections:
        - journey_planner
        - journey_options
      - id: routes
        title: Liinid
        sections:
        - route_search
        - route_details
      - id: stops
        title: Peatused
        sections:
        - stop_search
        - departures
      - id: sources
        title: Info
        sections:
        - credits
        - provenance
        - assumptions
        - warnings
        - offline
  controls:
    reconfigurable: true
    canonical_reset: true
    off_canonical_labelling: required
    filters: []
    scenarios: []
    variants: []
  map:
    engine_preference: maplibre
    basemap:
      id: tallinn-offline-protomaps
      kind: vector-style
      url: map/light.json
      dark_url: map/dark.json
      attribution: © OpenStreetMap contributors, Protomaps tiles by goplex.ee
      default_visible: true
      note: Local PMTiles extract of 2026-10-06, bounded to 24.45,59.28,25.04,59.57 at zoom 0–14; source
        snapshot pinned separately.
    layer_groups:
    - id: routes
      title: Routes
      default_open: true
    - id: stops
      title: Stops
      default_open: true
    layers:
    - source: routes
      group: routes
      semantic_role: primary_result
      geometry: line
    - source: stations
      group: stops
      semantic_role: source
      geometry: point
    - source: stops
      group: stops
      semantic_role: source
      geometry: point
  provenance_ui:
    feature_source_on_click: true
    show_source_timestamp: true
    show_assumptions: true
    credits:
      generated_with: true
      analysis_timestamp: runs.latest.completed_at
      author: true
runtime:
  implementation:
    pipeline: pipeline.py
    dependencies:
    - requirements.lock
    - package.json
    - package-lock.json
    - vite.config.js
    - index.template.html
    - src
    - public/sw.js
    - public/icon.svg
    - public/manifest.webmanifest
    - scripts
    - wrangler.jsonc
    - README.md
    - walking.py
    - gtfs_sources.py
  environment:
    python: '3.14'
    packages:
    - openmapstack[geo]==0.5.0
    - duckdb==2.0.0
    - pyyaml==6.0.3
    - pyproj==3.7.2
    - pmtiles==3.7.0
    - osmium==4.2.0
warnings:
- id: LIVE-001
  severity: medium
  issue: fix_time_unknown
  statement: Tallinna busside ja trammide GPS ei anna üksiksõiduki mõõtmisaega. Elroni rongide mõõtmisaeg
    on teada ja üle 3 minuti vanad asukohad eemaldatakse. Teekonna ajad lähtuvad sõiduplaanist, mitte
    GPS-ist.
  mitigation: Aegunud asukohad tuhmuvad ja eemaldatakse; teekonna ajad lähtuvad sõiduplaanist.
- id: WALK-001
  severity: medium
  issue: endpoint_snap_and_accessibility
  statement: Jalgsikäigud järgivad OpenStreetMapi teedevõrku. Hoone või platvormi viimased kuni 70 meetrit
    võivad olla ligikaudsed; ratastooliga ligipääsetavus ja ajutised sulgemised pole kinnitatud.
  mitigation: Kontrolli sissepääse ja kohapealseid liikumistingimusi.
- id: FRESH-001
  severity: medium
  issue: snapshot_freshness
  statement: Sõiduplaan ja teedevõrk on fikseeritud andmepaketis. Hilisemad muudatused ei lisandu automaatselt;
    sõiduplaani tuleb vähemalt kord nädalas uuendada.
  mitigation: Rakendus märgib üle seitsme päeva vana sõiduplaani.
- id: LICENSE-001
  severity: low
  issue: license_unverified
  statement: Tallinna ühistranspordivood on avalikud, kuid nende standardset edasilevitamise litsentsi
    ei leitud. Allikaviited on säilitatud.
  mitigation: Laiema edasilevitamise tingimused tuleb linnaga täpsustada.
- id: RAIL-001
  severity: medium
  issue: rail_coverage_and_snapshot
  statement: Elron on kaasatud olemasoleva Tallinna ja lähiümbruse kaardi piires, kuni Valingu, Saku ja
    Kullini. Rongisõiduplaani lähteversioon on 01.10.2026; hilisemad ajutised muudatused ei pruugi selles
    sisalduda. Kontrolli enne rongireisi Elroni teateid.
  mitigation: Värskenda GTFS-i kontrollitud lähtevoost; ära pikenda katvust ilma kaartide ja jalgsivõrgu
    uuendamiseta.
