# BUILD-LOG — M-20261030-001 S1 challenger
| stamp file | time (CDT) | event |
|---|---|---|
| _build/stamp-start | 2026-10-30 00:27:33 | start; read lessons L-001..005, staged pros, HIVE v1.2, SDH-B3 |
| (addendum) | 00:34 | swap-ready addendum received; restructured to neutral keys p1/op1, media/<entity>/, one manifest |
| _build/stamp-slice-runnable | 00:43:57 | p1 + directory + editor runnable on 127.0.0.1:8830 |
| _build/stamp-slice-qa | 01:11:03 | QA, grep (0 hits) and swap test (PASS) complete; slice reported |
| (resume) | 01:12 / 01:13 | resume + CONTROL steering received; swap server 8831 stopped (restarted only for swap runs) |
| (decision 2) | ~01:15 | "5.0 · 82 reviews" re-verified from stored evidence (see below); kept and dated "Oct 2026" |
| (decision 3) | ~01:16 | Studio 23 checked: confirmed shared (see below); shown as published |
| (decision 4) | ~01:18 | per-page projections `data/rt/*.json` generated from the one manifest by `_build/rt.py` |
| (build) | 01:18–01:37 | p2 barber, p3 nails, p4 skin, p5 brows/lash/sugaring built on `shared/kit.*`; editor Layout tab driven by entity meta |
| (decision 5) | 01:36 | menu-row label fit test at 360/390/430 (see below) |
| _build/stamp-full-qa-start | 01:41:15 | full QA run 1 (niced). **Contention:** Styled.page QA (`styled-concepts/M-20261029-010 … qa.js`) running; load 1.2–1.6 on 8 cores, so ran at nice 10 rather than wait 25 min |
| _build/stamp-full-qa-done | 01:50:54 | run 1 done: found opening-scrim failures on p3 (landscape photo) and p5, hub CLS 0.38 |
| _build/stamp-full-qa2-start | 01:52:30 | fixes (scrim block, hub reveal, p1 row verb) + run 2 at nice 10; Muse M-20261030-002 QA also running |
| _build/stamp-full-qa2-done | 02:01:36 | **run 2 crashed (Chromium target crashed in the keyboard step) under load average 126**: Styled `shoot.js` stills, ffmpeg frame grabs and contact-sheet scripts from other streams. **Yielded**: stopped launching browsers until load fell |

## Decisions log (resume)
- **82 reviews (decision 2): VERIFIED from stored evidence, not live.** Source: `ENRICH-HIVE-PILOT-v1.2/TENANT-ROSTER.json` record HIVE-T-037 notes, observed 2026-10-29 01:50 UTC (2026-10-28 20:50 CDT) from the pro's GlossGenius page; re-read 2026-10-30 01:15 CDT. No live re-fetch (read-only rule; GlossGenius not re-requested). Page text is now dated: "5.0 · 82 reviews on GlossGenius, Oct 2026". If the date is not acceptable for public use, the slot `p1.rating` is set to '' and the Meet card drops the line automatically.
- **Studio 23 (decision 3): CONFIRMED shared, no fix.** Both GlossGenius pages (T-028 and T-037) list Suite 23 at 3850 Gaskins Rd, and the T-028 roster note says the suite is shared. Directory shows it as published for both.
- **Operator name (decision 1):** kept the real HIVE name in exactly one place, slot `op1.brand`, under the "Concept preview, not affiliated" bar. Documented in the README "Public swap plan".
- **Manifest split (decision 4):** `data/slots.json` stays the only hand-edited source; `_build/rt.py` writes `data/rt/index.json` (hub: metas + 9 summary keys, 21 KB) and `data/rt/<entity>.json` (own slots + referenced entities; op1 83 KB incl. p1, p1 47, p2 39, p3 27, p4 26, p5 36 KB). QA grep still runs against the one manifest.
- **Menu-row verb (decision 5):** rows say "Book with <Name>" when every visible service name still fits whole; if any name would have to break mid-word the rows say "Book" (the aria-label keeps "Book with <Name>, <service> on <platform>"). Measured at 360/390/430: p1 Tayler, p2 JP, p3 Dasha, p5 Glow keep the full verb at all three; **p4 Lindsey falls back to "Book" at 360 and 390** (long all-caps names like "NEW CLIENT CONSULT+CUSTOM TREATMENT"), full verb at 430.

