Artist management · build status

ShowLedger24

The sell side of the live deal: roster, offers, deal engine, settlement and commission. Generated from the build ledger.

generated 2026-09-27 17:01 UTC tree e8f8d9a 33 slices from docs/BUILD-LEDGER.md

Overall

97%complete
32 complete1 in progress 33 total

Phases

Phase 0 — Foundation

S1 – S4 · 4 slices

4 complete

Phase 1 — The roster

S5 – S9 · 5 slices

5 complete

Phase 2 — The Offer Desk

S10 – S13 · 4 slices

4 complete

Phase 3 — The Deal Engine

S14 – S17 · 4 slices

4 complete

Phase 4 — Production and the road

S18 – S21 · 4 slices

4 complete

Phase 5 — Money

S22 – S25 · 4 slices

4 complete

Phase 6 — Clearance

S26 – S27 · 2 slices

2 complete

Phase 7 — Reach

S28 – S32 · 5 slices

4 complete · 1 in progress

Further slices

S9.5 · 1 slice

1 complete

Every module

SliceNameStatusThe ledger’s note
Phase 0 — Foundation
S1Repository scaffold and design tokenscompletetokens.css, base.css, verify-tokens.sh, 7 site pages, 7 console screens
S2Database foundation, RLS harness, migration toolingcomplete17 isolation assertions, 5 gates in verify-S2.sh
S3Identity, sessions, RBACcomplete29 identity assertions + a runtime R10 probe
S4Console shell and audit spinecomplete9 atomicity assertions, 12 payload-guard tests, derived notification tray
Phase 1 — The roster
S5Artist recordcompletearchive not delete; export in one call
S6The artist as a productcomplete27 db assertions + 22 runtime; overlap refused by exclusion constraint
S7People, line-up and personnelcomplete22 erasure assertions + 20 runtime; the Article 17 path works end to end
S8Management agreementcomplete25 db + 21 runtime; permissions now enforced INSIDE policies
S9Roster dashboard and artist assignmentcompleteR7 enforced; a CROSS-TENANT VIEW LEAK found and closed
Phase 2 — The Offer Desk
S10Calendar and availability
6b4cd42 · 2026-08-03
completederived on read; a CROSS-TENANT WRITE found and closed in 0016
S11Enquiry capture
a5855d8 · 2026-08-03
completethe first anonymous write; the link token is the credential
S12★Hold ladder and challenge protocol
d4564bd · 2026-08-03
completesignature module. H1–H7 in constraints and triggers; the API cannot accept a timestamp
S13Offer builder and offer tracking
ac151cf · 2026-08-03
completeaccepted offers immutable; a counter is a new row
Phase 3 — The Deal Engine
S14★Deal components and the calculator
937e887 · 2026-08-03
completesignature module. §2.3 reproduced exactly; two engines cross-checked
S15Deal memo
16c5f84 · 2026-08-03
completeappend-only, snapshotted; found an 11-slice audit-payload defect
S16Show record and confirmation
f93cc6a · 2026-08-03
completeone transaction or nothing; the radius clause names the show
S17Tours, routing and tour budget
f4f46de · 2026-08-03
completethe P&L identity, over 20 generated tours. Phase 3 closed
Phase 4 — Production and the road
S18Riders, stage plot and input list
583df4d · 2026-08-03
completesuperseding never repoints an advanced show; the plot is data
S19Advance pack, two-way
e67edc4 · 2026-08-03
completethe token resolves to exactly one advance; differences derived on read
S20Itinerary, day sheet, run sheet
722b6c7 · 2026-08-03
completea door time is a local time, not an instant — deliberately not timestamptz
S21★Settlement capture and reconciliation
f31e3f0 · 2026-08-03
completethe ten §2.4 checks derived on read; no findings table, asserted structurally
Phase 5 — Money
S22★Ledger primitives
fb23c3c · 2026-08-03
completean event pins its own FX rate; the rate table is only a lookup
S23★Commission engine
dd135a6 · 2026-08-03
completesignature module. §3.2 worked example reproduced exactly, sunset tail included
S24Invoicing and receivables
ac86832 · 2026-08-03
completeno total column at all; a totalMinor sent anyway is refused, not ignored
S25★Artist statement and splits
a0d9bee · 2026-08-03
completeD-021's three safety properties each enforced by test
Phase 6 — Clearance
S26★Clearance rules and requirements
a9dcb98 · 2026-08-03
completesignature module. a requirement is a row carrying its rule version
S27Visas, Schengen and carnetscompletecounter, vault, API and screen (2026-08-03); carnet + visa queue, 2026-08-13. C5.1 not met by decision (D-030)
Phase 7 — Reach
S28Notificationscompletethe tray is derived, the DELIVERY is recorded; exactly-once by unique dedupe key carrying the deadline
S29Artist portalcompletescoping at the database (0055–0057) + portal API, screen and runtime probe. Read-only, GET-only, statement audience is a literal
S30Merch, releases and campaignscompletemerch catalogue/register/settlement + release record, dependency-aware plan, checklist and album budget. Both roadmap gates hold
S31Ecosystem bridge
746164d · 2026-08-22
in progresslane 1 done (2026-08-15): the anonymous directory lane, restrictive policy, 22 assertions. Q-005 answered — event.clinic dev is the counterparty. Lane 2 done (2026-08-22, D-038): /public/production/:token, migration 0076, a supplier reads ONE show's TECHNICAL rider version and the stage plot drawn against it. 41 SQL + 52 runtime assertions; deployed to dev and asserted there. Rigfold records the same decision as its D-325. Still open, and still blocked on the far side rather than on effort: the WRITE into event.clinic (D-034 — the entity does not exist; docs/10-directory-entity-request.md is the request), 18.2/18.3 inbound, and E1.5's UI 2026-08-29: LANE 2 IS BUILT AND DEPLOYED — /public/production/:token, migration 0076, 41 SQL and 52 runtime assertions, a panel on the Advance screen, live on the dev Worker. Lane 1 remains blocked by D-034 and must never be built against a fixture.
S32Reporting, import and offlinecompletereports derived on read, no table; both idempotency guarantees are unique indexes. 39 SQL + 23 runtime assertions
Further slices
S9.5Console connection (inserted)completepassword sign-in, HttpOnly cookie, live roster + artist

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 scripts/verify-S<n>.sh 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. S27 is complete as of 2026-08-13, carnet and visa queue included. One requirement, C5.1, is deliberately NOT met: the carnet’s equipment list is typed rather than derived, because ShowLedger24 holds no asset inventory and D-030 rejected inventing one. The product says so on the screen rather than quietly claiming otherwise.

