Version: [4973] PlanX 3.6.0

## [3.6.0] - 2026-07-09

The Batch Plan Auditor closes the loop (50 algorithms, 15 groups).

### Added
- **Batch Plan Auditor** (Reporting group) — the whole standard
battery in one run: network + demand + amenities + land use +
facilities + greens in, and it chains the 15-minute access score,
walkability audit, land-use balance, facility adequacy, green-space
access and access equity; every score lands in one scenario snapshot
JSON (ready for Scenario Compare A/B) plus an optional one-file Plan
Performance Report. Each part optional; fully headless and
model-designer friendly.
- **Plan Dashboard**: Plan Performance Index **history sparkline**
(grows with every saved snapshot) and an **Audit…** button opening the
Batch Plan Auditor.
- Scenario metric registry gains the auditor keys (walkability mean,
low-walk share, weakest green coverage, access Gini) — direction-aware
in comparisons.
- `docs/METHODS.md` — the method, formula and primary source of every
tool group.

### Testing
- Engine unit checks grown to **350**; end-to-end assertions to
**274**; dashboard harness to **24 checks** — on QGIS 3.44 LTR and
QGIS 4.0.2.

## [3.5.0] - 2026-07-09

Urban Growth: change accounting, growth simulation and the sprawl
scorecard (49 algorithms).

### Added
- **NEW GROUP: Urban Growth.**
- **Land-Cover Change Analysis** — the transition matrix of two class
rasters: from/to pairs with cells + hectares, per-class
gains/losses/persistence/net, optional class labels; the largest
conversion named in the log.
- **Urban Growth Simulation (CA)** — constrained cellular automaton
(SLEUTH tradition): score = suitability × (base + weight × urban
neighbourhood share); top scorers convert per step until the land
demand is met; never-build constraints; deterministic for a given seed
**across processes** (unit-tested). Output: year-of-conversion raster.
- **Urban Sprawl Metrics** — SDG 11.3.1 LCRPGR (land consumption vs
population growth) + patch count, largest-patch share, edge density.
- Engine: pure-NumPy `engine/growth.py`; three new group-coloured tool
icons.

### Testing
- Engine unit checks grown to **345** (hand-counted transition
matrices, gradient-following CA, constraint masks, cross-process
determinism, hand-computed LCRPGR and edge lengths); end-to-end
assertions to **266** on QGIS 3.44 LTR and QGIS 4.0.2.

## [3.4.0] - 2026-07-09

Environment Screening: road noise and green infrastructure (46
algorithms).

### Added
- **Road Noise Screening** (Microclimate group) — screening-quality
dB(A) grid: RLS-90-style emission from traffic volumes (hourly factor
for AADT) and heavy shares; roads as line-calibrated point sources;
energetic sum with 20 lg r spreading; fixed insertion loss behind
buildings. Optional receivers report levels + a population exposure
table (5 dB bands). Documented as screening, not compliance.
- **NEW GROUP: Green Infrastructure.**
- **Green Space Access** — the park-hierarchy standard
(`min_ha=max_dist` ladder) on real network distances: per-demand
pass/fail per class, classes met, per-class covered population,
citywide m²/capita.
- **Urban Green Connectivity** — crossable-gap patch graph:
components, binary Probability-of-Connectivity index, per-patch dPC
importance (the stepping-stone argument, quantified).
- Engine: pure-NumPy `engine/noise.py` (the infinite-line calibration
is a unit test) and `engine/green.py`; three new group-coloured tool
icons.

### Testing
- Engine unit checks grown to **331**; end-to-end assertions to
**256** on QGIS 3.44 LTR and QGIS 4.0.2.

## [3.3.0] - 2026-07-09

Population & Housing: the demographic backbone of plan-making (43
algorithms).

