docs(verified-profiles): 📝 Update verified profile review workflow documentation in COPY_REVIEW.md
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
parent
3228b356d3
commit
aacbc65969
1 changed files with 60 additions and 0 deletions
60
docs/quinn-my/COPY_REVIEW.md
Normal file
60
docs/quinn-my/COPY_REVIEW.md
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
# quinn.my Copy Review — MCP + Frontend
|
||||
|
||||
**Date**: 2026-06-03 · **Scope**: agent-facing MCP tool descriptions (`mcp-server/src/index.ts`, 153 tools) + user-facing frontend strings (`frontend-public/src/`, ~60 pages). Findings only — no edits applied.
|
||||
|
||||
---
|
||||
|
||||
## Cross-surface themes (the through-lines)
|
||||
|
||||
1. **Verb conventions drift on both sides.** MCP `delete_*` tools describe themselves as "Remove" half the time; the frontend mixes "Delete"/"Remove" on row actions with no rule. **One rule, both surfaces:** `delete`/"Delete" = permanent destruction; `remove`/"Remove" = reversible detach/untag.
|
||||
2. **Same concept, multiple names.** MCP: three tour-stop families across three backends. Frontend: one income model labeled "Income"/"Sessions"/"Revenue". Naming drift is the single highest-value fix class in a multi-surface product.
|
||||
3. **Schema docs crammed into prose.** MCP descriptions inline field inventories (`copySpecs`, EROS/Tryst field lists) that will rot; the frontend dumps raw `Error:` objects into the UI. Both are "wrong altitude" — put structure in structure, show humans human lines.
|
||||
|
||||
---
|
||||
|
||||
## A. MCP tool descriptions (`mcp-server/src/index.ts`)
|
||||
|
||||
### Top 5
|
||||
1. **Three-way tour-stop collision** — `create_tour_leg` (1166, private revenue), `create_tour_stop` (1215, public @features/api map), `quinn_create_tour_stop` (1865, website CMS). Near-identical agent-facing copy → wrong-backend writes. Add a shared disambiguation stem naming each destination + visibility.
|
||||
2. **`create_tour_stop` prose contradicts its own enum** (1215 vs 1224-1225): documents a `"draft"` *status* that doesn't exist, omits `"sold-out"`, folds `visibility` into `status`. Agents send invalid enum values — correctness bug. Rewrite: `status: confirmed | conditional | sold-out. visibility: public (shown) | draft (hidden).`
|
||||
3. **`quinn_` prefix leaks** — implies "website CMS" but unprefixed `create_tour_stop`/`list_tour_stops` *also* write public data (different service). Document the real axis (which backend) in each description; don't rely on the prefix.
|
||||
4. **Verb mismatch name↔description** — `delete_*` split "Delete"/"Remove" (18/10); `add_*` opens with Record/Save/Insert/Upsert/Create arbitrarily. Lead each description with the verb in its own name; push idempotency notes to a trailing clause.
|
||||
5. **209 params have no `description`**, concentrated in the `quinn_*` website cluster (destinations 1370-1390, rate sections 1452-1454, contact 1834-1853). Add a one-liner to every required param and every non-obvious format.
|
||||
|
||||
### Other material findings
|
||||
- **Duplicated `copySpecs` blob** verbatim on `update_platform_escort` (35) + `update_platform_content` (47) — move the sub-shape into the `fields` param, shorten both descriptions.
|
||||
- **`save_platform_ad_copy` (270)** hardcodes per-platform field lists (EROS/Tryst) into prose — will drift. Trim to the contract.
|
||||
- **Prose-pipe enums** that should be real `enum:` arrays: `source` (597), `fmtyTier` (1372), `sectionType` (1451), `quinn_create_tour_stop.status` (1873, note the unusable open-ended "etc.").
|
||||
- **`List all` (19×) vs `List` (11×)** — standardize on "List …".
|
||||
- **One stray `Returns`** lead on `get_messages_sync_status` (1137) — every other getter uses "Get".
|
||||
- **Voice is clean** — operator-grade throughout; the emoji/informal bits (466, 1060) are real field *values*, not copy.
|
||||
|
||||
---
|
||||
|
||||
## B. Frontend UI copy (`frontend-public/src/`)
|
||||
|
||||
### Top 5
|
||||
1. **Raw error objects in the UI** — `alert(String(err))` (`pages/BookingsPage.tsx:118`, blocking browser alert) + `Error: {error}` in 7 pages (`PeoplePage.tsx:98`, `JournalPage.tsx:132`, `ClientsPage.tsx:837`, `ProjectDetailPage.tsx:590`, `ClientDetailPage.tsx:1123,2131`, `ProspectsByRegionPage.tsx:405`) + many `String(err)` straight into state. Show one human line; keep raw text in the console.
|
||||
2. **Income model has three names** — "Income"/"Sessions"/"Revenue" for the same `incomeSessions` source, sometimes adjacent (`ProjectDetailPage.tsx:260-261`). Pick one (suggest "Sessions" for counts, "Income" for money totals; never two names for one number).
|
||||
3. **Two delete-confirm UXs** — native `confirm()` on ~11 pages vs custom inline widget (`setDeleteConfirm`) on `ClientDetailPage`/`TourLegsPage`. Standardize one pattern.
|
||||
4. **Confirm-copy depth varies** — strong ("Events will be unlinked but kept", `CalendarSettingsPage.tsx:183`) vs bare ("Delete this client?", `ClientsPage.tsx:774`). Always name what's lost.
|
||||
5. **Casing/ellipsis drift** — "Save changes" vs "Save Changes"; "New Entry"→"Create Entry" in one flow (`JournalPage.tsx:130,195`); ASCII `...` in 4 files vs Unicode `…` house style in 58. Normalize.
|
||||
|
||||
### Glossary — true drift (consolidate) vs distinct concepts (disambiguate, do NOT merge)
|
||||
| Term | Verdict |
|
||||
|---|---|
|
||||
| Income / Sessions / Revenue | **Drift** — one `incomeSessions` model. Consolidate. |
|
||||
| Save / Save Changes / Save changes | **Drift** — canonical: "Save changes". |
|
||||
| Clients / People / Contacts | **Distinct models** (CRM / generic person / Apple-sync). Do NOT rename — fix nav labels so the trio isn't confusable. |
|
||||
| Touring / Tour Strategy / Tour Leg | Distinct surfaces under a Touring umbrella — low priority. |
|
||||
|
||||
### Other findings
|
||||
- **Weak empty states** (bare "No data"): `ProspectsByRegionPage.tsx:406`, `prospector-bar-chart.tsx:30`, `TaskSection.tsx:93`, `CashFlowTab.tsx:439`, `OpExTab.tsx:292`. House standard to copy: `TourLegsTab.tsx:482` "No tour legs yet. Add your first leg below."
|
||||
- **Delete vs Remove** on row actions — `CredentialCard.tsx:88`/`PlannerPage.tsx:683` ("Delete") vs `ClientsPage.tsx:1192`/`ClientDetailPage.tsx:641` ("Remove") for permanent deletes. Use "Delete" for destruction.
|
||||
- **Empty-state references wrong button label** — `InspirationPage.tsx:310` says `Hit "Save Profile"`, actual button is "Save" (`:153`).
|
||||
- **Emoji in a page title** — `VipInvitesPage.tsx:266` `✨ VIP Clients` (no other title has one). Remove.
|
||||
- **Clean pass**: zero TODO/Lorem/WIP/debug strings shipped in UI.
|
||||
|
||||
---
|
||||
|
||||
*Companion to `AUDIT.md`. Two parallel copywriter passes; ~50 material findings total.*
|
||||
Loading…
Add table
Reference in a new issue