cocottetech/@platform/codebase/@features/ai-copilot/docs/L-specialists-fleet.brief.md

19 KiB
Raw Blame History

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:

  1. User-facing fleet UX — how Quinn perceives, switches between, and trusts individual specialists in chat and drawers.
  2. 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 in specialists/.

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 (P0P4)

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-tiktok added 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-x back 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_actions rows (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-tiktok is 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. strategist always 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.
  • content-newsletter posture is partly contingent on the v2 comm-newsletter investigation. Resolved 2026-05-17: v2 newsletter has NO AI generation (hand-composed bodies); v4 specialist optionally drafts via Claude. Default posture confirmed: draft + scheduled-send (matching v2's existing dispatch flow). Hearth voice lean.
  • Specialist-to-specialist communication visibility — when content-onlyfans asks strategist for 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 shared bookings-directories specialist with adapter config. Resolved 2026-05-18: hybrid — bookings-tryst + bookings-ts4rent dedicated (anchor surfaces); other 11 directories from brief O — N2 folded into shared bookings-directories with per-directory personas.facets config. Same hybrid pattern adopted for content surfaces: content-onlyfans + content-tiktok + content-newsletter dedicated; 9 social surfaces share content-social. Promotion + demotion paths defined inline. See L1 above.
  • 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.