[feature] Intimate-timing predictions for romantic partners — 6 gaps surfaced by 6-month seeded arc #167

Closed
opened 2026-09-10 00:33:26 +00:00 by Mark · 1 comment
Owner

Context

Follow-up to #166. Ran the full predictive stack against a seeded 6-month romance arc (32 interactions, 6 gifts, 4 anniversaries, 2 active goals) on a real Kindle device. The existing engine surfaces Emergent Observations, cadence, and gift ideas well. But it's missing 6 timing/prediction surfaces that would be valuable specifically for romantic partners.

What's working

Per-person page surfaces for relationshipType: Partner:

  • Cadence status ("On track · Last contact 6h")
  • Goal cadence ("7 days until next check-in")
  • Emergent Observations with 3 suggestion types (ask, do together, gift)
  • Source attribution (the actual quotes that fed each observation)

What's missing

1. Anniversary countdown surfaced on Person Detail (not just Home)

  • 6-month anniversary is Sep 12 (3 days away from a Sep 9 seed)
  • Home page shows it in the date events list
  • Person Detail page does NOT show "X days until your 6-month anniversary"
  • Expected: prominent card on Person Detail when an anniversary is within 14 days

2. Milestone progression

  • After 6 months of dating, the schema knows we: met parents (done), first trip (done), said I love you (done), discussed moving in (active)
  • App doesn't surface "what's next at this stage" or track which milestones we've passed
  • Expected: a "Relationship arc" timeline or "Milestones passed / Next" widget

3. Intimacy-level aggregation

  • Interaction.intimacyLevel: 1-5 exists in the schema
  • I set it on the Big Sur trip interactions (level 3)
  • Engine doesn't aggregate it: no "average intimacy" trend, no "intimacy progression" surface
  • Expected: a metric showing intimacy growth curve over time

4. Anniversary-aware gift suggestions

  • I logged a gift idea for the photography exhibit on Sep 15
  • Gift suggestion is tied to the keyword "photography" (3 observations)
  • But it doesn't tie to the upcoming exhibit — "Her photography exhibit is in 6 days, your saved gift idea is the perfect fit"
  • Expected: when a dateEvent is within 30 days, surface saved gift ideas that match the event's theme

5. Natural-rhythm expression

  • App computes cadence.avgDaysBetween (used internally for drift detection)
  • But doesn't express it as a human-readable stat: "You usually see Jordan every 5 days"
  • Expected: surfaced in the Connection Goal section

6. Quality trend by phase

  • App computes closenessTrend.direction (drifting / stable / growing)
  • Doesn't break it down by month or relationship phase
  • A partner relationship might show "Quality dipped in month 4, recovered by month 5"
  • Expected: phase-aware quality analysis

Reproduction

# After fix lands
adb shell pm clear com.kin.prm
# Seed: 32 interactions spanning 6 months with anniversaries at month 1, 2, 3, 6
# Seed: 2 active goals (frequency: date night weekly, milestone: move in together)
# Seed: intimacyLevel: 1-5 on selected interactions
# Open person detail for the partner → check what's surfaced

Suggested implementation locations

  • Anniversary countdown: src/pages/PersonDetail.tsx + a new AnniversaryCountdown component
  • Milestone progression: new RelationshipMilestoneTimeline component reading dateEvents + filtering by relationship type
  • Intimacy aggregation: extend src/lib/metrics-engine.ts computePersonMetrics with an intimacy section
  • Anniversary-aware gifts: extend src/lib/metrics-engine.ts generateSuggestionsForPerson with a "gift_for_upcoming_event" type
  • Natural rhythm: surface cadence.avgDaysBetween in the existing Connection Goal section
  • Quality by phase: extend closenessTrend in metrics-engine.ts to bucket by month

Severity

Medium — predictive surfaces are the app's core value-add for romantic partners. Currently the engine treats a romantic partner the same as any other relationship type; the partner-specific surfaces above would meaningfully differentiate the experience.


Update (2026-09-09) — Vault boundary clarification

User clarified that intimate-aware features live in the Little Black Book vault, not the main DB. Re-classifying each gap:

# Gap Storage
1 Anniversary countdown on Person Detail Main DB — celebrations are not private
2 Milestone progression Main DB — relationship arc is shared
3 Intimacy-level aggregation Vault — explicitly named intimacyLevel, by definition private
4 Anniversary-aware gift suggestions Main DB — gift ideas based on shared themes are not private
5 Natural-rhythm expression ("you see X every 5 days") Main DB — shared with partner openly
6 Quality by phase Main DB if only cadence-based; vault if it includes mood-based quality

Item #3 should be implemented as a vault feature: a new vaultIntimacy table or vault-scoped metrics engine that aggregates intimacyLevel from vault-stored interactions. Surfaced only inside the unlocked vault view.

Implementation reference: vault architecture at src/vault/vault-db.ts and src/vault/VaultStore.ts. Use the same assertUnlocked() gate pattern.

