The hub · build status

event.clinic

The events platform the rest of the suite reads from. Generated from 07-delivery/BUILD-LEDGER.md, which is itself generated from files on disk in this repository and in event-clinic-app.

generated 2026-08-03 21:05 UTC tree 10676f6 (uncommitted changes present) 49 slices from 07-delivery/BUILD-LEDGER.md

Overall

45%complete
22 complete26 on production, no suite1 in progress 49 total

Phases

Phase 1 - The spine

W1 – W18 · 18 slices

5 complete · 13 on production, no suite

Phase 2 - The MVP modules

W19 – W33 · 15 slices

14 complete · 1 in progress

Phase 3 - Content, directory and import

W34 – W43 · 10 slices

2 complete · 8 on production, no suite

Phase 4 - Media, marketing and the siblings

W44 – W49 · 6 slices

1 complete · 5 on production, no suite

Every module

SliceNameStatusThe ledger’s note
Phase 1 - The spine
W1RLS isolation testcompleteThe first tenant-isolation harness. *Evidence: 1 migration, acceptance suite, 3 design docs.*
W2RLS isolation test, second passcompleteRetires a token later suites expect to be gone, so run order matters. *Evidence: 1 migration, acceptance suite, 3 design docs.*
W3Cascade testcompleteDelete-cascade behaviour across the tenant tree. *Evidence: 1 migration, acceptance suite.*
W4Spend thresholdon production*Evidence: 1 migration.*
W5Quote pricingon production*Evidence: 1 migration.*
W6Engagement bank detailson production*Evidence: 1 migration, 1 design doc.*
W7Quote createon production*Evidence: 1 migration, 1 design doc.*
W8Feature category graphon production*Evidence: 1 migration, 1 design doc.*
W9Supplier proposed lineson production*Evidence: 1 migration, 1 design doc.*
W10Quote line authoringcomplete*Evidence: 1 migration, acceptance suite, 1 design doc.*
W11Unit systemscomplete*Evidence: 1 migration, acceptance suite, 1 design doc.*
W12Quote line notificationson production*Evidence: 1 migration.*
W13Event and event spaceon production*Evidence: 1 migration.*
W14Notification preferenceon production*Evidence: 1 migration, 1 design doc.*
W15Theme preferenceon productionThe first slice with a production apply script. *Evidence: 1 migration, 1 production apply, 1 design doc.*
W16Bank reference read permissionon production*Evidence: 1 migration.*
W17Quote financial read grantson production*Evidence: 1 migration.*
W18User preference tableon production*Evidence: 1 migration.*
Phase 2 - The MVP modules
W19M-01 Projectcompleteapp.project, the container above the event. *Evidence: 1 migration, 1 production apply, acceptance suite.*
W20M-09 Person and contact directorycompleteDelivered 2026-07-26. *Evidence: 1 migration, 1 production apply, acceptance suite.*
W21M-02 Venue directorycompleteRoutes and screens over the venue / building / floor / space tree. *Evidence: 1 migration, 1 production apply, acceptance suite.*
W22M-03 Agendas and run of showcompleteThe three-level tree: agenda, segment, session line item. *Evidence: 1 migration, 1 production apply, acceptance suite, 2 design docs.*
W23M-05 Workforce and shiftscompleteEight tables. Delivered 2026-07-27. *Evidence: 1 migration, 1 production apply, acceptance suite, 1 design doc.*
W24M-04 PerformerscompleteDelivered 2026-07-27. Split, and W24.1 is also on production. *Evidence: 2 migrations, 2 production apply, acceptance suite, 2 design docs.*
W25M-06 Guests and registrationscompleteShared attendee record by flag, invitations, RSVP. *Evidence: 1 migration, 1 production apply, acceptance suite, 1 design doc.*
W26M-07 Tasks and checklistscompleteSplit three ways. W26.1 unified task target search (D-385). W26.2 per-caller searchable columns (Q-246). All three on production. *Evidence: 3 migrations, 3 production apply, acceptance suite, 1 design doc.*
W27M-08 Budget and budget line itemcompleteSplit four ways (D-411, D-493). W27.1-.3 all on production. The cross-domain hub wired to quote lines. *Evidence: 4 migrations, 4 production apply, acceptance suite, 4 design docs.*
W28M-12 File and attachmentcompleteSplit four ways (D-413). The D-012 one-file model and D-016 polymorphic attachment. W28.1-.3 on production. *Evidence: 4 migrations, 4 production apply, acceptance suite, 3 design docs.*
W29M-11 Product, inventory item, assetcompleteSplit three ways (D-427). The three-tier chain and its allocation. *Evidence: 3 migrations, 3 production apply, acceptance suite, 3 design docs.*
W30M-10 -> The public directorycompleteThe plan says accreditation and check-in. That is not what W30 became. It is /directory/v1, the no-login surface Procurevent and the wedding portal read. No migration, because the slice adds routes, a pre-auth surface and the app_public lane only. Verified live in production. *Evidence: acceptance suite.*
W31M-13 Messaging, threads and the InboxcompleteSplit ten ways. W31 through W31.9, every one with its own production apply script. W31.4 opened tenant-private venues. *Evidence: 10 migrations, 10 production apply, acceptance suite, 1 design doc.*
W32M-14 NotificationscompleteDelivered 2026-08-01, applied to production on the owner's explicit instruction. *Evidence: 1 migration, 1 production apply, acceptance suite, 1 design doc.*
W33M-16 Dashboard roll-ups and reportingpartialNo slice was ever built. GET /dashboard/summary exists and has its own acceptance suite, but that suite's own header calls it *a correction, not a slice*. The reporting essentials have no implementation. *Evidence: 1 design doc.*
Phase 3 - Content, directory and import
W34Glossaryon production*Evidence: 1 migration, 1 production apply.*
W35Moment frameworkon production*Evidence: 1 migration, 1 production apply.*
W36Glossary cross-referenceson production*Evidence: 1 migration, 1 production apply.*
W37Country spellingson production*Evidence: 1 migration, 1 production apply.*
W38Hungarian glossarycomplete26 migrations, one per letter group. Four carry production apply scripts, and the rest were applied through them. *Evidence: 26 migrations, 4 production apply, acceptance suite.*
W39Glossary mergeon production*Evidence: 1 migration, 1 production apply.*
W40Event wizardcomplete*Evidence: 1 migration, 1 production apply, acceptance suite, 1 design doc.*
W41IATA number and slugon production*Evidence: 1 migration, 1 production apply.*
W42Venue importon production11 migrations. The bulk venue load, addresses and country corrections. *Evidence: 11 migrations, 1 production apply.*
W43Strategy playbookson production*Evidence: 1 migration, 1 production apply.*
Phase 4 - Media, marketing and the siblings
W44Marketing plancompleteAll six steps complete. W44.1 adds marketing_plan_row.task_id, ON DELETE SET NULL. The task export is per-track and opt-in. *Evidence: 2 migrations, 1 production apply, acceptance suite, 1 design doc.*
W45Venue mediaon production13 migrations, ending in the repoint to R2. These were the 13 missing from production at 15:20 on 2026-08-03. They have since been applied. *Evidence: 13 migrations, 1 production apply.*
W46Supplier event readon productionAnswers Mise's cross-product request. On production. *Evidence: 1 migration, 1 production apply.*
W47Dietary requirement vocabularyon productionMigration on all three databases. The product commit carrying W47-W49 is local only and has not been pushed. *Evidence: 1 migration.*
W48Supplier programme readon productionMigration on all three databases. Product commit unpushed, see W47. *Evidence: 1 migration.*
W49Cultural dietary restrictionson productionMigration on all three databases. Product commit unpushed, see W47. *Evidence: 1 migration.*

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 named event-clinic-app/api/test/w<n>-acceptance.mjs 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. 22 of the 49 slices have such a suite. The other 26 are on production with nothing proving them in isolation, and the page says so rather than calling them complete. A migration reaching production is a deployment, not a proof.

