Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/gtfs-mapping-review-inventory.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,10 @@ dates, trip records and literal platform evidence.
| Jurong East EWL `EW24_A` | Source label B / C; both candidates support the direction. | Preserve the alternatives rather than infer an allocation from direction. |
| Tanah Merah `CG_A`/`CG_B` and Changi Airport `CG2_A`/`CG2_B` | Literal D / E and A / B groups. | Review complete alternative sets and resulting occurrence semantics. |
| Ang Mo Kio `NS16_A`/`NS16_B` | Source groups A / C and B / D. The 29 October correction adds physical C/D with `not_in_service` status following review of their depot role. | Complete physical groups still need every member to pass passenger boarding checks; see the [AMK correction and regenerated diagnostics](gtfs-amk-platform-evidence-2026-10-28.md). Choosing A/B alone would hide the source alternatives. |
| Expo airport services | Six patterns conflict with current literal-label/service scopes, overlapping grouped endpoint blockers. | Resolve dated allocation evidence or a source correction; grouped-platform support alone does not resolve these conflicts. |
| Expo airport services | Six patterns conflict with current literal-label/service scopes. Dated photographs support canonical A/east and B/west. | Follow the [allocation evidence review](gtfs-platform-allocation-review-2026-10-31.md); investigate the source's reverse labels without matching by suffix. |
| CCL | Revision/code gaps, multiple candidates and conflicts with undated current platform scopes, including unresolved dates in all 119 patterns. | Review these causes separately; do not choose the latest revision or use current records as historical proof. |
| Sengkang East | Six patterns conflict at the five intermediate stations. West patterns have supported proposals. | Verify intermediate-station labels and service allocations without applying town-centre evidence to other stations. |
| Bukit Panjang LRT | All six patterns conflict at both Choa Chu Kang occurrences; their ordered station geometry is valid. | Verify physical allocations and preserve both endpoint occurrences. Dropping the return occurrence would leave the initial conflict. |
| Sengkang East | Six patterns conflict at five intermediate stations; eight of ten canonical bindings trace to two observation roots. Maintainer-supplied Bakau and Rumbia boards support both roots' existing directions. | Retain current bindings and recorded inferences, with the image limits and unresolved source conflicts in the [allocation evidence review](gtfs-platform-allocation-review-2026-10-31.md). |
| Bukit Panjang LRT | Six patterns conflict at both Choa Chu Kang occurrences. Historical signage distinguishes boarding platforms 1/2 from platform 4. | Review current per-platform service and boarding allocations using the [station evidence](gtfs-platform-allocation-review-2026-10-31.md); preserve both endpoint occurrences. |
| Marina South Pier | Four geometric NSL patterns conflict at their terminal physical platform; two no-geometry skip paths also have that endpoint concern. | Distinguish terminal arrival and source occurrence rules before changing service scope or diagnostics. |
| Five source-path disagreements | Three NSL patterns contain skipped/excursion occurrences; two TEL patterns omit Gardens by the Bay. | Obtain service-specific evidence or a provider correction. No interpolation, reversal, deleted occurrence or implicit exclusion is supplied. |
| Unused `LTA` agency | The source declares it but no route references it. | Record a reviewed explicit disposition rather than infer an operator alias or automatic ignore. |
Expand Down
205 changes: 205 additions & 0 deletions docs/gtfs-platform-allocation-review-2026-10-31.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
# Expo and LRT platform allocation review — 31 October 2026
Comment thread
duncanleo marked this conversation as resolved.
Resolved

The next 18 unresolved pattern/date cells cover Expo, both Choa Chu Kang
occurrences and Sengkang East's five intermediate stations. Photographs support
Expo's existing canonical directions. The LRT evidence has narrower limits:
Choa Chu Kang's signs distinguish boarding from alighting. Maintainer-supplied
boards support Bakau's and Rumbia's existing directions; the remaining Sengkang
East bindings retain their recorded same-line inference.

This packet records evidence and the remaining decisions. It changes no source
rows, canonical platforms, mappings, calendars or eligibility rules.

## Exact affected population

