Skip to content

Stories from the Past

A gentle, one-question-at-a-time memory session built from the senior's own life story. Recognition-first, never framed as pass/fail, reassuring on a miss. Every answer is captured as a research-grade AnswerRecord so good-day / bad-day cognitive patterns can be measured over time.

The Memories screen today

The app's one screen, src/features/memories/memories-screen.tsx, shows the reminiscence items of this pool as memories, without asking for answers:

  • The start screen has a friendly fencer avatar, "Memories", and Start. Start gives a medium haptic tap.
  • A session draws up to five memories (MEMORIES_PER_SESSION), each shown once. Nothing repeats within a session. For now, Tom's skydiving video always comes first (FIRST_MEMORY_ID); the rest are a random draw.
  • Only memories with a photo, a memory illustration or a video in the app are shown (hasMedia). A memory with only words, or with a video still waiting to be added, is left out.
  • A memory is its picture or video, full screen and shown whole, with no title, story, or prompt beside it. Screen readers still hear the title and the picture's description.
  • The first tap on the memory slides up an overlay from the bottom. It holds the memory's context reminder (memoryContext on the item), then the song that is playing, then Restart and Next. They stay until the senior moves on or restarts. The picture shrinks to the space above the overlay, so it is still seen whole. On the last memory, Exit takes Next's place.
  • A context reminder is a short, plain line addressed to the senior ("You married Nyna on November 18, 1968"), written only from facts the family or the public record gave. It may quote the senior's own words. A memory without one shows its story quote in the overlay instead; the two never show together, so the overlay fits the smallest screen (7 lines of body text, the memoryContext budget).
  • Exit leads to the quit screen: a large question mark and "So, what did you think of the experience today?", with Back to start.
  • A memory can carry a photo, a muted looping video, or a memory illustration, and a song behind it.

The quiz described below is still in the code but no longer routed.

Where the code lives

  • src/features/stories/types.ts — the domain model. QuizQuestion is authored content (a question with a known answer and a sourceQuote for verification). AnswerRecord is the research signal captured per answer: correctness, latency, retries, assistance, input method, day rating, and time-of-day bucket.
  • src/features/stories/questions.ts — the seed question pool. The first twenty items are drawn from a recorded family interview. The rest are an extended set: same life, same facts, but paraphrased sourceQuote lines that a Loved One should confirm before a real session. In production this content is authored by the Loved One from the senior's own stories.
  • src/features/stories/session.ts — the per-pass draw (pickSessionQuestions) and the Fisher-Yates shuffle it uses. Randomness is injectable so tests stay deterministic.
  • src/features/stories/scoring.ts — grading (isCorrectChoice), the research record builder (buildAnswerRecord), and the time-of-day bucket helper. The clock is injectable so tests stay deterministic.
  • src/features/stories/stories-screen.tsx — the playable screen.
  • app/(tabs)/stories.tsx — the tab route.

One pass

A session asks three questions (QUESTIONS_PER_SESSION), drawn at random from the whole pool. Short passes end while the session still feels easy, and a random draw means a repeat visit that day asks something different rather than marching through the same list. Ungraded reminiscence prompts are moved to the end of the draw so a pass finishes on warmth.

The draw happens once when the session starts, and again on "Start again". It never reshuffles mid-session, so the "Question 2 of 3" counter stays honest.

Question formats

  • multiple-choice — recognition among three or four options. The dignity-preserving default.
  • this-or-that — two options; lowest cognitive load, good for hard days.
  • open-recall — a spoken free answer matched against accepted answers. Richest signal; kept optional.
  • reminiscence — an ungraded invitation to tell a story. correct is null. Exists to end a session on warmth.

Accessibility

The screen reuses the shared accessible primitives: themed components, the required-role Pressable with a 44pt minimum target, and text that scales with the platform font size. One question fills the screen at a time. Answer feedback is announced with AccessibilityInfo.announceForAccessibility and a polite live region, and a miss is met with reassurance, not a red X. See docs/accessibility.md for the baseline this builds on.

Research data model

AnswerRecord is the unit the research side aggregates across days. Because each question has a stable ground-truth answer, day-to-day variation in a person's answers is a signal about cognition rather than about the question. The same records feed the shared Stats Display and the Test Remedies feature.

Next steps

  • Persist AnswerRecords and surface trends in the Stats Display.
  • Add the Loved One authoring flow (interview import, question review, distractor editing, photo/audio attachment).
  • Implement open-recall with voice input and answer matching.
  • Capture a once-per-session DayRating ("good / okay / hard").