Venue property and facility management · build status

Venuesta

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-10-04 20:05 UTC tree d2f0182 (uncommitted changes present) 45 slices from docs/BUILD-LEDGER.md

Overall

98%complete
44 complete1 not started 45 total

Phases

Group Global — Portfolio

E1 – E5 · 5 slices

5 complete

Group Global — People and access

E6 – E11 · 6 slices

6 complete

Group Global — References

E12 · 1 slice

1 complete

Group Venue — Overview

E13 · 1 slice

1 complete

Group Venue — The building

E14 – E20 · 7 slices

7 complete

Group Venue — Compliance and safety

E21 – E24 · 4 slices

4 complete

Group Venue — Crowd and security

E25 – E27 · 3 slices

3 complete

Group Venue — Commercial

E28 – E34 · 7 slices

7 complete

Group Venue — Media and documents

E35 – E39 · 5 slices

4 complete · 1 not started

Group Venue — Settings

E40 · 1 slice

1 complete

Group Event — This event

E41 – E42 · 2 slices

2 complete

Group Event — Operations

E43 · 1 slice

1 complete

Group Event — Safety

E44 · 1 slice

1 complete

Group Event — Commercial

E45 · 1 slice

1 complete

Every module

SliceNameStatusThe ledger’s note
Group Global — Portfolio
E1Venuesbuilt/
E2Add a venuebuilt/portfolio/add
E3Compliancebuilt/portfolio/compliance
E4Utilisationbuilt/portfolio/utilisation
E5Board packbuilt/portfolio/board
Group Global — People and access
E6Tasksbuilt/tasks
E7Peoplebuilt/people
E8Roles and permissionsbuilt/roles
E9Activitybuilt/activity
E10Invitationsbuilt/invitations
E11Billingbuilt/billing
Group Global — References
E12Standards librarybuilt/reference/standards
Group Venue — Overview
E13Command viewbuilt/overview
Group Venue — The building
E14Venue profilebuilt/venue
E15Buildings and spacesbuilt/structure
E16Arrangebuilt/arrange
E17Asset registerbuilt/assets
E18Planned maintenancebuilt/ppm
E19Cleaningbuilt/cleaning
E20Work ordersbuilt/work
Group Venue — Compliance and safety
E21Statutory registerbuilt/compliance
E22Risk registerbuilt/risk
E23Incidentsbuilt/incidents
E24Contractors and permitsbuilt/contractors
Group Venue — Crowd and security
E25Capacity and crowdbuilt/capacity
E26Lost propertybuilt/lost-property
E27Security operationsbuilt/security
Group Venue — Commercial
E28Function diarybuilt/diary
E29Enquiries and ratesbuilt/pipeline
E30Event ordersbuilt/orders
E31Purchasesbuilt/procurement
E32Public listingbuilt/listing
E33Events herebuilt/events
E34Cateringbuilt/catering
Group Venue — Media and documents
E35Photos and plansbuilt/media
E36Drawing registerbuilt/drawings — the list is fetched by Venuesta's own Worker (/api/ec/layouts), not by the browser. It was DEAD in every deployed environment from the day it shipped until 29 Aug: a cross-origin fetch that event.clinic's ALLOWED_ORIGIN would not answer. A Worker sends no Origin, so CORS does not apply. Guarded by api/test-shared-planner-reachable.mjs.
E37Layouts and zone mapsbuilt/layouts
E38Brand kitbuilt/brand — blocked, not merely planned. Measured 29 Aug: app.layout_seat carries ticket_type, price_amount, is_killed and no column that records who holds a seat. That table is the ENGINE's — Venuesta never writes geometry — so this cannot be built here without event.clinic adding somewhere to put the answer. Nothing to do on this side until it does.
E39Seat assignment — built in event.clinic's engine, opened hereplannedDeclared on planned; no surface, no route, and nothing rendered.
Group Venue — Settings
E40Settings and vocabularybuilt/admin
Group Event — This event
E41Event workspacebuilt/event
E42Venue briefbuilt/event/brief
Group Event — Operations
E43Operations logbuilt/event/operations
Group Event — Safety
E44Crowd and permitsbuilt/event/safety
Group Event — Commercial
E45Booking 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 `venuesta-local`
cd ~/Documents/event-clinic-suite/property-management/api && npx wrangler dev --port 8811 &   # API
# the portal. 5188 is not arbitrary — it is the API's ALLOWED_ORIGIN
cd ~/Documents/event-clinic-suite/property-management/app && npm run dev -- --port 5188 --strictPort
# load the schema and the demo venue locally
cd ~/Documents/event-clinic-suite/property-management && ./db/apply.sh --with-demo
# prove the tree before believing any status above
cd ~/Documents/event-clinic-suite/property-management && ./scripts/verify-all.sh local
# regenerate this page's ledger from the navigation source
cd ~/Documents/event-clinic-suite/property-management && python3 scripts/build-ledger.py

Venuesta 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. Venuesta 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 — Venuesta opens its planner rather than hosting a copy, so it needs both products on one Clerk instance and is dark without it