Venue property and facility management · build status

Estate

The system a venue runs on, extending event.clinic's spine with an `estate` schema. Unlike its siblings, the ledger below is GENERATED from the navigation source rather than written — a hand-kept list of what is done reports 100% forever.

generated 2026-08-22 10:56 UTC tree 252fec3 (uncommitted changes present) 41 slices from docs/BUILD-LEDGER.md

Overall

98%complete
40 complete1 not started 41 total

Phases

Group Global — Portfolio

E1 – E4 · 4 slices

4 complete

Group Global — People and access

E5 – E9 · 5 slices

5 complete

Group Venue — Overview

E10 · 1 slice

1 complete

Group Venue — The building

E11 – E16 · 6 slices

6 complete

Group Venue — Compliance and safety

E17 – E20 · 4 slices

4 complete

Group Venue — Crowd and security

E21 – E23 · 3 slices

3 complete

Group Venue — Commercial

E24 – E30 · 7 slices

7 complete

Group Venue — Media and documents

E31 – E35 · 5 slices

4 complete · 1 not started

Group Venue — Settings

E36 · 1 slice

1 complete

Group Event — This event

E37 – E38 · 2 slices

2 complete

Group Event — Operations

E39 · 1 slice

1 complete

Group Event — Safety

E40 · 1 slice

1 complete

Group Event — Commercial

E41 · 1 slice

1 complete

Every module

SliceNameStatusThe ledger’s note
Group Global — Portfolio
E1Venuesbuilt/
E2Compliancebuilt/portfolio/compliance
E3Utilisationbuilt/portfolio/utilisation
E4Board packbuilt/portfolio/board
Group Global — People and access
E5Tasksbuilt/tasks
E6Peoplebuilt/people
E7Roles and permissionsbuilt/roles
E8Activitybuilt/activity
E9Invitationsbuilt/invitations
Group Venue — Overview
E10Command viewbuilt/overview
Group Venue — The building
E11Venue profilebuilt/venue
E12Buildings and spacesbuilt/structure
E13Asset registerbuilt/assets
E14Planned maintenancebuilt/ppm
E15Cleaningbuilt/cleaning
E16Work ordersbuilt/work
Group Venue — Compliance and safety
E17Statutory registerbuilt/compliance
E18Risk registerbuilt/risk
E19Incidentsbuilt/incidents
E20Contractors and permitsbuilt/contractors
Group Venue — Crowd and security
E21Capacity and crowdbuilt/capacity
E22Lost propertybuilt/lost-property
E23Security operationsbuilt/security
Group Venue — Commercial
E24Function diarybuilt/diary
E25Enquiries and ratesbuilt/pipeline
E26Event ordersbuilt/orders
E27Purchasesbuilt/procurement
E28Public listingbuilt/listing
E29Events herebuilt/events
E30Cateringbuilt/catering
Group Venue — Media and documents
E31Photos and plansbuilt/media
E32Drawing registerbuilt/drawings
E33Layouts and zone mapsbuilt/layouts
E34Brand kitbuilt/brand
E35Seat assignment — who sits in each seatplannedDeclared on planned; no surface, no route, and nothing rendered.
Group Venue — Settings
E36Settings and vocabularybuilt/admin
Group Event — This event
E37Event workspacebuilt/event
E38Venue briefbuilt/event/brief
Group Event — Operations
E39Operations logbuilt/event/operations
Group Event — Safety
E40Crowd and permitsbuilt/event/safety
Group Event — Commercial
E41Booking and ordersbuilt/event/commercial

What “done” means here

Done means a verification script exited zero on the committed tree. Not that somebody opened the screen and it looked right, and not that an agent reported success. Every slice marked complete above has a script in scripts/ that exits 0 against the code as committed; a slice whose script has not exited 0 in a single run is not complete here, whatever else was built. Exit 2 means BLOCKED — something could not run, so the tree was NOT measured. That is not a pass, and it outranks FAILED: no answer is more dangerous to act on than a bad answer. Three checks are local-only (they create roles and write fixtures) and are reported as SKIPPED against dev, never as passes.

Run every gate at once:
./scripts/verify-all.sh local

Run it locally

# both servers from one shell — the launch.json entry `estate-local`
cd ~/Documents/property-management/api && npx wrangler dev --port 8811 &   # API
# the portal. 5188 is not arbitrary — it is the API's ALLOWED_ORIGIN
cd ~/Documents/property-management/app && npm run dev -- --port 5188 --strictPort
# load the schema and the demo venue locally
cd ~/Documents/property-management && ./db/apply.sh --with-demo
# prove the tree before believing any status above
cd ~/Documents/property-management && ./scripts/verify-all.sh local
# regenerate this page's ledger from the navigation source
cd ~/Documents/property-management && python3 scripts/build-ledger.py

Estate uses real paths, not hash routing, so every link below survives a reload and can be pasted to someone else. The venue workspace is keyed by `?site=` and the event workspace by `?event_id=` — a link without one lands on the picker rather than guessing, which is deliberate: an operator with three venues used to see only the first.

Screens with data

Screen
Open at
What is on it
Venues
landing
http://localhost:5188/
The portfolio landing — every venue this operator holds a claim on
★ Board pack
signature
http://localhost:5188/portfolio/board
Quarterly, for a board. Three different meanings of "this quarter": a running one compares like-for-like elapsed days, bookings span the whole quarter because they are contracted, a future one shows no incidents at all
Portfolio compliance
list
http://localhost:5188/portfolio/compliance
Nine venues, worst first, ordered by statutory gaps
Portfolio utilisation
list
http://localhost:5188/portfolio/utilisation
Five currencies, nothing converted, so no cross-venue money total exists anywhere
Activity
list
http://localhost:5188/activity
Who changed what. Estate wrote zero audit events before this; it records field NAMES and never values
Compliance register
needs ?site=
http://localhost:5188/compliance
Six jurisdictions. Needs a venue — open it from Venues
Capacity and crowd
needs ?site=
http://localhost:5188/capacity
One definition of occupied, shared with the layout engine
Venue brief
needs ?event_id=
http://localhost:5188/event/brief
The event's clock, its duty posts, and what was promised beyond the contract — over an append-only handover log where a correction never erases the note it corrects
Layouts and seat maps
dark by design
set VITE_EVENTCLINIC_API and _WEB, and share a Clerk instance
ONE engine shared with event.clinic — Estate opens its planner rather than hosting a copy, so it needs both products on one Clerk instance and is dark without it