Building.Level is now a real number on disk. Construction queues, per-level cost curves, and the lazy-finalization invariant all ship together. The first true economic loop is live.
Slice 27 closes Phase 1 — Foundation Setup — by making Building.Level genuinely meaningful. Buildings can be upgraded through levels 1 through 5; BuildingLevelCosts is now the single runtime source of truth for every construction and upgrade cost in the realm.
Construction itself is now queued and timed. ConstructionJobs carry per-Castle in-flight state, with a configurable MaxQueueLength of 2 — one active build, one queued. POST .../buildings returns 202 Accepted with a ConstructionJobDto describing what will rise. POST .../buildings/{buildingTypeId}/upgrade enqueues a level bump. GET .../construction surfaces the current pipeline.
Finalization is pure lazy materialization. There is no background construction service waiting for a tick. When the next read hits the system, any ConstructionJob whose CompletesAt has passed is finalized in-line: the Building gets the level it earned, the job row is deleted, and the read returns the new state. Zero new asynchronous database overhead.
Foundation Setup is now closed. Phase 2 — Core Gameplay Loop — begins.
