--- type: concept tags: [parking, domain, business, occupancy] sources: [] updated: 2026-06-15 status: open --- # Capacity & Occupancy How many vehicles are inside, how many spaces remain, and what happens when the lot is full. ## Occupancy is a projection (like everything else) `occupancy = count(open [[parking-session|sessions]])` — an entry with no matching exit. It is a **fold over the signed [[append-only-event-chain]]**, never a hand-maintained counter (a counter is editable and drifts; the chain is the truth). Spaces-free = `capacity − occupancy`. - **`capacity`** is admin-set per site (and per **zone/level** if the lot has sections — model a `zone` on capacity + on the entry so multi-level is a later addition, not a rewrite). - Permit concurrency (`maxConcurrent`, see [[permit]]) is the same kind of fold, scoped to one permit's open sessions. ## Full → refuse entry + FULL sign - When `occupancy ≥ capacity`, the entry flow **refuses** (no `vehicle_entry`, no barrier open) and can drive a **"FULL" sign** (a relay/output, via the device adapter layer). - **Safety/policy nuance:** "full" blocks *entry* only — **exit always works** ([[fail-state-safety]]: exit fails open; never trap a vehicle). Permit holders may be allowed in past a "transient full" threshold (reserve spaces for subscribers) — an optional policy knob. - **Counting drift is real:** tailgating (two cars, one entry) and missed reads make the live count diverge from physical reality. The count is the *system's* occupancy; periodic ground-truth (a loop count, or the [[opencv-anpr-service|vision]] count) reconciles it — surfaced as an anomaly, not silently corrected. ## Open - Whether "FULL" is a hard block or a soft warning (operator can wave one in) — operator policy. - Zone/level granularity at launch vs. single capacity number. - Reserve-for-permits threshold.