Closer/seed/questions/DAILY_SINGLE_CHOICE_WEEKDAY...

27 KiB
Raw Permalink Blame History

Daily Single Choice Weekday System v9 — Importer-Aligned, Human-Voice

This document defines the Closer daily weekday question pack.

This is a special pack. It is not a normal mixed category pack.

Pack Identity

Logical pack id:

daily_single_choice_weekly_v1

Production category id:

daily_fun_mc

Current compatibility filename:

daily_fun_multiple_choice_v3.json

Possible future filename:

daily_single_choice_weekly_v1.json

The logical pack id and the production category id are not interchangeable.

  • category.id must remain daily_fun_mc while the current app/database contract uses that category.
  • every Daily question must use "category_id": "daily_fun_mc"
  • store "pack_id": "daily_single_choice_weekly_v1" inside category metadata
  • the compatibility filename does not supply category identity
  • the production file must include the full category object and full questions array

When editing the existing production pack, preserve its current display name, description, access, and icon unless the product owner explicitly changes them.

Required production wrapper

{
  "category": {
    "id": "daily_fun_mc",
    "display_name": "Daily Fun",
    "description": "One quick couples-game question for each day, including wildcard surprise days.",
    "access": "mixed",
    "icon_name": "calendar_today",
    "metadata": {
      "pack_id": "daily_single_choice_weekly_v1",
      "question_type_policy": "single_choice_only",
      "total_questions": 511,
      "free_questions": 86,
      "premium_questions": 425
    }
  },
  "questions": []
}

The example documents the required shape. In the live file, preserve the existing category display fields and icon unless they are intentionally changed.

A flat document with id, title, count, and questions but no category object is not importable as the Daily category.

Required Counts

Required Counts

This special daily pack uses:

Weekday pack (frozen — do not change these 500):

  • 500 total weekday questions
  • 75 free weekday questions
  • 425 premium weekday questions
  • 500 single_choice questions
  • 4 options per question preferred
  • 4 to 6 options allowed

Wildcard add-on (new — see the Wildcard Mode section):

  • 11 free single_choice wildcard questions (free only; pool size must stay coprime with 10)

New pack totals with the wildcard add-on:

  • 511 total · 86 free · 425 premium · 511 single_choice

Normal category packs are capped at 150 questions. This 511-question daily system is a documented special-pack exception, so the normal maximum and mixed-type planning target do not apply here.

Required Type

Every question must use:

"type": "single_choice"

Single choice means the user picks one best answer.

Daily Voice Standard

Daily questions should feel like a small couples game moment.

They should sound like two people deciding what to do, eat, watch, laugh about, try, flirt with, or enjoy together today.

Daily questions should be:

  • quick
  • warm
  • concrete
  • playful
  • fun before merely useful
  • easy to answer in under 10 seconds
  • relationship focused
  • doable in normal life

Daily questions should not sound like:

  • therapy homework
  • self-help worksheets
  • HR wellness surveys
  • abstract emotional processing
  • generic AI relationship advice
  • household admin
  • bedtime logistics
  • chore planning

If the question sounds like a couples counselor wrote it, rewrite it.

If the question sounds like roommates managing a house, rewrite it.

Daily Fun Gate

A daily question passes only if it creates at least one of these:

  • a smile
  • a laugh
  • a flirt
  • a cute choice
  • a tiny date idea
  • a playful debate
  • a small memory
  • a small thing the couple might actually try tonight

Warm is not enough. Concrete is not enough. Useful is not enough.

The daily pack should help couples enjoy each other, not manage the house.

Ask this before approving any daily question:

Would this feel fun, sweet, or playful inside the app tonight?

If the honest answer is "useful, but not fun", rewrite it.

Research-Informed Fun Rules

Recent relationship-question products and articles point to the same pattern: the strongest prompts feel like a game first, then create connection as a side effect. Paired markets quick, fun check-ins and says the relationship should not feel like work. Conversation-card coverage emphasizes that cards give people permission to skip small talk and reveal something interesting. Date-night and couples-question lists work best when they use preferences, memories, flirty choices, funny hypotheticals, tiny adventures, and low-pressure honesty.