Run every gate at once:
for f in scripts/verify-S*.sh; do bash "$f" local || { echo "FAILED: $f"; break; }; done

Run it locally

# 1 · API worker
cd ~/Documents/artist-management-site/api && npm run dev   # :8792
# 2 · console
cd ~/Documents/artist-management-site/web && npm run dev   # :5273
# prove a slice on the committed tree
cd ~/Documents/artist-management-site && bash scripts/verify-S23.sh local

The console holds its route in React state, so there are no deep links — open the root and use the left nav. Screens come in two kinds and the nav labels them: LIVE screens read the database, FIXTURE screens render a frozen sample.

Screens with data

Screen
Open at
What is on it
Sign in
entry point
http://localhost:5273/
Password sign-in, HttpOnly cookie. Everything else is behind it
Roster
LIVE · data
left nav → Roster
Live artist roster; R7 enforced, a cross-tenant view leak was found and closed here
Calendar
LIVE · data
left nav → Calendar
Availability derived on read; a cross-tenant write was found and closed in 0016
Enquiries
LIVE · data
left nav → Enquiries
The first anonymous write; the link token is the credential
★ Offer Desk
LIVE · signature
left nav → Offer Desk
Hold ladder and challenge protocol. H1–H7 in constraints and triggers
★ Deal Engine
LIVE · signature
left nav → Deal Engine
§2.3 reproduced exactly; two engines cross-checked against each other
Advance
LIVE · data
left nav → Advance
Two-way advance pack; the token resolves to exactly one advance
Day sheet
LIVE · data
left nav → Day sheet
A door time is a local time, not an instant — deliberately not timestamptz
Settlement
LIVE · data
left nav → Settlement
The ten §2.4 reconciliation checks, derived on read
Money
LIVE · data
left nav → Money
Ledger primitives; an event pins its own FX rate
Invoicing
LIVE · data
left nav → Invoicing
No total column at all; a totalMinor sent anyway is refused, not ignored
Artist statement
LIVE · signature
left nav → Artist statement
★ Commission engine and splits; D-021's three safety properties each enforced by test
Clearance
LIVE · signature
left nav → Clearance
★ A requirement is a row carrying its rule version
Roster / Offer Desk / Deal Engine / Settlement / Money / Clearance (fixtures)
FIXTURE · no DB
left nav → the (fixtures) entries
Six frozen-sample twins of the live screens. They render without a database and are how the design is reviewed
Releases and merch
live
left nav → Releases
A release plan holds OFFSETS, not dates — move the release date and every dependent task moves with it, with no cascade to half-fail. Merch: catalogue, per-show register where SOLD is derived from the counts, and a venue cut applied on the basis the deal memo agreed
Artist portal
live
sign in as artist@showledger.local — they see the portal and nothing else
Free, read-only, scoped to one artist: their dates, their statement and their documents. Document numbers are never shown. Whether the statement itemises management commission is the manager’s choice per agreement (D-021), and the portal cannot override it
Notifications
live
left nav → Notifications
What needs attention now, worked out fresh on every read, and a record of what was already sent. Sending twice is impossible — the guarantee is a database constraint, not application logic
Visas & carnets
live
left nav → Schengen, and Carnets & visas
Schengen 90/180 counter, document vault, ATA carnet and the visa appointment queue. C5.1 is not met by decision (D-030) — equipment lines are typed, and the screen says so