# Sojorn Seeding Philosophy

## Core Principle: Honest Onboarding

**The Problem:**
New users dropped into an empty platform experience confusion, not connection. They don't know what belongs, what tone is expected, or whether anyone else is here.

**Traditional Solution (Rejected):**
- Create fake user personas
- Simulate conversations and arguments
- Inflate engagement metrics
- Hide that content is from the platform itself

**Sojorn Solution (Honest):**
- Create clearly labeled official accounts
- Post authentic, useful content
- Never fake engagement
- Never pretend to be real users

---

## What We Seed

### Official Accounts (3)

All official accounts are:
- Clearly labeled with "SOJORN" badge
- Unable to log in (disabled passwords)
- Restricted to service role posting only
- Transparent in their bios

#### 1. @sojorn
**Purpose:** Platform transparency and announcements

**Content:**
- How Sojorn works
- Community guidelines
- Feature updates
- Transparency notes

**Tone:** Neutral, factual, direct

**Example:**
> "Welcome to Sojorn. This is a friends-first social platform designed for genuine connections. Posts are ranked by authentic engagement—real appreciation over time, not outrage or virality."

#### 2. @sojorn_read
**Purpose:** Reading content and prompts

**Content:**
- Public domain poetry excerpts
- Gentle observations about reading
- Literary reflections
- No attribution debates (handled in metadata)

**Tone:** Observational, appreciative

**Example:**
> "Sometimes a book sits on your shelf for years, and then one Tuesday you pick it up and it feels like it was waiting for exactly this moment."

#### 3. @sojorn_write
**Purpose:** Writing prompts and reflections

**Content:**
- Gentle writing invitations
- Observational prompts
- Seasonal/temporal reflections
- No instruction or therapy framing

**Tone:** Invitational, present

**Example:**
> "Write about a small moment that did not need to be shared."

---

## What We Don't Seed

### Never Fake Users
- ❌ Create personas ("Sarah from Portland")
- ❌ Generate profile pictures
- ❌ Simulate follower networks
- ❌ Pretend accounts are real people

### Never Fake Engagement
- ❌ Auto-like posts
- ❌ Generate fake saves
- ❌ Create fake comments
- ❌ Inflate view counts

### Never Fake Conversations
- ❌ Simulate arguments
- ❌ Create fake disagreements
- ❌ Post as if replying to users
- ❌ Generate synthetic dialogue

### Never Hide Origin
- ❌ Bury "official" labels
- ❌ Use vague language ("community team")
- ❌ Suggest content is user-generated
- ❌ Imply accounts are volunteers

---

## Content Guidelines

### Acceptable Themes

**Observational:**
- Weather, light, seasons
- Small routines
- Reading experiences
- Writing reflections

**Reflective:**
- Quiet gratitude
- Neutral observations
- Gentle prompts
- Present-moment awareness

**Educational:**
- How Sojorn works
- Tone detection explanations
- Feature announcements
- Transparency notes

### Unacceptable Themes

**Performative:**
- ❌ Engagement bait ("What do YOU think?")
- ❌ Calls to action ("Share this!")
- ❌ Virality attempts
- ❌ Trending topic chasing

**Instructional:**
- ❌ Self-improvement commands
- ❌ Therapy framing
- ❌ Moral instruction
- ❌ "Should" language

**Divisive:**
- ❌ Politics
- ❌ Religious preaching
- ❌ Persuasion
- ❌ Debate provocation

---

## Temporal Distribution

### Backdating Strategy

**Goal:** Avoid all content appearing on the same day

**Approach:**
- Backdate posts naturally over 14 days
- Spread across categories evenly
- Maintain chronological integrity
- Never future-date content

**Implementation:**
```sql
base_time := NOW() - INTERVAL '14 days';
-- Posts inserted with timestamps from base_time to NOW
-- Example: base_time, base_time + 6 hours, base_time + 1 day, etc.
```

**Why 14 Days:**
- Long enough to feel natural
- Short enough to stay relevant
- Creates scrollable history
- Avoids "ghost town" feeling

### No Artificial Freshness

**We Don't:**
- ❌ Constantly bump old posts
- ❌ Create "trending" illusions
- ❌ Simulate real-time activity
- ❌ Post at fake peak hours

**We Do:**
- ✅ Let old posts age naturally
- ✅ Post new official content occasionally
- ✅ Maintain honest timestamps
- ✅ Accept that some feeds will be quiet

---

## Volume Targets

### Initial Seed (Per Category)

**General Discussion:**
- Platform explanations: 5 posts
- Observations: 10-15 posts
- Writing prompts: 10 posts
- **Total: ~25 posts**

**Quiet Reflections:**
- Poetry excerpts: 8-10 posts
- Reading reflections: 5 posts
- Seasonal observations: 8 posts
- **Total: ~20 posts**

**Gratitude:**
- Gratitude reflections: 5 posts
- Writing prompts: 5 posts
- **Total: ~10 posts**

### Overall Target

**Total Seed Content: ~55 posts**

**Why This Number:**
- Enough to scroll 2-3 minutes
- Not overwhelming
- Models tone diversity
- Leaves room for user content

---

## UI Treatment (Honest Labeling)

### Official Badge

**Design:**
```
[SOJORN] badge in soft blue (AppTheme.info)
- 8px font, uppercase
- 12% opacity background
- Always visible, never hidden
```

**Placement:**
- Next to author name
- In profile header
- On all official posts

**Copy:**
- Just "SOJORN" (no embellishment)
- Not "Verified" (implies endorsement)
- Not "Staff" (implies employees)
- Not "Official" (too formal)

### No Deceptive Language

