Closer/seed/questions/QUESTION_SCHEMA.md

326 lines
7.5 KiB
Markdown

# Closer Question Schema v5
**See also:** [QUESTION_CONTENT_GUIDE.md](QUESTION_CONTENT_GUIDE.md) | [QUESTION_REWRITE_PLAN.md](QUESTION_REWRITE_PLAN.md) | [QUESTION_QUALITY_CHECKLIST.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:
```json
{
"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:
```json
{
"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:
```json
{
"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:
```json
{
"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:
```json
{
"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 250 Question Packs
Every standard 250 question pack must contain:
| Type | Count |
|---|---:|
| multi_choice | 140 |
| single_choice | 50 |
| scale | 35 |
| this_or_that | 15 |
| written | 10 |
Free and premium split:
* 75 free
* 175 premium
## Special Packs
Special product packs may override standard counts only when documented.
The daily single choice weekday pack is a special pack.
## Daily Single Choice Weekday Pack
Pack id:
```text
daily_single_choice_weekly_v1
```
Compatibility file name:
```text
daily_fun_multiple_choice_v3.json
```
Target counts:
| Field | Count |
|---|---:|
| total | 500 |
| free | 75 |
| premium | 425 |
| single_choice | 500 |
These counts do not apply to standard category packs.
## Daily Pack Metadata Example
```json
{
"id": "daily_single_choice_weekly_v1",
"title": "Daily Single Choice",
"access": "mixed",
"description": "One weekday themed single choice question per day.",
"count": 500,
"free_count": 75,
"premium_count": 425,
"question_type_policy": "single_choice_only",
"review_policy": "weekday_batch_loop_required",
"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:
```json
{
"question_type_policy": "single_choice_only",
"review_policy": "weekday_batch_loop_required",
"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
```json
{
"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
* special packs must match their documented counts
## 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.