### Added
- **NEW GROUP: Population and Housing.**
- **Population Projection (Cohort-Component)** — a Leslie-matrix
projection from a plain age-group table: per-step survival, fertility
and optional net migration as fields, any number of steps. Outputs
step × age-group rows and per-step totals. Single-sex screening form;
rates constant over the horizon.
- **Housing Needs Assessment** — the standard needs identity,
batchable: future households, vacancy allowance, replacement losses,
backlog; every intermediate in a metric/value table. Negative need =
surplus.
- **Residential Capacity** — per-parcel buildable floorspace from FAR
− existing floorspace → whole dwelling units (unit size, net-to-gross
efficiency), with a district roll-up. The reality check against the
housing need; feeds the Land-Use Allocation Optimizer.
- Engine: pure-NumPy `engine/population.py` (`leslie_matrix`,
`cohort_projection`, `housing_needs`, `residential_capacity`);
`report.svg_pyramid` age-structure chart; three new group-coloured
tool icons.

### Testing
- Engine unit checks grown to **316** (hand-computed two-step Leslie
projection, migration floors, needs identity, capacity clamps);
end-to-end assertions to **242** on QGIS 3.44 LTR and QGIS 4.0.2.

## [3.2.0] - 2026-07-09

Visibility: viewsheds, isovists and landmark exposure (40 algorithms).

### Added
- **NEW GROUP: Visibility.**
- **Viewshed (DSM)** — line-of-sight sweep from observer points:
observer/target heights, view radius, direction count;
visibility-count raster output. Radial sweep with a running horizon
angle, rays capped at the raster diagonal.
- **Isovist Field** — Benedikt's 2-D visibility measures sampled on a
point grid between buildings: visible area/perimeter, min/max/mean
radial, circularity, occlusivity. The VGA companion to the
space-syntax tools.
- **Visual Exposure of Landmarks** — the inverse viewshed: outline
samples (optional extra height for spires), per-cell count of visible
outline points; difference before/after DSMs for skyline & heritage
impact.
- Engine: pure-NumPy `engine/visibility.py`; three new group-coloured
tool icons.

### Testing
- Engine unit checks grown to **304** (wall shadows, tall-target
pokes, radius caps, corridor vs plaza isovists); end-to-end assertions
to **233** on QGIS 3.44 LTR and QGIS 4.0.2.

## [3.1.0] - 2026-07-09

Transit: GTFS feeds become first-class citizens (37 algorithms).

### Added
- **NEW GROUP: Transit.**
- **GTFS Import and Service Stats** — loads a GTFS zip into QGIS with
validation on the way in (named errors for missing files / malformed
times). Stops as WGS84 points with daily departures + route counts; a
route summary table (mode, trips, service span, longest stop
sequence). Service day defaults to the feed's first active day.
- **Transit Frequency Map** — departures per stop within a time
window: departures/hour, mean headway minutes, distinct routes (the
frequent-network map), plus per-route trips in the window.
- **Transit Travel-Time Access** — door-to-door with public transport:
walk to a stop on the street network, ride a RAPTOR-style timetable
with up to N transfers, walk to each destination. Reports walk-only vs
transit minutes, winning mode and minutes saved per destination.
Overtaking trips treated FIFO (screening simplification, documented).
- Engine: pure-stdlib+NumPy `engine/transit.py` — GTFS zip reader
(utf-8-sig, past-midnight times as plain seconds, never datetimes),
`calendar`/`calendar_dates` service resolution, `stop_frequencies`,
RAPTOR `compile_day` (pattern grouping by route + stop sequence) and
`earliest_arrival`; `paths.multi_source_offset` (egress Dijkstra whose
sources start at their own arrival offsets); three new group-coloured
tool icons.

### Testing
- Engine unit checks grown to **287** (synthetic in-code GTFS:
transfer chains, no-transfer cutoffs, late boarding, cancelled service
days); end-to-end assertions to **221** on QGIS 3.44 LTR and QGIS
4.0.2.

## [3.0.0] - 2026-07-09

Scenarios & Walkability: the plan-evaluation loop closes and a tenth
tool
group opens (34 algorithms).

### Added
- **Scenario Snapshot** (Reporting group) — captures the plan score
metrics of the current project into a snapshot JSON.
  - PlanX output layers auto-detected by field signatures (access
score, balance table, facility adequacy, demand coverage, density
grid) or pinned explicitly.
  - Model-designer friendly: run the tools for alternative A,
