{
  "id": "vvk-cctv-2026-09-19",
  "status": "Provisional visual tuning; not a fitted traffic calibration",
  "defaultProfile": "cctv",
  "source": {
    "cameraId": "56de42f611f398ec0c48128a",
    "name": "Võ Văn Kiệt - Trần Đình Xu 2",
    "distanceToModelMetres": 5.6,
    "coverage": "Beside the extended corridor near Trần Đình Xu; southwest view into its original section. No surveyed camera pose or complete field-of-view polygon.",
    "manifest": "data/cctv/corridor-sample/manifest.json",
    "capturedFrames": 8,
    "uniqueFrames": 7,
    "cameraClockRangeICT": [
      "2026-09-19T16:23:45+07:00",
      "2026-09-19T16:24:59+07:00"
    ],
    "distanceToOriginalModelMetres": 33.8
  },
  "profiles": {
    "cctv": {
      "label": "CCTV-informed draft",
      "options": {
        "demand": 2600,
        "motorbikeShare": 72,
        "bicycleShare": 2,
        "truckFraction": 0.2,
        "busFraction": 0.05,
        "seed": 42
      },
      "description": "Goods vehicles added; bicycle share reduced as a conservative exploratory prior. All percentages remain assumptions, not flow estimates."
    },
    "original": {
      "label": "Original illustrative",
      "options": {
        "demand": 2600,
        "motorbikeShare": 72,
        "bicycleShare": 8,
        "truckFraction": 0,
        "busFraction": 0.1,
        "seed": 42
      },
      "description": "Original four-mode synthetic scenario for comparison."
    },
    "gemma": {
      "label": "Gemma-read draft (9 frames)",
      "options": {
        "demand": 2600,
        "motorbikeShare": 72,
        "bicycleShare": 2,
        "truckFraction": 0.2,
        "busFraction": 0.05,
        "seed": 42,
        "types": {
          "car": {
            "gap": 1.76
          }
        }
      },
      "description": "Mode composition derived from 195 vehicles read by gemma-4-31b-it across 9 frames. Demand unchanged from the prior. Speeds, gaps, widths and signal timing are not fitted.",
      "derivedFrom": {
        "vlmReadings": [
          "data/vlm/gemma-pass-002-reparsed/readings.json"
        ],
        "priorProfile": "cctv"
      }
    }
  },
  "adjustments": [
    {
      "parameter": "truckFraction of remaining four-wheel demand",
      "before": 0,
      "after": 0.2,
      "evidence": "Box/covered goods vehicles clearly visible in primary frame 000 and farther back in the main lanes.",
      "confidence": "High that the class is missing; low for the chosen 20% fraction.",
      "interpretation": "Exploratory prior, not a measured share; 5.2% of all attempted arrivals at default mix. Truck dimensions and dynamics remain generic assumptions."
    },
    {
      "parameter": "bicycleShare (%)",
      "before": 8,
      "after": 2,
      "evidence": "No confidently identifiable pedal bicycle in the inspected near-field samples; visible two-wheelers are predominantly scooters.",
      "confidence": "Low; small sample and occluded city-side traffic prevent a reliable absence claim.",
      "interpretation": "Conservative sensitivity setting, not an estimated rate. Keep nonzero bicycle traffic; original 8% remains available."
    },
    {
      "parameter": "busFraction of remaining four-wheel demand",
      "before": 0.1,
      "after": 0.05,
      "evidence": "Passenger vans/minibuses should not all be rendered as 10.5 m buses; no clearly identifiable full-size bus in the primary near-field sample.",
      "confidence": "Low; a nearby bridge frame has buses but is outside this model.",
      "interpretation": "Exploratory prior, not an observed rate; 1.3% of all attempted arrivals at default mix."
    }
  ],
  "unchanged": {
    "demand": {
      "value": 2600,
      "reason": "Snapshots miss boundary crossings; occupancy cannot establish veh/h."
    },
    "motorbikeShare": {
      "value": 72,
      "reason": "Keep prior: one view does not observe all streams equally, and turning riders contaminate a whole-image count."
    },
    "speedsHeadwaysAccelerationLateralGaps": "Unchanged: no reliable multi-frame identities, camera homography or distance scale. Wet pavement alone does not quantify these.",
    "roadWidths": "Unchanged: camera perspective has not been rectified against surveyed control points.",
    "signalTiming": "Not fitted: stopped/released groups are visible, but only part of a cycle was captured and the junction is outside the model boundary."
  },
  "conditions": [
    "Daylight",
    "Visibly wet pavement; does not establish active rain or friction",
    "512 × 288 source JPEGs",
    "One byte-identical repeat",
    "Burned-in clock typically advances 12 s; one 14 s interval",
    "Clock interpreted as ICT (UTC+7), not independently synchronised"
  ],
  "observations": [
    {
      "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_000.jpg",
      "sha256": "abcf16eaa3f786b001548435e56bc589a567d2454d297fcba4b65456fbe10199",
      "cameraTimeICT": "2026-09-19T16:23:45+07:00",
      "receivedAtUTC": "2026-09-19T09:23:53.593392+00:00",
      "independent": true,
      "notes": "Several goods vehicles are visible, including two prominent departing box/covered trucks. Cars move through the junction; scooters cluster at the canal-side stop line."
    },
    {
      "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_001.jpg",
      "sha256": "8929c28700629e9c6f6a7038d5660061aee904e257348733b812438e97eb4dd7",
      "cameraTimeICT": "2026-09-19T16:23:57+07:00",
      "receivedAtUTC": "2026-09-19T09:24:03.245745+00:00",
      "independent": true,
      "notes": "Cars and a dark passenger van/minibus approach. Canal-side scooters are still clustered. The passenger van is not classified as a full-size bus."
    },
    {
      "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_002.jpg",
      "sha256": "b19ada97eef082da66e9ab6c0df297de0fbe745ed3786128b840b3a4293aecf4",
      "cameraTimeICT": "2026-09-19T16:24:09+07:00",
      "receivedAtUTC": "2026-09-19T09:24:13.307306+00:00",
      "independent": true,
      "notes": "Approaching cars have changed position. Canal-side scooters remain grouped by the crossing."
    },
    {
      "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_003.jpg",
      "sha256": "b19ada97eef082da66e9ab6c0df297de0fbe745ed3786128b840b3a4293aecf4",
      "cameraTimeICT": "2026-09-19T16:24:09+07:00",
      "receivedAtUTC": "2026-09-19T09:24:23.235744+00:00",
      "independent": false,
      "notes": "Byte-identical repeat of frame 002; excluded as an independent observation."
    },
    {
      "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_004.jpg",
      "sha256": "de19e71515f22a92c9260a30dd6085568d711142e3283b9268845b6899051315",
      "cameraTimeICT": "2026-09-19T16:24:23+07:00",
      "receivedAtUTC": "2026-09-19T09:24:33.278521+00:00",
      "independent": true,
      "notes": "Scooters cross/turn through the foreground while approaching four-wheel traffic is clustered behind the crossing. These turning scooters must not be counted as through-corridor demand."
    },
    {
      "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_005.jpg",
      "sha256": "cb2e7882d2c693d31a079eaabc25196f72fcd2a20043d7396d74dc863fbf69f0",
      "cameraTimeICT": "2026-09-19T16:24:35+07:00",
      "receivedAtUTC": "2026-09-19T09:24:43.285175+00:00",
      "independent": true,
      "notes": "A red car crosses/turns in the foreground. Approaching main-carriageway vehicles are still clustered near the stop line."
    },
    {
      "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_006.jpg",
      "sha256": "584c2ea443c1c0786a594d373516d6b92d96c6bd9f623c339185e0c120986205",
      "cameraTimeICT": "2026-09-19T16:24:47+07:00",
      "receivedAtUTC": "2026-09-19T09:24:53.293584+00:00",
      "independent": true,
      "notes": "A similar approaching queue remains; two-wheel traffic moves along the canal side."
    },
    {
      "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_007.jpg",
      "sha256": "153b75ce6a72c0f9f477fe40cb2b20d29cd8249a1736b413b10a3c54adc19b61",
      "cameraTimeICT": "2026-09-19T16:24:59+07:00",
      "receivedAtUTC": "2026-09-19T09:25:03.570651+00:00",
      "independent": true,
      "notes": "Turning scooters and a red car occupy the foreground. This confirms junction movements absent from the current straight-route simulation."
    }
  ],
  "excludedContext": [
    {
      "cameraId": "56de42f611f398ec0c48128b",
      "distanceToModelMetres": 421.6,
      "file": "data/cctv/nearby-context/56de42f611f398ec0c48128b_000.jpg",
      "reason": "Nguyễn Văn Cừ junction outside the selected corridor."
    },
    {
      "cameraId": "56de42f611f398ec0c48128c",
      "distanceToModelMetres": 508.2,
      "file": "data/cctv/nearby-context/56de42f611f398ec0c48128c_000.jpg",
      "reason": "Bridge traffic outside the selected corridor; not used to tune shares."
    }
  ],
  "nextMeasurement": "Capture a longer continuous sequence or higher-cadence source with enough unique frames to count line crossings separately by route and mode; establish metric control points before fitting speeds or gaps.",
  "corridorVersion": "nguyen-thai-hoc-v1",
  "extensionNote": "The corridor was extended to Nguyễn Thái Học. The original visual-tuning sample and assumed demand are retained; longer coverage does not establish new traffic rates.",
  "additionalCoverage": [
    {
      "cameraId": "56de42f611f398ec0c481288",
      "name": "Võ Văn Kiệt - Cầu Ông Lãnh 1",
      "distanceToModelMetres": 2.9,
      "manifest": "data/cctv/20260919T093332Z/manifest.json",
      "coverage": "Beside the Nguyễn Thái Học end of the extended corridor. Shared car/motorbike carriageway visible.",
      "capturedFrames": 3,
      "uniqueFrames": 2,
      "usedForNumericTuning": false,
      "frames": [
        "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_000.jpg",
        "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_002.jpg"
      ]
    }
  ],
  "vlmReadings": {
    "gemma": {
      "method": "Per-frame vehicle classes read by a vision-language model, pooled into composition ratios. No detector training, no hand-labelled validation set, no camera homography.",
      "model": "gemma-4-31b-it",
      "promptSha256": [
        "99ae7fb02b0e252d50a4973ef06f60039775a347c58d0330762ef10765596d8e"
      ],
      "readingFiles": [
        "data/vlm/gemma-pass-002-reparsed/readings.json"
      ],
      "priorProfile": "cctv",
      "vanHandling": "Minibuses and light vans were counted separately and folded into the model's \"car\" class, which the model renders at 4.4 m.",
      "cameras": [
        {
          "cameraId": "56de42f611f398ec0c48128a",
          "name": "Võ Văn Kiệt - Trần Đình Xu 2"
        },
        {
          "cameraId": "56de42f611f398ec0c481288",
          "name": "Võ Văn Kiệt - Cầu Ông Lãnh 1"
        }
      ],
      "framesRead": 9,
      "framesSkipped": 2,
      "framesFailed": 0,
      "failures": [],
      "totalVehiclesCounted": 195,
      "meanVehiclesPerFrame": 21.67,
      "meanLegibilityOutOf5": 3.89,
      "countsByClass": {
        "motorbike": 101,
        "bicycle": 0,
        "car": 83,
        "van": 11,
        "truck": 0,
        "bus": 0,
        "unknown": 0
      },
      "perFrameCounts": [
        {
          "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_000.jpg",
          "cameraId": "56de42f611f398ec0c48128a",
          "total": 18,
          "counts": {
            "motorbike": 6,
            "bicycle": 0,
            "car": 9,
            "van": 3,
            "truck": 0,
            "bus": 0,
            "unknown": 0
          }
        },
        {
          "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_001.jpg",
          "cameraId": "56de42f611f398ec0c48128a",
          "total": 37,
          "counts": {
            "motorbike": 21,
            "bicycle": 0,
            "car": 15,
            "van": 1,
            "truck": 0,
            "bus": 0,
            "unknown": 0
          }
        },
        {
          "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_002.jpg",
          "cameraId": "56de42f611f398ec0c48128a",
          "total": 14,
          "counts": {
            "motorbike": 8,
            "bicycle": 0,
            "car": 6,
            "van": 0,
            "truck": 0,
            "bus": 0,
            "unknown": 0
          }
        },
        {
          "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_004.jpg",
          "cameraId": "56de42f611f398ec0c48128a",
          "total": 17,
          "counts": {
            "motorbike": 11,
            "bicycle": 0,
            "car": 5,
            "van": 1,
            "truck": 0,
            "bus": 0,
            "unknown": 0
          }
        },
        {
          "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_005.jpg",
          "cameraId": "56de42f611f398ec0c48128a",
          "total": 10,
          "counts": {
            "motorbike": 4,
            "bicycle": 0,
            "car": 5,
            "van": 1,
            "truck": 0,
            "bus": 0,
            "unknown": 0
          }
        },
        {
          "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_006.jpg",
          "cameraId": "56de42f611f398ec0c48128a",
          "total": 24,
          "counts": {
            "motorbike": 12,
            "bicycle": 0,
            "car": 11,
            "van": 1,
            "truck": 0,
            "bus": 0,
            "unknown": 0
          }
        },
        {
          "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_007.jpg",
          "cameraId": "56de42f611f398ec0c48128a",
          "total": 14,
          "counts": {
            "motorbike": 7,
            "bicycle": 0,
            "car": 6,
            "van": 1,
            "truck": 0,
            "bus": 0,
            "unknown": 0
          }
        },
        {
          "file": "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_000.jpg",
          "cameraId": "56de42f611f398ec0c481288",
          "total": 29,
          "counts": {
            "motorbike": 16,
            "bicycle": 0,
            "car": 11,
            "van": 2,
            "truck": 0,
            "bus": 0,
            "unknown": 0
          }
        },
        {
          "file": "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_002.jpg",
          "cameraId": "56de42f611f398ec0c481288",
          "total": 32,
          "counts": {
            "motorbike": 16,
            "bicycle": 0,
            "car": 15,
            "van": 1,
            "truck": 0,
            "bus": 0,
            "unknown": 0
          }
        }
      ],
      "conditions": {
        "daylight": {
          "frames": 9,
          "true": 9
        },
        "wetPavement": {
          "frames": 9,
          "true": 8
        },
        "activeRain": {
          "frames": 9,
          "true": 1
        },
        "occludedApproaches": {
          "frames": 9,
          "true": 0
        }
      },
      "twoWheelersShareCarriagewayWithCars": {
        "yes": 9,
        "no": 0,
        "unclear": 0
      },
      "modelNotes": [
        "Wet pavement causes reflections and slight glare.",
        "Wet pavement causes reflections and slight glare.",
        "Wet road surface causes reflections and slight glare.",
        "Low image resolution makes distant vehicle identification slightly uncertain.",
        "Significant queuing on the near carriageway.",
        "Heavy queue in the far carriageway, wet road surface.",
        "Rain gear and wet pavement indicate rainy conditions; far carriageway is queued.",
        "Clear view of traffic flow in both directions.",
        "Wet pavement makes some lane markings less distinct."
      ],
      "compositionEvidence": {
        "truckFractionOfFourWheelers": {
          "value": 0,
          "numerator": 0,
          "denominator": 94,
          "framesContributing": 9,
          "perFrameRange": [
            0,
            0
          ],
          "perFrame": [
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_000.jpg",
              "denominator": 12,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_001.jpg",
              "denominator": 16,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_002.jpg",
              "denominator": 6,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_004.jpg",
              "denominator": 6,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_005.jpg",
              "denominator": 6,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_006.jpg",
              "denominator": 12,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_007.jpg",
              "denominator": 7,
              "value": 0
            },
            {
              "file": "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_000.jpg",
              "denominator": 13,
              "value": 0
            },
            {
              "file": "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_002.jpg",
              "denominator": 16,
              "value": 0
            }
          ],
          "sampleCaveat": "Pooled over frames captured about 12 s apart; a slow vehicle appears in several frames, so these are not independent observations and no interval is computed."
        },
        "busFractionOfFourWheelers": {
          "value": 0,
          "numerator": 0,
          "denominator": 94,
          "framesContributing": 9,
          "perFrameRange": [
            0,
            0
          ],
          "perFrame": [
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_000.jpg",
              "denominator": 12,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_001.jpg",
              "denominator": 16,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_002.jpg",
              "denominator": 6,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_004.jpg",
              "denominator": 6,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_005.jpg",
              "denominator": 6,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_006.jpg",
              "denominator": 12,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_007.jpg",
              "denominator": 7,
              "value": 0
            },
            {
              "file": "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_000.jpg",
              "denominator": 13,
              "value": 0
            },
            {
              "file": "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_002.jpg",
              "denominator": 16,
              "value": 0
            }
          ],
          "sampleCaveat": "Pooled over frames captured about 12 s apart; a slow vehicle appears in several frames, so these are not independent observations and no interval is computed."
        },
        "bicycleFractionOfTwoWheelers": {
          "value": 0,
          "numerator": 0,
          "denominator": 101,
          "framesContributing": 9,
          "perFrameRange": [
            0,
            0
          ],
          "perFrame": [
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_000.jpg",
              "denominator": 6,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_001.jpg",
              "denominator": 21,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_002.jpg",
              "denominator": 8,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_004.jpg",
              "denominator": 11,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_005.jpg",
              "denominator": 4,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_006.jpg",
              "denominator": 12,
              "value": 0
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_007.jpg",
              "denominator": 7,
              "value": 0
            },
            {
              "file": "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_000.jpg",
              "denominator": 16,
              "value": 0
            },
            {
              "file": "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_002.jpg",
              "denominator": 16,
              "value": 0
            }
          ],
          "sampleCaveat": "Pooled over frames captured about 12 s apart; a slow vehicle appears in several frames, so these are not independent observations and no interval is computed."
        },
        "twoWheelerFractionOfAllVehicles": {
          "value": 0.517948717948718,
          "numerator": 101,
          "denominator": 195,
          "framesContributing": 9,
          "perFrameRange": [
            0.3333333333333333,
            0.6470588235294118
          ],
          "perFrame": [
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_000.jpg",
              "denominator": 18,
              "value": 0.3333333333333333
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_001.jpg",
              "denominator": 37,
              "value": 0.5675675675675675
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_002.jpg",
              "denominator": 14,
              "value": 0.5714285714285714
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_004.jpg",
              "denominator": 17,
              "value": 0.6470588235294118
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_005.jpg",
              "denominator": 10,
              "value": 0.4
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_006.jpg",
              "denominator": 24,
              "value": 0.5
            },
            {
              "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_007.jpg",
              "denominator": 14,
              "value": 0.5
            },
            {
              "file": "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_000.jpg",
              "denominator": 29,
              "value": 0.5517241379310345
            },
            {
              "file": "data/cctv/20260919T093332Z/56de42f611f398ec0c481288_002.jpg",
              "denominator": 32,
              "value": 0.5
            }
          ],
          "sampleCaveat": "Pooled over frames captured about 12 s apart; a slow vehicle appears in several frames, so these are not independent observations and no interval is computed."
        }
      },
      "compositionDecisions": {
        "truckFraction": {
          "value": 0.2,
          "applied": false,
          "indicativeUpperBoundPercent": 3.2,
          "reason": "Not one of 94 counted vehicles was read as this class. That bounds the rate at roughly 3.2% rather than establishing zero, and the frames are not independent samples, so the real bound is looser. The prior is kept; an absent class is not a removed class."
        },
        "busFraction": {
          "value": 0.05,
          "applied": false,
          "indicativeUpperBoundPercent": 3.2,
          "reason": "Not one of 94 counted vehicles was read as this class. That bounds the rate at roughly 3.2% rather than establishing zero, and the frames are not independent samples, so the real bound is looser. The prior is kept; an absent class is not a removed class."
        },
        "bicycleOfTwoWheelers": {
          "value": 0.02702702702702703,
          "applied": false,
          "indicativeUpperBoundPercent": 3,
          "reason": "Not one of 101 counted vehicles was read as this class. That bounds the rate at roughly 3% rather than establishing zero, and the frames are not independent samples, so the real bound is looser. The prior is kept; an absent class is not a removed class."
        }
      },
      "classDisagreements": [
        {
          "parameter": "truckFraction of remaining four-wheel demand",
          "modelReading": "No vehicle in 9 frames was read as a heavy goods vehicle; 11 were read as vans or minibuses.",
          "earlierHumanReading": "Box/covered goods vehicles clearly visible in primary frame 000 and farther back in the main lanes.",
          "resolution": "Unresolved, and deliberately so. The prior 0.2 truck fraction is kept, and the 11 vans were folded into \"car\". Pass --van-as truck to take the opposite reading.",
          "matters": "A 6.5 m truck and a 4.4 m car occupy different road space and accelerate differently, so the choice changes the simulation. It is a classification boundary at 512 x 288 on wet asphalt, not a count anyone can settle from these frames."
        }
      ],
      "twoWheelerTotalShare": {
        "value": 74,
        "fromReadings": false,
        "prior": 74,
        "reason": "Kept at the prior 74%. The readings put two-wheelers at 51.8% of vehicles in view, but this camera resolves carriageways unequally and the trunk carriageways are tagged motorcycle=no, so a whole-image share is not the corridor's mode split. Pass --apply-two-wheeler-share to use it anyway."
      },
      "standstillGaps": {
        "applied": true,
        "derivedTypeOverrides": {
          "car": {
            "gap": 1.76
          }
        },
        "method": "Gaps were read as multiples of the stopped vehicle's own length, which needs no camera scale, then multiplied by the length the model already gives that vehicle.",
        "evidence": {
          "car": {
            "observations": 7,
            "medianInVehicleLengths": 0.4,
            "rangeInVehicleLengths": [
              0.3,
              0.5
            ],
            "modelledVehicleLengthMetres": 4.4,
            "derivedGapMetres": 1.76,
            "priorGapMetres": 1.6,
            "basis": [
              {
                "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_004.jpg",
                "gapInVehicleLengths": 0.5,
                "basis": "van to car behind"
              },
              {
                "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_005.jpg",
                "gapInVehicleLengths": 0.3,
                "basis": "van to car"
              },
              {
                "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_005.jpg",
                "gapInVehicleLengths": 0.3,
                "basis": "car to car"
              },
              {
                "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_006.jpg",
                "gapInVehicleLengths": 0.5,
                "basis": "van"
              },
              {
                "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_006.jpg",
                "gapInVehicleLengths": 0.3,
                "basis": "car"
              },
              {
                "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_006.jpg",
                "gapInVehicleLengths": 0.4,
                "basis": "car"
              },
              {
                "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_007.jpg",
                "gapInVehicleLengths": 0.5,
                "basis": "car to car in far queue"
              }
            ],
            "applied": true,
            "reason": "Median of 7 standstill readings, converted through the modelled 4.4 m vehicle length.",
            "appliedTo": "gap (standstill clearance, metres)"
          },
          "motorbike": {
            "observations": 1,
            "medianInVehicleLengths": 0.2,
            "rangeInVehicleLengths": [
              0.2,
              0.2
            ],
            "modelledVehicleLengthMetres": 1.9,
            "derivedGapMetres": 0.38,
            "priorGapMetres": 0.65,
            "basis": [
              {
                "file": "data/cctv/corridor-sample/56de42f611f398ec0c48128a_002.jpg",
                "gapInVehicleLengths": 0.2,
                "basis": "motorbike to motorbike"
              }
            ],
            "applied": false,
            "reason": "Only 1 standstill reading, below the 3 needed to move a behaviour parameter. Recorded as evidence; the assumed 0.65 m stands.",
            "appliedTo": "gap (standstill clearance, metres)"
          }
        },
        "discarded": [],
        "notMeasured": [
          "desired",
          "accel",
          "brake",
          "headway",
          "lateral"
        ],
        "notMeasuredReason": "desired speed, acceleration, braking, time headway and lateral speed are rates. A still frame has no clock, and consecutive captures here are about 12 s apart, so a vehicle leaves the view between frames and nothing can be matched. These stay at their assumed values."
      },
      "roadWidthEvidence": {
        "method": "Cars abreast x 1.8 m modelled car width, plus 0.25 m clearance at each boundary and between vehicles. The clearance is an assumption; the car width is the model's own.",
        "nearCarriageway": {
          "carsAbreast": 4,
          "frames": 8,
          "impliedWidthMetres": 8.5
        },
        "farCarriageway": {
          "carsAbreast": 4,
          "frames": 9,
          "impliedWidthMetres": 8.5
        },
        "motorbikesAbreastWidest": {
          "values": [
            3,
            3,
            3,
            4,
            3,
            3,
            3,
            3,
            4
          ],
          "median": 3,
          "frames": 9
        },
        "twoWheelersFilterBetweenCars": {
          "yes": 6,
          "no": 1,
          "unclear": 2
        },
        "modelledRouteWidths": [
          {
            "id": "mixed-west",
            "widthMetres": 6.4,
            "widthSource": "assumed from mapped lane count; not surveyed"
          },
          {
            "id": "cars-west",
            "widthMetres": 9,
            "widthSource": "assumed from mapped lane count; not surveyed"
          },
          {
            "id": "cars-east",
            "widthMetres": 6.4,
            "widthSource": "assumed from mapped lane count; not surveyed"
          },
          {
            "id": "bikes-east",
            "widthMetres": 3.2,
            "widthSource": "assumed from mapped lane count; not surveyed"
          }
        ],
        "applied": false,
        "reason": "Not applied. The camera pose is unsurveyed, so no image region maps to a named route, and the scene mesh is built from these widths at load time. Treat a disagreement as a reason to re-check the lane tags in data/street.json."
      },
      "occupancyInversion": {
        "framesByState": {
          "free-flowing": 3,
          "mixed": 6
        },
        "stoppedVehicleShare": 0.195,
        "valid": false,
        "reason": "6 of 9 frames read as queued or mixed and 19% of vehicles were stopped. Stopped vehicles accumulate, so occupancy no longer identifies an arrival rate: the same count is consistent with almost any demand. The demand estimates below are recorded but should not be applied."
      },
      "unanchoredModelGuesses": {
        "demandVehPerHour": {
          "values": [
            1200,
            1500,
            1200,
            1500,
            1800,
            1200,
            800,
            1800,
            2500
          ],
          "median": 1500,
          "frames": 9
        },
        "meanSpeedKmh": {
          "values": [
            40,
            40,
            40,
            20,
            20,
            10,
            25,
            50,
            40
          ],
          "median": 40,
          "frames": 9
        },
        "applied": false,
        "reason": "What the model answers when asked for a flow and a speed outright. A single frame has no clock, so these are impressions, not readings. They are stored next to the derived values so the two can be compared, and they set nothing."
      },
      "demand": {
        "applied": false,
        "value": 2600,
        "reason": "Demand stays at the prior. A still frame gives an occupancy, and occupancy only yields a flow once the visible length of corridor is assumed; see demandEstimates for how far the answer moves with that assumption."
      },
      "demandEstimates": [
        {
          "assumedViewLengthMetres": 80,
          "observedVehiclesPerMetre": 0.2708,
          "demand": null,
          "reason": "Observed density 0.2708 exceeds the model's 0.1977 veh/m at 7500 veh/h; the corridor saturates before reaching it"
        },
        {
          "assumedViewLengthMetres": 120,
          "observedVehiclesPerMetre": 0.1806,
          "demand": 6865,
          "bracket": [
            6000,
            7500
          ],
          "unservedFractionAtBracket": [
            0.044,
            0.063
          ],
          "modelMeanSpeedKmh": 37.2
        },
        {
          "assumedViewLengthMetres": 200,
          "observedVehiclesPerMetre": 0.1083,
          "demand": 4317,
          "bracket": [
            4000,
            5000
          ],
          "unservedFractionAtBracket": [
            0.013,
            0.017
          ],
          "modelMeanSpeedKmh": 39.4
        },
        {
          "assumedViewLengthMetres": 300,
          "observedVehiclesPerMetre": 0.0722,
          "demand": 3096,
          "bracket": [
            2600,
            3200
          ],
          "unservedFractionAtBracket": [
            0.003,
            0.016
          ],
          "modelMeanSpeedKmh": 40.8
        }
      ],
      "densityResponse": {
        "windowMetres": 200,
        "note": "Vehicles held per metre of corridor, summed over all four modelled routes, measured in a window at mid-corridor away from both boundaries. Produced by this repository's own simulation at the prior mix.",
        "curve": [
          {
            "demand": 300,
            "windowMetres": 200,
            "vehiclesInWindow": 1.2,
            "vehiclesPerMetre": 0.006,
            "meanSpeedKmh": 44.7,
            "unservedFraction": 0
          },
          {
            "demand": 600,
            "windowMetres": 200,
            "vehiclesInWindow": 2.67,
            "vehiclesPerMetre": 0.0133,
            "meanSpeedKmh": 44,
            "unservedFraction": 0
          },
          {
            "demand": 1000,
            "windowMetres": 200,
            "vehiclesInWindow": 4.8,
            "vehiclesPerMetre": 0.024,
            "meanSpeedKmh": 42.4,
            "unservedFraction": 0
          },
          {
            "demand": 1500,
            "windowMetres": 200,
            "vehiclesInWindow": 6.7,
            "vehiclesPerMetre": 0.0335,
            "meanSpeedKmh": 43,
            "unservedFraction": 0
          },
          {
            "demand": 2000,
            "windowMetres": 200,
            "vehiclesInWindow": 9.5,
            "vehiclesPerMetre": 0.0475,
            "meanSpeedKmh": 41.9,
            "unservedFraction": 0.004
          },
          {
            "demand": 2600,
            "windowMetres": 200,
            "vehiclesInWindow": 12.23,
            "vehiclesPerMetre": 0.0612,
            "meanSpeedKmh": 41.3,
            "unservedFraction": 0.003
          },
          {
            "demand": 3200,
            "windowMetres": 200,
            "vehiclesInWindow": 14.9,
            "vehiclesPerMetre": 0.0745,
            "meanSpeedKmh": 40.7,
            "unservedFraction": 0.016
          },
          {
            "demand": 4000,
            "windowMetres": 200,
            "vehiclesInWindow": 20,
            "vehiclesPerMetre": 0.1,
            "meanSpeedKmh": 39.1,
            "unservedFraction": 0.013
          },
          {
            "demand": 5000,
            "windowMetres": 200,
            "vehiclesInWindow": 25.23,
            "vehiclesPerMetre": 0.1262,
            "meanSpeedKmh": 40.1,
            "unservedFraction": 0.017
          },
          {
            "demand": 6000,
            "windowMetres": 200,
            "vehiclesInWindow": 31.47,
            "vehiclesPerMetre": 0.1573,
            "meanSpeedKmh": 37.5,
            "unservedFraction": 0.044
          },
          {
            "demand": 7500,
            "windowMetres": 200,
            "vehiclesInWindow": 39.53,
            "vehiclesPerMetre": 0.1977,
            "meanSpeedKmh": 36.9,
            "unservedFraction": 0.063
          }
        ]
      },
      "impliedViewLengthAtPriorDemand": {
        "impliedViewLengthMetres": 354,
        "modelVehiclesPerMetre": 0.0612,
        "atDemand": 2600,
        "note": "If demand really is 2600 veh/h, the camera would have to resolve about this much corridor to hold 21.7 vehicles. Compare it against the frames by eye; it is the cheapest available check on the reading."
      },
      "resultingOverallSharesPercent": {
        "motorbike": 72,
        "bicycle": 2,
        "car": 19.5,
        "truck": 5.2,
        "bus": 1.3
      },
      "limitations": [
        "A vision-language model reading a 512 x 288 frame can miss, merge or invent vehicles.",
        "Whole-image counts mix carriageways, turning traffic and parked vehicles; they are not corridor flow.",
        "Still frames carry no speed, headway or distance scale, so no metric parameter follows from them.",
        "Class boundaries, especially van against bus and scooter against bicycle, are the model's judgement.",
        "Camera pose is unsurveyed, so image regions are not mapped to modelled routes.",
        "Scale-free measurements use the vehicle as the ruler, so they inherit the model's class judgement and are coarse at this resolution.",
        "unanchoredGuesses are the model's impression of flow and speed with nothing to measure against. They are stored for comparison and never set a parameter."
      ]
    }
  }
}
