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>
190 lines
13 KiB
Markdown
190 lines
13 KiB
Markdown
# Vacation-mode flow
|
||
|
||
End-to-end: from "I'm off Tuesday–Sunday" 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 3–7 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.
|