Repository navigation
Description
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 hasCommunityCommitmentGate+ 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
- Seed: deploy / migration / admin seed command (idempotent).
- Browse: Community directory / feed route — locate during impl after [PARKED] Epic: community public posts — do not build in V1 #218 (do not invent path in this issue).
Flow
- Seed UPSERTs 6 groups + 3 starter threads each (author = Open Q: MatchMax Official account id).
- User opens Community; if
joined_count === 0or logged out → show Popular Starter Groups / 熱門預設社群 above latest feed. - Persona tabs:
All | Parents | Students & Exams | Tutors(Schools tab only after Phase C). - Card → group feed with pinned starters on top.
- Join / 加入社群 or reply; if logged out → existing auth modal → return to same group.
- Non-admin MUST NOT delete / rename / archive
is_system_seededgroups (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)
slugstring uniqueis_system_seededbool default falsepersona_tagstext[] default{}sort_orderint 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
< 50seeded 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_tagsincludesparent. - Seed ×2 → 0 duplicate groups/threads.
- Non-admin cannot delete/rename/archive seeded groups.
- 375px: horizontal starter shelf, no page overflow.
Test plan
- Run seed twice on staging.
- Incognito desktop 1440 + iPhone 390 → verify 6 slugs + EN/繁中.
- Parent account joins
hk-parents-lounge, replies → thread rises. - 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
- Parents hub → 6 category pills + stage pills + sort
Hot Today / 今日熱話|Latest Reply / 最新回覆. - New post in parent group: MUST pick 1 category; MAY pick 1 stage before Publish.
- Thread fields:
parent_category,child_stage_tag. - Shop banner if
showShopCta && child_stage_tag !== "0-3y"→ navigate shop with?ref=parent_forum&stage=(Open Q: exact shop path). - Hot Today:
(replies_24h * 3) + likes_24hDESC, HKT; if< 5active threads, backfill bylast_reply_at. - Filters AND; de-dupe by
thread.idbefore pagination slice. - Posting free (HK$0). No MatchMax payment for parent tip swaps in this phase.
- 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-hubseeded with 3 sub-channels. -
sa_moderatorcan 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
- Platform cut % (match notes shop or other)?
- Stripe recurring vs FPS/PayMe vs shop rails?
Global out of scope
- Any build while [PARKED] Epic: community public posts — do not build in V1 #218 remains parked / before [Urgent · V1] Unified account + roles + child sub-profiles + hours ledger #459 foundation.
- Full Baby Kingdom clone; job board; politics/celebrity boards.
- Replacing notes shop with posts.
- WhatsApp/Telegram community bots; off-platform contact leaks.
- Parallel poll or paywall stacks beside Issue C21 — (community feature, stage 2) Polls and author stats #239 / [Parked · Epic] Creator-Monetized Study Vehicles — Gated Vaults · AI Mock Builder · Hybrid Tuition Bridge #474.
Open questions (CEO — resolve on unpark)
- 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.
- Official system account id for seeded thread authorship?
- Exact MatchMax Shop path + query format for parent CTA?
- Poll max options: keep #239 (4) or raise?
- Phase C: SSC only vs named centre partners list?
- Teachers sub-channel: public read for students/parents or private?
Activity
owlstonbusiness-svg commentedon Oct 27, 2026
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.