Planning patterns

22 London boroughs · qualifying data only (see footer)

A re-analysis of house-london-0's "Spike Girls" submission (The Spike) against Foreman's own live, continuously updated data, rather than their frozen scrape from around March 2026. Same methodology throughout — minor/householder applications only, the same borough data-quality gate — see analysis/services.py for exactly what was ported from which notebook.

1. The spike

58082 decisions (218333 total) land exactly on the deadline the council set itself — 8.2x the surrounding days. Councils are measured on deciding within the statutory clock; this is what that incentive produces in practice.

2. The refusal discontinuity

Refusal rate: 16.0% in the two weeks before the deadline, jumping to 25.0% on the deadline itself, back down to 14.9% after — proof the bunching in the chart above costs applicants something, not just an administrative timing quirk.

3. Borough league table

Share of decisions landing exactly on the deadline, by borough. Havering — historically flagged as "broken data" for a ~0% refusal rate — is included here for the first time: the underlying Foreman bug that caused it (a planit.org.uk status-misclassification) is now fixed, and Havering's real refusal rate turns out to be entirely unremarkable.

4. Decided normally vs. decided on the deadline

Approval rate by borough, comparing decisions made in the deadline rush against everything else. Red lines slope down — a lower approval rate when bunched — for most boroughs; a few thin-volume boroughs go the other way, consistent with noise rather than a real reversal of the pattern.

5. Approval rate by application type

What you propose predicts the outcome more than where you propose it. Routine, low-controversy work (tree works, heritage, advertising) clears well above the London average; full/outline applications for new development and telecoms installations sit well below it.

6. The word list

Words most associated with refusal (red) and approval (green), from a TF-IDF + logistic regression model trained on application descriptions alone (ROC-AUC 0.787, 276514 applications). Trained 2026-08-10 — run manage.py train_approval_word_model to refresh it against newer data.