snapshot, rerun for B, snapshot, feed both files to Scenario Compare
(A/B).
- **NEW GROUP: Walkability.**
- **Walkability Audit** — scores every street segment 0–100 from the
classic walkability-index ingredients (Frank et al. 2010):
intersection density, land-use mix entropy, destination counts, block
length, slope. Editable weights and breakpoints; sub-scores + raw
ingredients on every segment; missing inputs renormalised away.
- **Pedestrian Route Quality** — routes over quality-weighted streets
(weight = length × (1 + penalty × (100 − score)/100)); reports detour
ratio vs the plain shortest path, length-weighted mean walk score and
the share of the route on low-scoring segments. Nearest-destination or
all-pairs.
- Engine: pure-NumPy `engine/walkability.py`;
`paths.shortest_path_tree` / `reconstruct_path` (predecessor Dijkstra
that names the parallel edge taken); shared collector
`planx/collect.py` feeding both the dashboard dock and the snapshot
algorithm; three new group-coloured tool icons.

### Testing
- Engine unit checks grown to **265**; end-to-end assertions to
**205** on QGIS 3.44 LTR and QGIS 4.0.2.

## [2.13.0] - 2026-07-08

Equity Cross-Tabs & Scenario Compare: who holds the low values, and
which
plan alternative wins (31 algorithms).

### Added
- **Demographic Equity Cross-Tabs** (Equity group) — cross-tabulates
any per-unit value by population subgroup.
  - Population-weighted quantile classes (quintiles by default) or
fixed breaks.
  - Representation ratio per group × class cell (1 = proportional;
over-representation in the lowest class flags a disadvantaged group).
  - Per-group population/value shares, weighted mean/P10/median/P90,
internal Gini, and the Duncan & Duncan dissimilarity index vs the
rest.
  - Optional second group field crosses two demographics; the input
comes back annotated with its value class and cell representation
ratio for mapping.
- **Scenario Compare (A/B)** (Reporting group) — the A/B view of the
Plan Dashboard.
  - The dashboard dock gains **Save A / Save B** scenario snapshots
(score metrics to JSON next to the project) and an in-dock comparison
panel with direction-aware winners and coloured deltas.
  - Headless too: `planx:scenariocompare` diffs two snapshot JSON
files into a comparison table and an optional one-file HTML comparison
report.
- Engine: pure-NumPy `equity.crosstab` / `equity.value_classes`; new
pure-stdlib `engine/scenario.py` (snapshot / compare / verdict,
direction registry); `report.compare_section` / `build_compare_html`;
two new group-coloured tool icons.

### Testing
- Engine unit checks grown to **250**; end-to-end assertions to
**188** on QGIS 3.44 LTR and QGIS 4.0.2.

## [2.12.0] - 2026-07-08

Siting & Contiguity: Capacitated Facility Siting and Contiguous
Land-Use Allocation (29 algorithms).

### Added
- **Capacitated Facility Siting** (Optimization group) — chooses where
to build p new facilities respecting per-site capacity constraints and
travel limits.
  - First, a greedy construction phase selects sites that maximize
newly served demand under a capacity-respecting allocation.
  - Then, a Teitz-Bart vertex substitution phase optimizes the
locations by swapping sites to maximize total served demand (with
total travel cost as a tiebreaker).
  - Existing facilities enter as fixed-open.
  - Outputs selected sites (with rank, load, utilization, marginal
demand gain), allocation lines (demand to site connection with cost),
and uncovered demand.
- **Contiguous Land-Use Allocation** (Optimization group) — optional
Hard Contiguity mode on the Land-Use Allocation algorithm to assign
parcels to uses forming a single connected component per use.
  - Seed-based concurrent region-growing followed by boundary-swap
local search preserving subgraph connectivity of affected uses.
  - Default is Soft (existing behaviour unchanged).
- `engine/optimize.capacitated_siting` and
`engine/allocate.allocate_contiguous` — pure NumPy.
- A new group-coloured tool icon for Capacitated Facility Siting.

### Testing
- Engine unit checks grown to **225**; end-to-end assertions to
**174** on QGIS 3.44 LTR and QGIS 4.0.2.

yes

geo140195philo

2026-07-09T13:41:37.759887+00:00

3.22.0

4.99.0

None

no

Version management

Plugin details