Repository navigation
Closed
0 / 30 of 3 issues completedClosed
0 / 30 of 3 issues completed
Copy link
Labels
ClaudeRoute to Claude Code: complex or UI-heavy workRoute to Claude Code: complex or UI-heavy workenhancementNew feature or requestNew feature or request
Description
Header
- Priority: High (Unifies public/internal profile mismatch + integrates [Urgent · V1] Unified account + roles + child sub-profiles + hours ledger #459, [Feature · V1 · #459] Lifelong Academic Records & Education CV #545 & Feature: MatchMax Impact (CSR Ecosystem Integration) #400) — Must NOT block core Stripe checkout or base auth.
- Owner: Ryan Young (locate tutor profile page, tutor card, and Feature: MatchMax Impact (CSR Ecosystem Integration) #400 impact badge components during implementation)
- Parent: #459 Unified base account & hours ledger
- Related (do not merge): #545 Academic Records CV (consumed on Overview & CV tab) · #400 MatchMax Impact / CSR Pro-Bono badge (capacity/slots SoT extends here) · #543 Digital materials checkout (Study Materials tab consumes published listings) · Social Posts → separate V1.1 child under #460
- Must NOT: Expose FPS / phone / private child sub-profiles on the Channel DOM · Add public “Pro-Bono Student” stigma badges · Ship photo feed / likes / comments /
@taggingin this issue · Rewrite materials fee SoT ([Feature · V1 · #251] Digital materials: Stripe checkout, 2% fee, R2 download, 72h hold #543) or tutoring 1.5-lesson fee
1. Problem
Currently, MatchMax suffers from a fragmented profile experience:
- Internal vs. Public Mismatch: Tutors edit their data in an internal settings view that looks completely different from their public profile card/page, making it hard to visualize how parents see them.
- Siloed Credentials & Assets: Clicking a user/tutor card only shows basic tutoring fields. It does not act as a unified "YouTube Channel" housing everything they do on MatchMax—their published Study Materials/Notes, Date Joined, Verified Teaching/Learning Hours, Active Student Count, Academic CV ([Feature · V1 · #459] Lifelong Academic Records & Education CV #545), and Centre Affiliations.
- Missing Pro-Bono Capacity & Stigma-Free Matching: While Feature: MatchMax Impact (CSR Ecosystem Integration) #400 introduced the Pro-Bono concept, tutors cannot specify how many concurrent pro-bono/discounted cases they can take or display their active pro-bono slot count publicly, and students have no stigma-free way to signal eligibility for pro-bono/discounted rates when requesting a tutor.
2. Product lock
| Ship now (V1 Unified Channel Profile) | Park (Moved to Social Posts under #460) |
|---|---|
• Unified Channel Page (/en/u/[handle] & /en/tutors/[id]): Every tutor/user card clicks through to a comprehensive YouTube/LinkedIn-style channel profile• Zero-Mismatch Owner Mode: Viewing your own profile shows the exact public layout with inline [ ✎ Edit ] triggers and a [ 👁 Preview Public View ] toggle (sensitive settings stay in /en/account/settings)• Concentrated Profile Header & Stats Bar: Date Joined, Verified Teaching Hours, Active Students/Lessons count, Notes Sold count, and Centre Affiliations • Channel Tabs: Overview & CV · Study Materials (Notes) · Reviews & Impact (plus Posts tab when Social Posts ships)• Centre Association: Tutors/users can link an Education Centre as Affiliated Educator (requires Centre confirmation) or Student / Alumni• Pro-Bono & Rate Tier System (Extending #400): Tutors set Pro-Bono toggle ( Free $0 and/or Reduced Rate), max concurrent slots (e.g., 1–5), and display live public slot status (1/2 Pro-Bono Slots Active) without exposing student identity• Private Student Access Signal: Case request form includes a private Request Pro-Bono / Reduced Rate toggle visible ONLY to matched tutors and staff (never public on student profile) |
• Instagram/LinkedIn Photo & Achievement Posts (Posts tab)• Post Likes, Comments, Saves, Shares, and @tagging in posts/comments |
3. Exact behaviour (how it works)
A. Card-to-Channel Navigation & Owner vs. Public View
- Universal Click-Through: Clicking any Tutor Card (in search results), Material Seller badge (on
/en/materials), or Centre Faculty card navigates to the user's unified Channel Profile. - Identical Layout (Owner vs. Visitor):
- When
auth.uid() == profile.user_id, the page renders the exact public Channel Profile layout with a sticky top bar:Viewing your public channel · [ ✎ Edit Mode (ON) ] [ 👁 View as Visitor ]. - In
Edit Mode, each block (Bio, Pro-Bono Banner, Academic CV from [Feature · V1 · #459] Lifelong Academic Records & Education CV #545, Centre Affiliations) displays an inline[ ✎ Edit ]button opening its respective modal. - Strict Privacy Separation: Private data (phone number, email, HK FPS payout details, private child sub-profiles, internal admin risk flags) MUST NEVER render on the Channel Profile DOM; they remain strictly inside
/en/account/settingsor the Admin Drawer.
- When
B. Concentrated Profile Metrics & Centre Affiliations
- Header Metadata:
- Display Name / Creator Alias,
@handle, Avatar, Cover Banner, Verification Badges (Blue Tick Verified/Community Champion #400). - Joined Date:
Joined Oct 2026(於 2026年10月 加入) derived fromprofiles.created_at. - Centre Affiliation Pill:
- A user can request an affiliation with a registered Partner Centre (
centre_id,role_type: 'affiliated_tutor' | 'alumni_student'). - If
role_type == 'affiliated_tutor', status starts aspendinguntil the Centre Admin clicksApprovein their Centre Workspace; once approved, displays🏛 Affiliated Tutor at [Centre Name](clickable to the Centre's page) and lists the tutor on the Centre's page. - If
role_type == 'alumni_student', displays in the user's Academic Timeline (Studied at [Centre Name]).
- A user can request an affiliation with a registered Partner Centre (
- Display Name / Creator Alias,
- Live Stats Ribbon (Auto-Calculated):
Verified Hours: Sum of confirmed teaching hours from the [Urgent · V1] Unified account + roles + child sub-profiles + hours ledger #459 ledger.Active Cases / Students: Count of currently active tutoring cases (shows count only, e.g.,4 Active Students, never exposing student names).Study Materials: Count of published notes/materials in the marketplace.Pro-Bono Impact: Count of active/completed pro-bono cases + pro-bono hours.
C. Pro-Bono & Reduced-Rate Signalling Rules (No Student Stigma)
- Tutor Supply Settings (Extending Feature: MatchMax Impact (CSR Ecosystem Integration) #400):
- In
Edit Mode, a tutor can configure their Impact & Pro-Bono Preferences:accepts_pro_bono(boolean:$0 Free Tuition for financial-need students)accepts_reduced_rate(boolean:Concessionary / Discounted Rate, with optionalreduced_hourly_rate_hkd)pro_bono_max_slots(integer0–10, e.g.,"I can take up to 2 pro-bono students at a time").
- In
- Public Signalling on Tutor Channel:
- When
accepts_pro_bono == trueoraccepts_reduced_rate == true, the tutor's card and profile display the Pro-Bono & Impact Card:- Shows capacity: e.g.,
🌱 Pro-Bono Capacity: 1 of 2 Slots Active (1 Slot Open)(義教名額:進行中 1/2(尚餘 1 個名額)). - If
active_pro_bono_cases >= pro_bono_max_slots, badge reads:🌱 Pro-Bono Capacity Full (Currently teaching 2/2 pro-bono students)— giving the tutor public social proof for actively teaching pro-bono while preventing burnout from extra requests.
- Shows capacity: e.g.,
- When
- Student / Parent Demand Signalling (Strictly Private to Tutor & Staff):
- Rule: There MUST NOT be a public "Pro-Bono Student" badge on any student's or child's public profile.
- Instead, inside the Request / Book Tutor modal (when booking a tutor who has Pro-Bono/Reduced Rate enabled, or submitting a general case), the student/parent can check:
[x] Apply for Pro-Bono / Financial Assistance Rate (申請義教或學費減免)and enter a brief private note (e.g., family/financial context or referral by school/NGO). - On the Tutor's incoming Case Lead Card, this renders a clear badge:
[🌱 Pro-Bono / Access Request]([🌱 義教/減免申請]) alongside[Parent Account]or[Independent Student]. - Once the case becomes active at
$0(or concessionary rate), the system automatically increments the tutor'sactive_pro_bono_casescounter on their public profile.
4. UI / UX (how it looks and where it lives)
A. ASCII Wireframe — Unified Channel Profile (/en/u/[handle])
+-----------------------------------------------------------------------+
| [Owner Bar: Viewing Your Channel] [✎ Edit Mode: ON] [👁 Public View] |
+-----------------------------------------------------------------------+
| [Cover Banner] |
| (Avatar) Hauzton Chan ✓ Blue Tick 🌱 Community Champion |
| @hauzton · Joined Aug 2026 · 🏛 Affiliated: Top Leader Ed |
| "HKU BBA · IB 42/45 · Specializing in HL Econ & Business" |
| [ Request Lesson ] |
+-----------------------------------------------------------------------+
| 📊 128 Verified Hrs | 👥 4 Active Students | 📚 3 Study Notes | 🌱 1/2 Pro-Bono |
+-----------------------------------------------------------------------+
| 🌱 Pro-Bono & Access Pledge [✎] |
| Welcomes Pro-Bono ($0) & Reduced-Rate students (HK$150/hr). |
| Status: Currently teaching 1 Pro-Bono student · 1 Slot Available. |
+-----------------------------------------------------------------------+
| Tabs: [ Overview & CV (5) ] [ Study Materials (3) ] [ Reviews (12) ]|
+-----------------------------------------------------------------------+
| (Tab 1: Overview & CV) |
| • tutoring subjects, rates, MTR stations |
| • Public Academic & Achievement Timeline (from #545) |
| |
| (Tab 2: Study Materials — Direct Buy Cards) |
| • [PDF] IB HL Economics Complete Notes · HK$100 · [Buy & Download] |
+-----------------------------------------------------------------------+
B. Exact Copy (English + 繁中)
- Joined Date: Joined {month} {year} / 於 {year}年{month}月 加入
- Active Students Stat: {count} Active Students / {count} 位進行中學生
- Pro-Bono Capacity Open: Pro-Bono Welcome ({active}/{max} Slots Active — {open} Available) / 歡迎義教申請(進行中 {active}/{max} — 尚餘 {open} 個名額)
- Pro-Bono Capacity Full: Currently Teaching {active}/{max} Pro-Bono Students (Slots Full) / 現正為 {active}/{max} 位義教學生補習(名額已滿)
- Student Case Modal Checkbox: Request Pro-Bono ($0) or Reduced Rate (Visible only to the tutor & MatchMax staff) / 申請義教($0)或學費減免(僅導師及平台管理員可見,絕不公開)
5. Logic & edge cases
| Case | Expected behaviour |
|---|---|
| User has published Study Materials, but has NOT activated 1-on-1 Teaching Mode | Their Channel Profile (/en/u/[handle]) hides the Request Lesson button and tutoring rate table, and defaults directly to the Study Materials and Overview & CV tabs (acting as a Creator/Student channel). |
| Tutor claims affiliation with a Centre without permission | Affiliation badge stays Pending and is hidden from the public profile until the Centre Admin approves it in the Centre Workspace. Either side can revoke the affiliation at any time. |
| Tutor's Pro-Bono slots are full (2/2 active) | The Apply for Pro-Bono ($0) checkbox in the booking modal for that specific tutor is disabled with tooltip: "This tutor's pro-bono slots are currently full (2/2 active), but you may still request their standard or reduced rate." |
| Pro-Bono case ends | When the case status transitions to completed or ended, active_pro_bono_cases decrements by 1 (freeing up the slot automatically), while total Pro-Bono Impact Hours remains permanently credited on the tutor's profile. |
| 0% Admin Fee on $0 Pro-Bono Cases | Consistent with #400, cases tagged and confirmed as $0 Pro-Bono incur $0 MatchMax administrative fee. |
6. Implementation notes
- Extend
profiles/tutor_profileswith:accepts_pro_bono(boolean, default false)accepts_reduced_rate(boolean, default false)reduced_hourly_rate_hkd(integer, nullable)pro_bono_max_slots(integer, default 0)
- Create
centre_affiliationstable (id,user_id,centre_id,role_type: 'affiliated_tutor' | 'alumni_student',status: 'pending' | 'approved' | 'rejected',created_at). - On cases, add
is_pro_bono_request(boolean, default false) andrate_tier: 'standard' | 'reduced' | 'pro_bono'. - Refactor the existing tutor profile view so the owner edit view and public visitor view share the exact same React layout component, conditionally rendering
[ ✎ Edit ]controls whenisOwner && !isPreviewingPublic. - Verified Hours ribbon reads [Urgent · V1] Unified account + roles + child sub-profiles + hours ledger #459 ledger sum only (no manual edits).
- Study Materials tab lists published rows from [Feature · V1 · #251] Digital materials: Stripe checkout, 2% fee, R2 download, 72h hold #543 marketplace for that seller — do not fork checkout.
7. Acceptance criteria
- Clicking any tutor card or material seller name navigates to the unified Channel Profile showing Date Joined, Verified Hours, Active Students count, Academic CV ([Feature · V1 · #459] Lifelong Academic Records & Education CV #545), and published Study Materials tab.
- Viewing one's own Channel Profile renders the exact same layout as a public visitor, with a toggle to switch between Edit Mode and Public Preview, and exposes zero private settings (FPS, phone, child sub-profiles).
- A tutor can enable Pro-Bono / Reduced-Rate preferences and set a maximum concurrent slot limit (
pro_bono_max_slots). - Having an active pro-bono case publicly displays "Currently teaching X/Y pro-bono students" on the tutor's profile without revealing who the student is.
- A student/parent can privately check Request Pro-Bono / Reduced Rate when requesting a lesson, displaying a
[🌱 Pro-Bono / Access Request]badge on the tutor's private case lead card without adding any stigma badge to the student's profile. - A tutor can link a Centre affiliation (which goes live upon Centre approval).
8. Out of scope
- Public stigma badges on student profiles.
- Social photo feed, likes, comments, and
@tagging(covered under [Parked Epic · under #459] Academic LinkedIn × Instagram Profile Overhaul #460 Social Posts child). - Materials payment rails rewrite ([Feature · V1 · #251] Digital materials: Stripe checkout, 2% fee, R2 download, 72h hold #543 remains SoT).
- Full community global feed ([PARKED] Epic: community public posts — do not build in V1 #218 / Issue C7 — (community feature, stage 2) Feed and tag page, do not build yet #225 stay parked).
9. Test plan
- Owner vs. Public Parity Test: Log in as Tutor A, open own Channel Profile, edit bio and Pro-Bono capacity inline (
max_slots = 1), toggle Preview Public View, and compare with an incognito window—confirm layouts are 100% identical. - Pro-Bono Slot & Privacy Test: As Student B, submit a case request to Tutor A with Request Pro-Bono checked. Verify Tutor A sees
[🌱 Pro-Bono / Access Request]on the lead card. Accept the case as active; verify Tutor A's public profile now reads1/1 Pro-Bono Slots Activeand Student B's profile has zero public pro-bono indicators. - Materials Tab Integration Test: Publish a study note as Tutor A; verify it appears automatically under the Study Materials tab on Tutor A's Channel Profile.
Addendum (2026-10-31): Centre Faculty Tab, Context-Aware Routing, Posts host note, Watermark/SEO
A. Our Tutors & Faculty (導師團隊) Tab
- On any Centre Channel Profile, add tab Our Tutors & Faculty / 導師團隊.
- Query: all users with
centre_affiliations.centre_id = current_centreANDstatus = 'approved'ANDrole_type = 'affiliated_tutor'. - Clicking a tutor card opens that tutor's independent Channel Profile (
/en/u/[handle]).
B. Context-Aware Case Routing (CEO lock)
| Entry point | Lead destination |
|---|---|
| Request Lesson on Tutor A's independent Channel Profile | Tutor A's private inbox — case.owner_id = tutor_a_user_id (Independent Case). |
| Request Lesson on Tutor A's card while browsing the Centre Faculty Tab (or a Centre-owned bootcamp listing) | Centre Workspace Inbox — case.centre_id = target_centre_id, tagged [Requested Tutor: Tutor A]. |
Why: tutors can freelance independently while also driving B2B centre business without channel conflict.
C. Posts & Media tab host (#549)
- When [Feature · V1.1 · #460] Social Channel Posts: photos, likes, comments, saves, shares & @tagging #549 ships, Channel tabs include Posts & Media hosting Grid/Feed + pin≤3.
- Overview & CV shows proof thumbnails from posts linked via
linked_academic_record_id([Feature · V1.1 · #460] Social Channel Posts: photos, likes, comments, saves, shares & @tagging #549 ↔ [Feature · V1 · #459] Lifelong Academic Records & Education CV #545).
D. Watermark & SEO (shared with #549 / #543)
- Post photos and material previews: auto-watermark MatchMax logo +
@handlebottom-right. - Overview & CV / non-commercial channel pages:
noindex,nofollowby default. - Settings: Allow search engines to index my public profile — default off Learning Mode; default on Verified Tutors & Centres.
Additional acceptance criteria
- Centre Channel shows Faculty tab listing approved affiliated tutors.
- Request Lesson from independent tutor profile → tutor inbox.
- Request Lesson from Centre Faculty context → centre inbox with Requested Tutor tag.
- SEO toggle + watermark behaviour documented and implemented per locks above (watermark may land with [Feature · V1.1 · #460] Social Channel Posts: photos, likes, comments, saves, shares & @tagging #549/[Feature · V1 · #251] Digital materials: Stripe checkout, 2% fee, R2 download, 72h hold #543 media pipeline).
ADOPTED addendum (2026-10-31 · CEO review enhancements)
Preview tooltip (ship with V1)
- Next to
[ 👁 Preview Public View ]/[ 👁 View as Visitor ], show a short tooltip / helper:- EN:
How parents see this — private settings (phone, FPS, child profiles) stay hidden. - 繁中:
家長所見畫面 — 電話、FPS、子女檔案等私密設定不會顯示。
- EN:
- Purpose: tutors immediately understand Edit Mode vs Public Preview without leaving the channel.
Stats ribbon — public vs owner-only (one-line lock)
| Stat | Public Channel | Owner-only (never on public DOM) |
|---|---|---|
| Joined date | ✅ | — |
| Verified Hours (#459) | ✅ | — |
| Active Students / Cases count | ✅ (count only) | Student names never |
| Study Materials count | ✅ | — |
| Pro-Bono slots active/open | ✅ (counts only) | Student identity never |
| Phone / email / FPS / child sub-profiles / admin flags | ❌ | ✅ /en/account/settings + Admin Drawer only |
Ship order note: #548 first unblocks #549 (Posts tab host) and #551 (availability grid on Overview).
Additional AC
- Preview Public View control has “How parents see this” helper tooltip (EN+繁中).
- Header/stats ribbon documents public vs owner-only stats per table above (eng + UI copy).
Metadata
Metadata
Assignees
Labels
ClaudeRoute to Claude Code: complex or UI-heavy workRoute to Claude Code: complex or UI-heavy workenhancementNew feature or requestNew feature or request
Activity
owlstonbusiness-svg commentedon Oct 31, 2026
Integrator note (2026-10-31): Body addendum applied —
Multi-Staff Workspace → new #550 under #459.
owlstonbusiness-svg commentedon Oct 31, 2026
CEO lock applied — Public Availability Calendar child #551 updated in place (V1.1 body + title).
#518 map refreshed.
owlstonbusiness-svg commentedon Oct 31, 2026
ADOPTED (CEO review 2026-10-31) — locked in body addendum:
Cross-note: Ship #548 first → unblocks #549 and #551. Privacy consistent: no child sub-profiles / no student names on public grids.
owlstonbusiness-svg commentedon Oct 31, 2026
Cross-lock from #553 (CEO 2026-10-31) — Profile / channel tags
#exam-prep,#ia-supervision,#probono,#online-only,#group-lessons).#typeahead and appear on public channel DOM (same privacy boundary as this issue: no child sub-profiles / no sensitive fields).owlstonbusiness-svg commentedon Oct 31, 2026
Child (CEO 2026-11-01)
owlstonbusiness-svg commentedon Oct 31, 2026
CEO lock 2026-11-01 — Tag input UX AC (profile edit) + PARK highlights
Shared freestyle
#tags SoT: #553. Profile pin tags (5–8) already cross-locked — this fills editor UX.ADOPT — Acceptance criteria (Channel Profile Edit Mode)
#shows typeahead of existing public tags (~8; popularity + prefix per [Feature · V1] Global Search Bar: free-text across Tutors, Cases, Notes, Centres, Users & Posts #553).#bio≠#生物in V1).#; normalize lowercase · spaces→hyphens · vulgarity reuse.Cross — Pro-bono discoverability
#probono/#reduced-ratesoft-promoted in typeahead once usage exists (#553) — pairs with public capacity counter here + #560. No student stigma badges.PARK V1.1 — Pinned materials / highlights strip
No V1 “pinned materials / highlights” strip on Channel beyond existing Study Materials tab. Revisit lightly under V1.1 with #549 if tutors need richer early presence before full social photos. Do not unpark early photo posting here.
Cap.57 / 1.5 fee / materials 2% SoT unchanged.
feat(#545,#547,#548,#550,#522): unified-account children — Education …
keyframesfound commentedon Nov 1, 2026
Closing — Unified Channel Profile shipped on main (c0e8ce4 + c424662; migration 20261101050000 prod-applied):
/u/[handle]Channel page: identity header (avatar, display name, Blue Tick, @handle, Joined date, 🏛 affiliation pills), live stats ribbon (Verified Hours from the [Urgent · V1] Unified account + roles + child sub-profiles + hours ledger #459 ledger · Active Students count · Study Notes count · Reviews avg) — counts only, never student identities.Viewing your public channelbar, Edit-Mode toggle (reveals inline affiliation request + edit hints), settings hand-off. Strict privacy separation: no phone/email/FPS/child data in any channel payload.accepts_pro_bono,accepts_reduced_rate+ reduced rate,pro_bono_max_slots0–10) in My Tutor settings via service fn; public Pro-Bono & Impact Card with live slot status ({active}/{max} · {open} open/ Capacity Full). No student-side stigma: the request lives as a privatepro_bono_request+note on the case, rendered only as the 🌱 badge on the tutor's lead card (tutor+staff only, verified ingetMyTutorCases).centre_affiliations(affiliated_tutor pending→centre-approved; alumni_student auto-approved → "Studied at"), requests raise an AR-8 action for centre admins (c424662), approval lists the tutor on the centre page and the pill on the channel.owlstonbusiness-svg commentedon Nov 2, 2026
ADOPT — Channel Materials tab = Seller Materials Store (ties to #556)
Public (and owner) Materials tab on Unified Channel Profile is the seller’s storefront — not a flat dump.
AC
price_pack+ “Save HK$X” when cheaper than sum of singles.sell_separately=true, show both pack CTA and child cards; when false, pack-only.Fee / Cap locks unchanged (materials 2%+72h; Cap.57 / 1.5 tutoring elsewhere).
owlstonbusiness-svg commentedon Nov 2, 2026
Industry grounding — Channel Materials tab (no stretch)
sell_separately: same as Gumroad listing both the bundle and its included products (help/339). Pack-only when toggle off ≈ Teachable single course product.Parent lock: #556. Studio bulk manage → #585.
owlstonbusiness-svg commentedon Nov 2, 2026
Cross-ref · Materials tab Collections (Gemini pack Issue B)
Even though this issue is closed as shipped channel shell, Materials tab Collections behaviour is refined by the Argon pack:
All 全部 (n), named series) above 2-column Carousell grid (reuse card from [Feature · V1 · #543 · #626 Child 2] Materials Discovery + Similar-on-Click Harden (Author Cap · 5+1) #557).Full wireframes + ACs → #557 (Issue B). Seller create assigns
collection_id→ #556 (Issue A). Fee SoT unchanged (materials 2%+72h / weekly FPS).owlstonbusiness-svg commentedon Nov 2, 2026
Cross — Explore entry is Marketplace (Materials tab unchanged)
CEO lock: #557 — Explore pill = Marketplace → Notes | Gigs. Seller profile Materials tab Collection filter pills + Carousell grid from Gemini Issue B are unchanged (organise-only Collections; no Collection checkout). Discovery entry rename only.
owlstonbusiness-svg commentedon Nov 3, 2026
2026-11-03 Asia/Hong_Kong — CEO via Jarvis
Channel Profile Teaching/Learning surfaces now get concrete Active Cases / 進行中個案 cards (replacing Active students/tutors counters) under #632 / #633. Dignity locks (no public student stigma badges) remain — restated REJECT on #632. Related calendar thin-link: #636 → #551/#594.
owlstonbusiness-svg commentedon Nov 3, 2026
2026-11-03 Asia/Hong_Kong — CEO via Jarvis
Channel Profile Teaching/Learning surfaces get concrete Active Cases / 進行中個案 under #632. Dignity locks (no public student stigma) restated REJECT. Calendar thin-link: #636 → #551/#594.