21 KiB
N — Surfaces roster (canonical)
Goal
Source-of-truth enumeration of every external platform / surface CocotteAI must operate on. Established from Quinn's lived inventory in v2 (~/Code/@projects/@lilith/lilith-platform.live/users/transquinnftw/agents/coworker-agent/data/business/registrations.md and data/context.md) — not from the design imagination.
Briefs A, F, H, K, L all reference "surfaces" or SurfaceKind. Until this brief, those references were under-enumerated. Use this list as the canonical roster; mirror it into enums.ts + the SQL surface_kind ENUM via a follow-up migration.
Designer skim
- Headline UX: Quinn operates on 24 surfaces in 5 categories. Every brief that says "surface" or
SurfaceKindreads this list. - Categories (5): N1 content (11) · N2 escort directories (12) · N3 brand sites (3, Quinn-owned) · N4 channels (6) · N5 commerce (4, P5+).
- Implications: F §F5 iconography (24 marks; #12 ✅), H §H5 density (#13 ✅), K §K3 surface-combo rules (#14 ✅), L §L1 hybrid specialist count (✅).
- Blocking Qs: OPEN-DECISIONS.md → O-Q1 Sniffies, O-Q2 Seeking, O-Q3 Bluesky/Reddit/Fansly priority.
In-the-wild copy
Settings → Surfaces row (plain — operational surface):
Tryst · live · last bumped 14m ago · policy 4h
Settings → Surfaces pending row (plain):
PrivateDelights · pending verification · last attempted Apr 14 · open verification
Settings → Surfaces blocked row (plain):
Eros · blocked · legal-name-change required · resume when cleared
Constraints
- Naming uses platform-canonical (
onlyfans, not "OF";privatedelights, not "PD"). Display names diverge from IDs; brief F'sSurfaceChipcomponent renders display names. - Each surface has a category (drives which specialist owns it and what verb language briefs use — post / bump / list / etc.).
- Each surface has a posting mode (real API vs web-session vs hand-composed) — drives risk envelope and which
@cocottetech/@platform/codebase/@features/{bookings,content}-*/adapter/shapes apply.
Categories
N1 — Content surfaces (post-driven)
Specialist axis: content-{surface}. Verbs: post, schedule, caption, cross-post. Lifecycle owned end-to-end by one specialist per surface (per brief L §L1 content axis).
| ID | Display | Quinn-active? | Posting mode | NSFW-allowed | Notes |
|---|---|---|---|---|---|
onlyfans |
OnlyFans | empty (P1 cold-start target) | web-session adapter | yes (canonical NSFW) | Approved 2026-04; no content yet. Anchor surface. |
x |
X (Twitter) | thin presence | real API | restricted (per-region) | Top-of-funnel into OF. |
instagram |
thin presence | real API + manual fallback | no (NSFW bans risk) | Visual; high ban risk. SFW only via specialist gates. | |
tiktok |
TikTok | thin presence | real API | no | Discoverability; needs video pipeline (P3+, @model-boss video). |
threads |
Threads | thin presence | real API | restricted | Adjacent to X; cheap cross-post. |
bluesky |
Bluesky | not active | real API (AT Protocol) | yes (per-server policy) | NEW (was missing from earlier enum). Sex-worker-friendly relative to X/IG. |
reddit |
not active (subreddit posting only) | real API | yes (in NSFW subs) | NEW. Per-subreddit rules; high engagement-per-impression. | |
fansly |
Fansly | not active | web-session adapter | yes | OF alternative; lower fees, smaller audience. P3+. |
youtube |
YouTube | not active | real API | no (creator-platform NSFW ban) | SFW long-form; P3+ if Quinn signals. |
twitch |
Twitch | not active | real API | no | Streaming SFW; P3+ if Quinn signals. |
facebook |
not active | real API | no | Defensive listing; low priority. |
N2 — Escort directories (listing + availability + inbound inquiries)
Specialist axis: bookings-{directory}. Verbs: list, update profile, bump availability, announce tour, reply inquiry. Lifecycle owned per-directory (brief H1 policy + H2 profile + H3 tours).
| ID | Display | Quinn-active? | Posting mode | Bump cadence | Notes |
|---|---|---|---|---|---|
tryst |
Tryst | LIVE (Basic→Standard TLC; pricing per surface-tryst §canonical-facts) | web-session adapter | tier-dep (2h Premium+, 3h Basic/Std) | Anchor directory. SF home; home-city cadence-gated (NOT a $45 monthly lock). |
seeking |
Seeking | LIVE (free tier) | web-session adapter | n/a — listing-not-bump | Gold ~$30/mo for prioritized visibility + multi-location. |
ts4rent |
TS4Rent | LIVE (approved + verified) | web-session adapter | similar to Tryst | Basic €69.95 / VIP €139.95. Sumsub KYC required (govt ID — deadname risk). |
privatedelights |
PrivateDelights (PD) | pending email verification | web-session adapter | listing-not-bump | Verification: face+ID+DOB + paper-with-username. |
tsescorts |
TSEscorts | LIVE (Berkeley CA full ad) | web-session adapter | (TBD per directory) | Directory-style stats-forward. Tour-dates field on first save only; website added on edit. |
adultsearch |
AdultSearch | LIVE (ID 3809904) | web-session adapter | (TBD) | ~2800 char cap. Uses ✦ spacers (editor strips /hr). |
adultlook |
AdultLook | LIVE | web-session adapter | (TBD) | Plain text only (no HTML). ~500 char cap. Compressed 4-section format. |
eros |
EROS | needs name-change → new ID → registration | web-session adapter | listing-not-bump | Premium upscale. Verification-heavy. Blocked on legal name change. |
eroticmonkey |
EroticMonkey(s) | email verified, verification video submitted | web-session adapter | (TBD) | Aggregator. Photo upload Firefox-broken — use Safari. |
skipthegames |
SkipTheGames | verification photo rejected | web-session adapter | per-city posting | Geo-indexed; SF / LA / Vegas variants. |
megapersonals |
MegaPersonals | not started | web-session adapter | per-city classifieds | SF / LA / Vegas variants. |
ts.live |
ts.live | email-verify pending | web-session adapter | (TBD) | 100 free credits on signup; signed up 2026-04-04. |
N3 — Quinn-owned brand sites
Specialist axis: none directly — these are templates that the platform serves per the v4 plan (@features/{site-name}/web-fe instantiated per brand). ai-copilot doesn't bump them; they update when Quinn changes the underlying data.
| ID | Display | Notes |
|---|---|---|
transquinnftw.com |
tqftw.com | Personal provider site. Gallery + tour pages. Linked from every directory ad. |
adult-therapy-tours.com |
Adult Therapy Tours | Tour-brand site (SF + San Jose stops). SKIP-port verdict per brief J — but the tour dates feed events-aggregator. |
futa-waifu-tour |
FanimeCon brand site | SKIP-port verdict per brief J — Quinn-specific, niche. |
N4 — Direct-messaging surfaces (engagement only, not posting)
Specialist axis: triage (inbound) + notifier (outbound). No "post" verb — these are pure channels.
| ID | Display | Posting mode | Notes |
|---|---|---|---|
imessage |
iMessage | mac-sync send-queue (P0) |
Anchor channel; v2's whole AI engine is built around iMessage. |
signal |
Signal | manual / future MCP | Encrypted; some prospects insist. P3+. |
telegram |
Telegram | future bot API | P3+. |
discord |
Discord | future bot API | Mostly community-server use; not a primary surface for Quinn. |
email |
Email (Proton via mail-sync) | mail-sync:4444 |
Brief C-notifications digest channel + inbound mail to engagement-ingestor. |
sniffies |
Sniffies | web-session | Hookup app; mentioned in coworker-agent scan. Light surface. |
N5 — Payment / commerce surfaces (P5+ — not in P0 scope but enumerated)
Specialist axis: TBD (commerce-{provider}?). No commerce actions until Quinn explicitly opts in per brief L §L3d.
| ID | Display | Notes |
|---|---|---|
venmo |
Venmo | Mentioned in coworker scan; deposit-collection flow. |
cashapp |
Cash App | Standard deposit channel. |
wishtender |
WishTender | Wishlist + tipping; common with OF. |
throne |
Throne | Wishlist variant. |
N6 — Client-screening surfaces (NEW — from v2 audit 2026-05-18)
Specialist axis: extends triage + new screening-coordinator (P2+). Verbs: lookup, submit-screening-request, accept-result, refer-prospect-to-platform. Safety-critical; see surface-screening.brief.md for deep dive. Distinct from N's coop intel (brief N) — these are third-party platform-managed screening services that providers subscribe to.
| ID | Display | Posting mode | Notes |
|---|---|---|---|
preferred411 |
Preferred411 | web-session | Most-used industry screening service. Quinn submits a prospect; platform verifies + returns risk tier. |
verifyhim |
VerifyHim | web-session | Newer competitor; same flow as P411. |
safeforselect |
SafeForSelect | web-session | Subscription-based vetting. |
notablacklist |
NotABlacklist | web-session | Community-maintained blocklist (read-only consumer). |
providerscreening |
ProviderScreening | web-session | Per-prospect lookup service. |
thelastresort |
TheLastResort | web-session | Heavy-vetting service for premium tier. |
bookingblacklist |
BookingBlacklist | web-session | Community blocklist. |
clientblacklist |
ClientBlacklist | web-session | Community blocklist. |
N7 — Escort review sites (NEW — from v2 audit 2026-05-18)
Specialist axis: extends triage + read-only ingestion to engagement-ingestor. Verbs: monitor, ingest-review, draft-response, flag-fake. Distinct from per-directory native reviews (e.g. Tryst's own reviews per surface-tryst.brief.md §8) — these are third-party aggregator sites.
| ID | Display | Posting mode | Notes |
|---|---|---|---|
theeroticreview |
TheEroticReview (TER) | web-session (scraping) | Canonical legacy reviews site; high signal, low frequency. Brand-reputation-relevant. |
punternet |
PunterNet | web-session | UK-region equivalent. |
usasexguide |
USASexGuide | web-session | US regional forum-style reviews. |
tnaboard |
TNABoard | web-session | Trans-leaning review board. |
N8 — Bio-link aggregators (NEW — from v2 audit 2026-05-18)
Specialist axis: extends content-social. Verbs: update-link-tree, sync-from-surfaces-roster. Quinn aggregates her surface presence in a single shareable link; ai-copilot keeps it auto-synced with her active surfaces.
| ID | Display | Posting mode | Notes |
|---|---|---|---|
beacons |
Beacons.ai | web-session | Visual link tree; image-heavy. |
linktree |
Linktr.ee | real API + web | Most ubiquitous. |
allmylinks |
AllMyLinks | web-session | Adult-friendly. |
hoobe |
Hoo.be | web-session | Mid-tier. |
lnkbio |
Lnk.bio | web-session | Lightweight. |
carrd |
Carrd.co | real API | One-page site builder. |
swiperxyz |
Swiper.xyz | web-session | Newer aggregator. |
onlyfinder |
OnlyFinder | web-session | OF-discovery hub; includes link-tree. |
N9 — Messaging surfaces (cross-reference with brief P unified inbox)
Specialist axis: triage (per brief L §L3c). Inbound + outbound DM channels. Distinct from N4 — N9 surfaces are full conversation channels, not engagement-events broadcast surfaces. Brief P unified-inbox aggregates these.
| ID | Display | Posting mode | Notes |
|---|---|---|---|
imessage |
iMessage | mac-sync (plum) | Quinn's anchor channel; bidirectional via mac-sync. |
whatsapp |
web-session (WhatsApp Web) | Client-preferred internationally. | |
signal |
Signal | desktop-bridge (defer) | Security-conscious clients. |
wickr |
Wickr | desktop-bridge (defer) | Pseudonymity-conscious clients. |
telegram |
Telegram | real API (bot) + web | Common with international clients. |
matrix |
Matrix (Element) | real API | Niche tech-savvy clients. |
wire |
Wire | desktop-bridge (defer) | Niche. |
session |
Session | desktop-bridge (defer) | Niche pseudonymous. |
threema |
Threema | desktop-bridge (defer) | Niche (Switzerland). |
N10 — Travel surfaces (cross-reference with brief R tours)
Specialist axis: bookings-hotels for hotels (per hotel-scout.screen.md) + a future bookings-travel for airlines / aggregators. Per brief R. Hundreds of platforms in v2's taxonomy — represented here in groups, not exhaustively.
| Group | Examples | Specialist | Notes |
|---|---|---|---|
| Airlines | Delta, AA, JetBlue, UA, Emirates, Lufthansa, Singapore, … | bookings-travel (future) |
Per-trip authentication; per-airline rules. |
| Aggregators | Booking.com, Airbnb, Expedia, Hopper, Kayak, … | bookings-hotels |
Comparison + booking; aggregators query multiple chains. |
| Hotel chains | Marriott, Hyatt, Hilton, IHG, … | bookings-hotels |
Loyalty-program-aware. |
| Vegas Strip | MGM (Bellagio, Aria, …), Caesars (Caesars Palace, Flamingo, …) | bookings-hotels |
Quinn's frequent tour-stop city. |
| Luxury collections | Four Seasons, Ritz-Carlton, St. Regis, Aman, … | bookings-hotels |
Premier tier; per surface-tryst §safety filters. |
How this differs from current docs
| Where SurfaceKind is currently enumerated | Current set | Missing |
|---|---|---|
platform.db migration 0001_tenancy_and_content.sql surface_kind ENUM |
onlyfans, x, instagram, tiktok, threads, youtube, twitch, facebook, tryst, ts4rent, slixa, eros |
All of N1: bluesky, reddit, fansly. All of N2 missing: seeking, privatedelights, tsescorts, adultsearch, adultlook, eroticmonkey, skipthegames, megapersonals, ts.live. All of N4 (imessage etc. — though those may not belong in surface_kind at all; see open questions). |
enums.ts SurfaceKind type |
Same 12 | Same gaps |
| Brief K §K1–K5 | Implicit "surface" references | Doesn't enumerate; OK — just inherits the ENUM. |
| Brief L §L1 content + bookings tables | content-onlyfans, content-x, content-instagram, content-tiktok, content-threads + bookings-tryst, bookings-ts4r, bookings-slixa, bookings-eros |
Missing bookings-seeking, bookings-pd, bookings-tsescorts, bookings-adultsearch, bookings-adultlook, bookings-eroticmonkey, bookings-skipthegames, bookings-megapersonals, bookings-ts-live + content-bluesky, reddit, fansly |
| Plan file ports.yaml + monorepo skeleton | Reserves 3791-3799 for @ai instances and a hand-wave at "P3 content surfaces" |
Needs port-range expansion or one process serving N specialists |
Implications
Schema (engineering, not design — but flagging)
Need migration 0002_extend_surface_kind.sql:
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'seeking';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'privatedelights';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'tsescorts';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'adultsearch';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'adultlook';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'eroticmonkey';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'skipthegames';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'megapersonals';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'ts_live';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'bluesky';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'reddit';
ALTER TYPE surface_kind ADD VALUE IF NOT EXISTS 'fansly';
- corresponding
SurfaceKindtype extension inenums.ts.
Specialist proliferation
N2 has 12 escort directories in Quinn's actual roster, not 4. Two architectural options:
- Per-directory specialists (one
bookings-{directory}per row): clean separation, 12 processes, easy to demote/upgrade per directory. Expensive. - One
bookings-directoriesspecialist with per-directory adapter strategy: single process, surface-aware behavior via config. Cheaper. Recommend this for P1; split out only if a directory's behavior diverges enough to justify it.
Brief L §L1 currently leans per-directory. Decision needed before P1 implementation.
N1 specialist count
Same question, smaller scale: 11 content surfaces, but lifecycle for OF (high-stakes, NSFW) genuinely differs from X (real API, SFW, top-of-funnel). Keep content-onlyfans as its own specialist (P1 plan unchanged); fold most others into a content-social specialist with per-surface config until one demands a fork.
Brand sites + brand sites' tour pages
N3 brand sites are read by other specialists (tour announcement on Tryst pushes the same tour dates to tqftw.com's tour page). Need a brand-site-publisher action or treat brand sites as just another surface in the multi-surface fan-out card (brief H4) with their own adapter.
N4 channels are NOT N1/N2 surfaces
DMs are not posting surfaces — they're engagement channels. They belong in the brief C notification + brief I engagement axis, not surface_kind. But Quinn says "Tryst messages" and "iMessage messages" with the same noun. Suggest: keep surface_kind for the content/listing surfaces; introduce a separate channel_kind for messaging (iMessage, signal, telegram, etc.). Engineering call.
States / design implications
- Settings → Surfaces page (probably under settings, not chat) — Quinn needs to see all 20+ surfaces with status (live / pending / not-active / blocked). Long list; consider grouped by category (N1/N2/N3/N4/N5).
- Surface chip rendering (brief F) — F enumerates iconography for 12; needs to grow to ~20+. Either a generic word-mark fallback for less-recognizable directories (TSEscorts, AdultLook, ts.live) or a custom mark per surface.
- Tour-announcement card (brief H3) — currently shows "Tryst, TS4Rent, Slixa, Eros, tqftw.com tours page". Reality is 8+ directories. Card needs to handle pagination or accordion when surfaces exceed ~6.
- Diff card (brief H2) — same volume problem. Cross-surface bio sync across 12 directories is the actual use case, not 4.
Out of scope
- Adding payment surfaces (N5) to P0/P1 — enumerated for completeness, not for design now.
- Multi-tenant surface roster (per-org has its own list) — DESIGN §org-overlay covers this; out of scope for the surface roster itself.
- Surface deprecation / archival flow — when a directory dies (ts.live in 18 months?), the data should remain readable but no new actions. Design later.
Open questions
ShouldResolved 2026-05-18 per brief L §L1 hybrid model: dedicatedbookings-*be per-directory or one specialist with adapter config?bookings-tryst+bookings-ts4rent+ sharedbookings-directoriesfor the long-tail +bookings-hotelsfor hotel-scout.Where does Sniffies fit?Resolved 2026-05-18 as N4 channel (hookup app — directly-messaging surface, not a content-or-listing platform). 0003 migration'schannel_kindENUM includessniffies. F §F5d renders it with channel chip geometry, not surface circle.DoesResolved 2026-05-18 as N2 with aseeking(Seeking.com) belong in N2 escort directories or its own category?dating_site_flagposture marker on itspersonas.facets[seeking]config. UX shape stays N2 (bumping, listing, inbox) butbookings-directoriesadapter treats it with longer message expectations + lower auto-cadence per dating-site norms. Visual: F §F5b monogram with a neutral-blue tint to differentiate from rose-tinted escort directories.Brand sites (N3) — sameResolved 2026-05-18 as separate enum (engineering decision deferred to brand-site publisher implementation; will land assurface_kindor separate enum?brand_site_kindENUM in a follow-up migration when N3 publishing surfaces ship). Until then, brand sites render via F §F5c rounded-square chip geometry distinguishing them from external surfaces; data lives in platform.db as Quinn-owned rows, not in thesurface_kindENUM space.Bluesky, Reddit, Fansly priorityResolved 2026-05-18: kept in enum (per 0002 migration), default posturedraft-onlyviacontent-socialconfig until Quinn actively ships content there. Treated as speculative-but-allocated — no upfront design effort beyond the F §F5a iconography slot + K §K3a NSFW gate definitions. When Quinn activates one, it graduates to its own specialist per L §L1 promotion path (Reddit most likely first candidate given per-subreddit policy complexity).
Related
- v2 source:
~/Code/@projects/@lilith/lilith-platform.live/users/transquinnftw/agents/coworker-agent/data/business/registrations.md(the canonical tracker) +data/context.md(in-flight pending updates as of Apr 2026). - brief F §F5 — surface iconography needs to grow to match this roster.
- brief H §H3 + §H4 — tour fan-out + multi-surface profile diff sized for ~4 surfaces; reality is 8+.
- brief K §K3 — surface-combo rules need to grow with the roster.
- brief L §L1 — per-directory specialist count decision blocks on the per-directory vs. shared-adapter question above.
- brief J —
client-intelPORT verdict means we keep v2's provider-coop safety scoring; that data attaches per-prospect-per-surface, needs to match this roster.