Skip to content

[Parked · Epic] Community Retention Pack — Seeded Groups · Parent (Baby Kingdom slice) · School/SA Hubs · Paid Tutor Groups #486

Open

Description

@owlstonbusiness-svg

Status: PARKED / On Hold — NOT V1. Do not schedule.
Unpark only after CEO opens #218 and foundation #459 (+ desk/fee rails) is stable in daily use.
Owner when unparked: Full-stack (Ryan) · Product locks: CEO.
Premise correction (2026-10-27): MatchMax does not ship a forum / Threads / group-chat engine today. Live code has CommunityCommitmentGate + commitment SQL only — no community feed, group directory, or thread tables. Any design that assumes an “existing community creation engine” is wrong. This epic is greenfield on top of #218 Stage-1 children (C1–C6 etc.) when unparked.
Do not conflict with: chat #476 · squads #332 · follow #331. Notes stay in shop / freestyle — posts must not replace the shop (#218 lock).

Related parks (do not duplicate — extend)

Theme Canonical issue
Community public posts epic #218
Polls as post kind #239 C21
Community monetization stages #232 C14
School / institutional hubs #458
Paid gated creator content #474 Study Vehicles
Rules / ToS for posts #221

Product goal

Raise daily parent/student return visits (chit-chat + education-adjacent discussion) so Shop / notes feel justified — without cloning full Baby Kingdom gossip/politics and without a second chat product.

Packing (phases in one epic)

Same retention surface → one epic, sequential phases. Paid + full school OS are later phases / prefer sibling epics.

