19 KiB
L — Specialists fleet (user-facing UX + per-specialist contracts)
Goal
CocotteAI is not one agent — it's a fleet. ai-copilot is the front door Quinn talks to; behind it is a roster of named specialists each owning a slice of her work (content production per surface, bookings per directory, prospect triage, strategy). This brief defines:
- User-facing fleet UX — how Quinn perceives, switches between, and trusts individual specialists in chat and drawers.
- Per-specialist contracts — each specialist's job, default auto/draft posture, voice lean (per
voice.brief.md), and what actions it owns. Per-specialist contracts now live inspecialists/.
Brief A established the front door. Brief B6 sketched the specialist drawer. This brief makes the fleet a first-class abstraction.
Designer skim
- Headline UX: One front door (ai-copilot). Specialists named-in-line are tappable to a drawer (B6). Direct specialist threads are an advanced affordance, not required.
- Sections (5): L1 fleet roster (hybrid: dedicated anchors + shared long-tail) · L2 chat UX (mentions, direct, ambient strip, switch gesture, invocation phrases) · L3 → contracts split to
specialists/· L4 trust lifecycle · L5 surfaces. - Pair-with:
specialist-drawer.screen.md,specialists/. - Blocking Qs: none currently — all resolved or
[nice-to-have]. See OPEN-DECISIONS.md → L-Q1 specialist-chatter-visibility.
Constraints
- The fleet is Quinn-perceived, not infrastructure-leaked: she shouldn't have to know which NestJS process serves which response. The specialist is a UX persona over the platform.api routing.
- Specialists share schema (
agent_actions,personas, etc.) but each has its own system prompt, model assignment (per v2's "Agent Model Table" — see brief J), correction history, and trust score (per brief I §5). - The front door (
ai-copilot) is the only specialist Quinn must know about. Direct specialist conversations are an advanced affordance — discoverable but not required. - Per
voice.brief.md§V4, each specialist has a register lean (hearth / working / plain). Don't duplicate that table here — reference it.
L1 — The fleet roster (P0–P4)
Defined by the v4 plan + brief J port map. Specialists fall into four axes:
Front door
| Specialist | Owns | Default posture | Voice lean |
|---|---|---|---|
ai-copilot |
Routing, context, conversation, multi-modal input, day-summary digest | Draft + ask | Full range |
Strategy
| Specialist | Owns | Default posture | Voice lean |
|---|---|---|---|
strategist |
Weekly content planning, tour timing, OF cohort warmth tracking, prospect funnel reads | Propose only — never auto | Working |
prospect-resolver (P4) |
Cross-surface prospect dedup, intent classification, scoring | Auto-score + draft-only outreach | Plain |
Content production — hybrid: dedicated + shared social long-tail
Same hybrid pattern as bookings (above). Per brief O — N1, 11 content surfaces. OnlyFans is the canonical NSFW + revenue anchor; everything else is funnel-top or experimental. Dedicate where revenue, NSFW policy, or specialized rendering pipelines diverge; share the rest.
| Specialist | Owns | Default posture | Voice lean | Why dedicated |
|---|---|---|---|---|
content-onlyfans (P1) |
OF post drafting, caption variants, scheduling, asset matching, PPV pricing, subscriber-DM funnel | Draft + auto-schedule (≥0.85 confidence + asset auto-approved + no flagged phrases per brief K) | Hearth | NSFW canonical surface; PPV revenue; web-session adapter (no public API). High-stakes posture; brand voice differs from social. |
content-tiktok (P3) |
TikTok scripts + caption hooks; eventually video-edit/captioning via @model-boss video pipeline |
Draft only | Hearth | Video pipeline diverges from text/image posting — different @model-boss route, different review affordance. |
content-social (P2) |
All other content surfaces sharing the post-text-and-image lifecycle: x, instagram, threads, bluesky, reddit, fansly (NSFW-friendly OF alt), youtube (P3+ if Quinn signals), twitch (same), facebook. Per-surface config in personas.facets[surface_id]: voice lean, NSFW-allowed flag, posting-mode, cross-post rules. |
Per-surface — defaults: x + threads auto-post ≥0.85; instagram + facebook draft-only (high ban risk); reddit + bluesky draft-only initially. |
Per-surface (X/Threads = working; IG/Bluesky = hearth; Reddit = plain) | Same fundamental verbs (post, schedule, caption, cross-post). 9 specialists for a near-identical lifecycle is overkill; per-surface config is the right axis. |
content-newsletter (P2, ported from v2) |
Newsletter drafting + dispatch via notifier worker; subscriber list management |
Draft + scheduled-send | Hearth | Different distribution mechanic (email, not feed); different tracking surface (opens/clicks vs likes); different content shape (long-form vs feed-post). |
Cross-post rules live in content-social's per-surface config: e.g. { x: { auto_cross_post_to: ['threads'] }, reddit: { auto_cross_post_to: [] } }. The shared specialist composes per-call adapters at dispatch time.
Promotion path (same shape as directories): when a content surface's behavior diverges enough — Instagram demands a Stories-specific pipeline, Bluesky's AT-Protocol becomes a substantial integration, Reddit needs per-subreddit policy logic — graduate it to its own specialist.
Bookings / directories — hybrid: dedicated + shared long-tail
Per brief O — N2, Quinn operates on 13 directories. One specialist per directory (13 NestJS processes, 13 trust scores, 13 voice configs) is overkill for directories that share the same lifecycle shape. Hybrid model: dedicate a specialist to directories where Quinn invests time/money/identity (the anchor surfaces); fold the long tail into one bookings-directories specialist that handles them via per-directory adapter config (per brief F §F5 iconography fallback).
| Specialist | Owns | Default posture | Voice lean | Why dedicated |
|---|---|---|---|---|
bookings-tryst (P0) |
Availability heartbeat (cadence tier-dependent per surface-tryst §canonical-facts: 3h Basic/Standard, 2h Premium+), profile copy, tour announcements, inbound reply triage | Auto-bump + draft replies + diff-approval for copy | Plain on policy, hearth on receipts | Anchor directory: TLC tier, home-city cadence-gated (not fee-gated), highest spend, primary funnel source. |
bookings-ts4rent (P0) |
TS4Rent equivalent of above | Same posture as bookings-tryst |
Plain on policy, hearth on receipts | Sumsub KYC required (govt ID — deadname risk); VIP tier €139.95; high-touch identity surface. |
bookings-directories (P1) |
The 11 long-tail directories sharing the same lifecycle shape: seeking, privatedelights, tsescorts, adultsearch, adultlook, eros, eroticmonkey, skipthegames, megapersonals, slixa, ts_live. Routes by surface_kind to the right @cocottetech/@platform/codebase/@features/bookings-{directory}/adapter/ adapter. |
Per-directory config in personas.facets[directory_id]: cadence, voice lean, posting mode, listing-or-bump |
Per-directory (defaults: plain policy + hearth receipts) | Same fundamental verbs (list, refresh, post-to-city, fetch inbound). Splitting into 11 specialists would create 11x the operational surface (trust panels, audit drawer rows, voice configs, demotion flows) for ~zero behavioral divergence. |
Promotion path: any directory in bookings-directories can graduate to its own specialist if (a) its behavior diverges enough (e.g. seeking works more like a dating site than a directory — see brief O open questions), or (b) Quinn's investment in it justifies the dedicated trust panel. Engineering cost is rename + lift; data carries forward via surface_kind filter.
Demotion path: reverse — if Quinn deprecates a directory, the bookings-directories specialist's adapter for it goes into "read-only" mode (audit history preserved per brief I §append-only); the surface is marked archived on the persona's facets.
Trust scoring (per brief I §5 + this brief §L4): the shared specialist holds per-directory trust scores internally (the trust panel in B6 shows a roll-up with per-surface drilldown). Demotions apply per-directory, not globally — if skipthegames accumulates corrections, only its adapter dials back to draft-only, not the whole shared specialist.
Engagement
| Specialist | Owns | Default posture | Voice lean |
|---|---|---|---|
triage |
Inbound iMessage / DM eligibility check (5-check chain ported from v2 — see brief J), routing decisions, block-list enforcement | Auto-decide; escalate only on ambiguity or block | Plain |
producer (sub-role of content-*, surfaced when Quinn invokes "make me X variants") |
Variant generation, asset selection, A/B suggestion | On-demand only | Hearth |
publisher (sub-role of content-*) |
The actual scheduled send | Auto (governed by content-*'s gates) | Working |
Note: Producer + publisher are named roles surfaced in chat ("the producer drafted three variants") but implemented as functions inside each content-* specialist, not separate processes. The UX treats them as named so Quinn can think about her workflow in named stages; the architecture stays consolidated.
L2 — How Quinn perceives the fleet (chat UX)
L2a — Specialist mentions in chat
When ai-copilot reports work done by a specialist, it names them explicitly:
"The producer has three OF variants ready — one fattier, one leaner, one tour-tease. Publisher has them in the 9pm slot when you approve."
The specialist name is tappable — taps open the specialist drawer (B6) scrolled to that specialist's recent actions. Tap-targets are visually distinct (subtle underline or chip, never bold-blue link).
L2b — Direct specialist conversations
Quinn can talk directly to a specialist by mentioning it or via the specialist drawer:
Quinn: "@strategist what's the OF cohort looking like this week?"
Strategist (in chat, with specialist badge): "Cooling slightly since the Berlin tease 5 days ago. Worth a follow-up DM cluster before Friday — drafted 12, your call."
The specialist badge (chip in the avatar position) is the visual cue. Conversation context is per-specialist — switching specialists doesn't load the other's history. This is the chat-thread equivalent of v2's /engine "Agent selector" affordance (per brief J).
L2c — Fleet status strip (ambient)
A compact one-row strip at the top of chat-home shows which specialists ran something in the last 24h (small dots / counts):
[ai-copilot 12] [triage 47] [bookings-tryst 6] [content-onlyfans 3] · [tap to see all]
Greyed = idle. Color = activity. Red dot = a specialist needs Quinn's attention (failed action, pending high-stakes approval).
L2d — Specialist switching gesture
On chat-home, a swipe-left on the top-bar avatar opens a horizontal scroller of recent specialists. Tap to switch active conversation context. Discoverable but not in the way.
L2e — Specialist invocation phrases
ai-copilot recognizes phrases that pull a specialist forward without explicit @ mention:
- "make me three options" → routes to producer (within current content-* context)
- "what's tryst doing" → opens bookings-tryst drawer
- "stop everything" → kill switch (per brief K); never specialist-scoped
L3 — Per-specialist contracts
Per-specialist contracts (Does · Auto · Proposes · Never · Correction lens) live in their own files under specialists/. One card per specialist; reference them when designing specialist-specific UX. Roster index at specialists/README.md.
This brief stays a roster + lifecycle doc — what specialists exist (L1), how Quinn perceives them (L2), how trust evolves (L4), where they show up (L5). Read the per-specialist file for what each one actually does.
L4 — Specialist trust lifecycle
Brief I §5 defines per-specialist trust scoring + policy graduations. This brief adds the fleet-level lifecycle:
- New specialist onboarding: when a new specialist comes online (e.g.
content-tiktokadded in P3), it's added with all gates set to propose only. No auto-actions until Quinn explicitly graduates it via the trust panel (which lives in B6 / I5). - Specialist demotion: any specialist whose recent correction rate exceeds a threshold (per I5) gets demoted — auto-modes revert to propose. Quinn sees a digest entry: "I dialed
content-xback to draft-only after 4 corrections this week. Approve to keep, or check its recent posts." - Specialist retirement: deprecating a specialist (e.g. shutting down a directory) shows a confirmation, archives the specialist's persona + history, but never deletes
agent_actionsrows (per brief I §append-only).
L5 — Surfaces and routing
| Surface | How specialists appear |
|---|---|
| Chat-home (brief A) | ai-copilot is the default voice; other specialists named in line via L2a; mentions tappable to drawer. |
| Specialist drawer (brief B6) | One row per specialist: avatar, name, voice-lean badge, last-N actions, trust meter, "talk directly" CTA. |
| Audit drawer (brief I) | Every agent_actions row tagged with specialist_id; filter by specialist. |
| Notification (brief C) | Push notifications are signed by their specialist ("bookings-tryst failed a bump" — not just "an error occurred"). |
| Web companion (brief G) | Engagement-portal shows triage queue per-specialist; content-portal shows content-* queues per-surface. |
| Voice / TTS | Specialist persona affects prosody slightly (subtle — same TTS voice with prosodic shift, per voice.brief.md §V4 open question). |
States to design
- Specialist drawer roster — full list, sorted by recent activity, with trust meters.
- Specialist drawer detail (B6 expanded) — single specialist: identity card, recent actions, trust meter, system prompt editor (advanced), correction history, talk-directly affordance.
- Direct conversation with a specialist — chat surface variant: specialist avatar in header, persistent breadcrumb back to
ai-copilot, history scoped to this specialist. - Fleet status strip — top of chat-home, all-idle vs busy variants, red-dot attention state.
- Specialist mention in chat — bare mention, tap-state, drawer-just-opened transition.
- New specialist onboarding card — first time
content-tiktokis live: "Cocotte added the TikTok producer. Right now it only drafts — nothing auto. Tap to set up." - Specialist-demotion digest entry — for the next morning's digest.
- Specialist retirement confirmation — "Sure you want to retire
bookings-eros? Past actions stay in the audit drawer."
In-the-wild copy
L2a · specialist mention in chat (working — ai-copilot voice):
The producer has three OF variants ready — one fattier, one leaner, one tour-tease. Publisher has them in the 9pm slot when you approve.
L2b · direct conversation with strategist (working — strategist's own register):
Cooling slightly since the Berlin tease 5 days ago. Worth a follow-up DM cluster before Friday — drafted 12, your call.
L4 · new specialist onboarded (hearth):
Cocotte added the TikTok producer. Right now it only drafts — nothing auto. Tap to set up.
L4 · demotion digest entry (working):
Dialed content-x back to draft-only after 4 corrections this week. Approve to keep, or check its recent posts.
Out of scope
- Underlying NestJS routing / topic-queue choreography (engineering brief).
- Cost-per-specialist (Model assignments are configurable per L3 contracts; cost surfacing is a settings overlay, not core fleet UX).
- Multi-tenant specialist sharing across orgs (per platform DESIGN, specialists are person-scoped; org-scope is a P5+ concern).
Open questions
- Should specialists have human-readable names beyond their ID (e.g.
strategistalways called "the strategist" in chat, but does it have a name like "Hera"?). Lean no — naming risks twee-ness; the role descriptors are warm enough. - Producer + publisher: keep as sub-roles inside
content-*, or split into peer specialists? Lean keep — easier to think about, easier to ship, can split later. Resolved 2026-05-17: v2 newsletter has NO AI generation (hand-composed bodies); v4 specialist optionally drafts via Claude. Default posture confirmed:content-newsletterposture is partly contingent on the v2comm-newsletterinvestigation.draft + scheduled-send(matching v2's existing dispatch flow). Hearth voice lean.- Specialist-to-specialist communication visibility — when
content-onlyfansasksstrategistfor cohort data, does Quinn see that handoff, or only the resulting proposal? Lean: optional "show specialist chatter" toggle, off by default. Per-directory specialists vs sharedResolved 2026-05-18: hybrid —bookings-directoriesspecialist with adapter config.bookings-tryst+bookings-ts4rentdedicated (anchor surfaces); other 11 directories from brief O — N2 folded into sharedbookings-directorieswith per-directorypersonas.facetsconfig. Same hybrid pattern adopted for content surfaces:content-onlyfans+content-tiktok+content-newsletterdedicated; 9 social surfaces sharecontent-social. Promotion + demotion paths defined inline. See L1 above.
Related
- brief A — front-door chat surface.
- brief B §B6 — specialist drawer (this brief expands it).
- brief I §5 — per-specialist trust panel + policy graduations (this brief adds the fleet-level lifecycle).
- brief J — port verdicts that determine which specialists exist + their default posture.
- brief O — canonical surfaces roster that drives the hybrid specialist-count decision in this brief.
voice.brief.md§V4 — per-specialist voice modulation.