Run every gate at once:
cd ~/Documents/event-clinic-app/api && for f in test/w*-acceptance.mjs; do node "$f" || break; done

Run it locally

# 1 · API worker against LOCAL Postgres, with the demo auth bypass
preview_start portal-api-demo        # :8787, wrangler dev --var DEMO_AUTH:true
# 2 · the portal
preview_start portal-web-localpg     # :5173
# measure what the three databases actually carry — never read it from a doc
cd ~/Documents/ec-q341 && ./04-data-architecture/spine/migration-ledger.sh local   # then dev, then prod
# regenerate this ledger after building a slice
cd ~/Documents/ec-q341 && python3 07-delivery/build-ledger.py

Real router paths, so every link below is a genuine deep link. Use port 5173, NOT the 5183 harness entry — the API's ALLOWED_ORIGIN is 5173, so on 5183 every tile silently renders a dash and nothing is logged. Screens need VITE_DEMO_USER set plus the portal-api-demo worker, or the auth gate holds them shut.

Screens with data

Screen
Open at
What is on it
Portal home
landing
http://localhost:5173/
The shell. Its 360px collapse was fixed across all 48 screens on 2026-08-03
Events
W13 · data
http://localhost:5173/events
The event and event space spine
Event wizard
W40 · data
http://localhost:5173/events/wizard
Guided event creation. Its tasks arrive undated — a build action has no date of its own
Marketing plan
W44 · data
http://localhost:5173/events/marketing-plan
A dated marketing calendar generated from an event. Export is per track and opt-in: 44 lines arriving unasked would bury the real work
Projects
W19 · data
http://localhost:5173/projects
app.project, the container above the event
Venues
W21/W42/W45 · data
http://localhost:5173/venues
The venue tree, the bulk import, and venue media now served from R2
Companies
data
http://localhost:5173/companies
Platform-scoped — company has no tenant_id; company_claim is the only link
Contacts
W20 · data
http://localhost:5173/contacts
The person and contact directory
Agenda / run of show
W22 · data
http://localhost:5173/agenda
The three-level tree: agenda, segment, session line item
Workforce
W23 · data
http://localhost:5173/workforce
Eight tables, including the participation join E-438 revealed
Performers
W24 · data
http://localhost:5173/performers
Event-level talent resolving to a directory person under D-008
Guests
W25 · data
http://localhost:5173/guests
Shared attendee record by flag, invitations, RSVP
My tasks / checklists
W26 · data
http://localhost:5173/tasks/mine
Also /checklists. One search field across all ten target types — D-385
Budgets
W27 · data
http://localhost:5173/budgets
The cross-domain hub, wired to the quote lines. Split four ways
Files / documents
W28 · data
http://localhost:5173/files
Also /documents. The D-012 one-file model and the D-016 polymorphic attachment
Inventory / assets / stock
W29 · data
http://localhost:5173/inventory
Also /assets and /stock/where. The three-tier chain: product, inventory item, asset
Messaging & the Inbox
W31 · data
http://localhost:5173/messaging
The record thread and activity log. Split ten ways, W31 through W31.9
Notifications
W32 · data
http://localhost:5173/notifications
Applied to production on the owner's explicit instruction
Quotes
W5–W10 · data
http://localhost:5173/quotes/lines
Also /quotes/new and /quotes/proposed. Quote pricing, authoring and supplier-proposed lines
Procurement
data
http://localhost:5173/procurement
The buy side
Settings / numbering / me
W15/W18 · config
http://localhost:5173/settings
Theme and user preference. Also /numbering and /me
★ Public directory (W30)
LIVE IN PRODUCTION · no login
https://api.event.clinic/directory/v1
Not a screen — the API other products read. Procurevent and the wedding portal consume it. Paged, capped at 100, wildcard CORS, s-maxage=900, served by the app_public role. Cache-bust when verifying a deploy or the edge will show you the old answer
Dashboard roll-up
W33 · partial
http://localhost:5173/
GET /dashboard/summary exists and has its own suite, but that suite calls itself *a correction, not a slice*. The reporting essentials have no implementation