cocottetech/@platform/codebase/@features/ai-copilot/docs/vacation-mode.flow.md
natalie 1b719e1fd7 chore(bootstrap): initial V4 commit
Clean successor to V3 (forge: lilith/atlilith). Seeded from local Mac
working tree at ~/Code/@projects/@cocottetech/. node_modules and build
artifacts excluded via .gitignore.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 08:11:41 -07:00

13 KiB
Raw Blame History

Vacation-mode flow

End-to-end: from "I'm off TuesdaySunday" through auto-resume + digest. Pairs with brief H §H1 vacation-mode and the per-source posture in brief P §P3.

Sibling-of-but-different-from the kill-switch flow. Both are staged pauses, but:

  • Kill switch — instant, plain-register throughout, "stop everything," no time-bound, no per-surface wording shifts, single fast tap.
  • Vacation — declarative time-bound mass-pause with positive framing ("returning Monday"), working register for the decision, hearth for receipts, plain only when something fails. Side-effects fan out across bumping specialists, tour wording, DM auto-replies. Designed for planned absence, not panic.

Quinn invokes vacation in advance and lives in it for days. The kill switch is for right now.

Triggers (three entry points)

# Entry Register Latency target
1 Voice: "I'm off Tuesday through Sunday" / "Take me out next week" → ai-copilot parses date range, returns confirmation card working <2s incl. STT
2 Chat-home top bar quick-toggle (per brief S §S5 surfaces row) — pill labeled "Vacation" → opens date picker sheet working <1s
3 Settings → S5 per-surface category → "Vacation mode" row → date picker + per-surface override checklist working n/a (deliberate path)

All three converge on the same vacation-mode-activate action. Voice + quick-toggle skip per-surface curation (use defaults — all bumping surfaces in scope); the S5 path is the place to opt out a surface.

Step 1 — first-time explainer card

Fires only on Quinn's first invocation of vacation mode. Subsequent invocations skip straight to Step 2 with a small "?" affordance to re-read.

Working register, with detailed side-effects spelled out per brief H §H1:

Vacation mode · first time

What this means:

  • Bumps pause on Tryst, TS4Rent, Slixa — every directory you're
    currently bumping on.
  • Tour wording shifts to "returning Monday" on directories that
    support it. Location detail stays locked (K3f-3).
  • DM auto-replies switch to "away" posture across iMessage, SMS,
    Proton, Gmail, per-surface DMs (P §P3).
  • Posts you've already scheduled still publish. Vacation pauses
    *future* drafts, not the queue.
  • Daily digest still arrives — quieter, mostly receipts of what
    didn't run.

  [ ] Don't show this again

[ Cancel ]                                    [ Continue ]
  • "Don't show this again" defaults off — Quinn opts out, not in (per H §H1).
  • Continue advances to Step 2. Cancel returns to chat.

Step 2 — confirmation card

Working register. Date range echoed back; per-surface scope summarized; one tap to commit.

Vacation · Tue May 19 → Sun May 24

Pausing 8 bumping surfaces. Tour wording shifts on 6.
DM auto-reply: away. Scheduled posts still publish.

Resume automatically Monday May 25, 06:00 local.

[ Set aside ]              [ Confirm ]
  • "Set aside" is the voice-aligned cancel (per voice §V7).
  • Confirm proceeds to Step 3 dispatch.
  • Tiny "?" affordance top-right re-opens the Step 1 explainer.

Step 3 — mass-pause dispatch

On confirm, ai-copilot fans out across every bumping specialist (per brief L — every bookings-{directory} instance):

  1. Publish vacation-mode.activated event to Redis pub/sub with {user_id, start_at, end_at, scope[]}.
  2. Each bookings-{directory} specialist freezes its H1 cadence policy (sets policy.paused_until = end_at); records an agent_actions row with action_type='vacation_mode_paused'.
  3. triage specialist flips DM auto-reply posture to away per source (P §P3).
  4. bookings-* specialists dispatch tour-wording updates (Step 4, below) to directories that support it.
  5. platform.api sets vacation_mode_active=true + range on the user row.
  6. Notifier emits a single low-stakes hearth-register push: "Vacation set Tue → Sun. Cocotte's on it."