## Cost
- Apify: **$0**. No Actor runs in this stream; all media comes from the existing harvest packages (their own Apify runs are logged in their manifests).
- No paid APIs or AI generation used.

## Steps
1. p1 media: crop/resize only (webp 480/960 q72), tone sampling; video trimmed 31.8–35.2 s, cropped 720x1010 from the top to cut baked-in label text (checked frame by frame).
2. op1: roster filtered to HIVE-L-SHORTPUMP (25). Booking links only where the test state is WORKS and not flagged dead. 4 tenant-owned post images: one cropped to remove a corner watermark, the rest resize only.
3. Manifest: slots_p1.py + slots_op1.py → slots.py (asserts unique ids, all public_ready false) → data/slots.json (101 slots).
4. QA: qa.js (Playwright), qa_grep.py, swap.py + qa.js swap.
5. Fixes from QA: swatch-book CSS overriding its stacking (fixed), wordmark tap height, pill aria-label, feature mode reordering under the finger (frozen), rail scroll lost on re-render, editor DOM order, Range support in serve.py (video stalled without it), hardcoded tone heading → slot.

## Progress after interruption (02:20 CDT)
| time (CDT) | event |
|---|---|
| 02:14 | full QA run 3 (grouped, waits for load < 8) finished, all pages; scrim measurement fixed (it hid the new scrim block), re-measured: worst brightest-pixel contrast p1 5.78, p2 18.7, p3 11.8, p4 16.1, p5 13.9 |
| 02:17 | p3 badge moved off the arch corner; p3 re-QA'd |
| 02:18 | swap run command aborted before spawning (session interrupted); 8831 was not started |
| 02:20 | resumed. Servers: 8830 ours (kept for QA). 8797 / 18797 are not ours (other streams), left alone. New: Muse pill ruling + updated commercial facts |
| 02:36 | swap build regenerated (304 slots), grep 0 hits; 8831 started on 127.0.0.1 for the swap QA only |
| 02:22–02:33 | Muse pill ruling implemented. SS.pill hides the pill wherever it would sit over text, captions, controls/CTAs or a work photo's focal point; it shows over photos/video/background only. Off state is visibility:hidden after the slide (no partial CTA at rest). p1 `.final` 120px bottom padding removed (spacer band). Inline "Book with <Name>" added to p3 atelier and p2 shop photo to keep CTA ≥ 85%. QA audit added (exact text/control/focal intersection per scroll sample + at-rest transform check); fixed an audit false positive (text in closed `<details>` reports rects) |
| 02:35–02:46 | QA run 4 (pros + extras; load 0.7–1.5, no yield needed). Swap QA run in parallel: all pages overflow 0 / errors 0 / small taps 0 / tiny text 0 / broken 0, taps-to-book 1, CTA 88.6–100%; one pill overlap (p3 430, small "Meet" eyebrow between sample columns) |
| 02:48 | pill guard rewritten to exact per-container intersection (grid only finds candidate sections). Re-running QA (run 5) + swap |
| 02:48–02:59 | QA run 5 (final, pros + hub + extras/webms; load 0.3–0.5, no yield needed). Pill ruling 0 overlaps / 0 partial states; CTA p1 91.1·88.9·91.1, p2 100·96.3·96.4, p3 94.9·97.4·97.5, p4 100, p5 100; all checks 0. Swap QA run 2 clean (0 overlaps, 0 errors, taps 1, CTA 88.6–100) |
| 02:59–03:01 | side-by-side composites (`_capture/compare/side-by-side-390.png`, `_capture/swap/real-vs-swap-390.png`); scrim re-measured; README filled (commercial rewrite with Tony's facts: ~$99/mo per location with onboarding credit, Pro ~$9, Standard = 3 photos and no signature feature, claim tactic Pro-first + 30-day drop; swap result; metrics; head-to-head weaker-list; provenance; gaps) |
| 03:02 | stopped our servers: 8830 (pid 1345112) and 8831 (already stopped after the swap run). 8797 / 18797 are other streams' servers, left running |

**Totals:** start 00:27:33 CDT, end 03:01:35 CDT, about 2 h 35 min wall, including yields to other streams (run 2 crashed at load 126). **Cost:** $0 external: no paid APIs, no AI generation, Apify not used ($0); local compute only.
