{
  "_comment": [
    "SINGLE SOURCE OF TRUTH for every fact this site states more than once.",
    "The site is hand-authored static HTML with no build step, so nothing imports",
    "from here at runtime. Instead tools/check-facts.py asserts the pages agree",
    "with this file and fails loudly on drift. Run it with --write to regenerate",
    "field-observations.csv from it. Change a number HERE first, then in the markup,",
    "then run: python3 tools/check-facts.py"
  ],
  "brand": {
    "title": "Built for Cars, Banned for Bikes",
    "subtitle": "Why Campus Micromobility Fails Before it Starts",
    "course": "SYN 100",
    "college": "Seventh College, UC San Diego",
    "domain": "syn100-micromobility.vercel.app"
  },
  "release": {
    "version": "2.12.0",
    "date": "July 28, 2026",
    "_iso_comment": "The same date a machine can sort. Feeds sitemap lastmod and the JSON-LD dateModified, both of which are silent when wrong because only crawlers read them.",
    "iso_date": "2026-07-28"
  },
  "license": {
    "_comment": "Stated in five places (the credits section, the footer, the data page's citing block, its footer, and the JSON-LD license field on the project node and all three Dataset nodes), so it lives here and check 19 asserts they agree. A dataset with no license is a dataset nobody can safely reuse, which is the whole reason the CSVs are published.",
    "short": "CC BY-NC 4.0",
    "name": "Creative Commons Attribution-NonCommercial 4.0 International",
    "url": "https://creativecommons.org/licenses/by-nc/4.0/",
    "_covers_comment": "Only what this team made. The rest is other people's and we cannot relicense it, which is why the exclusions are listed rather than left implied.",
    "covers": "the writing, figures, code, and the three published datasets on this site",
    "excludes": [
      "The findings borrowed from the two other SYN 100 teams, which remain theirs and are used with credit.",
      "The City of San Diego police collision file the corridor extract is computed from, which is a public record under the city's own open data terms.",
      "The sources cited in the sources list, which remain the property of their publishers.",
      "The three typefaces, which are subsets of Barlow, Barlow Condensed and Source Serif 4 under the SIL Open Font License 1.1."
    ]
  },
  "bikeway": {
    "_comment": [
      "California's statutory bikeway classes, condensed from Streets and Highways",
      "Code section 890.4. They grade public streets and paths. A university's",
      "interior circulation is not in the scheme at all, which is the whole point",
      "of the first-mile section: the graded network stops at the property line,",
      "and that is exactly where the strictest rule starts."
    ],
    "statute": "California Streets and Highways Code, section 890.4",
    "classes": [
      {
        "id": "I",
        "name": "Bike path",
        "gloss": "A right of way completely separated from the road, for bicycles and pedestrians, with motor traffic crossing it as little as possible."
      },
      {
        "id": "II",
        "name": "Bike lane",
        "gloss": "A striped lane inside the roadway. Cars may not drive through it, but they still park across it and cross it."
      },
      {
        "id": "III",
        "name": "Bike route",
        "gloss": "A shared road marked only by signs or a stencil. Nothing separates a rider from traffic except the paint."
      },
      {
        "id": "IV",
        "name": "Separated bikeway",
        "gloss": "An on-street lane held apart from traffic by something physical: posts, a raised curb, or a row of parked cars."
      }
    ],
    "campus_leg": {
      "name": "No class",
      "gloss": "The scheme grades public streets, so the campus paths a rider finishes on sit outside it entirely. There is no class for a corridor you are told to walk."
    }
  },
  "network": {
    "_comment": [
      "Real municipal data, computed by us from SANDAG's own published layers, not",
      "quoted from anybody's write-up. Lengths are the sum of Shape__Length in each",
      "layer's own spatial reference, EPSG 2230, NAD83 California zone 6, US survey",
      "feet, so feet over 5280 is miles. Three notes on the raw data, all of which",
      "matter if anyone ever re-runs this. SANDAG's existing-routes layer carries a",
      "category spelled 'Muliti-Use Path', their typo for the same thing, and its",
      "2913 feet are folded into Multi-use path here. One 599-foot feature has no",
      "category at all and is kept in the total rather than quietly dropped. And the",
      "two layers measure different things, so they are never added together: one is",
      "every bike facility that exists, the other is the adopted regional spine.",
      "Nothing below is asserted. check-facts.py recomputes every derived number",
      "from the feet and fails if the page and the arithmetic disagree.",
      "The canonical CSV at geo.sandag.org returns 403 to non-US traffic, which is",
      "why these come from the agency's ArcGIS service instead. Same data, same body."
    ],
    "source": {
      "agency": "SANDAG",
      "existing_layer": "Bike Routes 2019",
      "plan_layer": "Adopted Regional Bike Network",
      "service": "services1.arcgis.com/HG80xaIVT1z1OdO5",
      "spatial_reference": "EPSG 2230, US survey feet",
      "retrieved": "July 27, 2026"
    },
    "existing": {
      "kinds": [
        { "name": "Bike lane", "feet": 5676396, "separated": false },
        { "name": "Bike route", "feet": 1833974, "separated": false },
        { "name": "Other suggested routes", "feet": 1740120, "separated": false },
        { "name": "Multi-use path", "feet": 994658, "separated": true },
        { "name": "Freeway shoulder", "feet": 189536, "separated": false },
        { "name": "Uncategorised", "feet": 599, "separated": false }
      ],
      "derived": {
        "total_miles": 1976,
        "separated_miles": 188,
        "on_road_share_percent": 90
      }
    },
    "plan": {
      "completed_feet": 1129047,
      "future_feet": 1805046,
      "derived": {
        "total_miles": 556,
        "completed_miles": 214,
        "future_miles": 342,
        "unbuilt_share_percent": 62
      }
    }
  },
  "first_mile": {
    "_comment": [
      "NOT OUR DATA. Counts collected by another SYN 100 team, used with credit.",
      "They studied the leg we do not: home to the campus edge. Every figure here",
      "is theirs and is attributed on the page every time it appears. Nothing in",
      "this block may be restated as ours. 'locations' are the six sites they",
      "counted traffic at, which is not quite the same list as the six entry",
      "points they rated, so the two are kept separate on purpose."
    ],
    "credit": {
      "team": "Team 3",
      "authors": "Anthony Tong, Alan Wang, Ari Pasha, Owen Molloy",
      "title": "Bridging the Gap: Understanding Micromobility Infrastructure From Home to Campus",
      "course": "SYN 100, Seventh College, UC San Diego",
      "year": 2026,
      "url": ""
    },
    "entry_points": [
      {
        "n": 1,
        "name": "Gilman Drive",
        "approach": "from the east",
        "access": "good",
        "note": "The highest non-motorized volume of any location they observed. A bus stop and a bike lane both present."
      },
      {
        "n": 2,
        "name": "Campus Point Drive at Genesee Avenue",
        "approach": "from the south",
        "access": "good",
        "note": "A bike lane is present but often not used properly, alongside heavy car traffic."
      },
      {
        "n": 3,
        "name": "Regents Road at Athena Way",
        "approach": "from UTC",
        "access": "good",
        "note": "The lowest traffic of any entry point they observed, used mostly as a pedestrian crossing."
      },
      {
        "n": 4,
        "name": "Regents Road at Nobel, to La Jolla Village",
        "approach": "from the south-east",
        "access": "caution",
        "note": "A less direct route to campus."
      },
      {
        "n": 5,
        "name": "Regents Road at Miramar Street",
        "approach": "from the south",
        "access": "good",
        "note": "A high-volume corridor, with outbound traffic heaviest in the afternoon."
      },
      {
        "n": 6,
        "name": "Villa La Jolla",
        "approach": "from the south-west",
        "access": "limited",
        "note": "No bike lane at all. Riders use the sidewalk, the road, or the pedestrian bridge."
      }
    ],
    "locations": [
      { "name": "Gilman", "car_share": 89 },
      { "name": "Campus Point", "car_share": 93 },
      { "name": "Miramar St", "car_share": 92 },
      { "name": "Villa La Jolla", "car_share": 91 },
      { "name": "Regents Pizza", "car_share": 90 },
      { "name": "Athena Way", "car_share": 53, "pedestrian_share": 41 }
    ],
    "derived": {
      "_comment": "Computed from 'locations' above, not asserted. check-facts.py recomputes both.",
      "locations_counted": 6,
      "locations_at_or_above_89_percent_car": 5
    }
  },
  "collisions": {
    "_comment": [
      "NOT OUR DATA. City of San Diego open data, person-level collision file.",
      "Every figure here is reproduced by tools/build-collisions.py into",
      "collisions-corridor.csv, and check-facts.py recomputes the percentages",
      "from the counts in that CSV, so nothing below is a number anyone typed.",
      "",
      "THE ONE THING A READER MUST NOT CONCLUDE: these are rates per person",
      "ALREADY IN A COLLISION. They are not per trip and not per mile. The file",
      "has no exposure denominator, so it cannot say whether cycling is more",
      "dangerous than driving. It says what happens to a body when the crash",
      "has already happened. The page states this in as many words and",
      "check-facts.py fails if that sentence goes missing.",
      "",
      "The `injured` and `killed` columns in the source are report totals copied",
      "onto every person row, not per-person flags. Using them cost us a wrong",
      "driver injury rate (57.9% instead of 30.3%) in the first draft. The",
      "per-person field is person_injury_lvl. See tools/build-collisions.py."
    ],
    "source": {
      "publisher": "City of San Diego",
      "file": "pd_collisions_details_datasd.csv",
      "url": "https://seshat.datasd.org/pd/pd_collisions_details_datasd.csv",
      "portal": "https://data.sandiego.gov/datasets/police-collisions-details/",
      "extract": "/collisions-corridor.csv"
    },
    "scope": {
      "beats": ["115", "124", "126", "932"],
      "beats_note": "The four SDPD beats covering UC San Diego and its approaches. Wider than campus: the file carries a police beat, not a campus boundary.",
      "window": "2018-2025",
      "window_note": "2015, 2016 and 2017 are severely undercounted in the source (9, 6338 and 368 rows citywide against roughly 18,000 in a normal year) and 2026 is still in progress. All four are excluded.",
      "reports": 3570,
      "persons": 7145
    },
    "roles": [
      { "role": "Bicyclist", "persons": 222, "injured_pct": 92.3, "killed_pct": 0.45, "severe_or_fatal_pct": 7.2 },
      { "role": "Pedestrian", "persons": 230, "injured_pct": 90.9, "killed_pct": 3.48, "severe_or_fatal_pct": 11.3 },
      { "role": "Driver", "persons": 4478, "injured_pct": 30.3, "killed_pct": 0.27, "severe_or_fatal_pct": 1.3 },
      { "role": "Passenger", "persons": 886, "injured_pct": 35.0, "killed_pct": 0.45, "severe_or_fatal_pct": 1.5 },
      { "role": "Parked vehicle occupant", "persons": 1215, "injured_pct": 1.2, "killed_pct": 0.0, "severe_or_fatal_pct": 0.0 }
    ],
    "derived": {
      "_comment": "Recomputed by check-facts.py from the CSV, never trusted as typed.",
      "unprotected_persons": 452,
      "unprotected_share_pct": 6.3,
      "deaths_total": 25,
      "deaths_unprotected": 9,
      "deaths_unprotected_share_pct": 36.0
    }
  },
  "climate": {
    "_comment": [
      "OUR OWN ARITHMETIC, not a figure quoted from anybody. Every number under",
      "'derived' is recomputed by check-facts.py from 'inputs', so the only things",
      "a reader has to accept are the four inputs, and each carries a published",
      "source named on the page.",
      "",
      "THE UNIT IS DELIBERATE: per 1,000 daily round-trip car commuters. We do not",
      "know how many people drive to this campus, and inventing that number to get",
      "a bigger headline is the exact move this site exists to argue against. A",
      "rate scales to whatever the real population turns out to be.",
      "",
      "WHAT IT ASSUMES AND CANNOT PROVE: that a trip shifted off a car is a trip",
      "not driven, one for one. Real mode shift is messier, and some of the",
      "replaced trips would have been walked or bussed anyway, so treat these as",
      "the ceiling on what a given shift saves rather than a forecast. The page",
      "says so in as many words and check-facts.py fails if that goes missing."
    ],
    "inputs": {
      "car_g_co2_per_mile": 400,
      "car_source": "US EPA, greenhouse gas emissions from a typical passenger vehicle",
      "shared_escooter_g_co2_per_mile": 220,
      "escooter_source": "Hollingsworth et al., Environmental Research Letters, 2019, full life cycle",
      "one_way_miles": 1.5,
      "miles_source": "The leg length the site's own trip calculator uses",
      "days_per_year": 150,
      "days_source": "Five days a week across a 30-week academic year",
      "cohort": 1000
    },
    "shifts_pct": [5, 10, 20, 30],
    "derived": {
      "_comment": "Recomputed by check-facts.py from inputs. Nothing here is typed.",
      "miles_per_commuter_per_year": 450,
      "kg_per_commuter_per_year": 180,
      "tonnes_per_1000_commuters_per_year": 180,
      "escooter_saving_share_pct": 45,
      "tonnes_saved": { "5": 9, "10": 18, "20": 36, "30": 54 },
      "tonnes_saved_if_escooter": { "5": 4.05, "10": 8.1, "20": 16.2, "30": 24.3 }
    }
  },
  "same_corridor": {
    "_comment": [
      "NOT OUR DATA. Cyclalytics is another SYN 100 team's project, and this block",
      "was corrected on 2026-07-27 after reading their actual repository: an earlier",
      "version of this site called it 'a proposal, not a result', which was wrong.",
      "They shipped working code and ran it on their own drone footage. What they",
      "do NOT have is a calibrated speed, because their output is in pixels/second",
      "by their own README, and their two speed scripts filter to the VisDrone",
      "'motor' class rather than to bicycles. So the rule is unchanged even though",
      "the reason moved: no speed figure of theirs may ever be stated on this site",
      "as a real-world measurement. We cite the seven interior conflict points they",
      "named, the quantity they set out to measure, and the tool they built. The",
      "proposal names a person outside the team when listing one site; that name is",
      "deliberately not carried across, the same rule as tools/never-publish.json."
    ],
    "credit": {
      "project": "Cyclalytics",
      "authors": "Ian, Frank, Mel, Anyla",
      "kind": "drone and computer-vision project",
      "course": "SYN 100, UC San Diego",
      "url": ""
    },
    "shipped": {
      "_comment": [
        "Read off their repository and their README, not their proposal. This is",
        "the half the earlier draft of this site got wrong, so it is recorded in",
        "detail: they built the instrument and they ran it."
      ],
      "scripts": [
        "image_classifier.py",
        "mp4_identifier.py",
        "mp4_velocity.py",
        "velocity_heatmap.py"
      ],
      "detector": "YOLOv11s fine-tuned on the VisDrone aerial dataset",
      "tracker": "ByteTrack",
      "outputs": "A labelled drone still and smoothed speed heatmaps, produced from their own footage"
    },
    "limits": {
      "_comment": [
        "Both of these are their own words or their own source, and both are",
        "load-bearing: together they are the reason no speed figure of theirs",
        "appears anywhere on this site. check-facts.py requires 'units' to be",
        "stated on the page, which is what stops a later editor from quoting",
        "their heatmap as if it were km/h."
      ],
      "units": "pixels/second",
      "units_note": "Their README: converting to km/h would require camera calibration and a known ground-plane scale.",
      "tracked_class": "the VisDrone \"motor\" class",
      "tracked_class_note": "Both speed scripts filter to class index 9, so the speed layer describes motorbikes and scooters. Their cyclist detection is in the single-image script, which produces no speed."
    },
    "method": "A drone flown thirty to one hundred feet over campus junctions at midday passing period, with an image-recognition model labelling every cyclist and pedestrian frame by frame, to heat-map where the two collide.",
    "concept": {
      "name": "slowdown factor",
      "gloss": "Their term for the cost a rider pays crossing from the surface they are meant to ride on into the pedestrian walkway. They planned to measure it at one junction by comparing congestion on each side."
    },
    "sites": [
      "Library Walk at the micromobility roadway that feeds it from Sixth College",
      "Sun God Lawn, where three paths converge",
      "Sixth College by the market, where marked lanes and people walking overlap",
      "The micromobility roundabout by the Biology Building",
      "The crossroads at Target on Library Walk",
      "The automobile roundabout in Warren College",
      "The main roundabout by the gym"
    ],
    "policies_cited": [
      {
        "name": "PPM 270-11",
        "full": "the UC San Diego Micromobility Device Policy"
      },
      {
        "name": "Bicycle, Skateboard and Scooter Guidelines",
        "full": "the campus guidelines for riding on foot-traffic surfaces"
      }
    ],
    "derived": {
      "_comment": "Computed from 'sites', not asserted. check-facts.py recounts it.",
      "sites_named": 7
    }
  },
  "team": [
    {
      "name": "Yash Goel",
      "short": "Yash",
      "lens": "built the game, the site, and the survey instrument"
    },
    {
      "name": "Yuvia Cabral",
      "short": "Yuvia",
      "lens": "rode shared scooters for two years and brings the safety and convenience lens"
    },
    {
      "name": "Rut",
      "short": "Rut",
      "lens": "comes to it as a pedestrian and argues for accountability, not just access"
    }
  ],
  "survey": {
    "opened": "July 22, 2026",
    "closed": "July 25, 2026",
    "still_open": true,
    "institutions": 12,
    "countries": 4,
    "ucsd_share": "15 of 31",
    "published_csv": "survey-data.csv",
    "figures": {
      "total responses": 31,
      "riders": 12,
      "non-riders": 19,
      "live on campus": 14,
      "commute": 17,
      "ucsd respondents": 15,
      "rides to class": 4,
      "has device, travels another way": 8,
      "riders who rent": 9,
      "riders who own": 3,
      "barrier: theft": 7,
      "barrier: nothing": 6,
      "barrier: cost": 5,
      "barrier: safety": 4,
      "barrier: park/charge/store": 4,
      "barrier: weather": 3,
      "needed provision and could not find it": 10,
      "never needed provision": 19,
      "could not find secure parking": 9,
      "could not find storage": 2,
      "could not find charging": 1,
      "riders who could not find provision": 7,
      "unaware of the ban": 20,
      "aware, unaffected": 8,
      "aware, changed route": 3,
      "riders unaware of the ban": 7,
      "safety rating 1": 0,
      "safety rating 2": 3,
      "safety rating 3": 15,
      "safety rating 4": 8,
      "safety rating 5": 5,
      "would take training": 17,
      "would not take training": 11,
      "already trained": 3,
      "riders with no gear": 7,
      "riders with helmet": 4,
      "riders with closed-toe shoes": 3,
      "cause: distracted": 14,
      "cause: crowded": 13,
      "cause: crosswalks": 9,
      "cause: unsure": 4,
      "cause: other": 2,
      "answered cause": 27,
      "where: bike lane": 8,
      "where: intersections": 8,
      "where: pedestrian path": 7,
      "named a location": 15,
      "would adopt (yes)": 12,
      "would adopt (maybe)": 12,
      "would adopt (no)": 7,
      "climate is a major factor": 1,
      "climate plays no part": 11,
      "reported an actual theft": 0,
      "fear of theft stops them": 5,
      "in an accident": 2
    }
  },
  "interviews": {
    "_comment": [
      "The on-site interviews behind the quote blocks. Change 'total' HERE and the",
      "checker names every sentence in the markup that still disagrees. Store digits",
      "only: the checker spells them, so 'seven' lives in exactly one place.",
      "None of these are Yash's own. A podcast is planned and not yet recorded, so",
      "it is deliberately absent from the site until it exists."
    ],
    "total": 7,
    "campuses": 3,
    "by_site": [
      {
        "campus": "Sichuan University",
        "interviewer": "Yuvia Cabral",
        "count": 3,
        "quotable": 3
      },
      {
        "campus": "Victor Valley College",
        "interviewer": "Rut",
        "count": 1,
        "quotable": 0
      },
      {
        "campus": "UC San Diego",
        "interviewer": "Rut",
        "count": 3,
        "quotable": 3
      }
    ],
    "not_quotable": 1,
    "not_quotable_why": "The Victor Valley interviewee answered No to consent to record, so she is paraphrased and never quoted."
  },
  "observations": {
    "_comment": [
      "Two structured field observations on the same form. The forms record start",
      "and end times but no calendar date, so the site states times only.",
      "'riders_total' is the sum of the two riding-surface counts and is what the",
      "unit grid in index.html draws, one square per rider."
    ],
    "published_csv": "field-observations.csv",
    "sites": [
      {
        "id": "sichuan",
        "campus": "Sichuan University",
        "observer": "Yuvia Cabral",
        "start": "10:00 AM",
        "end": "10:40 AM",
        "minutes": 40,
        "traffic_level": "High (41 or more)",
        "counts": {
          "riders_in_roadway_or_lane": 85,
          "riders_on_the_footpath": 2,
          "riders_total": 87,
          "pedestrians_in_the_riding_space": 20,
          "safety_interventions": 20,
          "close_calls": 5,
          "collisions": 0
        },
        "provision": {
          "A lane or roadway riders are meant to use": "yes",
          "Painted markings on the surface": "yes",
          "Signage": "yes",
          "Posted speed limit and a live speed display": "yes",
          "Cars kept out of the campus core": "yes",
          "Shared bikes, cheap, unlockable at any hour": "yes",
          "Enforced parking": "no"
        }
      },
      {
        "id": "victor-valley",
        "campus": "Victor Valley College",
        "observer": "Rut",
        "start": "1:00 PM",
        "end": "1:30 PM",
        "minutes": 30,
        "traffic_level": "Low (15 or fewer)",
        "counts": {
          "riders_in_roadway_or_lane": 0,
          "riders_on_the_footpath": 1,
          "riders_total": 1,
          "pedestrians_in_the_riding_space": 0,
          "safety_interventions": 0,
          "close_calls": 0,
          "collisions": 0
        },
        "provision": {
          "A lane or roadway riders are meant to use": "no",
          "Painted markings on the surface": "no",
          "Signage": "no",
          "Posted speed limit and a live speed display": "no",
          "Cars kept out of the campus core": "no",
          "Shared bikes, cheap, unlockable at any hour": "no",
          "Enforced parking": "no"
        }
      }
    ]
  }
}
