# Critic BEFORE baseline — production frenday.xyz, Thu 2026-09-24 22:00–22:30 ICT (C10)

The honest "before" of the live site, shot while nine agents redesign the dev copy. Judged as a visitor (five-second tests, persona walks, generic-tell audit, trust audit), not as the designer. Extends, does not repeat, `QA-CUSTOMER-FUNNEL-2026-09-17.md` and `QA-SELLER-FUNNEL-2026-09-17.md`. Method from `CRITIC-BRIEF.md`, adapted to the live site. No message was sent to Kathy; the chat surface was judged visually and from its static copy. Production was read, never written. Time box cut to 22:30 by the integrator mid-run, so the persona walks are counted from the screenshots and the rendered copy rather than tapped through one by one.

## Screenshot index

Root: `/private/tmp/claude-501/-Users-james-3-nodejs-ai-new-business/02670483-a472-4ef6-aecf-74044a847b6e/scratchpad/wave1/c10/`

- Sweep 1 (22:02, five shots in parallel): `<page>-<width>-<lang>.png` + `chunks/<page>-<width>-<lang>-N.png` (900-px slices). **All but `home-390-th` came back as the bare Next.js 404 page** (390×900, black, "404 | This page could not be found") — see finding E1. `browse2-390-th.png` / `browse2-390-nolang.png` (22:06, sequential) rendered normally at 7,904 px.
- Sweep 2 (22:07–22:15, sequential, one load at a time): `r2/<page>-<width>-<lang>.png` + `r2/chunks/<page>-<width>-<lang>-N.png` (900-px slices). Pages: home, sell, pro, browse, story, mint (`/c/mint`), kit (`/c/mint/kit`), ploy (`/p/ploy`), signin, signup, policy; widths 390 / 820 / 1440; `?lang=th` and `?lang=en`. All 65 remaining shots landed (66 with sweep 1's `home-390-th`), zero failures; every sequential load rendered the real page (heights 918–8,729 px; `/`, `/sign-in`, `/sign-up` genuinely fit in 900).
- `/browse` at 1440 (`r2/chunks/browse-1440-th-0.png`) is the strongest desktop screen on the site: chip row, the companion's name in their colour at 200 px, hook, verbs, full-height photo. `/` at 1440 is the weakest (ranked #5).
- Rendered copy of every page/lang as text: `text/<page>-<lang>.txt` (from the served HTML, so it also covers what a crawler and a link preview see).

All shots were taken at the real clock (Thu 22:00–22:20), so every page is in its night state.

## Five-second tests (390, first 844 px)

| Page | What a stranger believes in 5 s | Who / when / price / tap visible? | Score 0–5 |
|---|---|---|---|
| `/` th+en (`chunks/home-390-th-0`, `r2/chunks/home-390-en-0`) | A time picker. "ว่างเมื่อไหร่ / When are you free?", a day strip, a huge 22:00, a sun slider — and the first sentence under it is "ชั่วโมงนี้ยังไม่มีใครว่างค่ะ / Nobody is free at this hour." No face, no person, no price, no Kathy in the fold. The one-line tagline ("เพื่อนเที่ยวคิดเป็นรายชั่วโมง ทุกวัน หกโมงเช้าถึงเที่ยงคืน") is 13-px grey. | who: no · when: yes (the wrong answer: nobody) · price: no · tap: "พลอย 10:00–20:00" links, if you scroll | **2** |
| `/browse` th (`chunks/browse2-390-th-0`) | A person. Full-bleed poster: "เต้", his line "วิ่งเป็นเพื่อน เพซของคุณ ไม่ใช่ของผม", four verbs, a real-looking AI photo with the "ตัวละครสมมติ · ภาพสร้างด้วยเอไอ" stamp, a chip row of activities. Reads like a product. | who: yes · when: below the photo · price: below the photo · tap: "เปิดหน้าเต้ →" below | **4** |
| `/sell` th (`r2/chunks/sell-390-th-0`) | "หน้าเดียว ลิงก์เดียว ของคุณเอง" then the promise (free, three minutes, your phone, nothing taken) and Mint's card as the example. Clear who it is for ("สำหรับคนที่รับงานเอง"). | who: yes · price: free/฿499 further down · tap: "เปิดการ์ดของมินต์ →" is the first button; "ทำการ์ด" is ~1,600 px down | **4** |
| `/pro` th (`r2/chunks/pro-390-th-0`) | ฿499 once, 12 months, no auto-renew, two buttons, then "แถวที่เขียนไว้ตรง ๆ ว่าซื้อมา". Honest to the point of dry. | who: n/a · price: yes, huge · tap: yes, two | **4** |
| `/story` en (`r2/chunks/story-390-en-0`, `-1`) | ~250 px of empty cream before a Thai brand lockup ("เฟรนเดย์") on the English page, flag icons for the language toggle (a UK flag on an American-English site; the rest of the site says "ไทย / EN"), then "Frenday. A friend-date you deserve." and a paragraph of pitch-deck English ("Our trusted system offers automation, visibility boost, and scam elimination in one package"). A mentor knows in 5 s that this is a founder's explainer, not a product page. | who: no person in the fold · price: far down · tap: "Open the directory" at the very end | **2** |
| `/c/mint` th (`text/mint-th.txt`; r2 shot) | Photo, name, her line, verbs, "฿500/ชม. ขั้นต่ำ 2 ชม.", areas, one 58-px "แอด LINE เพื่อจอง" button. The strongest fold on the site (unchanged since S5). | all four: yes | **5** |
| `/p/ploy` th (`r2/chunks/ploy-390-th-0`) | Name in her plum, the two-line hook, four verbs, the photo with the stamp, then the truth line. Price ("฿600/ชม.") and the two buttons ("ขอนัดพลอย" / "ถามแคธีเรื่องพลอย") sit just under the 844-px fold at 390. | who: yes · when: below fold · price: below fold · tap: below fold | **4** |
| `/c/mint/kit` (`r2/chunks/kit-390-th-0`) | "ชุดรูปของมินต์", day/night toggle, then the clips row first and two blank teal tiles at +2.2 s (the served HTML says "Rendering the image… / Not rendered yet" for every tile). A visitor on a slow phone sees a page of placeholders with Download buttons under them. | tap: "Save" per tile | **3** (depends on render latency) |
| `/sign-in`, `/sign-up` (`r2/chunks/signin-390-th-0`) | "การ์ดของฉัน — เข้าสู่ระบบเพื่อดูและแก้การ์ดของคุณ" and a Clerk card in the site's cream. Functional; the only foreign element is "Secured by Clerk" in English on the Thai page, and sign-in asks only for email (good). | — | 3 |
| `/policy` (`text/policy-*.txt`) | "Read before you meet — Safety and house rules — a three-minute read." Then the best paragraph on the site: "not a dating app, not a girlfriend experience… If that's what you're looking for, it isn't here." | — | 4 |

## Persona walkthroughs

**1 · Ploy's TikTok follower, Thai, 22:30 Thursday → `/p/ploy`.** Lands on the poster: "พลอย", the hook, photo, "ว่างพรุ่งนี้ 10:00–20:00", "฿600/ชม.", "ขอนัดพลอย" / "ถามแคธีเรื่องพลอย". Taps: 1 (ขอนัดพลอย) → the request sheet opens with Kathy's opener (2 = type the day/time, 3 = send). Three taps to a filed request, which is right. Doubts: (a) she is told the picture is AI-made and the person fictional — fine for a demo, fatal for a TikTok link that was supposed to be Ploy's; (b) at 22:30 nothing says "Kathy answers now, Ploy answers in the morning"; (c) "600baht an hour" on /story vs "฿600/ชม." here is not her page's problem but it is if she came via the explainer.

**2 · Japanese newcomer, English, Saturday 10:00 → `/`.** Reads "Company by the hour, every day, 06:00 to midnight" in small grey, then a giant "When are you free?" and a clock. With the real clock at 22:00 the first answer is "Nobody is free at this hour. Slide the sun to another one." — a Saturday-morning visitor would see names at least, but no face and no price until the "Everyone" link ~1,000 px down. Taps: 1 (See everyone) → 2 (Open Tae's page) → 3 (Send a request) → 4–5 (type, send). Five taps and one dead fold. Doubt: "Company by the hour" is exactly the phrase an escort site uses in English; nothing in the fold contradicts it (the contradiction, "A friend, not a date", is in the footer).

**3 · Would-be Companion referred by a friend → `/sell`.** The door is clear from the header nav? No — the header carries only the brand, the clock and the language toggle; the door is the footer line "อยากมีหน้าแบบนี้เป็นของตัวเอง". On `/sell` itself: promise → Mint example → three steps → price → safety → "ทำการ์ด →" (~1,600 px down at 390) → Clerk sign-up (with the username field S6 already flagged) → editor. Taps to a published card: roughly 1 (ทำการ์ด) + 2 (sign-up) + ~9 (editor asks) = 12. Doubts: (a) `/sell` says the customer "messages you directly, no one in between" while `/story` says the customer asks Kathy and Kathy sends the request — two products described as one; (b) the pitch is "no fee is taken from a meetup" but nothing says how many Customers exist (honest, but a Companion will ask); (c) the giant cropped "ม" behind Mint's example reads as a rendering glitch, not a design.

**4 · Startup mentor, English only, laptop → `/story`.** The first laptop screen (`r2/chunks/story-1440-en-0.png`) is 270 px of empty cream, a small Thai lockup, "Frenday. A friend-date you deserve." in a slab display face and one grey line; no picture, no product, no person, and "The trade exists." starts at the bottom edge. Then reads: "A friend-date you deserve" (a slogan), "The trade exists. The trust does not." (good), then "Like-minded people offer their time as a companion in buzzing Bangkok through social posts, comments, and DM - an untrusted, time-consuming, manual process. Our trusted system offers automation, visibility boost, and scam elimination in one package." — this paragraph fails the a16z bar in one screen: a hyphen doing an em dash's job, "automation, visibility boost, and scam elimination in one package" is template SaaS. Then a grammar slip in the key sentence: "Kathy can read and answer, but don't accept requests on your behalf." Then "Kathy, our AI language model". Then a roadmap that undercuts the trust thesis: "Not in ฿499 yet but coming soon: signal-based ranking, and boosts that lift who gets seen · dynamic pricing, and surge pricing when demand spikes · market intelligence on what customers will pay · an identity check, and a criminal background check" — `/pro` on the same site says "No boost inside the normal order" and "we verify no one". A mentor will ask which one is true. "Live in Bangkok since September 2026." with "Email today. LINE, X and phone next." and a "G / f" pair of orphan letters (social icons that did not render as icons in the served text) close it. Taps to the product: one, at the very bottom ("Open the directory").

**5 · Thai parent on `/browse`: "is this an escort site?"** The poster grammar answers well: everyday verbs (ไปวิ่ง · ไปเข้ายิม · ไปปั่นจักรยาน · ไปกินข้าว), a man in a park with a towel, "ป้านก" taking you to the flower market, the fictional stamp on every photo, and the footer "เพื่อน ไม่ใช่แฟน · ที่สาธารณะ". What does not help: the page title is just "ทุกคน — เฟรนเดย์" (no framing), the chip row starts with "คาเฟ่ฮอปปิ้ง" and "เพื่อนกินข้าว", the hero shows no rule (hours, public places, 20+) until the footer, and the English word for the product in `<meta description>` is "Company by the hour". The answer is "no", but the page makes the parent scroll to find it.

## Generic-tell audit and the one thing no template has

| Page | Tells | The one thing no template has |
|---|---|---|
| `/` | Centered giant clock + slider is not a tell, but the empty state ("nobody is free") is a dashboard's, not a shop's; footer with link rows | The sun slider that lists who is free at the hour you drag to |
| `/browse` | Chip row (chip soup: 15 chips) | Full-bleed one-person-per-screen posters in each companion's own colour, with the truth stamp burned into the photo |
| `/sell` | Three steps, Price section, Safety section, "Want a page like this" CTA: the classic landing-page ladder | Showing a real rendered card as the example instead of describing one |
| `/pro` | Numbered "how to pay" steps; "What Pro does not do" list | "shown rather than claimed": the actual paid row and the actual kit images rendered by the real system |
| `/story` | Slogan hero, icon-row three steps (document / speech bubble / people icons, `r2/chunks/story-390-en-1`), "X can / X cannot" two columns, Free/Pro two columns, "coming soon" roadmap, orphaned social letters, flag toggle | The live Ploy card and Kathy widget embedded mid-explainer |
| `/c/mint` | None | A card that is one screen, one button, one truth line |
| `/p/ploy` | Weekly hours grid is close to a booking widget | The hook line as a two-line poem and "Ploy's own rules" in first person |
| `/kit` | Gallery grid with Save buttons | Captions written per platform in the companion's voice |
| `/policy` | Long-form legal page | "we speak with them ourselves… We do not collect ID cards" — a policy that admits what it does not do |

## Trust audit (facts as rendered on production tonight)

- **AI-made picture label:** present and in the right language on `/browse`, `/p/ploy`, `/` ("ตัวละครสมมติ · ภาพสร้างด้วยเอไอ" / "Fictional character · AI-made picture"), on `/c/mint` ("โปรไฟล์ตัวอย่าง ตัวละครสมมติ" / "Sample profile, a fictional character" — says fictional, does not say AI-made), on `/story` ("Ploy is fictional; the picture is AI-made"), on `/pro` ("Mint is a demo card — a fictional person"), on `/sell` ("An example from the demo; Mint is fictional"). Gap: the card and kit label the person as fictional but not the picture as AI-made; the kit's own Band/Plate/Split images carry Mint's photo into a downloadable poster with no label in the caption text.
- **Service name:** "Frenday / เฟรนเดย์" everywhere in titles and headers. No "Paiduay" in any served copy. The old brand survives only in the hashtag set? No — hashtags are #FriendForHire #RentAFriend. Clean.
- **British spellings (EN):** "favours" (`/browse`, `/p/ploy`, `/story` — Ploy's hook line, from `providers.ts`), "labelled" (`/sell` body, `/pro` meta description). Everything else American.
- **"Daytime":** `/c/mint` EN bio "Daytime, public places" and TH "นัดกันช่วงกลางวัน"; `/c/mint/kit` toggle label "กลางวัน / Day" (that one is the day/night render toggle, acceptable). The Mint bio is a demo string exempt from the test, but it is public and contradicts the hours line two rows above it on the same card.
- **she/her for users:** none found in any EN page. Thai: no เธอ found.
- **Em dashes on `/story`:** one, in Ploy's hook line ("Cafe crawls, photos, malls — no favours to call in") which `/story` embeds. The body text uses a hyphen-as-dash instead ("and DM - an untrusted…"), which is worse.
- **Mixed-language lines:** none found on a Thai page except brand names (LINE, Instagram, TikTok, EN toggle). "LINE ID mint.bkk" is fine.
- **Hours:** `/` "06:00 to midnight"; `/browse`, `/p/ploy`, `/c/mint` footer "06:00 to midnight"; `/policy` "06:00 to 24:00" and "06:00–24:00"; kit X caption "06:00–24:00"; `/story` "06:00 to midnight"; Mint's bio "Daytime". Auntie Nok's hook on `/browse` and `/`: "Auntie takes you to the market. **05:30** at Pak Khlong." — thirty minutes before the platform opens, on the directory's second poster.
- **Booking vs request:** `/p/ploy`, `/story`, `/sell`, `/policy` say request; `/c/mint` and every card tile on `/browse` say "แอด LINE เพื่อจอง / Add on LINE to book"; the kit's X caption says "I take friend-for-hire bookings."
- **Grammar:** `/story` "Kathy can read and answer, but don't accept requests on your behalf." (should be "doesn't"). "Cafe" vs "café" is consistent (no accent) — fine.

## Cross-page consistency table

| Fact | `/` | `/browse` | `/sell` | `/pro` | `/story` | `/c/mint` (card) | `/c/mint/kit` | `/p/ploy` (page) | `/policy` | Conflict? |
|---|---|---|---|---|---|---|---|---|---|---|
| Price of Pro | — | — | "฿499 once, good for 12 months" | "฿499 once, good for 12 months" | "Pro is ฿499, once" / "once, for twelve months" | — | — | — | — | consistent |
| What ฿499 buys | — | — | Pro row on the everyone page, every kit template, the clips | Pro row, Plate/Split/night versions, three clips; explicitly **no boost, no badge, not verified** | Every kit template incl. night, **one handle change**, a labeled paid row; **coming soon: ranking signals, boosts, surge pricing, market intelligence, ID + criminal checks** | — | — | — | — | **YES**: handle change only on /story; /story roadmap (boosts, verification) contradicts /pro's promises; clips missing from /story |
| Hours | 06:00 to midnight | 06:00 to midnight (footer); Auntie Nok "05:30" | 06:00 to midnight | — | 06:00 to midnight | 06:00 to midnight (trust line) but bio "Daytime / กลางวัน" | 06:00–24:00 | 06:00 to midnight; Ploy's own 10:00–20:00 | 06:00 to 24:00 / 06:00–24:00 | **minor**: three spellings of the same window; one 05:30; one "Daytime" |
| Agent name | not mentioned | not mentioned | not mentioned | not mentioned | Kathy ×15 / แคธี ×22 | not mentioned | not mentioned | Kathy / แคธี | Kathy / แคธี | **gap**: the customer meets Kathy only on `/p/*`, `/story`, `/policy`; the home page and directory never introduce the agent |
| Support email | — | — | — | — | hello@frenday.xyz | (report link) | — | (report link) | hello@frenday.xyz | consistent where present |
| Request vs booking | — | tiles: "Add on LINE to **book**" | "Every meetup is a request; you confirm or decline" | — | "A meetup is a request" | "Add on LINE to **book**" | X caption: "**bookings**" | "Send Ploy a request" | "request" | **YES**: the card product says book, the page product says request |
| Card vs page naming | "หน้าของเขา" (page); footer "ทุกคน · การ์ด" | "Open Tae's **page**"; cards section "การ์ด" | "A **card** is one **page**" | "the everyone page" | "Profile Card"; "One page"; "Open the **directory**" | "Want a **page** like this of your own" (on a card) | "kit" | "page" | — | **YES**: card / page / profile / directory / everyone used interchangeably |
| Who answers the customer | tap a name | open page | "customer messages you directly, no one in between" | — | "A customer asks Kathy… Kathy sends the request" | LINE, direct | LINE | Kathy + request sheet | "Every companion screens every request personally" | **YES**: two funnels (LINE-direct card vs Kathy-mediated page) presented as one product |
| Price grammar | "10:00–20:00" hours only | ฿600/hour | ฿500/hour, 2‑hour minimum | ฿499 | "600baht an hour" | ฿500/ชม. ขั้นต่ำ 2 ชม. | ฿500/hour, 2‑hour minimum | ฿600/hour + "600baht an hour" | — | **minor**: "600baht an hour" (no space, no ฿) on /story and /p |
| Fictional label | "Every profile in this demo is fictional" | on every photo | "Mint is fictional" | "a fictional person" | "Ploy is fictional; the picture is AI-made" | "a fictional character" (photo not called AI-made) | "fictional" once | on the photo | "fictional" once | mostly consistent; card omits "AI-made" |

## Ranked: the 10 changes that would most raise a prospect's confidence

Engineering items (E) and James's-own-call items (J) are marked; the list is in order of impact.

1. **(E) Production served the bare Next.js 404 page to a burst of concurrent page loads.** At 22:02 five headless loads in parallel got "404 | This page could not be found" (black, unbranded) for `/`, `/browse`, `/sell`, `/pro`, `/story`, `/c/mint`, `/c/mint/kit`, `/p/ploy`, `/sign-in`, `/sign-up`, `/policy` — 65 of 66 shots (`chunks/*-0.png`, all 390×900). The same URLs one at a time rendered fine at 22:06–22:20 (`browse2-*.png`, `r2/*`). Either a rate limit answers with `notFound()` instead of 429, or something in the request path (a middleware, Caddy, Clerk) trips under concurrency. A mentor's laptop plus a phone opening two tabs is enough to hit this. Fix: find what returns 404 under burst, return 429 with a branded page, and add a branded `not-found.tsx` regardless. Evidence: `chunks/story-390-en-0.png`, `chunks/browse-390-th-0.png`, `shoot.log`.
2. **(J) `/story`'s second paragraph is the a16z-bar failure.** "Our trusted system offers automation, visibility boost, and scam elimination in one package" plus "DM - an untrusted, time-consuming, manual process". Fix: replace with one concrete sentence about what happens today on TikTok/X (a Companion posting a price in a comment and screening strangers in DMs) and what Frenday changes (one card, Kathy screens, the Companion says yes). Evidence: `text/story-en.txt` lines 5–6; `r2/story-390-en-0.png`.
3. **(J) The roadmap on `/story` contradicts `/pro`.** /pro: "No boost inside the normal order", "Does not mean verified — we verify no one". /story "coming soon": boosts, surge pricing, "market intelligence on what customers will pay", identity + criminal background checks. Surge pricing on a friend-date and "market intelligence" are the words a trust product should never use. Fix: cut the roadmap list to the two items that strengthen the thesis (identity check; LINE notifications) or move it to a mentor-only doc. Evidence: `text/story-en.txt` "Not in ฿499 yet but coming soon"; `text/pro-en.txt` "What Pro does not do".
4. **(E+J) Two funnels described as one product.** `/sell`: "A customer opens it and messages you directly, no one in between." `/story`: "A customer asks Kathy… Kathy sends the customer's request to the companion." The card (`/c/*`) is LINE-direct; the page (`/p/*`) is Kathy-mediated. A prospect asked to "make a card" on `/sell` and then shown Kathy on `/story` cannot tell which one they are buying. Fix: one sentence on `/sell` and `/story` naming both doors ("Your card carries your LINE; Kathy answers on your page"), or retire one wording. Evidence: `text/sell-en.txt` line 8, `text/story-en.txt` lines 8–10.
5. **(E) The home fold at night is an empty state, and at 1440 the whole home page is one.** At 22:00 (the audience's hour) the first sentence after the giant clock is "Nobody is free at this hour. Slide the sun to another one." No face, no price, no Kathy. On a laptop (`r2/home-1440-th.png`, the entire page fits in 900 px) the site's front door is a clock, an empty-state sentence, seven underlined names and a footer: a mentor who types frenday.xyz sees no product. Fix: when nobody is free now, lead with "free tomorrow morning" posters (the `/browse` poster grammar already exists), or move the day strip's default to the next open hour. Evidence: `chunks/home-390-th-0.png`, `r2/chunks/home-390-en-0.png`.
6. **(E) "Book" on the card, "request" everywhere else.** Card button "แอด LINE เพื่อจอง / Add on LINE to book", browse tiles the same, kit caption "friend-for-hire bookings". The doctrine (a booking is a request the Companion confirms) is the site's trust thesis and the card breaks it at the money button. Fix: "แอด LINE เพื่อขอนัด / Add on LINE to ask" (copy keys in `components/card/*`, kit captions). Evidence: `text/mint-en.txt` line 11, `text/browse-en.txt` lines 83/88, `text/kit-en.txt` line 68.
7. **(E) Four small editorial-rule breaks visible to an English reader.** "favours" (browse, ploy, story), "labelled" (sell, pro meta), "Daytime, public places" and "นัดกันช่วงกลางวัน" on Mint's card, "Kathy … but don't accept requests" grammar, "600baht an hour" formatting, Auntie Nok's "05:30" before opening hours. Each is one string. Evidence: `text/*-en.txt` grep in this report's trust audit.
8. **(E) The kit ships as placeholders.** Every tile in the served HTML says "Rendering the image… Not rendered yet"; on a phone the gallery is a wall of "Save" buttons over grey until renders arrive (the 390 shot in `r2/chunks/kit-390-th-*` shows the state at +2.2 s). Fix: pre-render Band for demo cards at build/publish time and ship the PNG in the HTML; keep lazy render for Plate/Split. Evidence: `text/kit-en.txt`.
9. **(J) Kathy is invisible until the request sheet.** Home and `/browse` never say an AI agent will answer; the parent persona and the Japanese newcomer meet Kathy only if they open a page. Fix: one line in the home fold ("แคธีตอบแทนทุกคนตอนนี้ เขาตอบเองตอนเช้า") — James's wording. Evidence: `text/home-*.txt` (no Kathy), `text/browse-*.txt` (no Kathy).
10. **(J) Card / page / profile / directory / everyone.** Five nouns for two things across nine pages ("Open the directory", "the everyone page", "See everyone", "Profile Card", "a card is one page", "Want a page like this" on a card). Fix: pick "card" for `/c/*`, "page" for `/p/*`, "everyone" for `/browse`, and let `/story` use the same three. Evidence: consistency table row "Card vs page naming".

Also seen, lower: `/story` opens with ~250 px of blank cream and a Thai lockup on the English page (`r2/chunks/story-390-en-0.png`); the kit's clips row still sits first on a demo card, showing blank tiles at +2 s (`r2/chunks/kit-390-th-0.png`); "Secured by Clerk" is the one English line on the Thai sign-in; the giant cropped "ม" monogram behind Mint's example on `/sell` reads as a glitch at 390 (`r2/chunks/sell-390-th-0.png`); the orphan "G" / "f" letters on `/story` where social icons should be (`text/story-en.txt`); `/pro` bullet still wraps after "โปร ·" (S6 #6, unchanged); `/story` "Live in Bangkok since September 2026" is true but reads as a placeholder date.

## What already works — keep it

- `/browse`'s poster grammar: one person per screen, their colour, their line, their verbs, the fictional stamp burned into the photo. This is the one screen a template could not have produced, and since S5 every poster has a photo.
- The card (`/c/mint`): one fold, one button, the trust line under the LINE id ("No deposit, ever. Pay at the end · Public places, 06:00 to midnight"). Do not add anything above the button.
- `/pro`'s honesty: "shown rather than claimed", the rendered paid row and kit, "What Pro does not do", no countdown, "A read is not an approval; a person decides."
- `/policy`'s first paragraph and the "we speak with them ourselves… We do not collect ID cards" candour; "Nobody can give you a discount except the companion themselves. Kathy cannot."
- `/p/ploy`: "Ploy's own rules" in first person, "Kathy will say up front if your plan runs into one of these", "Free tomorrow 10:00–20:00" as the first fact.
- The header clock and language toggle in the same corner on every page; the fictional label in the right language everywhere a photo appears.
- `/story`'s three good lines: "The trade exists. The trust does not.", "Kathy answers only from Ploy's profile", "The customer pays the companion in person at the end of the meetup; Frenday takes nothing from it."
