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

190 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Vacation-mode flow
End-to-end: from "I'm off TuesdaySunday" through auto-resume + digest. Pairs with [brief H](./H-recurring-chores.brief.md) §H1 vacation-mode and the per-source posture in [brief P](./P-inboxes.brief.md) §P3.
Sibling-of-but-different-from the [kill-switch flow](./kill-switch.flow.md). 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](./S-settings-ia.brief.md) §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](./00-system-voice.md) §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](./L-specialists-fleet.brief.md) 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](./K-safety-blocklist.brief.md) §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](./P-inboxes.brief.md) §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](./Q-vigil-journal-auto-conversations.brief.md) + [brief I](./I-audit-trust-replay.brief.md) §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](./I-audit-trust-replay.brief.md) §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](./H-recurring-chores.brief.md) §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](./N-provider-coop.brief.md)): 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](./00-system-voice.md) §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?
## Related
- [brief H](./H-recurring-chores.brief.md) §H1 vacation-mode spec + explainer detail.
- [brief K](./K-safety-blocklist.brief.md) §K3f location-detail gating during tour wording shift. [`kill-switch.flow.md`](./kill-switch.flow.md) parallel staged-pause pattern.
- [brief R](./R-tours-events-hotels.brief.md) tour-vacation conflict resolution (H-Q1).
- [brief P](./P-inboxes.brief.md) §P3 per-source DM posture during away.
- [brief C](./C-notifications.brief.md) §C1 quiet-hours interaction (vacation respects quiet hours; doesn't override them).
- [brief I](./I-audit-trust-replay.brief.md) §I1 daily digest renders the vacation block + resume receipts.
- [brief L](./L-specialists-fleet.brief.md) bumping specialists that subscribe to the mass-pause event.
- [brief S](./S-settings-ia.brief.md) §S5 per-surface vacation overrides.
- [voice](./00-system-voice.md) §V2a/b/c hearth for receipts, working for the decision, plain for failure.