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>
108 lines
7.5 KiB
Markdown
108 lines
7.5 KiB
Markdown
# tryst-home-cities.screen
|
||
|
||
Tryst home-cities management — view + change Quinn's home cities, with cadence-gated change cooldown. Implements [surface-tryst.brief.md §7](./surface-tryst.brief.md). **Replaces** the earlier (incorrect) `tryst-location-lock.screen.md`, which mis-modeled Tryst as a fee-gated monthly lock; the real model is cadence-gated, N cities per tier, Y days between changes. Voice: working; plain on cooldown / tier-limit constraints.
|
||
|
||
## Layout (full-screen sheet)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────┐
|
||
│ Cancel Tryst home cities Save │ 56pt
|
||
├─────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ─── Your tier ─── │
|
||
│ TLC Premium · N home cities · change every Y d │ live tier info
|
||
│ Tier supports: 3 home cities · 14-day cadence │ parametric — Quinn confirms │
|
||
│ │
|
||
│ ─── Current home cities ─── │
|
||
│ ┌─────────────────────────────────────────────┐│
|
||
│ │ San Francisco · primary · since 2026-04-12 ││ card per city
|
||
│ │ [ Drop ] (after cooldown) ││
|
||
│ └─────────────────────────────────────────────┘│
|
||
│ ┌─────────────────────────────────────────────┐│
|
||
│ │ Berkeley · secondary · since 2026-04-12 ││
|
||
│ │ [ Drop ] (after cooldown) ││
|
||
│ └─────────────────────────────────────────────┘│
|
||
│ ⊕ Add a city (1 slot remaining) │ slot count
|
||
│ │
|
||
│ ─── Change cooldown ─── │
|
||
│ Next change available: 7 days (2026-05-25) │ countdown
|
||
│ ⓘ Tryst lets you change home cities every │
|
||
│ Y days. Cooldown applies to all slots. │
|
||
│ │
|
||
│ ─── Tours ─── │
|
||
│ Active tours don't count against home cities. │
|
||
│ • Berlin (Oct 3–7) — declared, doesn't consume │
|
||
│ a home-city slot │
|
||
│ [ Manage tours → ] │
|
||
│ │
|
||
└─────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## Components
|
||
|
||
| Component | Notes |
|
||
|---|---|
|
||
| Top bar | Cancel + Save (Save disabled until any pending change is valid + within cadence). |
|
||
| Tier info | Live tier (basic / TLC / etc.) + the N + Y numbers for that tier. Pulled from Tryst on connect; cached. |
|
||
| Home-city card | One per current city: name + role (primary/secondary/…) + since-date + Drop affordance (gated by cooldown). |
|
||
| Add-a-city slot | When slots remain, this row appears as the affordance. Opens city picker. |
|
||
| Cooldown countdown | Live timer + next-available date. Affects all home-city changes (not per-slot). |
|
||
| Tours subsection | Read-only summary that tours are exception-layer; links to tour management. |
|
||
|
||
## States
|
||
|
||
1. **At slot count, no change pending** — full layout; no Save needed.
|
||
2. **Slot available, no change pending** — Add-a-city affordance prominent.
|
||
3. **Change pending, within cooldown** — Save disabled; banner: "Cooldown ends in N days. Save & schedule for then?" + opt-in scheduled-change affordance.
|
||
4. **Change pending, cooldown elapsed** — Save enabled.
|
||
5. **Saving** — banner: "Updating Tryst..."
|
||
6. **Saved** — sheet dismisses; receipt: "Home cities updated: SF + Berkeley → SF + Berkeley + Oakland."
|
||
7. **Save failed (Tryst-side)** — banner with retry per brief M.
|
||
8. **Tier upgrade detected mid-flow** (rare; Quinn upgraded between sheet open + save) — banner: "Your tier now supports {new-N} cities. Refresh." Adjusts slot count.
|
||
9. **Tour conflict** (Quinn adds a home city for a date her tour is in that same city) — soft warning: "You're touring {city} that week. The tour declaration already makes you visible there. Use a different home-city slot?"
|
||
10. **Cooldown reset detected** (Tryst's policy changed, e.g. promo) — banner: "Tryst opened up changes early. Cooldown waived." Save enabled.
|
||
11. **VoiceOver** — tier info first; each city card announces role + since-date + drop-availability.
|
||
|
||
## Interactions
|
||
|
||
- **Tap city card** → opens city detail (rare — defer).
|
||
- **Tap "Drop"** → confirms (medium-stakes); if cooldown elapsed, removes the city; if within cooldown, surfaces banner.
|
||
- **Tap "Add a city"** → city picker (autocomplete from Tryst's city list); placeholder if no city matches.
|
||
- **Tap "Manage tours →"** → [tour-leg-detail.screen.md](./tour-leg-detail.screen.md).
|
||
- **Tap Save** → commits any pending diffs; writes audit row per brief I.
|
||
- **Swipe-down with dirty** → "Discard pending changes?"
|
||
|
||
## Edge cases
|
||
|
||
- **Tier info not fetched yet** (Quinn just connected) — placeholder copy "Loading your tier..." with skeleton.
|
||
- **Slot count = 0 (basic tier?)** — UX collapses to "single home city only at your tier; upgrade to add more."
|
||
- **Cooldown crossing daylight-savings / TZ boundary** — uses Tryst's server time, not Quinn's local; display in both formats.
|
||
- **Trying to drop the only home city** — Save blocked: "Tryst requires at least 1 home city."
|
||
- **City not in Tryst's autocomplete list** — placeholder fallback ("Tryst doesn't have this city. Try a nearby one?").
|
||
- **Tour declared in a city Quinn already has as home** — chip: "{city} is already a home city; tour declaration is redundant but harmless. Skip declaring?"
|
||
- **Cooldown reset to zero from Tryst-side admin action** — banner shows the reset event.
|
||
|
||
## *Generalization callout*
|
||
|
||
Home-city / location-lock models vary widely across escort directories:
|
||
|
||
- **TS4Rent**: documented in surface-ts4rent (TBD). Different model.
|
||
- **Slixa**: documented in surface-slixa (TBD). Different model.
|
||
- **Eros**: per-city listings (Quinn can list in N cities with separate ads each, no unified "home"). Different model.
|
||
- **Most content surfaces (OF, X, IG, …)**: no city model — global presence.
|
||
|
||
Per-surface brief **must** flag the exact mechanic. Do NOT reuse Tryst's screen layout assuming the model carries over.
|
||
|
||
## Related
|
||
|
||
- [surface-tryst.brief.md §7](./surface-tryst.brief.md) — parent (corrected 2026-05-18).
|
||
- [tryst-profile-editor.screen.md](./tryst-profile-editor.screen.md) — sibling profile-level editing.
|
||
- [tour-leg-detail.screen.md](./tour-leg-detail.screen.md) — tour-as-exception layer.
|
||
- [Brief I](./I-audit-trust-replay.brief.md) — every home-city change = audit row.
|
||
- [Brief M](./M-error-degraded-modes.brief.md) — save-failure pattern.
|
||
|
||
## Out of scope
|
||
|
||
- The exact N + Y per Tryst tier — Quinn confirms once apricot is reachable + we've connected.
|
||
- Multi-account home-city management (single-account at P0).
|
||
- Predictive home-city suggestions based on tour patterns (defer; P3+).
|