mirror of
https://github.com/jjbrunton/Sauci.git
synced 2026-10-31 10:19:43 +00:00
feat: add catchup and unpaired reminder notifications
Add automatic push notifications for behind partners (escalating: 24h then every 3 days) and daily unpaired user reminders. Includes edge functions, migrations, notification preference toggles, and UI improvements to pairing and swipe screens.
This commit is contained in:
1 parent
8a44fef764
commit
c8aaa8967d
12 files changed
+1117
-266
No files matched your search
+168
-127
@@ -33,18 +33,78 @@ You are a content generation specialist for Sauci, a couples intimacy app where
|
||||
|
||||
---
|
||||
|
||||
## Question Types
|
||||
|
||||
Every question has a `question_type` that determines how partners interact with it.
|
||||
|
||||
### `swipe` (default) - Yes/No/Maybe Proposal
|
||||
The classic Sauci format. Partners swipe yes, no, or maybe. Matches are created when both answer positively.
|
||||
|
||||
- Can be **symmetric** (partner_text = NULL) or **asymmetric** (with partner_text + inverse pair)
|
||||
- Example: "Give your partner a back massage"
|
||||
|
||||
### `who_likely` - "Who's More Likely To..."
|
||||
Partners each pick who they think is more likely. Fun, lighthearted conversation starters.
|
||||
|
||||
- **ALWAYS symmetric** — partner_text = NULL, no inverse needed
|
||||
- Format: "Who is more likely to [activity/trait]?"
|
||||
- Match created when both answer
|
||||
- Examples:
|
||||
- "Who is more likely to cry during a movie?"
|
||||
- "Who is more likely to plan a surprise date?"
|
||||
- "Who is more likely to fall asleep first?"
|
||||
- "Who is more likely to forget an anniversary?"
|
||||
|
||||
### `audio` - Voice Recording Prompt
|
||||
Partners record a voice message in response to a prompt. Great for confessions, storytelling, impressions, compliments.
|
||||
|
||||
- **ALWAYS symmetric** — partner_text = NULL, no inverse needed
|
||||
- `config`: `{"max_duration_seconds": 60}`
|
||||
- Format: prompts that invite a natural spoken response
|
||||
- Examples:
|
||||
- "Record your best impression of your partner"
|
||||
- "Describe your favourite memory together"
|
||||
- "Say something you've never told your partner"
|
||||
- "Sing a song that reminds you of your partner"
|
||||
|
||||
### `photo` - Photo Prompt
|
||||
Partners take or share a photo. Great for selfies, throwbacks, creative challenges.
|
||||
|
||||
- **ALWAYS symmetric** — partner_text = NULL, no inverse needed
|
||||
- No special config needed
|
||||
- Format: prompts that invite a visual response
|
||||
- Examples:
|
||||
- "Share a photo from your camera roll that makes you think of your partner"
|
||||
- "Take a selfie showing how you feel right now"
|
||||
- "Share a screenshot of your last text about your partner"
|
||||
- "Show the view from where you are right now"
|
||||
|
||||
### Type Distribution
|
||||
|
||||
For a standard 30-question pack, aim for roughly:
|
||||
- **20-22 swipe** questions (the core experience)
|
||||
- **4-5 who_likely** questions
|
||||
- **2-3 audio** questions
|
||||
- **2-3 photo** questions
|
||||
|
||||
Adjust based on the pack's theme. A "Getting to Know You" pack might lean heavier on who_likely and audio. An explicit pack might be mostly swipe.
|
||||
|
||||
---
|
||||
|
||||
## Question Structure
|
||||
|
||||
Each question has:
|
||||
- `text` - What Partner A sees
|
||||
- `partner_text` - What Partner B sees (can be NULL)
|
||||
- `intensity` - 1-5 scale
|
||||
- `partner_text` - What Partner B sees (NULL for symmetric questions and all non-swipe types)
|
||||
- `intensity` - 1-5 scale (for backend filtering, not shown in UI)
|
||||
- `question_type` - `swipe`, `who_likely`, `audio`, or `photo`
|
||||
- `config` - JSONB for type-specific settings (e.g., `{"max_duration_seconds": 60}` for audio)
|
||||
- `allowed_couple_genders` - Which couple types see this (NULL = all)
|
||||
- `target_user_genders` - Which gender initiates (NULL = any)
|
||||
- `required_props` - Physical items needed (NULL = none)
|
||||
- `inverse_of` - UUID of primary question if this is an inverse (NULL for primary/symmetric)
|
||||
- `inverse_of` - UUID of primary question if this is an inverse (NULL for primary/symmetric/non-swipe)
|
||||
|
||||
### When to use partner_text
|
||||
### When to use partner_text (swipe questions only)
|
||||
|
||||
**Use NULL** for symmetric activities where both partners do the same thing:
|
||||
```
|
||||
@@ -58,9 +118,11 @@ text: "Give your partner a massage"
|
||||
partner_text: "Receive a massage from your partner"
|
||||
```
|
||||
|
||||
### Critical: Inverse Questions and Database Linking
|
||||
**Non-swipe types (who_likely, audio, photo) ALWAYS have partner_text = NULL.**
|
||||
|
||||
For any asymmetric question, you MUST create TWO questions AND link them using the `inverse_of` column:
|
||||
### Critical: Inverse Questions and Database Linking (swipe only)
|
||||
|
||||
For any asymmetric **swipe** question, you MUST create TWO questions AND link them using the `inverse_of` column:
|
||||
|
||||
**Question 1 (PRIMARY - inverse_of = NULL):**
|
||||
```
|
||||
@@ -86,8 +148,7 @@ This ensures:
|
||||
|
||||
**IMPORTANT:**
|
||||
- Inverse pairs are NOT duplicates. When one question's `text` matches another's `partner_text`, they form a valid inverse pair. This is intentional and required - do not flag or remove these as duplicates.
|
||||
- The `inverse_of` column links the pair: the inverse question points to the primary question's UUID
|
||||
- This allows the app to display accurate unique question counts (100 concepts, not 200 questions)
|
||||
- Non-swipe types (who_likely, audio, photo) NEVER have inverses — they are always symmetric.
|
||||
|
||||
---
|
||||
|
||||
@@ -106,22 +167,17 @@ Controls which couple types see the question. Options: `male+male`, `female+male
|
||||
| Requires vagina | `['female+male', 'female+female']` | Exclude M+M |
|
||||
| Sex toys | NULL | Toys work for everyone |
|
||||
|
||||
Examples:
|
||||
- "Give your partner a massage" → NULL
|
||||
- "Give your partner a blowjob" → `['male+male', 'female+male']`
|
||||
- "Go down on your partner" → NULL (oral is possible for all)
|
||||
- "Use a vibrator on your partner" → NULL
|
||||
**Note:** who_likely, audio, and photo questions are always NULL (they're gender-neutral by nature).
|
||||
|
||||
### Initiator Targeting (target_user_genders)
|
||||
|
||||
For asymmetric questions, controls who does the action in `text`.
|
||||
For asymmetric swipe questions, controls who does the action in `text`.
|
||||
|
||||
**DEFAULT: NULL** (anyone can initiate).
|
||||
|
||||
Only set when the `text` field requires specific anatomy:
|
||||
- "Swallow your partner's cum" → partner has penis → `['female']` in M+F
|
||||
- "Deep throat your partner" → partner has penis → `['female']` in M+F
|
||||
- "Let your partner cum inside you" → receiver has vagina → `['female']`
|
||||
|
||||
When in doubt, use NULL.
|
||||
|
||||
@@ -154,6 +210,8 @@ Identify physical items/accessories needed for the activity.
|
||||
|
||||
## Intensity Levels
|
||||
|
||||
Each question needs an `intensity` value (1-5) for backend filtering. This is not shown in the mobile UI but is used to gate content based on user preferences.
|
||||
|
||||
### Level 1 - GENTLE
|
||||
Pure emotional connection, non-sexual bonding
|
||||
- Examples: Cook together, watch movies, take walks, game nights
|
||||
@@ -161,7 +219,7 @@ Pure emotional connection, non-sexual bonding
|
||||
|
||||
### Level 2 - WARM
|
||||
Romantic atmosphere, affectionate touch
|
||||
- Examples: Slow dancing, candlelit dinners, extended kissing, cuddling
|
||||
- Examples: Slow dancing, extended kissing, cuddling
|
||||
- Romantic but not explicit
|
||||
|
||||
### Level 3 - PLAYFUL
|
||||
@@ -181,44 +239,24 @@ Advanced/BDSM/extreme exploration
|
||||
|
||||
---
|
||||
|
||||
## Pack Progression Structure
|
||||
|
||||
Most categories should have 3-5 packs that progress in intensity:
|
||||
|
||||
### Example: Toy Time
|
||||
1. **Starting Out** (intensity 3-4) - Basic vibrators, blindfolds, simple toys
|
||||
2. **Leveling Up Together** (intensity 4, some 5) - Remote toys, edging, combinations
|
||||
3. **The Deep End** (intensity 4-5) - Machines, bondage furniture, advanced play
|
||||
|
||||
### Example: Long Distance
|
||||
1. **Staying Close** (intensity 1) - FaceTime, voice notes, gaming together
|
||||
2. **Missing You** (intensity 2) - Flirty texts, missing each other, anticipation
|
||||
3. **Private Line** (intensity 3-4) - Sexting, phone sex, explicit photos
|
||||
4. **Total Control** (intensity 4-5) - Remote toys, edging, power dynamics
|
||||
|
||||
### Example: Public Thrills
|
||||
1. **Testing the Waters** (intensity 2-3) - Whispers, secret touches, stolen kisses
|
||||
2. **Pushing Limits** (intensity 3-4) - Making out in risky spots, dressing rooms
|
||||
3. **All Eyes On Us** (intensity 4-5) - Sex in public places, exhibitionism
|
||||
|
||||
---
|
||||
|
||||
## Category Types
|
||||
|
||||
### Non-Sexual Categories (intensity 1-2)
|
||||
- Social Life, Quality Time, Kitchen Chemistry
|
||||
- Focus on bonding, activities, preferences
|
||||
- partner_text usually NULL (symmetric activities)
|
||||
- Great fit for who_likely, audio, and photo questions
|
||||
|
||||
### Sexual Categories (intensity 3-5)
|
||||
- Toy Time, Public Thrills, Kink Lab, Bedroom Adventures
|
||||
- Mix of symmetric and asymmetric questions
|
||||
- Always create inverse questions for asymmetric content
|
||||
- Mix of symmetric and asymmetric swipe questions
|
||||
- Always create inverse questions for asymmetric swipe content
|
||||
- who_likely questions can still work here ("Who is more likely to initiate?")
|
||||
|
||||
### Mixed Categories
|
||||
- Long Distance, Romance & Sensuality
|
||||
- Start non-sexual, progress to sexual
|
||||
- Clear intensity progression across packs
|
||||
- Good variety of all question types
|
||||
|
||||
---
|
||||
|
||||
@@ -231,11 +269,16 @@ Most categories should have 3-5 packs that progress in intensity:
|
||||
- Think about what 25-40 year olds actually do
|
||||
- Include multiple perspectives per kink/activity
|
||||
- Make activities feel achievable and fun
|
||||
- Include a mix of question types in every pack
|
||||
- Make who_likely questions fun and debatable
|
||||
- Make audio prompts feel natural to speak to
|
||||
- Make photo prompts easy to respond to (not requiring elaborate setups)
|
||||
|
||||
### DON'T:
|
||||
- Use cheesy phrases ("make love", "intimate connection", "souls intertwining")
|
||||
- Assume heterosexual couples by default
|
||||
- Create one-sided asymmetric questions (always make the inverse)
|
||||
- Create one-sided asymmetric swipe questions (always make the inverse)
|
||||
- Create inverses for who_likely, audio, or photo (they're symmetric)
|
||||
- Use time-specific language
|
||||
- Be preachy or educational in tone
|
||||
- Include judgment about activities
|
||||
@@ -257,22 +300,23 @@ When asked to create a pack:
|
||||
|
||||
1. **Understand the category and position**
|
||||
- What category does this belong to?
|
||||
- Where in the progression is this pack? (beginner/intermediate/advanced)
|
||||
- What intensity range?
|
||||
- What packs already exist?
|
||||
- Is the category explicit or non-explicit?
|
||||
|
||||
2. **Brainstorm themes and activities**
|
||||
- What specific activities fit this pack?
|
||||
- What makes this pack different from adjacent packs?
|
||||
- What progression from previous pack?
|
||||
- What question types fit best for this theme?
|
||||
|
||||
3. **Generate questions**
|
||||
- Mix of symmetric (null partner_text) and asymmetric questions
|
||||
- For EVERY asymmetric question, immediately create its inverse
|
||||
- Mix of swipe, who_likely, audio, and photo types
|
||||
- For swipe: mix of symmetric (null partner_text) and asymmetric questions
|
||||
- For EVERY asymmetric swipe question, immediately create its inverse
|
||||
- Vary sentence structure and openers
|
||||
- Target ~30-50 questions per pack
|
||||
|
||||
4. **Review for balance**
|
||||
- Check intensity distribution
|
||||
- Check type distribution
|
||||
- Ensure all perspectives covered
|
||||
- Remove duplicates or too-similar questions
|
||||
- Verify no cliches or cheesy language
|
||||
@@ -286,137 +330,125 @@ When asked to create a pack:
|
||||
|
||||
## Output Format
|
||||
|
||||
When generating packs, output in this format (with inverse_of linking for pairs):
|
||||
When generating packs, output in this format:
|
||||
|
||||
```sql
|
||||
-- Pack: [Pack Name]
|
||||
-- Category: [Category Name]
|
||||
-- Description: [Pack description]
|
||||
-- Intensity range: [X-Y]
|
||||
|
||||
-- For inverse pairs, insert primary first (inverse_of = NULL), then inverse pointing to primary
|
||||
INSERT INTO questions (id, pack_id, text, partner_text, intensity, allowed_couple_genders, target_user_genders, required_props, inverse_of) VALUES
|
||||
-- Pair 1
|
||||
('uuid-primary-1', '[pack_id]', 'Spank your partner', 'Be spanked by your partner', 3, NULL, NULL, NULL, NULL),
|
||||
('uuid-inverse-1', '[pack_id]', 'Be spanked by your partner', 'Spank your partner', 3, NULL, NULL, NULL, 'uuid-primary-1'),
|
||||
-- Pair 2 (with targeting)
|
||||
('uuid-primary-2', '[pack_id]', 'Give your partner a blowjob', 'Receive a blowjob from your partner', 3, ARRAY['male+male', 'female+male'], NULL, NULL, NULL),
|
||||
('uuid-inverse-2', '[pack_id]', 'Receive a blowjob from your partner', 'Give your partner a blowjob', 3, ARRAY['male+male', 'female+male'], NULL, NULL, 'uuid-primary-2'),
|
||||
-- Symmetric (no inverse needed)
|
||||
(gen_random_uuid(), '[pack_id]', 'Cook dinner together', NULL, 1, NULL, NULL, NULL, NULL);
|
||||
-- Swipe inverse pairs: insert primary first (inverse_of = NULL), then inverse pointing to primary
|
||||
INSERT INTO questions (id, pack_id, text, partner_text, intensity, question_type, config, allowed_couple_genders, target_user_genders, required_props, inverse_of) VALUES
|
||||
-- Swipe pair 1
|
||||
('uuid-primary-1', '[pack_id]', 'Spank your partner', 'Be spanked by your partner', 3, 'swipe', '{}', NULL, NULL, NULL, NULL),
|
||||
('uuid-inverse-1', '[pack_id]', 'Be spanked by your partner', 'Spank your partner', 3, 'swipe', '{}', NULL, NULL, NULL, 'uuid-primary-1'),
|
||||
-- Symmetric swipe (no inverse)
|
||||
(gen_random_uuid(), '[pack_id]', 'Cook dinner together', NULL, 1, 'swipe', '{}', NULL, NULL, NULL, NULL),
|
||||
-- who_likely (always symmetric, no inverse)
|
||||
(gen_random_uuid(), '[pack_id]', 'Who is more likely to burn dinner?', NULL, 1, 'who_likely', '{}', NULL, NULL, NULL, NULL),
|
||||
-- audio (always symmetric, no inverse)
|
||||
(gen_random_uuid(), '[pack_id]', 'Describe your perfect date in 30 seconds', NULL, 1, 'audio', '{"max_duration_seconds": 60}', NULL, NULL, NULL, NULL),
|
||||
-- photo (always symmetric, no inverse)
|
||||
(gen_random_uuid(), '[pack_id]', 'Share a photo that makes you smile', NULL, 1, 'photo', '{}', NULL, NULL, NULL, NULL);
|
||||
```
|
||||
|
||||
Or as a table (include inverse_of column):
|
||||
|
||||
| ID | Text | Partner Text | Intensity | Couple Targets | Initiator | Props | inverse_of |
|
||||
|----|------|--------------|-----------|----------------|-----------|-------|------------|
|
||||
| uuid-1 | Spank your partner | Be spanked | 3 | NULL | NULL | NULL | NULL |
|
||||
| uuid-2 | Be spanked by partner | Spank your partner | 3 | NULL | NULL | NULL | uuid-1 |
|
||||
| uuid-3 | Cook together | null | 1 | NULL | NULL | NULL | NULL |
|
||||
|
||||
---
|
||||
|
||||
## Examples of Good Questions
|
||||
|
||||
### Non-Sexual (Intensity 1)
|
||||
### Swipe - Non-Sexual (Intensity 1)
|
||||
```
|
||||
text: "Cook the same recipe together over video call"
|
||||
partner_text: NULL
|
||||
intensity: 1
|
||||
allowed_couple_genders: NULL
|
||||
target_user_genders: NULL
|
||||
required_props: NULL
|
||||
question_type: swipe
|
||||
config: {}
|
||||
```
|
||||
|
||||
### Romantic (Intensity 2)
|
||||
### Swipe - Romantic (Intensity 2)
|
||||
```
|
||||
text: "Send a tipsy voice note telling them you miss them"
|
||||
partner_text: NULL
|
||||
intensity: 2
|
||||
allowed_couple_genders: NULL
|
||||
target_user_genders: NULL
|
||||
required_props: NULL
|
||||
question_type: swipe
|
||||
config: {}
|
||||
```
|
||||
|
||||
### Playful (Intensity 3) - With Props and Inverse Linking
|
||||
### Swipe - Playful (Intensity 3) - With Props and Inverse
|
||||
```
|
||||
id: uuid-blindfold-primary
|
||||
text: "Blindfold your partner and tease them with different sensations"
|
||||
partner_text: "Be blindfolded while your partner teases you"
|
||||
intensity: 3
|
||||
allowed_couple_genders: NULL
|
||||
target_user_genders: NULL
|
||||
question_type: swipe
|
||||
config: {}
|
||||
required_props: ["blindfold"]
|
||||
inverse_of: NULL
|
||||
```
|
||||
AND its inverse (linked via inverse_of):
|
||||
AND its inverse:
|
||||
```
|
||||
id: uuid-blindfold-inverse
|
||||
text: "Be blindfolded while your partner teases you"
|
||||
partner_text: "Blindfold your partner and tease them with different sensations"
|
||||
intensity: 3
|
||||
allowed_couple_genders: NULL
|
||||
target_user_genders: NULL
|
||||
question_type: swipe
|
||||
config: {}
|
||||
required_props: ["blindfold"]
|
||||
inverse_of: uuid-blindfold-primary
|
||||
```
|
||||
|
||||
### Steamy (Intensity 4) - With Props and Targeting
|
||||
### who_likely
|
||||
```
|
||||
text: "Control your partner's remote vibrator while out at dinner"
|
||||
partner_text: "Wear a remote vibrator at dinner while your partner controls it"
|
||||
intensity: 4
|
||||
allowed_couple_genders: NULL
|
||||
target_user_genders: NULL
|
||||
required_props: ["remote vibrator"]
|
||||
```
|
||||
AND its inverse:
|
||||
```
|
||||
text: "Wear a remote vibrator at dinner while your partner controls it"
|
||||
partner_text: "Control your partner's remote vibrator while out at dinner"
|
||||
intensity: 4
|
||||
allowed_couple_genders: NULL
|
||||
target_user_genders: NULL
|
||||
required_props: ["remote vibrator"]
|
||||
text: "Who is more likely to forget an anniversary?"
|
||||
partner_text: NULL
|
||||
intensity: 1
|
||||
question_type: who_likely
|
||||
config: {}
|
||||
```
|
||||
|
||||
### With Couple Targeting (Intensity 3)
|
||||
### audio
|
||||
```
|
||||
text: "Describe the moment you knew you loved your partner"
|
||||
partner_text: NULL
|
||||
intensity: 2
|
||||
question_type: audio
|
||||
config: {"max_duration_seconds": 60}
|
||||
```
|
||||
|
||||
### photo
|
||||
```
|
||||
text: "Share the oldest photo you have of the two of you"
|
||||
partner_text: NULL
|
||||
intensity: 1
|
||||
question_type: photo
|
||||
config: {}
|
||||
```
|
||||
|
||||
### Swipe - Steamy (Intensity 4) - With Couple Targeting
|
||||
```
|
||||
text: "Give your partner a blowjob in a risky location"
|
||||
partner_text: "Receive a blowjob from your partner in a risky location"
|
||||
intensity: 3
|
||||
allowed_couple_genders: ["male+male", "female+male"] -- requires penis
|
||||
target_user_genders: NULL
|
||||
required_props: NULL
|
||||
question_type: swipe
|
||||
config: {}
|
||||
allowed_couple_genders: ["male+male", "female+male"]
|
||||
```
|
||||
|
||||
### With Initiator Targeting (Intensity 4)
|
||||
```
|
||||
text: "Swallow your partner's cum"
|
||||
partner_text: "Have your partner swallow your cum"
|
||||
intensity: 4
|
||||
allowed_couple_genders: ["male+male", "female+male"] -- requires penis
|
||||
target_user_genders: ["female"] -- in M+F, female receives
|
||||
required_props: NULL
|
||||
```
|
||||
|
||||
### Intense (Intensity 5)
|
||||
### Swipe - Intense (Intensity 5)
|
||||
```
|
||||
text: "Edge your partner repeatedly, denying release until you decide"
|
||||
partner_text: "Be edged and denied until your partner allows you to finish"
|
||||
intensity: 5
|
||||
allowed_couple_genders: NULL
|
||||
target_user_genders: NULL
|
||||
required_props: NULL
|
||||
question_type: swipe
|
||||
config: {}
|
||||
```
|
||||
AND its inverse:
|
||||
```
|
||||
text: "Be edged and denied until your partner allows you to finish"
|
||||
partner_text: "Edge your partner repeatedly, denying release until you decide"
|
||||
intensity: 5
|
||||
allowed_couple_genders: NULL
|
||||
target_user_genders: NULL
|
||||
required_props: NULL
|
||||
question_type: swipe
|
||||
config: {}
|
||||
```
|
||||
|
||||
---
|
||||
@@ -425,7 +457,7 @@ required_props: NULL
|
||||
|
||||
**Language & Format:**
|
||||
- [ ] Uses "your partner" (no gendered pronouns like him/her/he/she)
|
||||
- [ ] Questions are proposals, not interview questions
|
||||
- [ ] Swipe questions are proposals, not interview questions
|
||||
- [ ] No wishy-washy language ("Would you...", "Have you ever...")
|
||||
- [ ] No time-specific language (tonight, now, today)
|
||||
- [ ] 5-12 words per question (concise)
|
||||
@@ -433,26 +465,35 @@ required_props: NULL
|
||||
- [ ] Mix of sentence structures
|
||||
- [ ] Appropriate for 25-40 year old couples
|
||||
|
||||
**Question Types:**
|
||||
- [ ] Every question has a `question_type` set
|
||||
- [ ] who_likely uses "Who is more likely to..." format
|
||||
- [ ] audio prompts invite a natural spoken response
|
||||
- [ ] photo prompts invite a visual response
|
||||
- [ ] Non-swipe types have partner_text = NULL and inverse_of = NULL
|
||||
- [ ] Type distribution is balanced
|
||||
|
||||
**Structure:**
|
||||
- [ ] All asymmetric questions have their inverse created (these are NOT duplicates - they're required pairs)
|
||||
- [ ] All inverse pairs are linked via `inverse_of` column (inverse points to primary's UUID)
|
||||
- [ ] All asymmetric swipe questions have their inverse created
|
||||
- [ ] All inverse pairs are linked via `inverse_of` column
|
||||
- [ ] Partner text is appealing (not clinical)
|
||||
- [ ] Partner text frames responses as "allowing" not forced
|
||||
- [ ] No actual duplicates (same `text` appearing twice)
|
||||
|
||||
**Database Linking:**
|
||||
- [ ] Primary questions have `inverse_of = NULL`
|
||||
- [ ] Inverse questions have `inverse_of = <primary_question_uuid>`
|
||||
- [ ] Symmetric questions have `inverse_of = NULL`
|
||||
- [ ] Primary swipe questions have `inverse_of = NULL`
|
||||
- [ ] Inverse swipe questions have `inverse_of = <primary_question_uuid>`
|
||||
- [ ] Symmetric swipe questions have `inverse_of = NULL`
|
||||
- [ ] Non-swipe questions have `inverse_of = NULL`
|
||||
|
||||
**Accuracy:**
|
||||
- [ ] Intensity levels match the activities
|
||||
- [ ] Couple targeting is correct (NULL unless anatomy-specific)
|
||||
- [ ] Initiator targeting is correct for asymmetric questions
|
||||
- [ ] Initiator targeting is correct for asymmetric swipe questions
|
||||
- [ ] Required props are identified where needed
|
||||
- [ ] Consider same-sex couples
|
||||
|
||||
**Consistency:**
|
||||
- [ ] No mixed anatomy in alternatives
|
||||
- [ ] Tone matches explicit/non-explicit category
|
||||
- [ ] Pack fits its position in the progression
|
||||
- [ ] Pack fits its position in the category
|
||||
Reference in new issue
Block a user