Use this as the daily pack standard:

  • Game first, insight second.
  • A question should create a choice, mini-mission, playful debate, flirt, memory, or laugh.
  • Avoid questions that only ask users to manage the relationship better.
  • Avoid questions that sound like advice, coaching, therapy, or household planning.
  • Ask about wants, favorites, memories, tiny plans, silly preferences, and sweet attention.
  • For flirty or spicy prompts, start light, keep it consent-based, and never make the user feel cornered.
  • For deeper prompts, make them feel like a game card, not a therapy intake form.

A daily question should answer at least one of these:

  • What would be fun to choose right now?
  • What would be cute to try tonight?
  • What would make us laugh?
  • What would make us flirt a little?
  • What would help us learn a tiny new thing about each other?
  • What would create a small shared memory?

If the answer is only "this would be responsible", reject it. Adults already have bills. The app does not need to become another one.

Daily Game Mechanics

Every daily question should use at least one clear game mechanic.

Preferred mechanics:

  • Would-you-rather style choice
  • Fake award
  • Tiny mission
  • Mini date pick
  • Snack draft
  • Silly bet
  • Guilty-pleasure pick
  • Memory pick
  • Flirty pick
  • Compliment choice
  • Photo challenge
  • One-song challenge
  • Mystery treat
  • Cute dare, kept low pressure
  • "Choose our vibe" for the next hour

Do not overuse one mechanic. A full weekday should not feel like 70 versions of the same snack question wearing different socks.

Option Quality Standard

Daily options should be:

  • vivid enough to picture
  • short enough to tap quickly
  • similar in effort
  • similar in emotional weight
  • tied to the prompt
  • fun, sweet, flirty, silly, or date-like

Avoid vague options like:

  • Something sweet
  • A cute moment
  • More connection
  • Better communication
  • Quality time

Avoid weird domestic options like:

  • The good blanket saved
  • A clean counter
  • A bedtime plan
  • Dishes handled
  • The laundry moved

Better option style:

  • A two-song kitchen dance
  • A dessert walk
  • A ridiculous fake award
  • A flirty text from across the room
  • A corner-store snack hunt
  • A couch movie trailer voice

Prefer These Daily Option Types

Use options like:

  • snacks
  • tiny dates
  • silly bets
  • inside jokes
  • couch games
  • music picks
  • mini adventures
  • playful compliments
  • low-pressure flirting
  • cozy but fun moments
  • small surprises
  • dramatic fake awards
  • guilty-pleasure shows
  • cute photos
  • dessert runs
  • short walks with a purpose

Avoid These Daily Option Types

Avoid options centered on:

  • bills
  • laundry
  • dishes
  • clean counters
  • errands
  • appointments
  • calendars
  • bedtime planning
  • household maintenance
  • saved blankets
  • clinical reassurance phrasing

These can exist in real relationships. They should not dominate the daily fun pack.

Do not rebrand chores as romance unless the question clearly makes the moment playful.

Banned Daily Tone Words

Avoid these in daily questions:

  • reset
  • process
  • mental load
  • emotional load
  • autopilot
  • pressure
  • soft landing
  • relationship dynamic
  • name the mood
  • emotional processing
  • communication style
  • conflict framework

These words push the pack toward therapy voice.

Daily Voice: Human and Funny

The daily pack is the funniest surface in the app, so the "Write Like a Human" standard in QUESTION_CONTENT_GUIDE.md (section 8A) binds hardest here. Read it before writing any daily batch.