## Context Follow-up to #166. Ran the full predictive stack against a seeded 6-month romance arc (32 interactions, 6 gifts, 4 anniversaries, 2 active goals) on a real Kindle device. The existing engine surfaces Emergent Observations, cadence, and gift ideas well. But it's missing 6 timing/prediction surfaces that would be valuable specifically for romantic partners. ## What's working Per-person page surfaces for `relationshipType: Partner`: - Cadence status ("On track · Last contact 6h") - Goal cadence ("7 days until next check-in") - Emergent Observations with 3 suggestion types (ask, do together, gift) - Source attribution (the actual quotes that fed each observation) ## What's missing ### 1. Anniversary countdown surfaced on Person Detail (not just Home) - 6-month anniversary is Sep 12 (3 days away from a Sep 9 seed) - Home page shows it in the date events list - Person Detail page does NOT show "X days until your 6-month anniversary" - Expected: prominent card on Person Detail when an anniversary is within 14 days ### 2. Milestone progression - After 6 months of dating, the schema knows we: met parents (done), first trip (done), said I love you (done), discussed moving in (active) - App doesn't surface "what's next at this stage" or track which milestones we've passed - Expected: a "Relationship arc" timeline or "Milestones passed / Next" widget ### 3. Intimacy-level aggregation - `Interaction.intimacyLevel: 1-5` exists in the schema - I set it on the Big Sur trip interactions (level 3) - Engine doesn't aggregate it: no "average intimacy" trend, no "intimacy progression" surface - Expected: a metric showing intimacy growth curve over time ### 4. Anniversary-aware gift suggestions - I logged a gift idea for the photography exhibit on Sep 15 - Gift suggestion is tied to the keyword "photography" (3 observations) - But it doesn't tie to the *upcoming exhibit* — "Her photography exhibit is in 6 days, your saved gift idea is the perfect fit" - Expected: when a dateEvent is within 30 days, surface saved gift ideas that match the event's theme ### 5. Natural-rhythm expression - App computes `cadence.avgDaysBetween` (used internally for drift detection) - But doesn't express it as a human-readable stat: "You usually see Jordan every 5 days" - Expected: surfaced in the Connection Goal section ### 6. Quality trend by phase - App computes closenessTrend.direction (drifting / stable / growing) - Doesn't break it down by month or relationship phase - A partner relationship might show "Quality dipped in month 4, recovered by month 5" - Expected: phase-aware quality analysis ## Reproduction ```bash # After fix lands adb shell pm clear com.kin.prm # Seed: 32 interactions spanning 6 months with anniversaries at month 1, 2, 3, 6 # Seed: 2 active goals (frequency: date night weekly, milestone: move in together) # Seed: intimacyLevel: 1-5 on selected interactions # Open person detail for the partner → check what's surfaced ``` ## Suggested implementation locations - Anniversary countdown: `src/pages/PersonDetail.tsx` + a new `AnniversaryCountdown` component - Milestone progression: new `RelationshipMilestoneTimeline` component reading `dateEvents` + filtering by relationship type - Intimacy aggregation: extend `src/lib/metrics-engine.ts` `computePersonMetrics` with an `intimacy` section - Anniversary-aware gifts: extend `src/lib/metrics-engine.ts` `generateSuggestionsForPerson` with a "gift_for_upcoming_event" type - Natural rhythm: surface `cadence.avgDaysBetween` in the existing Connection Goal section - Quality by phase: extend `closenessTrend` in `metrics-engine.ts` to bucket by month ## Severity Medium — predictive surfaces are the app's core value-add for romantic partners. Currently the engine treats a romantic partner the same as any other relationship type; the partner-specific surfaces above would meaningfully differentiate the experience. --- ## Update (2026-09-09) — Vault boundary clarification User clarified that intimate-aware features live in the **Little Black Book** vault, not the main DB. Re-classifying each gap: | # | Gap | Storage | |---|---|---| | 1 | Anniversary countdown on Person Detail | **Main DB** — celebrations are not private | | 2 | Milestone progression | **Main DB** — relationship arc is shared | | 3 | Intimacy-level aggregation | **Vault** — explicitly named `intimacyLevel`, by definition private | | 4 | Anniversary-aware gift suggestions | **Main DB** — gift ideas based on shared themes are not private | | 5 | Natural-rhythm expression ("you see X every 5 days") | **Main DB** — shared with partner openly | | 6 | Quality by phase | **Main DB** if only cadence-based; **vault** if it includes mood-based quality | Item #3 should be implemented as a vault feature: a new `vaultIntimacy` table or vault-scoped metrics engine that aggregates `intimacyLevel` from vault-stored interactions. Surfaced only inside the unlocked vault view. Implementation reference: vault architecture at `src/vault/vault-db.ts` and `src/vault/VaultStore.ts`. Use the same `assertUnlocked()` gate pattern.
Author
Owner

↳ Parent issue: #169 (privacy audit — every privacy-sensitive field traced back to the Little Black Book). All work on this issue should reference #169's field-by-field audit and the architectural fix sketch.

↳ Parent issue: #169 (privacy audit — every privacy-sensitive field traced back to the Little Black Book). All work on this issue should reference #169's field-by-field audit and the architectural fix sketch.
Mark 2026-09-13 00:58:38 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Mark/kimi_agent_kin_app_sync#167
No description provided.