Mise
Lollicutblueprint salon
ROLLOUT

Finish

One workspace per salon: its own database, API and agent service, stood up from the blueprint and checked before anything goes live. The files below are generated from the config, in the formats the Lollicut stack already reads.

Go-live gateon staging, owner test next
Lollicut already runs on staging with synthetic data. The gate stays closed until the owner has tested it at the counter and approved every public sentence. Live sends stay off until then.

Checks on the approved config

Config schema: passed.Valid
Blueprint contract: passed.42 endpoints, 206 fixtures. Its validator passed at the last sync
Fixed rules: passed.26 of 26 located in the code
Settings request: passed.Built. Today's API accepts every field
Modules: passed.7 of 7 can go live on config alone
Artifacts: passed.6 files compiled
Go-live gate: open.Closed until the owner has tested it and approved the wording

Generated files

FROM THE APPROVED CONFIG
The steps to stand the salon up, with this repo's commands.
# Rollout: Lollicut

Generated by Mise from `salons/lollicut/salon.toml` against the Lollicut blueprint
(contract v1-booking-with-staff-optional-service-hac97: 42 endpoints, 206 fixtures).

## Before anything is deployed

1 piece does not exist in the blueprint:

- **Record import.** Bring past appointments in from the paper appointment book. Photograph the paper book or load an export, review each row, confirm it into history. Defined in the contract, not built.

## Steps

Each salon gets its own database, API and agent service. Run from the repo root.

1. **Database.** Create a Supabase project for this salon, then apply the migrations:
   `python backend/scripts/migrate_staging.py --yes-staging --env-file <salon env file>`
2. **Seed.** Load this salon's catalogue and hours: `psql "$SUPABASE_DB_URL" -f platform/salons/lollicut/out/seed.sql`
3. **Secrets.** `PROJECT=<salon project> deploy/backend/secrets.sh <salon env file>` (creates the runtime account, the agent token and the scheduler token).
4. **API.** Copy `out/env.yaml` to `deploy/backend/env.yaml`, fill the three placeholders, then `PROJECT=<salon project> SERVICE=lollicut-api deploy/backend/deploy.sh`. The script ends with a smoke booking.
5. **Settings.** Sign in as the owner and send `out/settings.put.json` to `PUT /settings` (read `expected_version` from `GET /settings` first).
6. **Wording.** Replace `backend/app/features/reminders/wording.toml` with `out/wording.toml`. The owner approves it before any real text.
7. **Agents.** `LOLLICUT_API_URL=<api url> agents/photon/deploy/cloudrun.sh`, with live sends off.
8. **Checks.** `python3 contracts/validate.py`, the backend test suite, and the agent evals:
   `cd agents/photon && .venv/bin/python -m evals.run_scripted --backend http --judge`
9. **Site.** A Vercel project with `NEXT_PUBLIC_API_BASE_URL` set to this salon's API.
10. **Owner test.** The owner books on the site and finds the booking on the staff calendar. Record what confused them.
11. **Go live.** Only after the owner approves the wording: set `PHOTON_LIVE=1` and allow-list the numbers.

## Not automated

Staff sign-in grants (they need each person's account), the phone number, and the owner's approval of every public sentence.
On disk: npm run mise -- compile lollicut writes these to platform/salons/lollicut/out/

Lollicut, measured

Spec to last integration mergeabout 9 hoursdocs/submission/devpost.md, from git log (Nov 14, 3:46 am to 12:56 pm ET)
Backend tests534 passed, 27 deferred skipsbackend/README.md (HAC-75, HAC-76, HAC-64, HAC-26)
Second salon, end to endnot measuredNo second salon has been stood up yet. "Days, not weeks" is a target until one is timed.