Daily-specific applications:

  • The joke must live in the detail, never in a label. If "silly" or "ridiculous" is doing the humor work, the line has no humor. Cut the adjective and make the option specific enough to be funny alone.
  • The house register is adult deadpan: mock-formality and fake stakes for tiny real things. Not chaotic-quirky, not children's-entertainer energy.
  • The weekday theme is the angle, not a template stem. Every Thursday prompt opening "What's the funniest..." is a machine fingerprint. Approach each weekday's mood from a different direction every time.
  • Wildcards get the single most absurd detail in the pack — still adult deadpan, still one absurd detail maximum.
  • The guides' example nouns ("two-song kitchen dance", "dessert walk", "snack board") are categories, not vocabulary. Shipping them verbatim is a reject.
  • No exclamation marks in prompts. No emoji in prompts or options. Options in sentence case.
  • Aim for roughly one question in four to pass the snort test (partner would snort and show the other the phone); the rest land warm and concrete. A pack that strains for a laugh on every line is as exhausting as one with none.

Good Daily Examples

Good:

What tiny date move sounds best tonight?

Options:

  • Dessert on the couch
  • A two-song kitchen dance
  • A short walk with snacks
  • A ridiculous movie pick

Good:

Which tiny win should we celebrate like it matters?

Options:

  • Find a new dessert spot
  • Try a ridiculous soda combo
  • Pick tomorrow's fun song
  • Build a tiny snack board

Good:

Before phones win, what should we do for fun?

Options:

  • Pick a ridiculous snack
  • Watch one guilty-pleasure clip
  • Trade dramatic compliments
  • Choose tomorrow's tiny date

Good:

What small surprise would make you smile tonight?

Options:

  • A favorite drink
  • A flirty text from the next room
  • A mystery snack
  • A song picked just for us

Bad Daily Examples

Bad:

Which reset would help us avoid autopilot?

Why it fails:

  • therapy coded
  • abstract
  • not game-like
  • sounds generated

Bad:

Before phones win, what would make the night nicer?

Bad options:

  • A clean counter
  • A quick shoulder rub
  • A simple bedtime plan
  • The good blanket saved

Why it fails:

  • too much household admin
  • not playful enough
  • one option is weirdly phrased
  • it does not feel like a couples game

Bad:

What would help us process the emotional load of the week?

Why it fails:

  • too clinical
  • too heavy for daily
  • sounds like a worksheet

Weekday Lineup

Monday: Mood Check Monday

Purpose: pick what kind of day the relationship needs.

Vibe: gentle, sweet, simple, start of week, still fun.

Use prompts about:

  • cozy mini dates
  • easy snacks
  • low-effort laughs
  • tiny playful care
  • feeling picked on purpose
  • one cute thing after a long day

Avoid making Monday a housework recovery plan.

Example:

What tiny thing would make Monday feel more like us?

Required tag:

daily_monday_mood_check

Tuesday: Tiny Win Tuesday

Purpose: pick one small win to enjoy together.

Vibe: low effort, practical only if cute, playful, doable.

Use prompts about:

  • a new snack
  • a tiny date plan
  • a silly reward
  • choosing something together
  • a small fun challenge

Avoid bills, appointments, laundry, dishes, errands, and calendar cleanup.

Example:

Which tiny win should we celebrate like it matters?

Required tag:

daily_tuesday_tiny_win

Wednesday: Real One Wednesday

Purpose: pick the most honest answer.

Vibe: simple, grounded, lightly meaningful, not therapy.

Use prompts about:

  • real preferences
  • small truths
  • what sounds best tonight
  • what would feel nice
  • what the couple actually wants

Options must be complete answers. Do not use sentence fragments like "When I need reassurance".

Example:

What would make tonight feel more like us?

Required tag:

daily_wednesday_real_one

Thursday: Laugh It Off Thursday

Purpose: pick something silly or low pressure.

Vibe: weird, funny, tired-week energy.

Use prompts about:

  • fake awards
  • dumb games
  • weird snacks
  • dramatic bits
  • couch games
  • inside jokes

Example:

What ridiculous little thing would improve our night?

Required tag:

daily_thursday_laugh

Friday: Flirty Friday

Purpose: pick something playful, sweet, or date-like.

Vibe: compliments, attraction, flirting, fun.

Use prompts about:

  • compliments
  • tiny date moves
  • playful teasing
  • low-pressure flirting
  • sweet attention
  • romantic but not explicit choices

Keep it consent-based and non-pushy.

Example:

What kind of flirting from me still works best?

Required tag:

daily_friday_flirty

Saturday: Side Quest Saturday

Purpose: pick a tiny adventure or date idea.

Vibe: playful, outside the routine, doable.

Use prompts about:

  • coffee runs
  • dessert trips
  • photo walks
  • thrift-store bets
  • mini missions
  • trying something new
  • tiny adventures

Example:

What kind of mini-adventure sounds most like us today?

Required tag:

daily_saturday_side_quest

Sunday: Slow Burn Sunday

Purpose: pick a warm intimacy or closeness answer.

Vibe: affectionate, cozy, lightly flirty, never pushy.

Use prompts about:

  • closeness
  • compliments
  • slow kisses
  • cuddly date ideas
  • sweet teasing
  • low-pressure affection

Avoid making Sunday a relationship checkup.

Example:

What kind of closeness would feel best tonight?

Required tag:

daily_sunday_slow_burn

Wildcard Mode (Surprise Days) — CONTENT NEEDED

Wildcard is not a weekday. It is a surprise override that can land on any day.

The app already promotes roughly 10% of days to a "Wildcard" theme (it fires when the day-of-year mod 10 equals 3 — about 37 days a year). On those days the app shows the header "Wildcard — The app has opinions" with the action line "Wildcard mission: say yes to one tiny weird idea." Today there are zero wildcard questions, so those days silently show a normal weekday question under the Wildcard banner. This section defines the missing content.

Wildcard voice

Playful, surprising, a little weird, low pressure. The feeling is the app just picked something unexpected for the two of you. Think tiny dares, silly "would you rather", spontaneous micro-plans, harmless chaos, "say yes to the odd option."

Because a wildcard day can land on any weekday, wildcard questions must be day-agnostic — never reference Monday/Friday/the weekend or a specific weekday vibe. They must read well no matter which day they appear on.

Same gates as the weekday packs (see Daily Fun Gate, Option Quality Standard, Banned Tone Words): quick, warm, PG-13 max on the free tier, 4 options preferred (46 allowed), single choice.

Wildcard counts

  • 11 free single_choice wildcard questions. Free only — the daily picker never draws from the premium pool, so premium wildcards would never be served. Do not author premium wildcards.
  • Added on top of the existing 500 weekday questions → new pack totals 511 total · 86 free · 425 premium (the "Required Counts" section above is updated to match).
  • Why 11, not 10 — this is a correctness constraint, not a preference. Wildcard days fall ~10 days apart (day-of-year mod 10 == 3) and the picker indexes epochDay % poolSize. A pool size that shares a factor with 10 (i.e. divisible by 2 or 5 — e.g. 10 or 12) collapses the rotation, so only a fraction of the questions ever appear in a given year. The wildcard pool size must be coprime with 10 (9, 11, 13, …). 11 gives full rotation with good freshness — do not round it to 10.

Wildcard IDs

Continue the existing sequence so ids stay sortable and unique — the picker sorts by id (the pack currently ends at _500, no gaps):

daily_single_choice_weekly_v1_501 … daily_single_choice_weekly_v1_511

Wildcard tags (EXACT — this is an app contract)