Regenerated against merged [PR #444](https://github.com/foldaway/mrtdown-data/pull/444),
commit `1788292457da1f02ddaf29b4209f4ed5c178def7`, using the pinned
[21 October capture](https://sources.mrtdown.org/captures/schedule/9a4271536f4bee1d690b10c887fcd0063875a36f3918543d2e32e21ac4dc7e4a.json)
and [original ZIP](https://sources.mrtdown.org/blobs/schedule/9a4271536f4bee1d690b10c887fcd0063875a36f3918543d2e32e21ac4dc7e4a.zip).
The source SHA-256 is
`9a4271536f4bee1d690b10c887fcd0063875a36f3918543d2e32e21ac4dc7e4a`
(2,981,645 bytes). LTA attribution and licence are in the
[public handoff](gtfs-public-handoff.md).

| Scope | Pattern/date cells | Recurring trips | Pattern/date pairs | Trip/date pairs | Conflicting occurrence indices |
| --- | ---: | ---: | ---: | ---: | --- |
| Expo | 6 | 675 | 730 | 80,453 | 1, between Tanah Merah and Changi Airport |
| Choa Chu Kang | 6 | 1,248 | 730 | 159,364 | **0 and 18**, preserving both terminal visits |
| Sengkang East | 6 | 1,491 | 730 | 180,151 | 1–5, preserving both Sengkang town-centre visits |

These disjoint sets total **18 cells, 3,414 trips and 419,968 trip/date pairs**.
All remain unresolved. Every trip's route, calendar and complete ordered stop
list was joined back to the ZIP. Affected occurrences have ordinary/default
pickup and drop-off, with no source instruction prohibiting boarding.
WD contributes 261 dates, WE 52 and PH 52 over literal 2026 calendars; the
accepted Sunday-on-public-holiday policy is still a separate implementation.
The [cross-line appendix](gtfs-cross-line-mapping-review-2026-10-28.md#no-path-traces-and-exact-smaller-exception-cells)
lists all 18 cell keys and representative trips.

## Expo: evidence supports retaining the canonical allocation

Canonical [Expo](../data/station/XPO.json) assigns A to `EWL_CG_E` toward
Changi Airport and B to `EWL_CG_W` toward Tanah Merah. Both are directly
maintained records, without a same-line inference. Their last review date is
21 July 2026, not a dated observation of every supplied service.

| First-hand photograph | Visible operator signage |
| --- | --- |
| [ZKang123 / zhenkang, 27 June 2020, platform A](https://commons.wikimedia.org/wiki/File:CG1_Expo_Platform_A.jpg) | A beside an onward route strip to Changi Airport. |
| [ZKang123 / zhenkang, 27 June 2020, platform B](https://commons.wikimedia.org/wiki/File:CG1_Expo_Platform_B.jpg) | B beside the route strip through Tanah Merah toward the main EWL. |
| [LN9267, 12 August 2025](https://commons.wikimedia.org/wiki/File:Expo_Station_East_West_Line_Changi_Airport_Branch_Line_platform_12-08-2025%281%29.jpg) | B and the direction Tanah Merah on the same platform-door sign; Changi Airport appears behind the origin on the route strip. |

The October source does the reverse: eastbound `CG1_A` explicitly labels B,
and westbound `CG1_B` labels A. Its parent is `CG1` in both cases. Physical
identity follows those literal labels; the stop-ID suffix cannot replace them.

**Recommendation:** retain the canonical A/east and B/west bindings and keep all
six source conflicts visible. These observations strengthen a provider-label
investigation; they do not prove an unchanged allocation on every 2026 date or
authorize rewriting the source. A dated change notice or provider clarification
would be needed to explain the reverse assertion.

## Choa Chu Kang: separate service allocation from boarding infrastructure

Canonical [Choa Chu Kang](../data/station/CCK.json) assigns platforms 1/3 to
`BPLRT_B` via Petir and 2/4 to `BPLRT_A` via Senja, without boarding restrictions.
The feed instead uses literal platform 1 at both ends of every Service A trip,
and literal platform 2 at both ends of every Service B trip.

Two photographs by ZKang123 / zhenkang, dated 17 February 2021, narrow the question:

- [Platform 1](https://commons.wikimedia.org/wiki/File:BP1_Choa_Chu_Kang_LRT_Platform_1_20210217_155346.jpg)
displays Service B via Petir, with passengers boarding. This supports one
observed B/1 departure, not an exclusive or permanent B/1 allocation.
- [Platform 4](https://commons.wikimedia.org/wiki/File:BP1_Choa_Chu_Kang_LRT_Platform_4_20210217_155442.jpg)
has a notice directing passengers to board at platform 1 or 2. The temporary
out-of-service display in the image supplies no permanent status for 2026.

**Recommendation:** obtain current station-specific confirmation of which
services can board at **each of 1 and 2**, and separately review the restrictions
on **each of 3 and 4**. The current service-only records do not describe the
observed boarding distinction. Do not swap A/B, grant both services to both
boarding platforms, or mark both outer faces from one photograph alone.

The initial occurrence already conflicts. An alighting-only rule at the final
occurrence cannot resolve that initial conflict, and the feed's repeated 1/2
must not be silently changed to 3/4. Any subsequent correction must preserve
the complete 19-occurrence path and assess pickup/drop-off at both ends.

## Sengkang East: supplied boards support the two observation roots

The canonical clockwise service runs
`SKG → CPV → RMB → BAK → KGK → RNG → SKG`; counterclockwise reverses it.
At every intermediate station, platform 1 lists `SKLRT_E_CW` and 2 lists
`SKLRT_E_CCW`. Eight of those ten bindings are inferred: platform 1 traces to
directly maintained `BAK_SKLRT_1`, and platform 2 to `RMB_SKLRT_2`.
The October feed uses literal 2 clockwise and 1 counterclockwise at all five.

The inspected [Bakau photograph, 21 July 2020](https://commons.wikimedia.org/wiki/File:SE3_Bakau_Platform_1_20200721_111814_1.jpg)
shows station identity but no readable platform-direction pairing. The
[Rumbia photograph, 30 May 2018](https://commons.wikimedia.org/wiki/File:SE2_Rumbia_Platform_2.jpg)
shows platform 2; its small route diagram is insufficient here to authenticate
the complete direction and date allocation. Both photographs are by
ZKang123 / zhenkang. Their titles alone cannot supply the missing directions.

The maintainer subsequently supplied a crop identified as Bakau's platform board.
It shows both platform headings and opposite highlighted arms of the East Loop.
Reading those arms against the canonical station order supports platform 1 via
Kangkar and Ranggung (`SKLRT_E_CW`), and platform 2 via Rumbia and Compassvale
(`SKLRT_E_CCW`). This is an interpretation of the route highlighting; the small
station text is blurred. The crop's capture date, author and original URL were
not supplied, and its station identity comes from the maintainer's description.
It supports retaining Bakau's current binding.

The second supplied crop, identified as Rumbia's board, supports platform 1
via Bakau, Kangkar and Ranggung (`SKLRT_E_CW`), and platform 2 via Compassvale
(`SKLRT_E_CCW`). Platform 1's highlighted path continues around the longer arm;
platform 2 highlights the shorter arm through Compassvale to Sengkang. This is
also a route-diagram interpretation, with blurred text and part of platform 2's
board obscured. Its capture date, author and original URL were not supplied;
station identity again comes from the maintainer.

**Recommendation:** retain both stations' existing direction bindings. These
boards support the two directly maintained observation roots; the eight inferred
bindings retain their existing provenance, including those at Compassvale,
Kangkar and Ranggung. The supplied images do not independently verify those
three stations or every 2026 date. Keep all five source conflicts and both
town-centre visits; no source label swap is authorized by this evidence review.

## Maintainer input — 31 October

| Scope | Supplied review input | Effect on this review |
| --- | --- | --- |
| Choa Chu Kang | “I believe so” in response to both services boarding at either 1/2 and 3/4 being alighting-only. | Tentative recollection of that arrangement, retained for a later canonical correction review. It does not establish an exclusive service allocation or historical validity over all 2026 dates. |
| Bakau | “Platform 1 is East Loop,” followed by a crop identified as Bakau's platform board. | The opposite highlighted route arms support the existing 1/clockwise and 2/counterclockwise bindings, with the image limits above. |
| Rumbia | “same, Platform 1 is East Loop,” followed by a crop identified as Rumbia's platform board. | The highlighted routes support 1 via Bakau (clockwise) and 2 via Compassvale (counterclockwise), retaining the existing platform 2 observation root and the image limits above. |
| Expo | “I think so?” about A toward Changi Airport and B toward Tanah Merah. | Tentative agreement, alongside the independent photographs above; the source conflict remains unresolved. |

These are maintainer statements, with their expressed uncertainty preserved.
Both supplied boards answer the requested direction clarification at their
identified stations; the other bindings remain recorded inferences.
No canonical allocation or digest-bound mapping approval is supplied here.

## Reproduction and evidence integrity

All seven cited photographs were downloaded and their pixels inspected.
Dates are author-recorded metadata; they are observations, not operator-issued
all-year allocation statements. Each linked file page identifies its author
and CC BY-SA 4.0 licence. Originals and inspection crops remain outside Git.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
The separately supplied Bakau board crop is identified by SHA-256
`2bd25076506e474759caf36b5d2b4d20ef2cccbcf8fe1a4af6134dece972abab`
(2,098,446 bytes), filename
`codex-clipboard-8d0224f1-01f0-410e-b4eb-a4eaded682a8.png`.
The supplied Rumbia board crop hashes to
`2cae51cd9a544537e6442eb024fa1de8bbd14af53d543a5f3da0cd439af194ec`
(1,740,092 bytes), filename
`codex-clipboard-5b15a8e2-6671-4b14-9032-cd0416dcd10b.png`.
Both crops have unspecified licences; they remain outside Git and are not republished.
Newer Choa Chu Kang/Rumbia originals returned HTTP 429 and were not inspected;
no conclusion relies on their captions or thumbnails.

| Original | SHA-256 | Bytes |
| --- | --- | ---: |
| Expo A, 2020 | `ed1ea9b145ae8079606a6679810a386ee74f963d2f1286089a7fb599b0b13675` | 3,952,173 |
| Expo B, 2020 | `e003e12157d575534f39fce34eccb68fcd1fb24117dda2ccb80b5707966115e4` | 3,914,833 |
| Expo B, 2025 | `da38e813958b4141a297111ea3d0461776d8e16c60afdef9ec18b81a4b66d800` | 11,961,759 |
| Choa Chu Kang 1, 2021 | `77d72d0d04bd72afcc6f4e0a5d4cda0127c856eebcc88b6c533d2820496d3801` | 3,774,631 |
| Choa Chu Kang 4, 2021 | `fa6489a08eb3954f1ba43b615a19616fd9a8e9a584349d4604194f16853f7e95` | 3,380,155 |
| Bakau, 2020 | `39077e92f3a4325af37a09b29d4a2d26de8d789c2bb46765d8a551c1bd825953` | 4,421,003 |
| Rumbia 2, 2018 | `99a953f3411bacb52240ef2c357fd32f824f45de04326b810bc1e35ef6865824` | 5,499,307 |

With the pinned receipt/ZIP downloaded as in the [NEL instructions](gtfs-nel-mapping-review-2026-10-28.md),
build the CLI and regenerate using committed data at the merge above:

```sh
npm run build:cli
TZ=UTC node scripts/draft-gtfs-scoped-review.mjs \
/tmp/nel-review-input-20261028/schedule.zip \
/tmp/nel-review-input-20261028/capture.json \
NSL,EWL,NEL,CCL,DTL,TEL,BPLRT,SKLRT,PGLRT \
/tmp/platform-allocation-review-20261031 \
--canonical-commit 1788292457da1f02ddaf29b4209f4ed5c178def7 \
--platform-groups --blockers --assignments
```

Select blocker patterns containing `CG1_A/B`, `BP1_A/B` or `SE1_A/B` in
`stopIds`; join `dateSetId` to the full draft's `dateSets`. Join **every**
`tripIds` member to source trips and stop-times, sorting occurrences by numeric
`stop_sequence`. This reproduces the population above without selecting only
convenient examples. Generated packets remain outside Git.

| Regenerated identity | SHA-256 |
| --- | --- |
| Topology projection 1 | `02ebd83efd71e0facbe7b34ecb374ec0fbec62b581db56417bfc4ede88b3365f` |
| Normalized full draft | `9b5219384f880c13984d74ad71d4b2a8a8dc6dba33cb6f9a4275837bb4c37aa4` |
| Blocker bytes, 4,244,923 bytes | `920e426a56f04f25c0b51c53ea336238204d829542d3866aed9ce03214172ee2` |
| Normalized assignments | `ad4756a9ba792ac3afeb0af55efaed2eff3387e7613413687db73d2989a351b9` |

Full accounting and assignment validation pass. There are still **189 unresolved
decisions and 990,143 unassigned trip/date pairs**. Mapping review and generation
eligibility remain false. This evidence review recovers no departures; canonical
corrections, occurrence semantics, holiday overrides and publication need their
own reviewed changes.

Validation: CLI build, lint, documentation links and 74 existing grouped-platform,
grouped-review and blocker tests passed with Node 24 and `TZ=UTC`.
Loading