Dispatch is idempotent — re-confirming the same range during the active window is a no-op (Edge cases, below).

Step 4 — tour wording auto-update

Where directories support free-form tour copy (Tryst, TS4Rent, brand sites), ai-copilot writes "returning Monday May 25" or equivalent per-surface tone.

Where directories only support structured location detail (brief K §K3f-3 — location-detail still gated), wording stays at the last-approved value; the structured city field isn't touched without explicit approval. This is a hard edge: vacation doesn't get to reveal "she's home in $CITY" by accident.

Each per-surface update emits an agent_actions row, batched into a single H4-pattern multi-surface receipt:

Tour wording shifted on 6 surfaces. tqftw.com and bio-site say "returning Mon May 25." Tryst, TS4Rent, Slixa, Eros say the same in their fields.

Step 5 — DM auto-reply switch

Per brief P §P3 per-source posture, vacation flips each unified-inbox source to its away template:

Source Away posture
iMessage / SMS Polite human-toned away message; preserves per-prospect tone (triage writes it)
Proton / Gmail Slightly longer, working-register away copy
Per-surface DM (Tryst, OF, TS4Rent) Surface-native away wording; respects K3 blocked terms
Provider-coop channels (N) Untouched — vacation doesn't silence coop

Quinn can per-source override in S5 before confirming (Step 2's per-surface checklist).

Step 6 — vacation-active banner across surfaces

Persistent until end of range or manual end. Hearth register (this is ambient, not interrupt):

🏖 Vacation through Sun May 24 · 5 days remaining · Cocotte's keeping things steady.

  • Banner sits below the chat-home top bar, in the audit drawer header, in the calendar drawer, on the web companion (ai.cocotte.maison).
  • Approval cards for bumping specialists are greyed out during the window (per H §H1 state "Vacation mode active") — tap surfaces a toast: "paused for vacation — end vacation to dispatch."
  • ai-copilot keeps responding in chat. Strategist still drafts background analysis. Content drafts still arrive (scheduled posts in queue still publish, per H §H1).
  • Tap banner → vacation-detail sheet (date range · scope · per-source posture · end-now affordance).

Step 7 — daily reminder of remaining days

Once per vigil close (per brief Q + brief I §I1 daily digest), the digest leads with a quiet hearth line:

Day 3 of 6. Bumps off across 8 directories. Tour wording holds at "returning Mon." Two DMs auto-replied with the away note — held for your eyes when you're back.

If vacation will end inside the next 24h, the line shifts:

Vacation winds down tomorrow at 06:00. Cocotte starts bumps back up from where they left off — no replay flood.

Step 8 — auto-resume or manual end

Auto-resume (default): at end_at, ai-copilot reverses the dispatch from Step 3:

  1. vacation-mode.deactivated event to Redis.
  2. Each bookings-{directory} specialist clears policy.paused_until, resumes its H1 cadence from now (no backfill — replaying 6 days of missed bumps would burn ranking; just pick up the cadence forward).
  3. Tour wording reverts to pre-vacation copy (drafted by each bookings-*, no approval needed — restoring prior state is auto).
  4. Triage away posture clears across all sources.
  5. Notifier emits one hearth push: "Back on. Cocotte's tending to things again."

Manual end (from banner detail sheet or "end vacation" voice): same dispatch path, fires at the tap moment instead of end_at. Confirmation card (working register) before commit:

End vacation 2 days early? Bumps resume immediately on 8 directories. Tour wording reverts. Away auto-replies stop.

[ Hold ] [ End now ]

Step 9 — resume receipts digest

Per brief I §I1, the first daily digest after resume includes a vacation-block summary (hearth register, magazine-like):

Vacation Tue → Sun. Bumps stayed off across 8 directories — Tryst's "last seen" badge held steady, no ranking penalty. Tour wording said "returning Mon" everywhere it could. 23 DMs auto-replied with the away note; 4 are flagged for your read — one VIP, three with tour questions. Two scheduled posts published as planned (OF Wed 9pm, X Fri 3pm — both green). No failures.

Each per-surface action is linked into the audit drawer with vacation_replay=false (these aren't replays — they're the vacation pause itself); the resume actions carry resumed_from_vacation=true so the audit shows the boundary.

Edge cases

  • Overlap with active tour (per H §H-Q1): if a declared tour (brief H §H3) overlaps the vacation range, the confirmation card surfaces a working-register warning: "Berlin tour Oct 37 sits inside this vacation. Vacation wins — tour wording shifts to 'returning Monday' even on the Berlin announcement. Confirm anyway, or shorten vacation?" Quinn picks. Default is vacation-wins (safer); shorten-vacation reopens Step 2 date picker.
  • Scheduled posts already in queue: per H §H1, vacation pauses future drafts only. Anything already in the publisher queue still fires at its scheduled time. Mentioned explicitly in Step 1 explainer so this never surprises.
  • Re-enable mid-vacation: tapping vacation toggle while already active is a no-op (silently). To extend, Quinn opens the banner sheet → "extend by 1 day / 3 days / through next Sunday." To shorten, "end now" path (Step 8 manual end).
  • Vacation extends past 30d default: vacation mode is capped at 30 days at confirmation time. If Quinn picks a range > 30d, the picker shows a working-register inline note: "Vacation longer than 30 days? Cocotte will check in at day 30 to confirm you still want it off." At day 30, a low-stakes push asks Quinn to extend or end. No auto-end at 30d — the check-in is informational.
  • Vacation + kill switch active simultaneously: kill switch takes precedence (plain register beats hearth). Vacation banner is replaced by kill-switch banner. On kill-switch resume, vacation resumes its remaining range without re-confirmation.
  • Voice "I'm off" with ambiguous date range ("next week"): ai-copilot disambiguates in chat before the confirmation card. "Next week — Mon May 25 through Sun May 31? Or starting today?"
  • Provider-coop incoming during vacation (per brief N): coop intel still arrives and gets logged. triage still flags safety-relevant items as high-stakes interrupts — vacation doesn't silence the safety axis.

Voice / TTS specifics

Voice trigger "I'm off Tuesday through Sunday" / "take me out next week" routes through ai-copilot's intent classifier (not the kill-switch keyword spotter — this isn't a panic path). Latency target <2s including STT.

