# salons.site CHALLENGER — M-20261030-001 S1

PRIVATE CONCEPT. Localhost only (`python3 serve.py` → http://127.0.0.1:8830/). Not affiliated, not published, noindex everywhere. Every name, photo, clip and menu line loads from **one manifest** (`data/slots.json`, 304 slots, all `public_ready: false`).

The brief was to beat the current BeautyOS, not to integrate with it. This folder holds 5 pro pages (one real staged pro per vertical, each with its own identity), one operator directory, a customization editor with a live phone preview, a public swap plan with a passing swap test, a commercial recommendation, and an honest head-to-head at 390.

## What's here
| Path | What it is |
|---|---|
| `index.html` | hub; lists every entity from `data/rt/index.json` (no hardcoded names) |
| `pros/p1/` | **hair/colour**: "Tailored tag" identity: Tone Rail + Start-here router (slice 1) |
| `pros/p2/` | **barber, 5 chairs**: "Chair Switch" identity: pick your barber, Time fit |
| `pros/p3/` | **nails**: "Atelier arch" identity: Removal Check |
| `pros/p4/` | **skin / esthetics**: "Skin Path" identity: Start here → Treat → Keep it up |
| `pros/p5/` | **brows, lashes & sugaring**: "Loupe" identity: Area Map |
| `directory/` | "Who's in the building": a real 25-studio roster of one suite location (op1) |
| `editor/?e=p1…p5` | customization editor with a live phone preview (localStorage only) |
| `data/slots.json` | **the only source** of every identity/media/menu value; `data/rt/*.json` are generated per-page projections |
| `shared/ss.js` | runtime: slot loader, cfg (localStorage `ss:cfg:<entity>`), editor bridge, sticky pill, contrast maths |
| `shared/kit.js`, `shared/kit.css` | the shared pro-page kit (p2–p5): opening, work rail/grid, menu rows, meet, visit, pill, radio groups |
| `_build/` | generators (`slots_*.py`, `slots.py`, `rt.py`, `mkhtml.py`, `media.py`, `swap.py`, `prov.py`), QA (`qa.js`, `runqa.sh`, `qa_grep.py`, `scrim.py`, `cmp.js`), stamps |
| `_capture/` | 360/390/430/1440 + reduced-motion captures, scroll-through **webms per business + directory + editor**, `qa-main-*.json`; `_capture/swap/` swap test; `_capture/compare/` head-to-head |

## The 5 businesses (real staged pros; avoid-list respected)
| key | vertical | source records | booking (deep link) | why this pro |
|---|---|---|---|---|
| p1 | hair / colour | HIVE-T-037 · SR-80b4767e6a | GlossGenius | 36-service colour menu, real clip |
| p2 | barber (5-chair shop) | CHI-T-013 · SR-a8157d1bdb (SDH-B2) | Booksy, one page per barber | multi-chair: the hard case for "one tap to book" |
| p3 | nails | TSC-MKE-002 · SR-69896b4233 | GlossGenius | removal/soak-off rules are where nail bookings go wrong |
| p4 | skin / esthetics (+ lash) | TSS-T-054 · SR-47fe1cbb56 (SDH-Q1) | GlossGenius | new-client consult → treatment → maintenance sequence |
| p5 | brows / lashes / sugaring | SEQ-T-007 · SR-7075618a65 | GlossGenius | 28 services across body areas, two methods (sugar / hard wax) |
Not used (avoid list): Julee Marie, Arcane Glow, Nail Retreat, Unforgettable Hair, Flow State (TSC-MKE-001 is Flow State, so the nail pick is TSC-MKE-002).

## Ideas (named) and why they drive bookings / revenue
**Shared across every pro (L-005):** sticky thumb pill (min 58px, shows the current service context; under the Muse ruling it appears only over photos/video/background and never over text, captions, controls, CTAs or a work photo's focal subject; inline "Book with <Name>" buttons carry the rest), 1 tap to the real booking page from every surface, "Book this look" after every work section, one verb "Book with <Name>" (opening, pill, final, menu rows where it fits), durations + "what to expect" in the pro's own words, service names verbatim, prices withheld (shown on the booking site), the opening leads with work.

1. **Tone Rail (p1).** Work ordered dark → light with a swipeable scrubber; each look books the service mapped to it. *Why:* clients arrive with a photo; "book that one" removes the which-service stall where colour bookings leak.
2. **Start-here router (p1).** One question routes to the pro's own intake rule (new colour → consult). *Why:* fewer wrong-service bookings and fewer abandoned 36-row menus.
3. **Chair Switch (p2).** A 5-way segmented control at the top of the page: pick JP / Manny / Max / AJ / JJ and the verb, the menu, the pill and every Book button switch to that barber's own Booksy page. *Why:* in a multi-chair shop "Book" is ambiguous; one deep link per chair makes every tap land on the right calendar.
4. **Time fit (p2).** "I've got 30 / 45 / 60 min" filters the chosen chair's menu by real durations; if nothing fits it suggests another barber. *Why:* turns a lunch break into a booking without inventing availability.
5. **Removal Check (p3).** "What's on your nails now?" (none / gel / hard gel / dip / acrylic) → the matching soak-off service + the set, with the combined time ("Together about X") and one Book button. *Why:* removal is the #1 reason nail appointments run over or get rebooked; adding it at booking protects the pro's calendar and adds a paid line item.
6. **Skin Path (p4).** The menu opens as a numbered route built from her real menu: Start here (virtual / new-client consult) → Then treat (facials, HydraFacial, back) → Keep it up (head spa, product pick-up). Medical-adjacent services are hidden by default (flagged for review). *Why:* esthetics clients don't know what to book first; a consult-first path raises first-visit conversion and sets up the repeat visit, which is where skin revenue is.
7. **Area Map (p5).** "Where are we working?" chips (Face & brows / Body / Bikini & intimate / Feet / Add-ons / Combos) show only that area's services, each with "What to expect" (her own description) and "Options when you book" (her add-on names). *Why:* a 28-row wax menu becomes 3–8 rows; options surface the upsell (tint, lamination) before checkout.
8. **"I've got N minutes" + Shop the building by look (directory).** Real durations, real roster, deep links only where the URL test passed. *Why:* the operator's page becomes a booking surface for every tenant.
9. **Editor: colours from your work, tap-to-feature on the live page, layouts per page.** The Layout tab is generated from each page's own options (p2 also offers "Chair shown first"). AA enforcement on palette. *Why:* a branded page in 2 taps; pros can't make it unreadable.
- Later (not built): rebook card / suite-door QR; "fits before school pickup" saved filter; Pro analytics (which look gets the taps).

## Rationale per business (identity)
- **p1 Tailored tag:** punched eyelets + one running stitch; blush / espresso / bright looks; opening is her real 3.4 s clip, cropped above baked-in label text.
- **p2 Chair Switch:** chrome-on-black barbershop with a barber-pole band, Anton uppercase; looks chrome / pole / day. Opening photo is a fresh fade; a space photo cropped to remove a wall TV showing a person. The "Kids 13&younger" service is hidden by default (minor-related service, safeguarding) and can be re-shown by the shop.
- **p3 Atelier arch:** arch-topped photos, Instrument Serif, champagne / marble / noir. The "Not accepting new clients" note from her bio is shown next to the menu (not hidden). Captions baked into her posts were cropped out (no blur or inpaint), each verified.
- **p4 Skin Path:** sage / clinic / dusk, Fraunces + Manrope; a 5.5 s real reveal clip; numbered path.
- **p5 Loupe:** close-ups in circles like a magnifier, Syne + Bricolage, honey / noir gold (from her mark) / cream; a 5.5 s real-time sugaring clip (9:16, clean range 18–23.5 s).

## Commercial structure (recommendation only; no billing wiring, no published price changed)
Tony's current facts: operators pay about **$99/mo per location**, with onboarding taken as a credit. Tenant **Pro is about $9/mo**. **Standalone websites are the main revenue**, so the free Standard tier must not be too generous. Tony thinks 6 Standard photos is too many.

| | Standard (free, included in the operator's ~$99/mo per location) | Pro (~$9/mo per tenant, or operator-sponsored) |
|---|---|---|
| Booking | full: one tap to the tenant's real booking link, sticky pill, menu rows with the verb | same; booking is never gated |
| Menu | the full menu, service names verbatim, with durations | the same, plus the "what to expect" panels and starred picks |
| Work | **3 photos**, picked by the tenant (one-line change: `lists.work` slice in the per-page meta) | the full work set, the video opening, the "Book this look" re-pointing |
| Look | the operator's default look | all looks plus "colours from your work" |
| Layout | the operator's default | tenant-selectable layouts (`meta.layout`) |
| Signature feature (Tone Rail / Chair Switch / Removal Check / Skin Path / Area Map) | **off** | on |

Why 3 photos and the signature feature in Pro:
- The page has to be credible enough on Standard that the operator's directory works and nobody's booking link is held hostage.
- The things that make a tenant want a *website* (their whole portfolio, their identity, the feature that fits their trade) sit in Pro, which is also the upsell path to a standalone site.
- With 6 Standard photos the page already reads as a finished portfolio, so there's no reason to pay. With 3, the tenant can see the gap.

Claim tactic (Tony):
- Every unclaimed tenant profile is generated and shown **as Pro** first, so the tenant sees their best page.
- It carries two buttons: **"Claim free (Standard)"** and **"Claim Pro"**.
- If it's still unclaimed after **30 days**, it drops to Standard. The drop is visible to the tenant, because their own work goes from the full set to 3.
- In this build that maps to a single config field (`tier`) read by the kit. It is **not built here**: no claim flow and no tier toggle in the UI (see Known gaps).

Fit with existing references (read-only, not changed):
- beauty-os #53/#64 describe Pro at $9/mo founding ($19 regular) and Full Website at $29/mo.
- The Rogers Premier review site shows "Profile Pro is proposed at $10/month".
- The parallel M-20261030-004 TIERS draft also recommends a 3-photo Standard.
- This recommendation uses the ~$9 Pro and keeps the standalone website as the main product.

## Public swap plan
- **One manifest:** `data/slots.json` (schema `salons.site/slots@1`), **304 slots**: text 75, list 5, url 5, service 131, chair 5, image 55, video 3, tenant 25. Per entity: p1 67, op1 34, p2 64, p3 45, p4 40, p5 54. Every slot has `id`, `type`, aspect/size (`aspect`, `w`, `h`; video `duration_s`), `focal`, `source` (provenance), `rights` {concept: private_concept_ok, production: UNKNOWN, identity_reuse: UNKNOWN}, **`public_ready: false`** (asserted at build) and a `style` text describing what a replacement should show (work, light, framing; never an identifiable person). Replacements are to be generated from the style text, never image-to-image.
- **Per-page projections, one source:** `_build/rt.py` writes `data/rt/index.json` + `data/rt/<entity>.json`; nobody edits those by hand.
- **No hardcoding:** HTML shells and scripts contain no identity; entity meta refers to names by slot (`{"slot": "p2.c1"}`), not by value. **QA grep** (`_build/qa_grep.py`): 25 built pages/scripts against 814 identity + media needles from the manifest: **0 hits.**
- **Layouts survive the swap:** aspect-ratio boxes from the slot, `object-fit: cover` + `object-position` from the slot focal, no text pinned to a photo spot; the solid part of the opening scrim always sits behind the whole name block (any image, any name length) with a fade above it; long names wrap/ellipsize; menu-row verbs fall back to "Book" when a long name would otherwise break.
- **The real operator name** is in exactly one slot (`op1.brand`) under the "Concept preview, not affiliated" bar. Going public = replace that slot (or swap to a labelled demo operator); nothing else changes.
- **Swap test** (`_build/swap.py` → `_swap/`, 127.0.0.1:8831 only for the run): every slot replaced with a neutral grey placeholder of the same pixel size/aspect (videos: same size and length), fictional identities with deliberately long names, long service names, placeholder options, sandbox booking URLs; projections regenerated.

**Result (run 2, 02:48–02:56 CDT):** grep 0 hits. On all 8 pages at 360/390/430/1440:
- overflow 0, JS errors 0, taps under 44px 0, text under 12px 0, images without alt 0, broken images 0
- taps-to-book 1 on every pro
- CTA visible: p1 90.9 · 90.9 · 88.6, p2 100 · 96.4 · 93.1, p3 97.4 · 97.4 · 94.9, p4 95.7 · 100 · 95.8, p5 100 · 100 · 100
- pill-ruling overlaps 0, not-at-rest 0
- every book link points to the sandbox URL

Run 1 (02:35) found one pill overlap: a small "Meet" eyebrow on p3 at 430 that fell between the guard's sample points. It was fixed by making the guard exact.

Captures:
- `_capture/swap/*-390-fold.png` and `*-full.png`
- `_capture/swap/real-vs-swap-390.png`: the real folds over the placeholder folds for p1–p5

To go public:
1. Generate replacements from each slot's `style` text, or get owner permission for the real media.
2. Swap the operator slot.
3. Flip `public_ready` per slot only after review.
4. Re-run `swap.py`-style QA and `qa_grep.py`.

## Tests (Playwright 1.64.1 Chromium; external requests aborted; QA run at nice 10 in groups that wait for load < 8 to yield to the Styled.page queue)
Final numbers are from **QA run 5** (02:48–02:59 CDT) for the hub and p1–p5. The directory and editor numbers are from run 3 (02:04–02:14); their code didn't change after it.

- Merged results: `_capture/qa-merged.json`
- Captures: `_capture/<page>-<width>-fold.png` / `-full.png`, `<page>-390-reduced-motion.png`
- Scroll videos: `_capture/<page>-scroll-390.webm`

| | p1 | p2 | p3 | p4 | p5 | directory | editor | hub |
|---|---|---|---|---|---|---|---|---|
| overflow-x px (360·390·430·1440) | 0 · 0 · 0 · 0 | 0 · 0 · 0 · 0 | 0 · 0 · 0 · 0 | 0 · 0 · 0 · 0 | 0 · 0 · 0 · 0 | 0 · 0 · 0 · 0 | 0 · 0 · 0 · 0 | 0 · 0 · 0 · 0 |
| taps <44px / text <12px / imgs no alt / broken | 0/0/0/0 | 0/0/0/0 | 0/0/0/0 | 0/0/0/0 | 0/0/0/0 | 0/0/0/0 | 0/0/0/0 | 0/0/0/0 |
| JS errors (all widths) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| CTA visible % 360·390·430 (excl. header) | 91.1 · 88.9 · 91.1 | 100 · 96.3 · 96.4 | 94.9 · 97.4 · 97.5 | 100 · 100 · 100 | 100 · 100 · 100 | – | – | – |
| pill ruling: overlaps of text/controls/focal · not-at-rest samples (360·390·430) · pill up % @390 | 0 · 0 · 15.6 | 0 · 0 · 22.2 | 0 · 0 · 12.8 | 0 · 0 · 0 | 0 · 0 · 2.4 | – | – | – |
| taps-to-book | 1 | 1 | 1 | 1 | 1 | – | – | – |
| book links @390 (distinct URLs) | 58 (1) | 17 (1) | 37 (1) | 24 (1) | 23 (1) | – | – | – |
| 4x CPU LCP ms | 240 | 160 | 260 | 184 | 180 | 132 | 144 | 60 |
| CLS | 0.0095 | 0 | 0 | 0.01 | 0.0001 | 0 | 0 | 0.0032 |
| INP ms (scripted taps) | 16 | 32 | 16 | 16 | 24 | 24 | 24 | 0 |
| JS KB | 24.2 | 26.2 | 24.6 | 23.7 | 24.5 | 12.9 | 33 | 9.1 |
| initial KB | 742 | 319 | 274 | 573 | 268 | 293 | 602 | 77 |
| full-scroll KB (limit 2,560) | 749 | 319 | 274 | 573 | 754 | 293 | 602 | 77 |
| reduced motion (rm class / videos playing) | True / 0 | True / 0 | True / 0 | True / 0 | True / 0 | True / 0 | True / 0 | True / 0 |

How to read this:
- **CTA visible** is the share of scroll positions (sampled every 120 px or 1/60 of the page) where a booking control is fully visible in the thumb zone. The header "Book" doesn't count.
- **Pill ruling:** at every sample, after 650 ms of rest, an independent audit intersects the pill with every visible text node, every control/caption and each work photo's focal point (from the slot focal). It also checks that the pill is fully on (no transform, visible) or fully off (hidden). The result is 0 overlaps and 0 partial states on all pros. No spacer band: p1's 120 px finale padding was removed.
- **Book links:** all of a page's booking links point to one distinct real booking URL, open in a new tab with `noopener`, and use one verb, "Book with <Name>" / "Book this look". The fallback "Book" appears only in the header, and on p4's menu rows at 360/390.
- **Opening scrim:** worst contrast at the brightest pixel under the name block, measured with the text hidden: p1 5.78, p2 18.7, p3 11.8, p4 16.1, p5 13.9 (≥ 4.5 everywhere). Source: `_build/scrim-contrast-main-scrim.json`.
- **Keyboard:** the first 14 tab stops have a visible focus ring on every page. Pros start with "Skip to content" → wordmark → header "Book with <Name> … (opens booking site)" → first service.
- **Menu-row verb fit (decision 5):** `K.fitRows` keeps "Book with <Name>" unless a visible service name would overflow. The full verb is used on p1, p2, p3 and p5 at 360/390/430, and on p4 at 430; p4 uses "Book" at 360/390.

Editor (p1, scripted taps on the live phone preview; localStorage only):

| task | taps | ms |
|---|---|---|
| Change look | 1 | 309 |
| Colours from a photo | 2 | 742 |
| Feature 3 photos by tapping the preview | 6 | 3119 |
| Re-point a look's Book button | 1 | 323 |
| Switch opening to Trio | 2 | 445 |
| Hide a service + star a pick | 3 | 1499 |
| Undo | 1 | 313 |

- p2–p5 editor: look 1 tap (~0.31 s), feature 3 photos 6 taps (~2.8 s), switch layout 2 taps (~0.35 s), hide + pick 3 taps (~1.3 s), undo 1 tap (~0.3 s).
- Every page reflects the saved state after reload (look, featured, layout).


## Head-to-head at 390 (read-only)
Captures: `_capture/compare/` (fold and tall PNGs at 390 for each reference) and `_capture/compare/side-by-side-390.png` (our five folds over the four references).
- References were read-only:
  - BeautyOS / Pro Experience V2: beauty.dgenius.site, profiles "Rae Studio" and "Individual Hair"
  - Rogers Premier: the M-004 local mirror, Amanda Binkley Pro preview
  - Salon Park: the M-004 local mirror, Kelsi Moore
- Nothing was submitted or changed.
- The loose cross-site metric (`_build/cmp.js`, a book-like control in the viewport) scored the references:
  - BeautyOS Rae Studio 24%. This undercounts: its CTA is "Choose your artist", which the verb heuristic misses.
  - BeautyOS Individual Hair 100%
  - Rogers Pro 100%
  - Salon Park Kelsi 98%
- Ours use the stricter thumb-zone metric (see Tests), at 85% or more on every pro.

**Where ours is stronger**
- **The opening is the person's own work, full-bleed, with one verb.** "Book with <Name>" is on the opening, every menu row, after every work card, and in the finale, and it links straight to the real booking page.
  - BeautyOS: "Request a time with Jamie", "Choose your artist" and "Ask about an appointment" lead to a fictional request flow on AI demo images.
  - Rogers: the Pro fold is spent on the tier explainer.
- **Each trade gets a booking tool built for it.** Tone Rail (hair), Chair Switch (barber roster), Removal Check (adds the right soak-off so the time is held), Skin Path and Area Map (sugaring/brows). The references share one template for every trade.
- **Durations and what to expect on every service**, with names verbatim from the booking source. There are no invented prices.
- **Per-page performance:** LCP is about 0.16–0.24 s at 4x CPU locally, CLS ≤ 0.013, there's no framework and about 21 KB of JS per page.
- **A live phone-preview editor:** changing the look takes 1 tap, and the opening layout or re-pointing a "Book this look" button takes 1–2 taps.

**Where ours is weaker (honest)**
1. **Breadth and scale.** BeautyOS V2 has multi-artist studio profiles ("With Rae, Devon & Frankie"), save (heart), share, expand-photo, a location line and search entry/return, across a whole directory. Ours is 5 pros plus 1 operator directory, with no save, share or search.
2. **The claim and tier story is visible on Rogers and missing on ours.**
   - Rogers shows "Included / Profile Pro" and "Claim & choose your plan" in the fold.
   - Ours has no claim flow and no Standard/Pro switch in the UI; it is only a recommendation in this README.
3. **Salon Park's practical actions:** "Save contact", "Call", share, bookmark, "Confirm suite" and a reviews link on Booksy. Ours has no call or contact-card action. Only p1 shows a review line ("5.0 · 82 reviews on GlossGenius, Oct 2026", re-verified from stored evidence) and it has no reviews link; p2–p5 show none.
4. **Desktop is serviceable but not designed.** The 1440 layouts pass the checks (no overflow, no tiny text) but are centred phone layouts. The references are similar, so this is not a differentiator either way.
5. **p3's landscape opening** needs a heavy solid scrim behind the name to reach 4.5:1, which flattens the bottom of the photo.
6. **p4 menu rows fall back to "Book"** at 360/390 because the long service names don't fit next to the full verb. The full verb is used at 430 and everywhere else.
7. **The pill ruling costs pill time.** The sticky pill now hides whenever it would cover text, controls or a photo's subject. It is up for only about 0–22% of the scroll (p4 0%, p5 2%); the inline "Book with <Name>" buttons carry the 85% or more.
8. **Real media rights are UNKNOWN.** Every media slot is private_concept_ok and public_ready=false. The public version depends on the swap plan or on owner permission.


## Provenance (media slots)
Every media slot, with its source post, account, media id and edit, is in `_build/prov.md` (generated from the manifest), also below. Text and menu provenance is on every slot in `data/slots.json` (GlossGenius / Booksy pages, roster records, IG captions). Prices are withheld everywhere.
| slot | type | aspect | source post / record | account | media id | edit | concept | production | public_ready |
|---|---|---|---|---|---|---|---|---|---|
| `op1.c01` | image/card | 1215/2160 | https://www.instagram.com/p/DbZCRLcJ4sw/ | giandrahair_salon | HIVE-M-046 | resize only | private_concept_ok | UNKNOWN | false |
| `op1.c02` | image/card | 1440/1920 | https://www.instagram.com/p/DZdZ4xhCVli/ | morestylesbykat | HIVE-M-053 | resize only | private_concept_ok | UNKNOWN | false |
| `op1.c03` | image/card | 3072/4096 | https://www.instagram.com/p/Ddpt-lblOft/ | unforgettablehairllc | HIVE-M-007 | resize only | private_concept_ok | UNKNOWN | false |
| `op1.c04` | image/card | 694/868 | https://www.instagram.com/p/DQCNT_RjtSC/ | nailology_spa_ | HIVE-M-074 | crop (300, 0, 994, 868) to remove corner watermark, then resize | private_concept_ok | UNKNOWN | false |
| `p1.w10` | image/work | 896/1599 | https://www.instagram.com/p/DcbdA0LOeYk/ | taylerdmanes | HIVE-M-060 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w09` | image/work | 720/1280 | https://www.instagram.com/p/Daxoww_u5Zi/ | taylerdmanes | HIVE-M-062 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w11` | image/work | 720/1280 | https://www.instagram.com/p/DaGGh8zub9z/ | taylerdmanes | HIVE-M-063 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w13` | image/work | 720/1280 | https://www.instagram.com/p/Dado6_uJPMv/ | taylerdmanes | HIVE-M-064 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w12` | image/work | 720/1280 | https://www.instagram.com/p/DdtmYVZxhuh/ | taylerdmanes | HIVE-M-003 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w04` | image/work | 1206/1288 | https://www.instagram.com/p/DZnMehJDngi/ | taylerdmanes | HIVE-M-065 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w07` | image/work | 1080/1440 | https://www.instagram.com/p/Dee5LubiWMS/ | taylerdmanes | SDH-B3-066-005 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w05` | image/work | 1206/1608 | https://www.instagram.com/p/Dee5LubiWMS/ | taylerdmanes | HIVE-M-002 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w08` | image/work | 1080/1440 | https://www.instagram.com/p/Dee5LubiWMS/ | taylerdmanes | SDH-B3-066-006 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w01` | image/work | 1026/1830 | https://www.instagram.com/p/DbJETtNutv-/ | taylerdmanes | HIVE-M-061 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w02` | image/work | 1033/1839 | https://www.instagram.com/p/DdEZ-JCO1qE/ | taylerdmanes | HIVE-M-059 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w06` | image/work | 1059/1410 | https://www.instagram.com/p/Dee5LubiWMS/ | taylerdmanes | SDH-B3-066-004 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.w03` | image/work | 720/1280 | https://www.instagram.com/p/DewoeNORwEv/ | taylerdmanes | HIVE-M-058 | resize only; no crop, grade or AI | private_concept_ok | UNKNOWN | false |
| `p1.v01` | video/result | 540/758 | https://www.instagram.com/p/De17QBMN-3J/ | taylerdmanes | SDH-B3-066-009 | trim + crop + re-encode only; no AI, no speed change | private_concept_ok | UNKNOWN | false |
| `p1.portrait` | image/portrait | 1/1 | instagram profile photo | taylerdmanes | SDH-B3-066-008 | resize only; never animated | private_concept_ok | UNKNOWN | false |
| `p2.w01` | image/work | 720/960 | https://www.instagram.com/p/DbTxILQoFZZ/ | jp_clipzz | SDH-B2-017-001 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p2.w02` | image/work | 720/960 | https://www.instagram.com/p/DbTxILQoFZZ/ | jp_clipzz | SDH-B2-017-003 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p2.w03` | image/work | 640/1136 | https://www.instagram.com/p/DZNgOIEJpLC/ | jp_clipzz | SDH-B2-017-008 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p2.w04` | image/work | 720/960 | https://www.instagram.com/p/De-QEhlFCO6/ | prietodiditright | SDH-B2-017-012 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p2.w05` | image/work | 720/960 | https://www.instagram.com/p/Dc1HtO_IJ49/ | jp_clipzz | CHI-M-036 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p2.w06` | image/work | 1080/1350 | https://www.instagram.com/p/CyhVo0NOj8z/ | prietodiditright | CHI-M-045 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p2.sp1` | image/space | 1215/1188 | https://www.instagram.com/p/Db8u8w5JugP/ | jp_clipzz | CHI-M-102 | crop bottom 55% (removes a wall TV showing a person); resize only | private_concept_ok | UNKNOWN | false |
| `p2.logo` | image/logo | 320/320 | instagram | lineage.inc | SDH-B2-017-007 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p3.w01` | image/work | 1080/1920 | https://www.instagram.com/p/DdVFhcutFGU/ | dasha.delcy | TSC-MKE-MM-040 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p3.w02` | image/work | 1080/1920 | https://www.instagram.com/p/Db6VtmxtvhW/ | dasha.delcy | TSC-MKE-MM-045 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p3.w03` | image/work | 1080/675 | https://www.instagram.com/p/DZ5iqlECMan/ | dasha.delcy | SDH-B3-056-001 | crop to the hand band (removes a caption line and a logo mark); resize only | private_concept_ok | UNKNOWN | false |
| `p3.w04` | image/work | 1080/1536 | https://www.instagram.com/p/DaLaTDvIPf4/ | dasha.delcy | SDH-B3-056-003 | crop bottom 20% (removes a corner logo mark); resize only | private_concept_ok | UNKNOWN | false |
| `p3.w05` | image/work | 1080/1536 | https://www.instagram.com/p/Dcga_eStNsq/ | dasha.delcy | TSC-MKE-MM-042 | crop top 20% (removes a caption); resize only | private_concept_ok | UNKNOWN | false |
| `p3.w06` | image/work | 1080/1440 | https://www.instagram.com/p/DcKoKP0NBS1/ | dasha.delcy | TSC-MKE-MM-043 | crop top 25% (removes a caption); resize only | private_concept_ok | UNKNOWN | false |
| `p3.w07` | image/work | 1080/1325 | https://www.instagram.com/p/DawjQLgNkx3/ | dasha.delcy | TSC-MKE-MM-046 | crop top 31% (removes a caption); resize only | private_concept_ok | UNKNOWN | false |
| `p3.w08` | image/work | 720/1280 | https://www.instagram.com/p/DZ9RQmoI2Fa/ | dasha.delcy | TSC-MKE-MM-047 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p3.sp1` | image/space | 1080/1917 | https://www.instagram.com/p/Db9Hq51tA8J/ | dasha.delcy | TSC-MKE-MM-044 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w01` | image/work | 1216/2160 | https://www.instagram.com/p/Deed6TcvKW6/ | skinbarjax | TSS-M-106 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w02` | image/work | 720/720 | https://www.instagram.com/p/CascJAUF9vE/ | skinbarjax | SDH-Q1-063-003 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w03` | image/work | 1216/2160 | https://www.instagram.com/p/Dd3taCrzr1c/ | skinbarjax | TSS-M-103 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w04` | image/work | 720/720 | https://www.instagram.com/p/Ca7jUh_lOw_/ | skinbarjax | SDH-Q1-063-002 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w05` | image/work | 1217/2160 | https://www.instagram.com/p/Dd9Lscnxxta/ | skinbarjax | TSS-M-104 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w06` | image/work | 720/720 | https://www.instagram.com/p/CbUq83uFn8N/ | skinbarjax | SDH-Q1-063-004 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w07` | image/work | 720/1280 | https://www.instagram.com/p/DeZLxSLz1t0/ | skinbarjax | TSS-M-105 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w08` | image/work | 1216/2160 | https://www.instagram.com/p/DeRywLEx8fH/ | skinbarjax | TSS-M-108 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w09` | image/work | 1217/2160 | https://www.instagram.com/p/Dey7wltzG9T/ | skinbarjax | TSS-M-109 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w10` | image/work | 1217/2160 | https://www.instagram.com/p/Det59E-Bkso/ | skinbarjax | TSS-M-107 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.w11` | image/work | 1216/2160 | https://www.instagram.com/p/DfFKOyuJ6Td/ | skinbarjax | TSS-M-110 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.portrait` | image/portrait | 320/320 | instagram | skinbarjax | SDH-Q1-063-009 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p4.v01` | video/result | 1/1 | https://www.instagram.com/p/Ca7jUh_lOw_/ | skinbarjax | SDH-Q1-063-010 | trim + scale + re-encode only; no AI, no speed change | private_concept_ok | UNKNOWN | false |
| `p5.w01` | image/work | 1000/1000 | https://glowsugarwax.glossgenius.com/portfolio | glowsugarwax | SEQ-M-017 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p5.w02` | image/work | 1000/1000 | https://glowsugarwax.glossgenius.com/portfolio | glowsugarwax | SEQ-M-022 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p5.w03` | image/work | 1000/1000 | https://glowsugarwax.glossgenius.com/portfolio | glowsugarwax | SEQ-M-015 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p5.w04` | image/work | 1000/998 | https://glowsugarwax.glossgenius.com/portfolio | glowsugarwax | SEQ-M-019 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p5.w05` | image/work | 1000/1000 | https://glowsugarwax.glossgenius.com/portfolio | glowsugarwax | SEQ-M-023 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p5.w06` | image/work | 1000/998 | https://glowsugarwax.glossgenius.com/portfolio | glowsugarwax | SEQ-M-021 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p5.w07` | image/work | 1000/1000 | https://glowsugarwax.glossgenius.com/portfolio | glowsugarwax | SEQ-M-016 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p5.logo` | image/logo | 1536/1024 | https://glowsugarwax.glossgenius.com/ | glowsugarwax | SEQ-M-024 | resize only; no grade or AI | private_concept_ok | UNKNOWN | false |
| `p5.v01` | video/result | 9/16 | https://www.instagram.com/p/DdUHFqLxX6F/ | glowsugarwax | SDH-B3-069-003 | trim + scale + re-encode only; no AI, no speed change | private_concept_ok | UNKNOWN | false |


## Known gaps
- **Media rights are UNKNOWN for every real asset.** They are private_concept_ok only and every slot has public_ready=false. Going public needs owner permission or the swap plan.
- **No claim flow and no Standard/Pro toggle are built.** The tier split, the 3-photo Standard and the 30-day drop are a recommendation only.
- **Desktop (1440) is clean but not a designed layout.**
- **p4 menu rows use "Book" at 360/390.** The full verb didn't fit beside long verbatim service names.
- **The pill is up for only part of the scroll under the Muse ruling** (about 0–22%). The 85% or more CTA coverage comes from inline "Book with <Name>" buttons, so pages with long text runs depend on those.
  - The pill guard uses a 9×5 grid to find the sections under where the pill would sit, then intersects exactly with their text, controls and focal points. It re-checks on scroll, on details toggle and every 250 ms.
  - An audit in QA checks every scroll sample independently.
  - A photo's "focal subject" is approximated from the slot focal point (object-position) with a radius of about 24% (page) / 20% (audit). It is not detected from the image.
- **The 82-review count on p1 comes from stored evidence** (observed 2026-10-28 20:50 CDT), not a live re-fetch.
- **Performance numbers are local** (127.0.0.1, 4x CPU throttle, no network shaping), not field data.
- **The head-to-head CTA metric is a loose cross-site heuristic.** It undercounts BeautyOS "Choose your artist".
- **Not done (out of scope or not allowed):** no deploy, no public link, no booking-system integration, no analytics, no contact with any pro.