Phase Outcome Prefer sibling When
A Seeded free groups + starter threads + Join shelf — (after #218 base) First when unparked
B Parent hub taxonomy (BK slice) + Shop CTAs — After A
C Org hubs (Teachers / Students / SA) + polls + SA promo #458, polls #239 After A
D Paid tutor subscription groups #474, #232 Only after free community has real DAU

Baby Kingdom research → MatchMax slice (2026-10-27)

Source: baby-kingdom.com forum / forum home.

BK board family Examples MatchMax stance
吹水玩樂 自由講場, 影視, 美容, 旅遊 Out (off-mission)
飲奶論壇 懷孕, 0–6m … 3y+ Thin 0-3y stage tag only
由家出發 夫婦, 婆媳, 家傭, 爸爸專區 Out (drama / liability)
媽媽天地 / 育兒教養 母乳, 用品, 食譜, 醫護 Keep light: gear/jetso + health
情報分享 二手, 開倉, 著數, 網購, 求職 Keep used-books + jetso; no job board (#228 blocked)
Cohort social 出生年份媽媽會, 18區媽媽會 High retention → Phase B+ cohort tags (not full clone)
Education-adjacent 少年成長 + school talk Core for MatchMax

Phase B category lock (exactly 6 — do not expand to full BK in first ship):
chit-chat-family · school-admissions · tutoring-homework · diapers-gear-jetso · health-parenting · used-books-swaps
Stages: 0-3y | k1-k3 | p1-p6 | s1-s6
Shop CTA: only school-admissions + tutoring-homework (and never when stage is 0-3y).


Phase A — Seeded groups & cold-start starter threads

CEO lock

Ship now (when unparked) Park
is_system_seeded free system groups Paid groups (Phase D)
3 starter threads / seeded group AI bot replies in threads
Recommended shelf if joined = 0 (or logged out) ML personalized feed
One-click Join; post into seeded groups without creating a group Nested user sub-forums inside system groups
Idempotent seed by immutable slug

Triggers

Flow

  1. Seed UPSERTs 6 groups + 3 starter threads each (author = Open Q: MatchMax Official account id).
  2. User opens Community; if joined_count === 0 or logged out → show Popular Starter Groups / 熱門預設社群 above latest feed.
  3. Persona tabs: All | Parents | Students & Exams | Tutors (Schools tab only after Phase C).
  4. Card → group feed with pinned starters on top.
  5. Join / 加入社群 or reply; if logged out → existing auth modal → return to same group.
  6. Non-admin MUST NOT delete / rename / archive is_system_seeded groups (UI hide + API 403).

Seed roster

slug persona_tags name_en name_zh description_en description_zh
hk-parents-lounge parent HK Parents Chit-Chat Lounge 香港家長吹水閒聊區 Daily parenting chat, kids routines, family life 育兒日常、湊仔經、家庭生活吹水閒聊
school-admissions-hk parent, student School Admissions & Banding 升學選校及面試情報 (幼小中) PN/K1/P1/S1 interviews, banding, school reviews 幼稚園、小一、中一叩門面試及選校討論
baby-kids-gear-deals parent Baby & Kids Gear / Jetso 嬰幼用品、尿片及著數情報 Diapers, baby supplies, group buys & discounts 尿片奶粉格價、育兒好物、著數優惠
ib-igcse-alevel-hub student IBDP / IGCSE / A-Level Hub IB / IGCSE / A-Level 國際課程專區 IA/EE/TOK, subject tips 國際課程選科、IA/EE 攻略及溫習交流
hkdse-fighters-hub student HKDSE Study & Subject Q&A DSE 考生溫習及問書區 Core/electives, mocks, JUPAS DSE 問書、Mock、JUPAS 排位
tutor-lounge-hk tutor Independent Tutors Lounge 導師教學及接案交流區 Teaching tips, student management 教學心得、教材、學生溝通

Schema adds (prefer extend #218 group/post tables — no parallel stack)

  • slug string unique
  • is_system_seeded bool default false
  • persona_tags text[] default {}
  • sort_order int default 999
  • All seeded: is_paid = false

Ranking (starter shelf) — exclude before slice

const MAX_STARTER_GROUPS_SHOWN = 6;
const MIN_USER_GROUP_POSTS_FOR_TOP_RANK = 3;

const starterGroups = allGroups
  .filter((g) => g.is_system_seeded || g.post_count >= MIN_USER_GROUP_POSTS_FOR_TOP_RANK)
  .filter((g) => activeTab === "all" || g.persona_tags.includes(activeTab))
  .sort((a, b) => a.sort_order - b.sort_order || +b.last_activity_at - +a.last_activity_at)
  .slice(0, MAX_STARTER_GROUPS_SHOWN);

Among seeded: sort_order ASC, then last_activity_at DESC. Seeded groups rank above user groups with < 3 posts.

MUST / MUST NOT

  • Seed MUST UPSERT on slug; re-run MUST NOT duplicate groups or starter threads (update metadata only; do not wipe members).
  • Filters with < 50 seeded groups MAY be client-side.
  • Money: all Phase A groups MUST be free.
  • WhatsApp: MUST NOT notify on seed or passive browse.

UI wireframe

+-----------------------------------------------------------------------+
| Community Hub / 討論區及社群                          [+ Create Group] |
| Filter: [ All 全部 ] [ Parents 家長 ] [ Students 學生 ] [ Tutors 導師 ] |
+-----------------------------------------------------------------------+
| ★ Popular Starter Groups / 熱門預設社群                                |
| | Parent | HK Parents Chit-Chat …  [ Join 加入 ] |  | Student | DSE Hub … |
+-----------------------------------------------------------------------+
| Latest Discussions / 最新話題                                          |
| 📌 [HK Parents Chit-Chat] MatchMax Official · 2h                       |
| 26/27 P1 & S1 Admission Interview Megathread …                         |
+-----------------------------------------------------------------------+
  • Loading: 4 group-card skeletons + 3 feed skeletons.
  • Empty inside group (shouldn’t happen if seeded): CTA New Post EN/繁中.
  • Error: reload banner EN/繁中.
  • Joined: button → outline Joined ✓ / 已加入.
  • Mobile <768px: starter shelf = horizontal snap carousel.

Edge cases

Case Expected
Cold start 0 user posts Seeded groups still show 3 starters; feed not blank
User group < 3 posts Below starter shelf
Multi-persona group persona_tags array; tab match if selectedTab ∈ tags
Double-click Join Disable in-flight; unique (group_id, user_id)
Re-seed No dup threads; members preserved

Acceptance

  • Fresh staging DB + seed → 6 groups + starters, no manual entry.
  • Parents tab → only persona_tags includes parent.
  • Seed ×2 → 0 duplicate groups/threads.
  • Non-admin cannot delete/rename/archive seeded groups.
  • 375px: horizontal starter shelf, no page overflow.

Test plan

  1. Run seed twice on staging.
  2. Incognito desktop 1440 + iPhone 390 → verify 6 slugs + EN/繁中.
  3. Parent account joins hk-parents-lounge, replies → thread rises.
  4. Non-admin delete attempt → hidden + API reject.

Phase B — Parent taxonomy + Shop contextual links

Depends on: Phase A + #218 composer/feed.

CEO lock

Ship Park
6 category pills + stage tags + Hot Today (24h HKT) Parent↔parent physical goods escrow
Required category on parent-group posts; optional stage Price scrapers, sticker packs, parent DM matching
Shop strip on academic threads only

Constants

export const PARENT_FORUM_CATEGORIES = [
  { slug: "chit-chat-family", en: "Chit-Chat & Family", zh: "家長吹水家庭事", showShopCta: false },
  { slug: "school-admissions", en: "School & Admissions", zh: "升學選校情報", showShopCta: true },
  { slug: "tutoring-homework", en: "Tutoring & Homework", zh: "補習及功課討教", showShopCta: true },
  { slug: "diapers-gear-jetso", en: "Diapers, Gear & Jetso", zh: "尿片用品及著數", showShopCta: false },
  { slug: "health-parenting", en: "Health & Parenting", zh: "育兒健康及飲食", showShopCta: false },
  { slug: "used-books-swaps", en: "Used Books & Swaps", zh: "二手書及教材轉讓", showShopCta: true },
] as const;

export const CHILD_STAGE_TAGS = [
  { slug: "0-3y", en: "0-3Y Baby/Toddler", zh: "0-3歲 嬰幼" },
  { slug: "k1-k3", en: "K1-K3 Kindergarten", zh: "K1-K3 幼稚園" },
  { slug: "p1-p6", en: "P1-P6 Primary", zh: "P1-P6 小學" },
  { slug: "s1-s6", en: "S1-S6 Secondary", zh: "S1-S6 中學" },
] as const;

Flow

  1. Parents hub → 6 category pills + stage pills + sort Hot Today / 今日熱話 | Latest Reply / 最新回覆.
  2. New post in parent group: MUST pick 1 category; MAY pick 1 stage before Publish.
  3. Thread fields: parent_category, child_stage_tag.
  4. Shop banner if showShopCta && child_stage_tag !== "0-3y" → navigate shop with ?ref=parent_forum&stage= (Open Q: exact shop path).
  5. Hot Today: (replies_24h * 3) + likes_24h DESC, HKT; if < 5 active threads, backfill by last_reply_at.
  6. Filters AND; de-dupe by thread.id before pagination slice.
  7. Posting free (HK$0). No MatchMax payment for parent tip swaps in this phase.
  8. Spam: no raw commercial link flood in first 24h of account (moderation flag) — normal talk stays easy.

Wireframe

| Parents Hub / 家長王國討論區                      [+ New Post 發新帖] |
| [💬吹水] [🏫升學] [📚補習] [🍼尿片] [🍎健康] [♻️二手]                 |
| Stage: All | 0-3Y | K1-K3 | P1-P6 | S1-S6                            |
| Sort: [🔥 Hot Today] [🕒 Latest Reply]                                |
| … thread cards; academic ones show Shop strip …                       |

Edge cases

Case Expected
Hot Today cold Backfill so page never empty
Toggle active category pill again Clears to All
Diaper + 0-3y No study-notes Shop banner
Double-submit Disable Publish + idempotency key

Acceptance

  • 6 categories + 4 stages EN/繁中.
  • Diaper/0-3y post: no Shop study CTA.
  • Tutoring/S1–S6: Shop CTA present + correct query.
  • Hot Today sorts by 24h HKT engagement with backfill.

Later (still parked inside B+): birth-year 媽媽會 + 18-district cohort tags — capture only, not Phase B required.


Phase C — School / centre hubs (prefer implement under #458)

Depends on: Phase A schema. Polls: extend #239 — do not invent a second poll system. If #239 says max 4 options, follow #239 unless CEO changes it (Open Q).

CEO lock

Ship (with #458) Park
Org hub sub-channels: SA / Students / Teachers Self-serve school SSO / ID OCR
Native poll widget (single/multi, HKT close) Ranked-choice elections, CPC ad auction
SA promo banner editable by sa_moderator / org_admin
Admin/seed creates hubs in first ship Open self-serve school verification portal

Pilot seed

  • ssc-hub — St. Stephen's College / 聖士提反書院專區
  • Other centres only if CEO lists them (Open Q).

Sub-channels & permissions

Channel Create top-level posts Vote / comment
📣 SA & Welfare sa_moderator, org_admin, platform admin All logged-in (unless SA locks comments)
🎓 Students Hub members Hub members
🍎 Teachers tutor/teacher, org_admin, admin Read: Open Q public vs private

Poll rules (align #239)

  • Options: follow Issue C21 — (community feature, stage 2) Polls and author stats #239 (2–4) unless CEO overrides.
  • Close: 1 / 3 / 7 days or custom HKT end.
  • Single: unique (poll_id, user_id); Multi: unique (poll_id, user_id, option_id).
  • Closed → reject votes; UI “Final Results / 最終投票結果”.
  • totalVotes === 0 → show 0%, never NaN.
  • Change vote allowed until close (atomic replace).
  • Count via rows / atomic increment — no unlocked JSON blob.

SA promo banner

interface OrgPromoBanner {
  isActive: boolean;
  title: string;
  body: string; // max 160
  ctaLabel: string;
  ctaUrl: string; // MUST match /^https:\/\/|^\//  — no javascript: / data:
  updatedAt: string;
}

Inactive → 0 height for members; SA sees dashed “Add promo”.

Wireframe

| 🏫 SSC Community Hub … [Joined ✓]                                      |
| 📢 SA Welfare & Promo … [✏️ Edit SA only]  [ Claim Offer → ]            |
| [ 📣 SA ] [ 🎓 Students ] [ 🍎 Teachers ]                               |
| 📊 POLL … percentages … Change Vote                                    |

Acceptance

  • ssc-hub seeded with 3 sub-channels.
  • sa_moderator can set promo CTA; student cannot.
  • Poll vote updates bars; no duplicate single-choice votes; 0 votes → 0%.
  • Student cannot top-post in SA or Teachers.

Phase D — Paid tutor subscription groups (prefer #474 / #232)

CEO lock

Until DAU exists When unparked into #474/#232
All A–C groups stay free Tutor creates new paid group; monthly HKD
Server strips post bodies + attachment URLs for non-subscribers (never CSS-only blur)
Cannot flip an existing free group with members to paid
Independent-tutor copy (not MatchMax employee) — Cap.57 / ToS aligned

Acceptance (when built)

  • Network tab on locked group → 0 paid bodies / signed attachment URLs.
  • Free→paid flip on membered group → 403.

Open Q before unpark D

  1. Platform cut % (match notes shop or other)?
  2. Stripe recurring vs FPS/PayMe vs shop rails?

Global out of scope

Open questions (CEO — resolve on unpark)

  1. Confirm stay parked until [PARKED] Epic: community public posts — do not build in V1 #218 + [Urgent · V1] Unified account + roles + child sub-profiles + hours ledger #459 — recommended YES.
  2. Official system account id for seeded thread authorship?
  3. Exact MatchMax Shop path + query format for parent CTA?
  4. Poll max options: keep #239 (4) or raise?
  5. Phase C: SSC only vs named centre partners list?
  6. Teachers sub-channel: public read for students/parents or private?

Activity

  1. owlstonbusiness-svg commented on Oct 27, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    Deepened 2026-10-27: full Phase A–D locks, BK research→slice table, seed roster EN/繁中, wireframes, exclude-before-slice ranking, Shop CTA rules, SSC/poll/promo detail, cross-links to #218/#239/#232/#458/#474. Still On Hold — not V1.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    On HoldExtra attention is neededenhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions