Closer/seed/questions/QUESTION_SCHEMA.md

9.0 KiB

Closer Question Schema v7

See also: QUESTION_CONTENT_GUIDE.md | QUESTION_REWRITE_PLAN.md | QUESTION_QUALITY_CHECKLIST.md

Purpose

This document defines the JSON schema, question types, validation rules, and required counts for Closer question packs.

For writing philosophy and tone, see QUESTION_CONTENT_GUIDE.md.

For rewrite workflow and special pack exceptions, see QUESTION_REWRITE_PLAN.md.

Question Types

Use these type names exactly:

  • written
  • single_choice
  • multi_choice
  • scale
  • this_or_that

Do not rename them unless the app code is updated first.

multi_choice

Select every option that applies.

Use 4 to 6 options.

Example:

{
  "type": "multi_choice",
  "text": "What helps you feel relaxed on a date with me?",
  "options": [
    { "id": "no_rushing", "text": "Not feeling rushed" },
    { "id": "phones_away", "text": "Putting phones away" },
    { "id": "good_food", "text": "Good food" },
    { "id": "easy_conversation", "text": "Easy conversation" }
  ]
}

Rules:

  • Prompt should clearly allow multiple answers.
  • Options should not shame either partner.
  • Options should be practical, emotional, or playful when possible.
  • Options must not overlap too much.

single_choice

Select one best answer.

Use 4 to 6 options.

Example:

{
  "type": "single_choice",
  "text": "Which kind of date sounds best this week?",
  "options": [
    { "id": "cozy_at_home", "text": "Cozy at home" },
    { "id": "dinner_out", "text": "Dinner out" },
    { "id": "something_playful", "text": "Something playful" },
    { "id": "something_outside", "text": "Something outside" }
  ]
}

Rules:

  • Options should be short.
  • Options should not overlap too much.
  • Options should sound like real choices.
  • Every option must directly answer the prompt.
  • Every option should be similar in weight.

scale

Rate agreement, comfort, importance, confidence, or frequency.

Example:

{
  "type": "scale",
  "text": "How much do you feel like we need a real date soon?",
  "scale": {
    "min": 1,
    "max": 5,
    "min_label": "Not much",
    "max_label": "Very much"
  }
}

Rules:

  • Scale labels should be gentle and neutral.
  • Do not make the low end sound bad or shameful.
  • Scale questions should measure one thing only.

this_or_that

Very fast playful questions.

Example:

{
  "type": "this_or_that",
  "text": "Planned date or spontaneous date?"
}

Rules:

  • Prompts should be quick.
  • Avoid choices that imply one partner is wrong.
  • Best used in fun, date, intimacy, home, and lifestyle packs.

written

Reserved for questions where a short written response adds meaningful value.

Example:

{
  "type": "written",
  "text": "What is one small thing I do that makes you feel cared for?",
  "answer": {
    "max_length": 500
  }
}

Written questions require an answer configuration with max_length.

Do not use written questions for basic preferences.

Standard Category Packs

A normal category pack may contain up to 150 questions. The maximum is not a required count. Smaller packs are valid when they provide stronger coverage with less repetition.

For a full 150-question mixed pack, use this planning target:

Type Count
multi_choice 90
single_choice 30
scale 15
this_or_that 10
written 5

Free and premium split:

  • 45 free
  • 105 premium

Normal-pack rules:

  • total question count must be 150 or fewer
  • metadata counts must match the actual file
  • written questions should normally total 0 to 5
  • written questions are optional and must not be used as filler
  • more than 5 written questions requires a documented pack-specific exception
  • a smaller pack may use a different type mix when the mix is documented and fits the category

Special Packs

Special product packs may exceed the normal 150-question maximum or override the standard type mix only when documented.

The daily single choice weekday pack is the current documented 511-question special exception.

Daily Single Choice Weekday Pack

Pack id:

daily_single_choice_weekly_v1

Compatibility file name:

daily_fun_multiple_choice_v3.json

Target counts — weekday pack (frozen; do not change these 500):

Field Count
weekday total 500
weekday free 75
weekday premium 425
single_choice 500

Plus the wildcard add-on (surprise days; see DAILY_SINGLE_CHOICE_WEEKDAY_SYSTEM.md → Wildcard Mode). The wildcard pool size must stay coprime with 10 (the wildcard-day spacing), so 11, not 10/12:

Field Count
wildcard free 11

New pack totals (weekday + wildcard): 511 total · 86 free · 425 premium · 511 single_choice.

These counts do not apply to standard category packs.

Daily Pack Metadata Example

{
  "id": "daily_single_choice_weekly_v1",
  "title": "Daily Single Choice",
  "access": "mixed",
  "description": "One weekday themed single choice question per day, plus wildcard surprise days.",
  "count": 511,
  "free_count": 86,
  "premium_count": 425,
  "question_type_policy": "single_choice_only",
  "review_policy": "weekday_batch_loop_required",
  "patch_policy": "fix_marked_ids_only",
  "mass_rewrite_policy": "requires_over_60_percent_shared_failure",
  "content_policy": "fun_first_daily_game_questions",
  "research_note": "Use relationship question research patterns, not copied prompts.",
  "questions": []
}

If the compatibility filename daily_fun_multiple_choice_v3.json is used, the metadata should still make clear that the content is single_choice only.

Daily Content Metadata

Daily packs should include metadata that makes the content standard impossible to miss.

Recommended fields:

{
  "question_type_policy": "single_choice_only",
  "review_policy": "weekday_batch_loop_required",
  "patch_policy": "fix_marked_ids_only",
  "mass_rewrite_policy": "requires_over_60_percent_shared_failure",
  "content_policy": "fun_first_daily_game_questions",
  "research_note": "Use relationship question research patterns, not copied prompts."
}

These fields are not a replacement for validation. They document the intended behavior so future rewrites do not quietly turn the pack into chores, therapy, or generic wellness sludge.

Daily Question Object Example

{
  "id": "daily_monday_001",
  "type": "single_choice",
  "text": "What tiny date move sounds best tonight?",
  "depth": "light",
  "access": "free",
  "sex": "neutral",
  "tags": ["daily_monday_mood_check"],
  "options": [
    { "id": "dessert_couch", "text": "Dessert on the couch" },
    { "id": "kitchen_dance", "text": "A two-song kitchen dance" },
    { "id": "snack_walk", "text": "A short walk with snacks" },
    { "id": "movie_pick", "text": "A ridiculous movie pick" }
  ]
}

Daily Single Choice Content Rules

Daily options must be:

  • complete answers to the prompt
  • short and natural
  • similar in weight
  • fun, sweet, flirty, silly, or date-like when possible
  • easy to pick in under 10 seconds

Daily options must not be mostly chores, household admin, or therapy phrasing.

Reject options centered on clean counters, bills, laundry, dishes, appointment scheduling, bedtime planning, saved blankets, or oddly specific domestic logistics unless the question clearly frames the option as playful and worth choosing.

Schema validation only proves the file can be parsed. It does not prove the content is good.

Daily packs must also pass the fun gate in QUESTION_QUALITY_CHECKLIST.md and the loop in QUESTION_REWRITE_PLAN.md.

Weekday Tags

Daily questions must include the correct 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

If app code still uses older mode tags, include compatibility tags as needed without removing the new weekday tag.

Depth

Documented depth values:

  • light
  • medium
  • deep

Do not use numeric depth values unless the active app import code still requires numeric depth for compatibility.

If compatibility requires numeric depth, document the exception in the pack README and fix the import code later.

Access

Valid access values:

  • free
  • premium

Validation Requirements

Before shipping any pack:

  • JSON must parse
  • all IDs must be unique
  • all question text must be unique
  • every type must be valid
  • every required field must exist
  • option IDs must be unique within a question
  • options must directly answer the prompt
  • access values must be valid
  • depth values must match current app compatibility rules
  • normal category packs must contain no more than 150 questions
  • normal category packs should contain no more than 5 written questions unless an exception is documented
  • special packs must match their documented counts and exception rules

Content Validation Reminder

Do not confuse schema validity with quality.

A file can be valid JSON and still be bad content.

Daily packs require schema validation plus human content review.