Every wildcard question must carry these tags, and must NOT carry any weekday_* tag or any weekday mode_* tag (a weekday mode tag would wrongly pull the wildcard into that weekday's pool):

"tags": [
  "daily",
  "single_choice",
  "best_fit",
  "mode_wildcard",     // REQUIRED — the app selects wildcard questions on this EXACT tag.
  "daily_wildcard",    // new-scheme weekday-style tag, kept for consistency
  "quick_answer"
]

mode_wildcard is non-negotiable. The client (DailyModeResolver.MODES["wildcard"].modeTag) and the server both filter on the literal string mode_wildcard. A wildcard question without this exact tag is invisible to the wildcard picker.

Wildcard question schema (copy this shape)

{
  "id": "daily_single_choice_weekly_v1_501",
  "category_id": "daily_fun_mc",
  "type": "single_choice",
  "text": "The app dares you: which tiny weird idea do we say yes to tonight?",
  "depth": 1,
  "access": "free",
  "sex": "neutral",
  "tags": ["daily", "single_choice", "best_fit", "mode_wildcard", "daily_wildcard", "quick_answer"],
  "options": [
    { "id": "swap_one_chore_for_a_dance", "text": "Swap one chore for a 2-song dance break" },
    { "id": "dessert_for_dinner_experiment", "text": "Dessert-for-dinner experiment" },
    { "id": "text_each_other_only_in_emoji", "text": "Only talk in emoji for an hour" },
    { "id": "rename_the_wifi_together", "text": "Rename the wifi together, right now" }
  ],
  "answer_config": {
    "options": [
      { "id": "swap_one_chore_for_a_dance", "text": "Swap one chore for a 2-song dance break" },
      { "id": "dessert_for_dinner_experiment", "text": "Dessert-for-dinner experiment" },
      { "id": "text_each_other_only_in_emoji", "text": "Only talk in emoji for an hour" },
      { "id": "rename_the_wifi_together", "text": "Rename the wifi together, right now" }
    ],
    "selection_style": "single"
  }
}

Wildcard authoring rules (easy-to-miss)

  • These 11 are net-new questions, not a patch. "Patch Discipline: Fix Only What Fails" freezes the existing 500 — it does not stop you creating the new wildcard set. Do not renumber or edit any 001500.
  • options must be mirrored exactly into answer_config.options (same ids, same text, same order) with "selection_style": "single" — the app reads the options from answer_config.
  • Option ids are lower_snake_case and unique within the question.
  • access is "free" for all 11 (there is no premium wildcard).
  • Field schema, types, and validation rules live in QUESTION_SCHEMA.md; tone/voice gates live above in this guide (Daily Fun Gate, Option Quality Standard, Banned Tone Words). Wildcard is held to the same bar.

After the JSON is authored — engineer rollout (NOT the content agent's job)

Once the 11 wildcard questions are in daily_fun_multiple_choice_v3.json, an engineer lands them:

  1. Asset DB: insert the 11 rows into app/src/main/assets/database/app.db question table data-only (category_id='daily_fun_mc', status='active', is_premium=0, tags containing mode_wildcard). Do NOT run build_db.py — a full rebuild changes the Room identity hash and breaks the shipped DB (see project notes). Data-only inserts are safe.
  2. Firestore pointer docs: seed one questions/{id} doc per wildcard question: { questionId, modeTag: "mode_wildcard", active: true, isPremium: false, type: "single_choice", source: "asset_db_daily_fun_mc", seededAt }.
  3. Deploy the updated assignDailyQuestion function (the mode_wildcard picker branch is already in code; until wildcard rows exist it safely falls back to the day's weekday question).

Required Tags

Each question must include exactly one new weekday tag:

  • daily_monday_mood_check
  • daily_tuesday_tiny_win
  • daily_wednesday_real_one
  • daily_thursday_laugh
  • daily_friday_flirty
  • daily_saturday_side_quest
  • daily_sunday_slow_burn
  • daily_wildcard (wildcard surprise days — see Wildcard Mode above; pairs with the REQUIRED mode_wildcard app tag)

If the app code still uses older mode tags, include the compatibility tag too, but only one new weekday tag.

Patch Discipline: Fix Only What Fails

Production-file protection

Patch discipline does not change the production file shape.

A document containing only:

id
expected_text
reasons
replacement text
replacement options

is a patch manifest, not the Daily pack.

Never overwrite daily_fun_multiple_choice_v3.json with that manifest.

Apply the patch to the complete 511-question source, retain the full category object, validate the complete result, and ship the complete production JSON.

Daily pack updates must use patch discipline.

The writer must review the full pack, mark the failing question IDs, and then fix only those marked IDs.

Do not rewrite passing questions just because a rewrite is happening. Passing questions are frozen unless they later fail a specific rule.

For normal content fixes, preserve:

  • id
  • type
  • access
  • depth
  • sex
  • weekday tags
  • app compatibility tags

Change only the prompt and options unless metadata is the thing that failed.

Mass rewrites are allowed only when more than 60 percent of a weekday or pack fails for the same root cause. If that happens, the review report must explain why patching would be worse.

See DAILY_PATCH_REVIEW_LOOP_POLICY.md for the full patch loop.

Fun But Grounded Gate

Fun does not mean random nonsense.

Reject daily questions that feel like a carnival generator instead of a couples app.

Watch for overuse of:

  • fake awards
  • snack drafts
  • mascot jokes
  • couch games
  • dramatic compliments
  • random object choices
  • silly phrases that do not match the prompt

A little weird is good. A whole pack of weird becomes wallpaper with confetti on it.

Daily questions should feel playful and usable by adults.

They should not feel like children's party games, chore dice, or therapy cards with glitter.

Option Answer Test

Every option must pass the answer test.

Read the prompt, then read each option after it. The option must sound like a clean answer.

Bad:

Which tiny date move fits after dinner?
Choosing the fun mug

Why it fails: choosing a mug is not really a date move.

Better:

Which tiny date move fits after dinner?
A two-song kitchen dance

If one option fails the answer test, fix that option. If two or more fail, rewrite the whole answer set.

Production Review Loop

Do not write or rewrite all 511 questions in one blind pass.

For each weekday:

  1. Write or rewrite 20 questions.
  2. Read all 20 out loud.
  3. Mark weak questions with reasons.
  4. Fix only the marked questions.
  5. Do not touch questions that passed.
  6. Review the fixed set again.
  7. Continue only when all 20 have no hard flags.
  8. Continue only when at least 18 of 20 feel fun, playful, sweet, flirty, silly, or date-like.
  9. Expand in batches of 20 to 30.
  10. Repeat mark, fix, review after each batch.
  11. Move to the next weekday only after the current weekday passes.

Marking Reasons

Use these reasons when marking weak daily questions:

  • therapy_voice
  • wellness_voice
  • household_admin
  • not_fun
  • abstract_prompt
  • awkward_split_phrase
  • repeated_stem
  • option_mismatch
  • fragment_options
  • too_generic
  • weird_option
  • weak_weekday_fit
  • filler_question
  • too_random
  • mechanic_overuse
  • patch_scope_violation

Research Notes Used for This Guide

These sources informed the daily fun rules. Do not copy their question lists. Use the patterns.

Final Production Gate

Before shipping:

  1. Confirm the file contains the full category object and all 511 questions.
  2. Confirm category.id and every category_id are daily_fun_mc.
  3. Confirm every depth is integer 1, 2, or 3.
  4. Confirm every option set is mirrored into answer_config.options.
  5. Run schema and count validation against the totals in Required Counts (511 · 86 free · 425 premium once the wildcard add-on is in; 511 single_choice).
  6. Run duplicate question checks.
  7. Run duplicate option-list checks.
  8. Check repeated openers and repeated option text.
  9. Read 10 random questions from each weekday, plus all 11 wildcard questions.
  10. Mark anything therapy-coded, boring, weird, logistical, or not fun. For wildcard specifically, also mark anything tied to a particular weekday/day-name (wildcard must read on any day).
  11. Fix the marked items.
  12. Run a second random sample from each weekday, and re-read the wildcard set.
  13. Fix only the newly marked sample items.
  14. Run the second sample again if any sampled item changed.
  15. Ship only when the second sample passes cleanly and the remaining hard flag count is 0.

The final sample must include no weird domestic options like "The good blanket saved", no chore-heavy answer sets, and no random silliness that does not fit the prompt.

The final review report must state how many questions were marked, how many were patched, and how many known flags remain.