# Quick status for James — what you have, what you can do now, what waits on you

Undated filename on purpose: this file is revised as we go. Each revision stamps the block below and I tell you in chat when I update it.

**Last updated: 25 Sept 2026, 04:20 (ICT)** by Claude Opus 5.5: **wave 3c DEPLOYED 03:59 (commit d1ba297).** An independent critic now scores production at **about 80% of the design bar** (was about 60% after 3b; you had said 30% of last night's mockups): six text sizes site-wide, one header position, one sun per screen, captions under photos, one day band everywhere, /story tightened, /pro 35% shorter on a phone. Report: `apps/paiduay/docs/design/CRITIC-WAVE3-2026-09-25.md`. Wave 3d (small polish) is running. **What separates 80% from ~95% is mostly yours (see "Your calls, 25 Sept" in §3):** the /story sentences, the AI caption wording, the kit hashtags. Previous stamp: **25 Sept 2026, 02:45 (ICT)** by Claude Opus 5.5: **wave 3b DEPLOYED 02:38 (commit 074a85d)**: seven pages brought to the art-direction bar (/browse, /pro now 0.12 MB of kit images instead of 6.4 MB, /sell, a quiet "ไทย / EN" header aligned on every page, /story visuals with Ploy in the first screen on a laptop, /p with price and buttons in the phone fold, /c in all layouts, the kit gallery, /me and the editor). An independent critic is scoring production against the bar now; I fix what it finds before calling it done. Previous stamp: **25 Sept 2026, 01:15 (ICT)** by Claude Opus 5.5 after wave 3 (spec §9.72). **DEPLOYED 01:01, commit dece342.** NEW: the **builder, phase 1**: in the card editor, a "หน้าตา / Look" sheet (layout, 8 colors, background paper/tint/deep, block order and hide, photo move and zoom). Free users can try it and save it; their public card stays classic until Pro. Try the demo: `https://frenday.xyz/c/mint?template=poster&ground=deep`. A named quality bar (Monocle city guides, a departures board, Airbnb Experiences host pages) in `apps/paiduay/docs/design/ART-DIRECTION-2026-09-25.md`; **home rebuilt to it**; share images follow the card's layout; AI label printed on the demo kit images. Running now (wave 3b): seven page agents on /browse, /pro (also its slow load), /sell + the header, /story visuals, /p + /c, the kit gallery, /me + the editor; then a critic scores everything against the bar before you see it. New for you (small): screen name "Frink" for the Look sheet; "วันหยุด / Day off" label on home (DRAFT). Previous stamp: **24 Sept 2026, 23:35 (ICT)** by Claude Opus 5.5 after wave 2 and the Pro templates (spec §9.71). **DEPLOYED 23:29, commit 67da52c, deploy took 3m42s (was 7m+).** Production Kathy grounding reseeded clean (was still "ไปด้วย" + owner@paiduay.local); live check: Kathy gives hello@frenday.xyz. Next prompt pass: opener skipped on a safety question, she does not correct "Paiduay" when a customer says it, Thai นัดได้ slip. NEW tonight: **Pro card layouts** (Classic free; Poster, Editorial, Business card for Pro, 8 accents, price-or-hours first; try `https://frenday.xyz/c/mint?template=poster`), **Pro kit templates** (Quote, Ticket, Poster + accent, headline, photo on/off, caption), kit images cached (no more "Not rendered yet"), Kathy prompt v3, home shows who is free next at night, one noun per thing outside /story, accessibility and speed fixes, your hidden **pitch kit at /pitch**, and three documents for you: `apps/paiduay/docs/design/STORY-COPY-PROPOSALS-2026-09-24.md` (fixes a real Thai error, "ของกลาง"), `WYSIWYG-RESEARCH-2026-09-24.md` (about.me-style editor: build a small one, about 3 days), `CRITIC-AFTER-2026-09-24.md`. Waiting on you: DRAFT copy lines (home Kathy line, two doors, Pro layout and kit copy), cast names Carl / Burns / Flanders / Lisa, the seven WYSIWYG decisions, the story proposals. Previous stamp: **24 Sept 2026, 22:50 (ICT)** by Claude Fable 5.1, after design wave 1 (ten parallel agents, spec §9.70, tracker P28 to P43). Changes since 20 Sept 00:20: all six of your §6 wishes moved (see §6 for what is done and what is partial); /browse is a timetable; /story uses a desktop; /sell and /pro show the real card and the complete ฿499 list; the card plate prints its AI label; onboarding walls and a /me dashboard; a deploy pipeline whose first real test is tonight's deploy; a design brief with two unapplied mockups and a critic's before-report of production. New items for you in §3 (mockups, four copy calls, three deploy calls). **Prior stamp: 20 Sept 2026, 00:20 (ICT)** — by Claude Fable 5.1. Changes since 18 Sept 15:00: (1) Anthropic topped up, receptionist chat live on Haiku 4.5; (2) **Clerk moved to your new account and to a PRODUCTION instance on frenday.xyz** — seller sign-in on the site now runs on `pk_live`, no more "Development mode" badge, username no longer asked at sign-up; (3) telemetry opt-outs (Clerk CLI, Next.js, Turborepo) done locally and in the Docker build; (4) 16:10 Clerk webhook secret set — account deletion now erases cards; (9) 00:20 two Kathy fixes from the live spot-check deployed (request opener in the customer's language; the model now knows today's Bangkok date and weekday) and **§6 below records what you want next session**; (8) 23:45 **round 4 deployed**: your 20 items (hyphens only, italic Kathy in two headlines, asterisked footnote, request-button tile removed since the chat is real, hero rebuilt with your text, "free forever", present tense, third-place line, American English, midnight wording, hello@frenday.xyz on the last screen and on /policy) plus Kathy's prompt now pins the service name to Frenday (a live reply had said "Paiduay"; both tenant rows renamed too); (7) 22:30 round 3 deployed: your text on every `/story` screen, singular they + Customer/Companion site-wide (including Kathy's own prompt), hours 06:00–24:00 in copy, policy, prompt and the request-time validation, "daytime" gone from the whole site (new home tagline below), the agent is named Kathy on the companion pages too, X and phone glyphs in the sign-in row, and **the story page's chat is real** (Ploy, same guards as her page); (6) 21:10 `/story` round 2 deployed: normal flowing layout (no forced screen heights, so no "snap" voids or cut-off screens), the card screen redrawn from Ploy's companion page (photo, activities, rate, hours, Kathy's ask box, the request button), money and today screens recomposed; (5) 19:40 `/story` review round 1 + mentor audit deployed (your 15 items: Kathy named, no snap, no numbered labels, no lines, card-as-product screen, money/today/reach rewritten; one product inconsistency on the card screen waits on you, see §3); earlier 17:30 `/story` first went live — the 30-second explainer for your mentor and other outsiders, English by default; `/our-story` exists but is hidden until you replace the Homer Simpson placeholder.

## 0. Ad hoc note for the next session — where the words of `/story` live (James wants to refine them himself)

- **All text of `/story` and `/our-story` is in ONE file: `apps/paiduay/content/story.ts`.** Every screen is an object in `STORY_SCREENS` (ids `name`, `problem`, `how`, `trust`, `card`, `money`, `now`, `reach`), each with `headline`, optional `body`, optional `points[]`, optional `link.label`, each a `{ th, en }` pair. `FOUNDER_SCREEN` is the Homer Simpson placeholder for `/our-story`. `STORY_META` holds the browser-tab titles and share descriptions. `HOW_BUILT` is the three plain sentences under the founder screen on `/our-story` only.
- **The agent's name is one constant for the whole site:** `apps/paiduay/content/agent.ts` (`AGENT_NAME`); `story.ts` re-exports it as `KATHY` and strings contain `{kathy}`. Change the constant, the story page, the companion pages and Kathy's prompt all follow.
- **Permanent copy rules** (they/them; Customer/ลูกค้า vs Companion/เพื่อนเที่ยว; hours 06:00–24:00; no "daytime"; American English; support email hello@frenday.xyz in `content/contact.ts`): `apps/paiduay/docs/EDITORIAL-RULES.md`, enforced by `apps/paiduay/content/editorial-rules.test.ts` over every public copy object and the prompt.
- **The home tagline was rewritten by an agent** to fit the new hours: EN "Company by the hour, every day, 06:00 to midnight" / TH "เพื่อนเที่ยวคิดเป็นรายชั่วโมง ทุกวัน หกโมงเช้าถึงเที่ยงคืน" (`content/copy.ts` → `v3.home.tagline`). Yours to refine.
- **A few small UI words** (the flag labels, "Ploy is fictional; the picture is AI-made", "Questions:", the fold's label) are in `apps/paiduay/components/story/copy.ts`. Italics: write `*{kathy}*` in a headline to italicize the name; a lone `*` is just an asterisk.
- **Rules the tests enforce** (`apps/paiduay/content/story.test.ts`): Thai strings carry no Latin letters (write เฟรนเดย์, พร้อมเพย์, ไลน์, เอไอ); English strings carry no Thai; headlines ≤ 9 English words; no numbered eyebrows; no "receptionist"/"ผู้ช่วย"; no sentence starting with a bare "She"; no payment method named; no "verified", counts, or urgency words. After editing, run `pnpm --filter paiduay exec vitest run content/story.test.ts` — if a rule genuinely should change, edit the test with the same intent.
- **To see it:** `pnpm --filter paiduay dev` then `http://localhost:3400/story?lang=en` and `?lang=th`. To ship: commit, `git push vps main`, then on the VPS `cd ~/apps/ai-new-business/repo && git pull && cd deploy && cp ~/apps/ai-new-business/.env .env && docker compose build paiduay && docker compose up -d paiduay` (ssh may drop during the build; the work completes).
- Screenshots of every screen in both languages: `apps/paiduay/docs/screenshots/story/`.

## 1. What is live right now

| Thing | Where | State |
|---|---|---|
| The product, renamed **เฟรนเดย์ / Frenday** | https://frenday.xyz | Live, HTTPS, rebranded (copy, wordmark, share images, kit, poster). Old host `paiduay.6326638.xyz` redirects. |
| Seller front door | https://frenday.xyz/sell | Live. This is the page you tweet. **24 Sept (in tonight's deploy):** "Make your card" on the first screen, the real card tile as the example, steps beside the price from 720px, 1120px wide on a desktop. |
| What ฿499 buys | https://frenday.xyz/pro | Live. **PromptPay id 0817272329 is live** — the QR and slip upload are on; a seller can pay from today. **24 Sept:** the head lists all four things ฿499 buys (every kit template incl. night, three clips, one link-name change, the labeled row on /browse), with the real /browse row and tile as proof. |
| Directory with the cards section | https://frenday.xyz/browse | Live. Eight fictional companions now have AI-made portraits, labelled "ตัวละครสมมติ · ภาพสร้างด้วย AI". **24 Sept:** a timetable: rows grouped by the day each Companion is next free, every row on the same 06 to 24 axis with the sun at now; who, when, price and where in the first screen; the page a third as tall. Cards still below the deck, one jump link away. |
| Demo card + kit + clips | https://frenday.xyz/c/mint, /c/mint/kit | Live. **24 Sept:** the card's plate prints "Fictional character · AI-made picture" like the pages do; from 720px the plate fills the fold; a companion page (/p/ploy) reads in two columns from 1024px; the chat sheet was hardened so a collapsing phone URL bar cannot push the header over the first bubble (structural fix; not reproduced on a device). |
| Operator pages | /admin/pro (slip pre-read), /admin/card, /admin/numbers, /admin/report | Live; login owner@paiduay.local (Better Auth). |
| Seller sign-in (Clerk, **production instance**) | /sign-in, /me, /c/new | Live on frenday.xyz since 19 Sept 15:50: new Clerk account, app "Frenday", production keys, Clerk hosts `clerk.` / `accounts.` / `clkmail.frenday.xyz` verified (DNS, SSL, mail). Email + password sign-up, no username, no Google. **Every earlier dev-instance seller account is gone** (only test users existed). **24 Sept:** the sign-in and sign-up walls say what Frenday is and the three steps that follow; /me is a dashboard with one next action per card and your Pro status; the editor counts "step n of N". The signed-in screens were NOT screenshotted tonight (a Clerk session could not be minted headlessly); reviewed from code only. |
| **The explainer for outsiders** | https://frenday.xyz/story | Live 19 Sept. Eight full-screen scrolls, ~30 s, no header/footer, flag toggle top-right. **English unless the phone prefers Thai** or the reader taps the Thai flag; `?lang=en` forces English. Send this to your mentor. **24 Sept:** uses a desktop's width: one left rail, the five visual screens beside their words from 1024px, the phone pixel-identical. |
| Hidden: explainer + founder screen | https://frenday.xyz/our-story | Live but unlisted (noindex, robots disallow, not in sitemap, "placeholder" chip). Screen 9 is written about **Homer Simpson** on purpose: edit `apps/paiduay/content/story.ts` → `FOUNDER_SCREEN`, put your facts in, set `placeholder: false`, redeploy. Nothing else changes. |
| Design brief + two mockups | `apps/paiduay/docs/design/DESIGN-SYSTEM-2026-09-24.md`, `mockups/direction-a.html`, `direction-b.html` | The brief is applied: tokens, hover/press/focus states, and the "sun marks now" signature (a sun disc beside the clock on every page). The two bolder directions (A: the hour as the page; B: the poster wall) are static HTML, NOT applied, yours to glance at. |
| Critic report of production, before the wave | `apps/paiduay/docs/design/CRITIC-BEFORE-2026-09-24.md` | Five-second scores, persona walks, a consistency table, ten ranked fixes; four addressed tonight, six are yours (§3). It also saw production answer five concurrent page loads with the bare Next 404 at 22:02; a curl reproduction did not trigger it, cause unknown (tracker P29). |
| Deploy pipeline | `deploy/push-and-deploy.sh`, `apps/paiduay/docs/DEPLOY-FAST.md` | New tonight: one command from the Mac, detached on the box, the log tailed to a verdict; install layer cached, type check skipped inside Docker (root typecheck gates every commit), standalone image behind a flag (off). The Docker build itself was NOT run before commit; tonight's deploy is the test, the second deploy is the one to time. |
| Factory sales page | https://6326638.xyz/factory.html | Live; contact placeholders are still yours to fill. |
| Kernel model | server env | `claude-haiku-4-5` (Anthropic), **chat confirmed live 18 Sept 15:00** after your $5 top-up. Daily cap on prod is 2M tokens (≈ ฿70–100/day worst case on Haiku). Gemini adapter exists; dev runs `gemini-3.5-flash-lite`; the Gemini key now accepts calls from your Mac (restriction set to none). |

## 2. What you can do today

- **Send the explainer.** `https://frenday.xyz/story?lang=en` (no tracking on this page, by your decision).
- **Post.** `docs/paiduay/launch/posts-2026-09.md` — 12 posts (TH first, EN), reply scripts, a 7-day calendar. Links already carry `?s=` source tags so `/admin/numbers` tells you which post worked.
- **Hand out the one-pager.** `docs/paiduay/launch/one-pager-th.png` / `-en.png` (story size) and `-a5-*.png` (print); QR verified to open `frenday.xyz/sell`.
- **Run the daily loop.** `docs/paiduay/launch/seller-messages.md` — what to send her by LINE at each moment, plus the 10-minute morning/evening checklist.
- **Approve a Pro slip.** `/admin/pro` shows what the slip says and flags; you decide. Once PromptPay is live, a seller can actually pay.
- **Compare models.** Dev is on Gemini flash-lite, prod on Haiku 4.5. The switch is two env lines + restart.
- **Regenerate demo portraits with any model.** `docs/paiduay/content/demo-photo-prompts.md` — one prompt per companion.

## 3. Waiting on you (with the default I'd take)

| Item | Why it matters | Minutes | Default if you say nothing |
|---|---|---|---|
| **Your calls, 25 Sept: /story sentences** | the critic's biggest remaining gap: "scam elimination in one package", "don't accept" (doesn't), "our AI language model", "600 baht an hour", "Dynamic pricing coming soon", the roadmap, "Your Profile Card", "Open the directory", straight apostrophes. Proposals: `apps/paiduay/docs/design/STORY-COPY-PROPOSALS-2026-09-24.md` | 15 | leave (your words) |
| **Your calls, 25 Sept: AI caption wording** | "Fictional character · AI-made picture" wraps to two lines under small faces; a shorter disclosure (e.g. "AI-made · fictional") would fit one line; and whether one label per faces band is enough | 2 | keep the words, wave 3d fits them on one line where possible |
| **Your calls, 25 Sept: kit hashtags** | #RentAFriend, #FriendForHire, #รับจ้างเป็นเพื่อนเที่ยว … in every kit caption read as hire-a-companion; suggested: #CafeBuddy #PhotoBuddy #FrendayBKK / #เพื่อนเที่ยว #หาเพื่อนเที่ยว #เฟรนเดย์ (costs some search reach) | 3 | keep |
| **Your calls, 25 Sept: small DRAFTs** | screen name "Frink" (Look sheet); "วันหยุด / Day off" on home; "Everyone with a card" on /browse; the Look editor as a fifth line on /pro while its head says "four things" | 3 | keep as drafted |
| **Anthropic API credit** | topped up 18 Sept (~$5). Chat is live again. When it runs out the receptionist says "try again" and slip pre-read stops; no full harness battery runs without your OK | — | done; top up again when `/admin/numbers` shows the balance is low, or say "move prod to Gemini" |
| **Gemini key allowlist** | you set the restriction to none on 18 Sept; the Mac can call Gemini directly now, no tunnel needed | — | done |
| **Haiku vs flash-lite** | **decided for you: prod stays on Haiku 4.5.** flash-lite on the Claude-tuned prompt restates hours and never files the request; Haiku answered correctly live. Gemini's monthly billing becomes worth it after the per-model tuning (WO-7) | — | Haiku; revisit when WO-7 is built |
| **`.co` vs `.app`** | `.xyz` is scam-associated in Thai police/media; `frenday.com` squatter expires 2026-11-23 (backorder it). Clerk production is now bound to `.xyz`; a later move costs ~20 minutes | 10 | `.co` |
| ~~Clerk production instance~~ | **done 19 Sept** on frenday.xyz (your call: not waiting for .co/.app). Moving the keeper domain later = one Clerk `change_domain` + five new DNS records + rebuild | — | done |
| ~~`CLERK_WEBHOOK_SIGNING_SECRET`~~ | **done 19 Sept 16:10** — endpoint answers 401 to unsigned posts (was 503) | — | done |
| **Tagline** | "ไปด้วยกันนะ" no longer puns on the name; `/story` uses "A friend, not a date" as the lead line | — | keep for now |
| ~~Card screen on `/story`~~ | **done 19 Sept 21:10** — now drawn from Ploy's companion page | — | done |
| ~~Kathy's name on the product itself~~ | **done 19 Sept 22:30** — one constant, site-wide | — | done |
| **Your screen 2 vs screen 6 on `/story`** | your sentence says the system "offers … visibility boost, and scam elimination" today; screen 6 lists boosting and identity/background checks under "not in ฿499 yet — coming". A sharp reader meets both on one scroll. Your words, so your call | 2 | leave |
| **`/story` money screen: "three clips"** | `/pro` and `/sell` now list all four things ฿499 buys (read from the code); your money screen lists three and omits the clips. Your words, not edited | 2 | add one line |
| **Thai polish on `/story`** | screen 2 Thai reads translated ("ในแพ็กเกจเดียว"); screen 1 has "ทั่วไป…ทั่ว" back to back; the chip `รับงานวัน{day}ไหม` (`copy.ts`) drops the qualifier เพื่อนเที่ยว and reads like an escort ad | 10 | you refine, per your plan |
| **Story chat header on a phone** | not reproduced in headless Chrome at 390 or 820 on 24 Sept; the chat sheet was hardened structurally anyway (header and composer fixed, the thread absorbs a collapsing URL bar) | 2 | look once on your Pixel after tonight's deploy |
| **American English site-wide** | applied to `/story` only so far; the rest of the site still has British spellings (labelled, favour, …) | 20 | sweep when you say so |
| **"midnight" vs "24:00" outside `/story`** | you have not decided for the rest of the site | — | leave 24:00 |
| **Kathy's reply quality on prod (Haiku)** | 3-message live spot-check on 19 Sept: name, they/them, hours refusal, facts, no-acceptance all passed; two failures fixed the same night (Thai opener to an English customer; no clock → wrong weekday). A proper adversarial eval is §6.1. 24 Sept: prompt v2 + a 6-message spot check on Haiku, 5 pass, 1 partial (Thai switch: one forbidden word, one nickname typo); the battery baseline is running | — | — |
| **"Card" vs "companion page"** | `/story` says "card" on screens 3, 6, 7 but the artefact it draws is a companion page; the self-serve card (`/c/`) and the companion page (`/p/`) are two products that have not converged | — | leave; your call when the products merge |
| **Your `/our-story` facts** | replace Homer Simpson with yourself when a competition or intro needs it (5 minutes of editing in `content/story.ts`) | 5 | stays hidden |
| ~~`PAIDUAY_SUPPORT_EMAIL`~~ | **done 19 Sept** — `hello@frenday.xyz` on both machines; /policy prints it | — | done |
| **Cards above the companion deck on /browse?** | 24 Sept: the deck is a third as tall and a jump link "See the cards" sits beside the heading; cards still below (spec §9.62 b) | — | leave |
| **AI-gateway work orders** (caching, grounding trim, routing, outage alerts, cost view, harness spend guard, per-model tuning) | approved by you, deferred; `docs/foundation/work-orders/ai-gateway-cost-and-resilience.md` | ~2 days Opus | say "build the gateway work orders" |
| **Design mockups A / B** | two bolder directions drawn as static pages, NOT applied: A "the hour as the page", B "the poster wall" (`apps/paiduay/docs/design/mockups/`). The refined identity shipped instead | 3 | stay with the refined identity |
| **`/story` screen 2 wording** | the critic's top copy finding: "automation, visibility boost, and scam elimination in one package" reads as template SaaS; "DM - an untrusted…" is a hyphen doing a dash's job; "but don't accept" should be "doesn't"; and the roadmap (boosts, surge pricing, market intelligence, background checks) contradicts `/pro`'s "no boost, we verify no one" | 10 | leave (your words) |
| **Two funnels as one product** | `/sell`: "messages you directly, no one in between"; `/story`: "Kathy sends the request". The card is LINE-direct, the page is Kathy-mediated; a prospect cannot tell which one they are buying. Same root as "book" on the card vs "request" everywhere else | 5 | one sentence on both pages naming both doors |
| **Kathy on the home fold** | home and /browse never say an AI agent answers; a visitor meets Kathy only on a companion page, /story or /policy. The critic suggests one line under the picker | 2 | your wording; nothing added until then |
| **Noun cleanup** | card / page / profile / directory / everyone for two things across nine pages; the new walls say "หน้า", the editor says "การ์ด" | 5 | card = /c, page = /p, everyone = /browse |
| **Off-VPS build** | GitHub Actions + GHCR, or your n8n VPS as the builder with a registry; which credentials may be created (P8's questions in `DEPLOY-FAST.md`) | 5 | wait; measure tonight's second deploy first |
| **Prune the builder cache** | 58 GB reclaimable on the box, shared with Luna/TuaTon/chatbot-engine builds; disk 78 % full | 1 | `docker builder prune --keep-storage 20G` on your word |
| **Flip standalone on** | smaller image, faster export; needs the throwaway-container test in `DEPLOY-FAST.md` and a `turbopackIgnore` in `lib/photo/store.ts` | 15 | off until tested |
| **Editor step counter** | "ข้อ n จาก N" added tonight against the editor's earlier "no step counter" decision; one line to revert | 1 | keep |
| **Language disc** | the ink language pill competes with the one button in every corner (design brief §10) | 1 | keep |
| **Clerk DEV test user** | `o9.wave1+clerk_test@example.com` may exist on the dev instance from a failed headless run; production untouched | 1 | delete it from the Clerk dashboard |

## 6. Next sessions — what you said you want (future-me: remind James of these at the start of every session until each is done)

Ordered by you on 20 Sept 2026, 00:15. **24 Sept: all six moved in design wave 1; what is still open is marked under each.** Future-me: keep reminding James of the open parts at the start of every session until each is closed.

1. **More adversarial tests against the real API.** The two live spot-checks so far were 1 + 3 messages. You want a real battery: jailbreak attempts, romantic/nightlife pushes, deposit asks, off-profile questions, language switching mid-chat, date arithmetic, request-filing edge cases, both languages. Cost-aware: agree the message count and the model before running; never a full trust-harness battery without your explicit OK (standing rule). **24 Sept: battery BUILT** (`apps/paiduay/scripts/battery/`: 54 scenarios, 72 messages, 15 categories, both languages, 17 machine assertions, a spend guard, a judge packet); **baseline DONE**: Gemini flash-lite 28 of 54 scenarios pass (72 messages, about $0.08); Haiku 4.5 19 of 29 demo-weight scenarios pass (39 messages, about $0.74); reports in `apps/paiduay/trust-reports/battery-2026-09-24-*.md`. Top failures: Gemini answers English customers in Thai (copies the Thai example lines), both models skip the opener on refusals, Haiku ignored the deposit question, Gemini invents areas. The remaining 33 Haiku scenarios cost about $0.65. Production grounding checked: clean of the old name and address (the "Paiduay" leak came from the dev DB).
2. **Prompt, harness and tool-use work on Kathy.** You believe the endpoint can be far stronger with the right prompting, harness and tools. Candidates already known: the WO-7 per-model tuning in `docs/foundation/work-orders/ai-gateway-cost-and-resilience.md`, the LANGUAGE/opener rules in `content/ai.ts`, tool results that carry more ground truth (today's date landed 20 Sept), screening-question flow, few-shots per language. **24 Sept: prompt v2 LANDED** (the opener is the first characters of every reply, no greeting in front of it; dates read from the tool's next-7-days list and said back with the weekday; five named refusal patterns; four short examples); the profile tool now returns the canonical rate, listed hours per weekday, "no direct contact exists", today and the next seven dates, and this chat's open request. Spot check on Haiku, 6 messages, about $0.10: 5 pass, 1 partial (the Thai switch used one forbidden word and mangled a nickname).
3. **Explore the Gemini provider properly.** The adapter exists (`packages/core/src/ai/gemini.ts`); dev runs `gemini-3.5-flash-lite`, untuned. Compare against Haiku on the same battery from §6.1, then decide prod. **24 Sept: the per-provider hook is BUILT** (the kernel accepts a system prompt as a function of provider + model; `systemFor()` in `content/ai.ts` adds a per-provider addendum, Anthropic byte-identical); the one-line wiring in the chat module and the Gemini comparison on the battery are pending.
4. **Kathy and em dashes.** Technically fine (a reader knows it is AI text), but add guidance to her prompt to prefer commas, periods or a hyphen over the em dash where possible. Guidance, not a hard rule. **24 Sept: LANDED** as guidance in the prompt (comma, period or hyphen); 0 em dashes in the 6 live replies.
5. **Deployment flow.** A deploy takes at least 7 minutes today (full `next build` inside Docker on the VPS, pnpm install re-resolved, slow image export/unpack, ssh drops during the build). Goal: minutes, not seven. Options ranked in chat on 20 Sept 00:20: build the image off the VPS and pull it; cache the install layer with a lockfile-first COPY and BuildKit cache mounts; Next `output: "standalone"` to shrink the image; skip the in-Docker typecheck since root `pnpm typecheck` already runs; a one-command `deploy.sh` that runs detached and reports by curl. **24 Sept: pipeline LANDED** (build context 966 MB to 30 MB, the install layer cached and shared, the type check skipped inside Docker, standalone behind a flag that stays off, a detached `deploy.sh` with a log and an n8n ping, `deploy/push-and-deploy.sh` from the Mac). The Docker build was NOT run before commit: **tonight's first deploy is the test** (expect it slow, the cache is empty); the second deploy is the one to time (target 3 to 4 min).
6. **Responsiveness.** Example you gave: `/story` on a desktop browser renders at the same narrow column as on a phone instead of using the width. Decide a desktop treatment for the story page (a wider measure with the anatomy and money tiles side by side, or a deliberate centered column with more air) and check the other public pages at tablet and desktop widths. **24 Sept: LANDED** for /story (one left rail at every width; the five visual screens beside their words from 1024px; the phone pixel-identical) plus a tablet/desktop audit of every public page (home 820 wraps and 1440 is one viewport with empty paper; browse 820 label vs axis; sell and pro 820 fixed the same night); the leftovers are tracker P36.

## 4. Housekeeping I have not done (say the word)

- Dev test cards `s6-nok`, `s14-b`, `a22slip`, `a22dup`; prod `prod-proof-hujv` (hidden, holds a photo); portal test conversations `p_ploy_*` (one more on prod from the 18 Sept 15:00 chat check). Clerk dev test users died with the old account — nothing to clean.
- Local `.env` still holds the new **dev** Clerk keys (right for local work); the server holds the **live** ones. Backups of both env files sit next to them (`.env.bak-clerk-*`) — delete when comfortable.
- 21 old failed `booking.reminder` jobs (deleted records; cheap fix in the reminder job).
- Draw the companion photo into the OG share board (helpers exist).
- Old-name draft copy inside unimplemented plan docs (line-channel, notifications §3, trust-safety, payments, public-flip) — fix when implemented.

## 5. Where the long story lives

- Bridge (blow-by-blow): `.tmp-frenday-builder-visual-handover.md` (older ones in `.handover-archive/`)
- Decisions: `docs/foundation/02-kernel-spec.md` §9.58 to §9.72
- Tracker: `00_TOC_TRACKER_REMAINING_WORK_OPUS_FABLE.md` P19 to P46
- Menu: `03_ENTRYPOINT.html`
- Next-week menu: `docs/paiduay/plans/next-sprint.md`