Spoken confirmation, working register:

Vacation Tuesday through Sunday. Eight directories off, tour wording shifts, DMs auto-reply away. Confirm?

Quinn says "yes" → activated. "No" or "wait" → "Holding off. Tell me when." First-time invocation also reads the Step 1 explainer aloud if invoked by voice (TTS reads the bullet list as prose — per voice §V8 read-aloud check).

On auto-resume morning, the daily digest's TTS opening drops to hearth-warmest:

Back on. Six steady days. Bumps starting up again across the directories.

On failure (a bookings-* specialist couldn't pause one of its surfaces): voice flips to plain.

Couldn't pause TS4Rent — they didn't accept the change. You're still bumping there. Re-auth or pause by hand?

  • brief H §H1 — vacation-mode spec + explainer detail.
  • brief K §K3f — location-detail gating during tour wording shift. kill-switch.flow.md — parallel staged-pause pattern.
  • brief R — tour-vacation conflict resolution (H-Q1).
  • brief P §P3 — per-source DM posture during away.
  • brief C §C1 — quiet-hours interaction (vacation respects quiet hours; doesn't override them).
  • brief I §I1 — daily digest renders the vacation block + resume receipts.
  • brief L — bumping specialists that subscribe to the mass-pause event.
  • brief S §S5 — per-surface vacation overrides.
  • voice §V2a/b/c — hearth for receipts, working for the decision, plain for failure.