Skip to content

Commit 1c0d957

Browse files
NoamGaashclaude
andcommitted
Add to_review/ with the 34 draft issues for map-search
Nothing filed yet - these are for review. Regenerate with uv run python scripts/gen_issues.py to_review Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent f786d6c commit 1c0d957

37 files changed

Lines changed: 2270 additions & 0 deletions

File tree

to_review/00-VERIFICATION.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Live re-verification, 2026-08-01 (before filing)
2+
3+
| Defect | Result | Evidence |
4+
|---|---|---|
5+
| A `total_actual_rides` = 0 | CONFIRMED | group_by, 4 dates: planned 121420/122088/53260/27327, actual 0/0/0/0 |
6+
| B `route_short_name` ignored | CONFIRMED | 400 rows / 202 line_refs identical filtered vs unfiltered |
7+
| E `actual_start_time` is a flag | CONFIRMED | 676 rows with both: 676 identical, 0 differing |
8+
| E2 unplanned rides (planned null) | CONFIRMED, rate lower | 1.4% (write-up said 3-6%) |
9+
| G1 route_timetable >1 day | CONFIRMED | 1-day OK; 3-day -> 500 |
10+
| G3 row cap 15k/20k | CONFIRMED | 15000 OK; 20000 -> 500 |
11+
| G4 silent default page size | CONFIRMED, varies | agg/list 1000, gtfs_routes 100, agencies 36 |
12+
| H naive datetime | CONFIRMED | 500 Internal Server Error |
13+
14+
## Corrections to the hackathon write-ups (do NOT quote the old numbers)
15+
16+
1. orion's planned totals (3,498 / 3,510 / 3,227 / 3,927) were computed from
17+
`/gtfs_rides_agg/list` WITHOUT an explicit limit, so they are truncated
18+
samples of the default 1000-row page, not network totals. Real network
19+
planned totals via group_by are ~27k-122k. The actual=0 conclusion is
20+
unaffected and holds at every page size and via group_by.
21+
2. The default page size is 1000 for /gtfs_rides_agg/list and 100 for
22+
/gtfs_routes/list - it varies per endpoint. The source repo's "~100 rows"
23+
was right for one endpoint, not universally.
24+
3. Unplanned-ride rate measured at 1.4% on line 480 (write-up said 3-6% on
25+
line 2259). Both may be true per-line; quote as "1-6%, line-dependent".
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Dashboard charts show ~0% actual rides — `total_actual_rides` is unpopulated upstream
2+
3+
> ### ⚠️ AI-generated draft — needs human validation
4+
>
5+
> This issue was **written by an AI agent** from materials produced during the
6+
> hasadna Open Bus hackathon (July 2026). The underlying analysis was built fast,
7+
> under hackathon conditions, and **has not been peer-reviewed**. Figures,
8+
> endpoint behaviour and conclusions all need independent verification before
9+
> anyone acts on them or quotes them publicly.
10+
>
11+
> **Please validate before implementing. Corrections very welcome.**
12+
13+
## Symptom
14+
15+
`totalActualRides` is consumed in five places, all fed by `useGroupBy`
16+
`/gtfs_rides_agg/group_by` (`src/api/groupByService.ts`):
17+
18+
- `src/pages/dashboard/AllLineschart/AllLinesChart.tsx`
19+
- `src/pages/dashboard/WorstLinesChart/WorstLinesChart.tsx`
20+
- `src/pages/dashboard/ArrivalByTimeChart/DayTimeChart.tsx`
21+
- `src/pages/operator/OperatorGaps.tsx`
22+
- `src/pages/DataResearch/DataResearch.tsx`
23+
24+
That column is **0 for every row, network-wide**. The rendered result is not an
25+
empty state — it is a confident chart showing that essentially no bus in Israel ran.
26+
27+
Here is the same defect reproduced on the hackathon dashboard, which uses the
28+
same endpoint. Note the flat `Actual` series and the caption *"Overall 0.0% of
29+
planned rides were observed"*:
30+
31+
![Planned vs actual rides — Actual is flat at zero](https://raw.githubusercontent.com/hasadna/open-bus-hackathon-26/main/algorithms/img/service-by-operator.png)
32+
33+
*Planned vs actual rides — Actual is flat at zero — screenshot of the hackathon dashboard card.*
34+
35+
## Evidence
36+
37+
*Re-verified against the live Stride API on 2026-08-01 immediately before filing; the reproduction below is the exact check that was run.*
38+
39+
```python
40+
from openbus_hack import stride
41+
for d in ["2026-07-01", "2026-06-15", "2026-04-01", "2025-11-01"]:
42+
rows = stride.get("/gtfs_rides_agg/group_by",
43+
{"date_from": d, "date_to": d,
44+
"group_by": "operator_ref,gtfs_route_date"})
45+
print(d, sum(r["total_planned_rides"] or 0 for r in rows),
46+
sum(r["total_actual_rides"] or 0 for r in rows))
47+
```
48+
49+
| Date | Σ `total_planned_rides` | Σ `total_actual_rides` |
50+
|---|---|---|
51+
| 2026-07-01 | 121,420 | **0** |
52+
| 2026-06-15 | 122,088 | **0** |
53+
| 2026-04-01 | 53,260 | **0** |
54+
| 2025-11-01 | 27,327 | **0** |
55+
56+
**This is not ingestion lag.** Control: line 2259 on 2026-07-29 reports
57+
`total_actual_rides = 0` in the aggregate, while `/rides_execution/list` for the
58+
same line and date returns real `actual_start_time` values and zero
59+
cancellations. Actuals exist at ride level; they are not being rolled into the
60+
aggregate.
61+
62+
`num_planned_rides` is populated and cross-checks well against the ride-level
63+
endpoint, so the aggregate remains usable **as a planned-ride denominator**.
64+
65+
## Upstream
66+
67+
Root cause belongs to the API/ETL — hasadna/open-bus-stride-api#49 reports the
68+
same thing for a single date (2025-09-17); the evidence above extends it to nine
69+
months, network-wide, with a control. This issue tracks the **frontend symptom**.
70+
71+
Closely related: #24 (better indication of partial data in the UI) — that is the
72+
general ask; this is one concrete, currently-live instance of it.
73+
74+
## Suggested interim mitigation
75+
76+
Until the upstream column is fixed, detect
77+
`totalActualRides === 0 && totalPlannedRides > 0` across a whole response and show
78+
a data-quality banner instead of plotting a zero series.
79+
80+
---
81+
82+
**Credit & provenance**
83+
Found during the hasadna Open Bus hackathon, July 2026 — analysis by the hackathon team.
84+
· Method, evidence and caveats: [`algorithms/service-by-operator.md`](https://github.com/hasadna/open-bus-hackathon-26/blob/main/algorithms/service-by-operator.md)
85+
· Original work: https://github.com/hasadna/open-bus-hackathon-26
86+
· Issue drafts and the full defect list: [`algorithms/upstream-issues.md`](https://github.com/hasadna/open-bus-hackathon-26/blob/main/algorithms/upstream-issues.md)
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# `stride-api:` `/siri_vehicle_locations/list` accepts `gtfs_route__route_short_name` and silently ignores it
2+
3+
> ### ⚠️ AI-generated draft — needs human validation
4+
>
5+
> This issue was **written by an AI agent** from materials produced during the
6+
> hasadna Open Bus hackathon (July 2026). The underlying analysis was built fast,
7+
> under hackathon conditions, and **has not been peer-reviewed**. Figures,
8+
> endpoint behaviour and conclusions all need independent verification before
9+
> anyone acts on them or quotes them publicly.
10+
>
11+
> **Please validate before implementing. Corrections very welcome.**
12+
13+
## What happens
14+
15+
Passing `gtfs_route__route_short_name` to `/siri_vehicle_locations/list` does not
16+
filter. It does not error, does not warn, and does not return an empty set — it
17+
returns **every ping in the time window, from every line in the country**, which
18+
the caller then treats as belonging to their line.
19+
20+
## Evidence
21+
22+
*Re-verified against the live Stride API on 2026-08-01 immediately before filing; the reproduction below is the exact check that was run.*
23+
24+
```python
25+
base = {"recorded_at_time_from": "2026-07-28T08:00+03:00",
26+
"recorded_at_time_to": "2026-07-28T09:00+03:00", "limit": 400}
27+
unfiltered = stride.get("/siri_vehicle_locations/list", base)
28+
filtered = stride.get("/siri_vehicle_locations/list",
29+
{**base, "gtfs_route__route_short_name": "23"})
30+
```
31+
32+
| Query | rows | distinct `siri_route__line_ref` |
33+
|---|---|---|
34+
| unfiltered | 400 | **202** |
35+
| with `gtfs_route__route_short_name=23` | 400 | **202** |
36+
37+
Byte-identical result sets. The parameter has no effect.
38+
39+
## Why it matters
40+
41+
How it was originally caught: an off-route analysis reported buses **50 km from
42+
their route on 97.7% of pings**. The buses were fine — the pings belonged to other
43+
lines. That was only obvious because the number was absurd. Anything computing a
44+
rate, a median or a coverage percentage gets a **plausible wrong answer** with no
45+
indication anything went wrong. Two hackathon participants hit this independently.
46+
47+
The working filter is `siri_routes__line_ref` (a `line_ref`, not a
48+
`route_short_name`), which requires resolving through `/gtfs_routes/list` first.
49+
50+
## Requested
51+
52+
Either apply the filter, or reject the parameter with a 4xx. Silently ignoring a
53+
filter is the worst of the three options.
54+
55+
Possibly the same class of bug as hasadna/open-bus-stride-api#23 (closed), where
56+
`/siri_rides/list` did not join on `line_ref`/`operator_ref`.
57+
58+
---
59+
60+
**Credit & provenance**
61+
Found during the hasadna Open Bus hackathon, July 2026 — analysis by the hackathon team.
62+
· Method, evidence and caveats: [`algorithms/route-divergence.md`](https://github.com/hasadna/open-bus-hackathon-26/blob/main/algorithms/route-divergence.md)
63+
· Original work: https://github.com/hasadna/open-bus-hackathon-26
64+
· Issue drafts and the full defect list: [`algorithms/upstream-issues.md`](https://github.com/hasadna/open-bus-hackathon-26/blob/main/algorithms/upstream-issues.md)
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# `pipelines:` SIRI→GTFS ride-matching has written no matches since 2024-10
2+
3+
> ### ⚠️ AI-generated draft — needs human validation
4+
>
5+
> This issue was **written by an AI agent** from materials produced during the
6+
> hasadna Open Bus hackathon (July 2026). The underlying analysis was built fast,
7+
> under hackathon conditions, and **has not been peer-reviewed**. Figures,
8+
> endpoint behaviour and conclusions all need independent verification before
9+
> anyone acts on them or quotes them publicly.
10+
>
11+
> **Please validate before implementing. Corrections very welcome.**
12+
13+
## What happens
14+
15+
Two related symptoms, observed independently by two hackathon projects.
16+
17+
**1. The ride link.** `siri_ride.gtfs_ride_id` and its three siblings
18+
(`route_gtfs_ride_id`, `scheduled_time_gtfs_ride_id`, `journey_gtfs_ride_id`) stop
19+
being populated together. Reported as healthy through 2024-08, degrading 2024-09,
20+
effectively zero 2024-10 → 2026-07. The raw feed never stopped — roughly 2.9–3.1M
21+
`siri_ride` rows per month are still created.
22+
23+
**2. The enrichment.** `siri_ride.first_vehicle_location_id` reported null for
24+
100% of rides across 18 consecutive months (2024-12 → 2026-05, ~49.4M rides), with
25+
`duration_minutes` tracking the same pattern.
26+
27+
A hackathon analysis independently found these columns *"inconsistently NULL —
28+
present for some days, absent for others, for identical, genuinely-tracked
29+
rides"*, and had to derive planned-vs-actual from raw GPS pings instead.
30+
31+
## Interpretation risk worth flagging separately
32+
33+
`first_vehicle_location_id` **looks** like it means "this vehicle never reported
34+
its position", and it is easy to build a per-operator transmission metric on it.
35+
It does not mean that — it encodes **whether the enrichment job has processed that
36+
day**. It is a processing-state flag, not a property of the bus.
37+
38+
## Confidence
39+
40+
The 18-month and 21-month figures come from a separate hackathon project
41+
(BusAnalysis by lihay7) whose repository is currently private, so **the census
42+
numbers cannot be independently checked from this issue alone.** What *was*
43+
reproduced in the shared hackathon repo is the qualitative finding: these columns
44+
are unreliable enough that every planned-vs-actual analysis had to bypass them.
45+
46+
Treat the precise dates and percentages as **needing confirmation against the
47+
database** before anyone acts on them.
48+
49+
---
50+
51+
**Credit & provenance**
52+
Found during the hasadna Open Bus hackathon, July 2026 — analysis by lihay7.
53+
· Method, evidence and caveats: [`algorithms/service-violations.md`](https://github.com/hasadna/open-bus-hackathon-26/blob/main/algorithms/service-violations.md)
54+
· Original work: https://github.com/lihay7/BusAnalysis *(private repo — ask the owner for access)*
55+
· Issue drafts and the full defect list: [`algorithms/upstream-issues.md`](https://github.com/hasadna/open-bus-hackathon-26/blob/main/algorithms/upstream-issues.md)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# `stride-db:` duplicate `siri_ride` journeys and repeated location rows
2+
3+
> ### ⚠️ AI-generated draft — needs human validation
4+
>
5+
> This issue was **written by an AI agent** from materials produced during the
6+
> hasadna Open Bus hackathon (July 2026). The underlying analysis was built fast,
7+
> under hackathon conditions, and **has not been peer-reviewed**. Figures,
8+
> endpoint behaviour and conclusions all need independent verification before
9+
> anyone acts on them or quotes them publicly.
10+
>
11+
> **Please validate before implementing. Corrections very welcome.**
12+
13+
## What happens
14+
15+
**Ride level.** The same physical journey is stored more than once. Reported at
16+
3.93% of rides sitting in a duplicated `(siri_route_id, journey_ref, service day)`
17+
group and 2.56% of all rows being surplus duplicates, over a full census of
18+
~116.3M rows — 66× skewed across operators, and roughly quadrupling from 2023 to
19+
2026. Attributed to `scheduled_start_time` drift: when a journey's scheduled start
20+
drifts, a **new** row is written rather than the existing one updated.
21+
22+
**The same shape appears in GTFS.** On 2026-07-26 one line returned 259
23+
`/rides_execution/list` rows for 127 distinct `planned_start_time`s (some ×4)
24+
under 255 distinct `gtfs_ride_id`s — one physical departure emitted under several
25+
ride ids. Any naive count of planned rides double-counts, and a duplicated row
26+
with a null actual becomes a phantom cancellation.
27+
28+
**Location level.** Overlapping SIRI snapshots repeat the same physical
29+
observation — same `siri_ride__id`, same `recorded_at_time`, same lat/lon — at
30+
roughly 10% of rows. Harmless for `min()`/`max()` aggregations; **not** harmless
31+
for anything weighted or counted. One hackathon analysis computes a
32+
distance-weighted average position, where a duplicated ping carries its weight
33+
twice and drags the result.
34+
35+
## Evidence of the workaround spreading
36+
37+
Every analysis in the hackathon repo now dedups on
38+
`(siri_ride__id, recorded_at_time, lat, lon)` as a matter of course:
39+
40+
```python
41+
pings = pings.drop_duplicates(
42+
subset=["siri_ride__id", "recorded_at_time", "lat", "lon"])
43+
```
44+
45+
That is a workaround every consumer is independently reinventing, which is the
46+
strongest argument for fixing it at the source.
47+
48+
## Confidence
49+
50+
The ride-level census figures come from a hackathon project (BusAnalysis by
51+
lihay7) whose repository is currently private — **treat them as needing
52+
confirmation.** The GTFS duplicate-departure observation and the ~10% duplicate
53+
ping rate were reproduced in the shared hackathon repo.
54+
55+
---
56+
57+
**Credit & provenance**
58+
Found during the hasadna Open Bus hackathon, July 2026 — analysis by lihay7.
59+
· Method, evidence and caveats: [`algorithms/days-with-no-cancellations.md`](https://github.com/hasadna/open-bus-hackathon-26/blob/main/algorithms/days-with-no-cancellations.md)
60+
· Original work: https://github.com/lihay7/BusAnalysis *(private repo — ask the owner for access)*
61+
· Issue drafts and the full defect list: [`algorithms/upstream-issues.md`](https://github.com/hasadna/open-bus-hackathon-26/blob/main/algorithms/upstream-issues.md)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# `stride-api:` `rides_execution.actual_start_time` always equals `planned_start_time`
2+
3+
> ### ⚠️ AI-generated draft — needs human validation
4+
>
5+
> This issue was **written by an AI agent** from materials produced during the
6+
> hasadna Open Bus hackathon (July 2026). The underlying analysis was built fast,
7+
> under hackathon conditions, and **has not been peer-reviewed**. Figures,
8+
> endpoint behaviour and conclusions all need independent verification before
9+
> anyone acts on them or quotes them publicly.
10+
>
11+
> **Please validate before implementing. Corrections very welcome.**
12+
13+
## What happens
14+
15+
`actual_start_time` never carries an observed departure time. Where both fields
16+
are present, it is byte-identical to `planned_start_time`.
17+
18+
## Evidence
19+
20+
*Re-verified against the live Stride API on 2026-08-01 immediately before filing; the reproduction below is the exact check that was run.*
21+
22+
Line 480, all resolved `line_ref` variants, 2026-07-15 → 2026-07-29:
23+
24+
| | count |
25+
|---|---|
26+
| rows with **both** planned and actual | 676 |
27+
| `actual_start_time == planned_start_time` | **676** |
28+
| `actual_start_time != planned_start_time` | **0** |
29+
| cancelled (`actual_start_time` null) | 4 |
30+
| unplanned (`planned_start_time` null) | 10 (1.4% of rows) |
31+
32+
## Why this still matters
33+
34+
The field is genuinely useful as-is — null means the ride did not run, which is
35+
the cleanest cancellation signal in the API, and a working
36+
days-without-cancellations score was built on exactly that. But the **name
37+
promises an observed departure time and it is not one**, so the endpoint can never
38+
be used for delay or punctuality work.
39+
40+
## Requested
41+
42+
Either populate it from SIRI, or rename/document it as a `did_run`-style boolean
43+
so nobody builds a punctuality metric on it.
44+
45+
Related: #19 (improve rides reliability metric by adding "actual start time" ETL)
46+
— that issue is arguably the fix for this one.
47+
48+
## Note on a possibly-related closed issue
49+
50+
hasadna/open-bus-stride-api#54 (`rides_execution/list` used UTC midnight instead of
51+
Israel midnight) is closed. The hackathon code still carries a client-side
52+
re-filter working around fuzzy service-date boundaries; if #54's fix shipped, that
53+
workaround may now be unnecessary. Worth confirming.
54+
55+
---
56+
57+
**Credit & provenance**
58+
Found during the hasadna Open Bus hackathon, July 2026 — analysis by Broundal.
59+
· Method, evidence and caveats: [`algorithms/days-with-no-cancellations.md`](https://github.com/hasadna/open-bus-hackathon-26/blob/main/algorithms/days-with-no-cancellations.md)
60+
· Original work: https://github.com/hasadna/open-bus-hackathon-26/tree/main/orion
61+
· Issue drafts and the full defect list: [`algorithms/upstream-issues.md`](https://github.com/hasadna/open-bus-hackathon-26/blob/main/algorithms/upstream-issues.md)

0 commit comments

Comments
 (0)