1.3.0
Correctness release. An independent review of the special demand implementation found six real bugs, all confirmed by running code. Every one produced plausible-looking output with no error, which is why none surfaced in play.
Lodging visitors were inflated 2.6×. OSM maps most hotels twice — once as a POI node, once as the building outline — and the dedup key was name plus rounded coordinates, so representative points tens of metres apart kept both. 604 apparent properties were really 374. Overnight visitors go from 42,740 to 19,698. This was the largest quantitative error in the special demand, and it shipped in 1.2.1 through 1.2.3.
A school was silently disappearing. Point ids are built from a POI's code, falling back to its name, and there are two different Palmetto Christian Academy campuses. Both resolved to the same id and were merged, putting 1,470 people on one point and dropping the other. Schools now carry their NCES id.
The special-demand schema accumulated garbage. save_schemas appends to the file already on disk, and del_points never touches it, so every surgical rebuild left replaced points in twice. The working file had reached 530 entries for 313 points with 9,317 dead pop_ids.
Rebuilds were not reproducible. The staff sampler was seeded with hash(name), which Python salts per process — so each run allocated differently, pupils included, since the draws share a budget.
Two fully-virtual schools generated physical commutes to an administrative address.
merge_within was a silent no-op on 15 of 35 points. The airport's nearest LODES block is 954 m away against a 700 m radius, so AIR_CHS had no employment at all. Radii are now sized against real geometry. Universities were also processed before hospitals, so UNI_MUSC had absorbed the 10.5k-job medical centre block; hospitals now go first and it lands on HOS_MUSC.
Also fixed: airport arrivals lost 11% to double truncation; a latent AttributeError in depot that would discard an entire routing pass on any unroutable point; zero-length self-loop pops dropped. package.py now runs a preflight that refuses to ship unrouted pops, a duplicated schema, or a config population disagreeing with the demand.
Commute distances still track real Charleston travel (LODES 14.0 km median): military 14.1, airport 14.1, resorts 14.9, hospitals 12.4. School load per residential node stays at zero nodes above 100%.
Demand totals 582,306 across 2,359 points and 66,179 pops. Map files unchanged from 1.2.0.