flowchart LR B1["S1 Streets<br/>results and checks"]:::step --> W1["copy for the Lab"]:::step B2["S2 Scores<br/>results and checks"]:::step --> W2["copy for the Lab"]:::step B3["S3 Rules<br/>results and checks"]:::step --> W3["copy for the Lab"]:::step C["shared way of copying"]:::rule --> W1 C --> W2 C --> W3 W1 --> D1[/"S1 data"/]:::out W2 --> D2[/"S2 data"/]:::out W3 --> D3[/"S3 data"/]:::out B1 --> R1["shortest routes"]:::step R1 --> D4[/"route data"/]:::out D4 --> L D4 --> T D1 --> L["the Lab"]:::test D2 --> L D3 --> L B4["S4 Buildings<br/>results and checks"]:::step --> W4["copy for the Lab"]:::step C --> W4 W4 --> D5[/"S4 data"/]:::out D5 --> L D5 --> T D1 --> T["the Lab checks<br/>L1 to L6"]:::test D2 --> T D3 --> T classDef rule fill:none,stroke:#8a8a8a,stroke-dasharray:4 3,color:#a6a6a6 classDef step fill:none,stroke:#e6e6e6,color:#e6e6e6 classDef out fill:none,stroke:#e6e6e6,stroke-width:2px,color:#ffffff classDef test fill:none,stroke:#fe83cc,color:#fe83cc
Lab notes
What the Lab is
The Lab is one map with a tab for each system, where I try a system and see the places it still leaves open. Clicking anything shows what every system knows about it.
The Lab replays results and never recomputes them. Every street colour and slider position shows something a system already wrote down; the reach slider, for instance, steps through how far S1 found you can get from a junction. Each rule therefore lives in one place, and the Lab cannot quietly disagree with it.
Routes are the one small exception. Storing every route between every pair of junctions would take many megabytes, so I store only the shortest distances and the last step of each shortest route. The browser then follows each route back and tests each street against the detour allowed. Those two rules exist twice, beside the systems and in the browser, and a test runs both on 45,600 cases to check they give the same streets.
What it shows
One system shows at a time, because two colourings on one street cannot be read. Each tab has few controls, and it lists its checkpoints by kind, with the reason each kind matters and the result of its last tests.
| Tab | What the map shows | What you can try |
|---|---|---|
| S1 Streets | who may use each street, and where gates and dead ends stand | how far you can get from a junction, and every street a trip up to 50 % longer than the shortest could use |
| S2 Scores | choice or integration, on foot or by car | a distance slider that can play |
| S3 Rules | stops and lights, or speed limits | click a junction, then a street arriving at it, for its rules and signs |
| S4 Buildings | buildings by use, or by where the use came from | the places people go to |
| S5 Rhythm | places open or closed, the counts at the counted junctions, and the bicycle detectors | a day, an hour and a mode (and a season for bicycles), and a day that plays |
Integration and choice are the space syntax measures S2 attaches to each street: how easy it is to reach, and how often it lies on the way between other places. The stress tests sit with each system’s tests, where their numbers can be read in full.
How it is built
Each system copies its tables into one file for the Lab. A browser may refuse to read a data file from the disk, yet it always runs a script, so each file is written as a small script and the Lab works even without a server.
How the Lab is tested
The eleven Lab checks ask one thing: does the Lab show exactly what the systems wrote?
| Question | |
|---|---|
| L1 | Do the streets and junctions match S1, and does each junction reach the same streets? Every 15th junction’s reach is worked out again from scratch. |
| L2 | Does every S2 value equal the S2 table, with missing values still missing? |
| L3 | Do the S3 rules, signs, speeds and checkpoints equal the S3 tables? |
| L4 | The Lab no longer shows the S3 stress results, though its data still holds them. Do they give the same counts as the S3 stress tests? |
| L5 | Is every shortest route real and truly shortest, and do the browser’s route rules give the original routes? |
| L6 | Does every S4 building and place equal the S4 tables, down to each outline point, with empty cells still empty? |
| L7 | Do the S5 weekday shape, junction counts, each place’s week and the open counts equal the S5 tables? |
| L8 | Does every S6 object and surface equal the S6 tables, down to each outline point, with empty cells still empty? |
| L9 | Do the S7 buildings with homes, their commuters and nearest stops, the stops and the hour bands equal the S7 tables? |
| L10 | Do the S8 view measures and kept views equal the S8 tables, and does each sight line the Lab draws land where S8 cast it? |
| L11 | Do the S9 street flows, counted junctions and ledger equal the S9 tables? |
All eleven pass; the Lab shows the latest results. Before trusting the checks, I broke the files on purpose. I changed one S2 value in the Lab’s copy, and L2 caught it; earlier, L3 caught a stop switched off on Rue Chatham. I added 3 m to one walking distance, and L5 found the route no longer added up. When I made the browser’s detour rule one decimetre stricter, L5 found 6,116 cases that differed. For L6, I turned one unknown dwelling count into 0 and moved one outline point by 1 m, and L6 caught each change. For L7, I changed one letter of a place’s week, and L7 caught it.
The shortest-route check does not trust the method that found the routes. If a route is real and no single move anywhere could shorten any distance, then no shorter route exists. That condition is checked separately, for every start and every move.