**Never:**
- ❌ "Recommended for you" (implies algorithm knows you)
- ❌ "Trending" (fake popularity)
- ❌ "Popular" (fake consensus)
- ❌ "You might like" (false personalization)

**Always:**
- ✅ "From Sojorn" (honest origin)
- ✅ [SOJORN badge] (clear labeling)
- ✅ Bio transparency ("Official Sojorn account")

---

## Feed Weighting (Exit Strategy)

### Problem
Official seed content must not dominate forever as user-generated content grows.

### Solution: Gradual Dilution

#### Phase 1: Empty Platform (Week 1)
- Official posts: 100% of feed
- User posts: 0%
- **Weighting:** Equal visibility for official posts

#### Phase 2: Growing Platform (Week 2-4)
- Official posts: 50-80% of feed
- User posts: 20-50%
- **Weighting:** Begin reducing official post ranking

#### Phase 3: Active Platform (Month 2+)
- Official posts: 10-30% of feed
- User posts: 70-90%
- **Weighting:** Official posts ranked lower than user content

#### Phase 4: Mature Platform (Month 6+)
- Official posts: 0-10% of feed
- User posts: 90-100%
- **Weighting:** Official posts archived or heavily downranked

### Implementation

**Ranking Modifier:**
```typescript
if (post.author.is_official) {
  // Reduce ranking weight based on platform maturity
  const platformAge = daysSinceFirstUserPost();
  const officialPenalty = Math.min(platformAge / 30, 0.7); // Max 70% reduction
  post.engagementScore *= (1 - officialPenalty);
}
```

**Cap Per Feed Window:**
```typescript
// Limit official posts in each feed page
const maxOfficialPosts = Math.max(2, Math.floor(pageSize * 0.2)); // 20% or 2, whichever is higher
```

### Optional Archival

**After 6 Months:**
- Move oldest official posts to "archived" status
- Still accessible via direct link
- No longer appear in feeds
- Preserves history without clutter

---

## Engagement Integrity

### Rule: No Synthetic Engagement

**All Metrics Start at Zero:**
```sql
INSERT INTO post_metrics (post_id, like_count, save_count, comment_count, view_count)
VALUES (post_id, 0, 0, 0, 0);
```

**Why:**
- Faking engagement = lying
- Lies erode trust
- Trust is Sojorn's only asset
- Zero is honest

### Comments Disabled

Official accounts **cannot receive comments**:

```sql
CREATE POLICY "Official accounts cannot receive comments"
ON comments
FOR INSERT
WITH CHECK (
  NOT EXISTS (
    SELECT 1 FROM posts p
    JOIN profiles pr ON pr.id = p.author_id
    WHERE p.id = post_id AND pr.is_official = true
  )
);
```

**Why:**
- Official accounts never reply (not real users)
- Prevents fake dialogue
- No "community manager" persona
- Maintains honesty

---

## Content Examples

### ✅ Good Seed Content

**@sojorn (Transparency):**
> "Your feed has two tabs: Following shows posts from people you follow, chronologically. Sojorn shows posts ranked by authentic engagement from everyone. You control which categories you see."

**Why:** Factual, useful, transparent

**@sojorn_read (Observation):**
> "Reading before bed is different than reading in the morning. One settles you down. The other wakes you up in a quiet way."

**Why:** Observational, relatable, no instruction

**@sojorn_write (Invitation):**
> "Write about something ordinary you noticed today."

**Why:** Gentle prompt, no pressure, present tense

### ❌ Bad Seed Content

**Fake Persona:**
> "Hi everyone! I'm Sarah and I just joined Sojorn. What are you all reading?"

**Why:** Deceptive, pretends to be real user

**Engagement Bait:**
> "What's your favorite book? Let me know in the comments!"

**Why:** Solicits performance, implies conversation

**Moral Instruction:**
> "Remember: you should always take time for self-care. Here are 5 ways to practice mindfulness today."

**Why:** Preachy, instructional, "should" language

---

## Monitoring & Adjustment

### Monthly Review

**Check:**
1. What % of feed is official content?
2. Are official posts still useful?
3. Is user content growing?
4. Should we archive old official posts?

### User Feedback

**Listen For:**
- "These posts feel fake" → Review tone
- "Too much Sojorn content" → Increase penalty
- "I don't know what to post" → Add more prompts
- "Official accounts are helpful" → Continue

---

## Summary

### What This Accomplishes

**For New Users:**
- ✅ Never dropped into emptiness
- ✅ Immediately see what tone is expected
- ✅ Have content to interact with
- ✅ Understand "what belongs here"

**For Platform:**
- ✅ Honest onboarding through presence
- ✅ Trust preserved through transparency
- ✅ No deception or fake activity
- ✅ Gradual transition to user content

### The Commitment

**Sojorn will:**
- ✅ Always label official content
- ✅ Never fake users or engagement
- ✅ Reduce official content as platform grows
- ✅ Maintain transparency about seeding

**Sojorn will never:**
- ❌ Create fake personas
- ❌ Inflate metrics
- ❌ Hide content origin
- ❌ Pretend official accounts are users

---

## Implementation Checklist

- [ ] Run `seed_official_accounts.sql` (create @sojorn, @sojorn_read, @sojorn_write)
- [ ] Run `seed_content.sql` (insert ~55 posts backdated over 14 days)
- [ ] Update Profile model with `isOfficial` field
- [ ] Add official badge to PostCard UI
- [ ] Implement feed weighting for official posts
- [ ] Schedule monthly review of official content ratio
- [ ] Plan archival after 6 months

---

**Philosophy:** Seeding is not deception. It is honest hospitality.

**Execution:** Clearly labeled, authentically useful, gradually diluted.

**Result:** New users welcomed into connection, not emptiness.
