Repository navigation
[Feature · V1 · #459] Lifelong Academic Records & Education CV #545
Copy link
Copy link
Closed
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: Medium (Matching context + "LinkedIn for Education" CV foundation) — Must NOT block initial sign-up or complicate
/en/join. - Owner: Ryan Young (locate profile and child sub-profile views during implementation)
- Parent: #459 Unified base account & child sub-profiles
- Related (do not merge): Parked broader visual/social CV epic #460 (Academic LinkedIn × Instagram) — this issue is the lightweight V1 records layer only. Extracurricular discovery remains #415.
- Must NOT: Replace or complicate the existing
/en/jointutor form; change 1.5-lesson fee; build materials checkout (that is #543).
1. Problem
Currently, academic credentials on MatchMax only exist inside the heavy /en/join educator onboarding form. This creates three gaps:
- No structured student background for tutors: When a parent or student requests a tutor, there is no structured place to share the learner's school history, current grades, weak subjects, or target exams—forcing repetitive questions over WhatsApp.
- No lifelong education CV for children or adults: Parents preparing young children (Kindergarten / Primary / Secondary) have no clean portfolio builder to track schools, music/sports certificates, and awards (which parents also use for HK Primary 1 / Secondary 1 admission interviews). Adults/parents with teaching or academic backgrounds also cannot record their credentials without applying as a commercial tutor.
- Duplicate data entry when becoming a tutor: If a student records their DSE/IB grades on their profile and later decides to become a tutor via
/en/join, they currently have to re-enter their academic background from scratch.
2. Product lock
| Ship now (V1 Lightweight Education CV) | Park / Out of scope |
|---|---|
• Academic & Achievement Records (academic_records) card section on /en/account (for "Myself" AND each Child Sub-Profile)• 6 structured record categories: Early Years (Kindergarten/Nursery), Primary School, Secondary School, University & Post-Secondary, Extracurricular, Music, Sports & Awards, Languages & Professional Credentials• Lightweight single-modal + Add Record flow• Learner Diagnostic Banner ( Current Strengths, Needs Help With / Weaknesses, Target Goals) per learner profile• Visibility Controls: Private (Only Me) vs Share with Matched Tutors on Cases vs Public on Tutor Profile• 1-Click Pre-fill into /en/join: If a user later opens /en/join to become a tutor, existing academic_records automatically populate their tutor education section• Clean Print / PDF Portfolio View: Print / Save as CV (PDF) button using browser print stylesheet |
• Replacing or merging the /en/join tutor application wizard• Mandatory transcript verification for student/child records (Blue Tick remains optional and exclusive to Teaching Mode / /en/join)• Publicly searchable directory of children's or students' private CVs • Parked #460 Instagram-style achievements grid / banner chrome (unpark later) |
3. Exact behaviour (how it works)
A. Data Ownership & Role Portability
- Every
academic_recordbelongs either to the account owner (user_id,child_profile_id = null) OR to a specific Child Sub-Profile. - Switching Learning ↔ Teaching Mode never hides or deletes records.
- Parent manages records for young children under the child pill. No child login required in V1. Later claim flow (Issue [Urgent · V1] Unified account + roles + child sub-profiles + hours ledger #459) transfers records intact.
- When user opens
/en/join, education step auto-reads self-owned records (child_profile_id IS NULL) so they do not re-type schools or grades./en/joinitself remains the dedicated path for Teaching Mode logistics (rate, stations, Cap.57, Blue Tick upload).
B. What Users Can Record
1. Learner Diagnostic Summary (top card per learner)
current_level(e.g. K3, Primary 5, IBDP Year 12)strengths_text(max 200 chars)weaknesses_needs_text(max 200 chars)target_goal_text(max 200 chars)
2. Timeline Cards (academic_records)
Categories:
early_years— Kindergarten / Nurseryprimary— Primary Schoolsecondary— Secondary / High Schoolpost_secondary— University / Higher Diplomaextracurricular_award— Music, sports, competitions, awardscertification_language— IELTS, JLPT, professional quals
Modal fields:
institution_or_issuer(required)title_or_program(required)curriculum_or_body(optional; free text or simple dropdown: IB, DSE, A-Level, etc.)start_year/end_year/is_currentgrades_or_results(free text, e.g. “HL Economics 7”, “5**”, “A*”, “88/100”)notes(optional, max 300 chars)
C. Visibility
- Default for learners/children:
shared_with_matched_tutors(toggleable to private). - When shared and a case is created for that learner, tutor sees Diagnostic Summary + Timeline on the case lead / active case.
- Teaching Mode: self-owned records get checkbox “Show on my Public Tutor Profile”. Unverified records show as Stated; Blue Tick only from
/en/joinverification.
4. UI / UX
Placement: /en/account under selected learner pill (Myself or child), section titled Education CV & Academic Records / 學習履歷及成績檔案.
+-----------------------------------------------------------------------+
| Education CV & Academic Records — Anson [🖨 Export PDF CV] |
| Share with matched tutors on cases: [ ON ● ] [+ Add Record] |
+-----------------------------------------------------------------------+
| 🎯 Learner Snapshot [Edit ✎] |
| • Current Level: IB Year 11 • Goal: HL Econ 7 |
| • Strengths: Fast at quantitative math |
| • Needs Help With: 15-mark essay evaluation |
+-----------------------------------------------------------------------+
| 🎓 Academic & Achievement Timeline |
| [Secondary School] St. Stephen's College 2021 – Pres |
| IB Diploma Programme · Year 11 [Edit] |
| Grades: [HL Econ: 6 (Predicted)] [HL Math AA: 7] |
+-----------------------------------------------------------------------+
Tutor case view shows compact “Student Academic Snapshot” when shared.
Copy:
- Section: Education CV & Academic Records / 學習履歷及成績檔案
- Add: + Add Record / + 新增履歷紀錄
- Export: Print / Save PDF Portfolio / 列印/匯出 PDF 履歷
- Toggle: Share academic snapshot with tutors when requesting lessons / 配對補習時向導師顯示此學習履歷及弱項分析
5. Logic & edge cases
| Case | Expected behaviour |
|---|---|
| Parent switches pill Myself ↔ Anson | Section swaps to that learner’s records only. |
User later visits /en/join |
Self-owned records pre-populate education step. Single source of truth. |
| Parent prints PDF for Primary 1 interview | Clean print view of timeline; hides diagnostic weaknesses and site chrome. |
| Visibility set to Private | Tutors do not see detailed records on case. |
| Vulgar text in free fields | Handled by existing moderation path. |
6. Implementation notes
- Table
academic_recordswith fields listed above (child_profile_idnullable). - Diagnostic fields live on learner / child sub-profile record.
- Keep record creation as a single lightweight modal. Do not build a second multi-page wizard.
/en/joinreads existing self-owned records but is not replaced.- Distinct from parked #460 visual overhaul — do not pull Instagram grid / banner scope into V1.
7. Acceptance criteria
- Any user can add/edit/delete Academic Records (all 6 categories) and Learner Snapshot on
/en/account. - Parent can maintain separate records and snapshot for each child sub-profile.
- When share toggle is on, tutors see snapshot + records on case lead / active case.
- When share toggle is off, tutors do not see them.
- Print / Save PDF produces clean portfolio of timeline cards.
-
/en/joinauto-pulls self-owned Academic Records without double entry. -
/en/joinitself remains the dedicated tutor onboarding path. - Grade field accepts free text.
8. Out of scope
- Replacing
/en/join. - Blue Tick verification for student/child records.
- Public searchable student CVs.
- Parked [Parked Epic · under #459] Academic LinkedIn × Instagram Profile Overhaul #460 banner / achievements grid / Instagram-style profile chrome.
9. Test plan
- Child portfolio: Add Early Years + Award records for Anson, set strengths/weaknesses, export PDF and confirm clean print.
- Tutor visibility: Share on → tutor sees on case; share off → hidden.
- Bridge: Add secondary record under Myself, open
/en/join, confirm pre-filled.
Addendum (2026-10-31): Child Visual Proof (media_urls)
Product lock
academic_records+=media_urls text[]— max 3 Cloudflare R2 photos per record (adults and child sub-profiles).- Parents attach award / certificate / artwork photos on child records → Visual Trophy Roster inside
/en/account(child pill). - Photos appear on Print / Save PDF Portfolio (clean print; no site chrome).
- Claim flow #547 MUST carry
media_urlswhen the child claims (atomic migrate with records). - Two-way proof with social posts: when an adult links a [Feature · V1.1 · #460] Social Channel Posts: photos, likes, comments, saves, shares & @tagging #549 post via
linked_academic_record_id, CV card shows[ 📷 View Proof ]from that post. Child minors still have no public social channel — proof lives on the record itself viamedia_urls.
Schema
academic_records.media_urls text[]default'{}', max 3 image URLs (R2).
Additional acceptance criteria
- Parent can attach up to 3 award/certificate photos on a child sub-profile academic record.
- Visual Trophy Roster renders those photos on the child Education CV section.
- Print/PDF includes record photos.
- [Feature · V1 · #459] Child Sub-Profile Claim Flow #547 claim migrates
media_urlswith the records. - Adult records can also hold up to 3 direct proof photos; optional [Feature · V1.1 · #460] Social Channel Posts: photos, likes, comments, saves, shares & @tagging #549 post link remains SoT for public channel proof display.
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
Locked V1 Academic Records under parent #459. Related parked epic #460 stays On Hold (visual/social CV layer) — do not pull Instagram grid / banner into this issue.
/en/joinprefill only; join wizard not replaced.owlstonbusiness-svg commentedon Oct 31, 2026
Downstream claim/transfer: #547 Child Sub-Profile Claim Flow (under #459).
When a child claims, the RPC sets
academic_records.user_id = <new_user_id>andchild_profile_id = NULLso the CV becomes self-owned on the child's"Myself"profile. Implement #545 schema with that nullablechild_profile_id+ ownership flip in mind.owlstonbusiness-svg commentedon Oct 31, 2026
Cross-link (2026-10-31): Public Overview & CV tab on Unified Channel Profile #548 will render public-visibility Academic Records from this issue. Keep #545 as the lightweight records SoT — do not pull Instagram Posts grid here (that is #549 under #460).
owlstonbusiness-svg commentedon Oct 31, 2026
Integrator note (2026-10-31): Body addendum — Child Visual Proof
media_urls(max 3 R2 photos per record; Visual Trophy Roster; PDF; claim #547 carries photos). Two-way proof with #549 when adults link posts.feat(#545,#547,#548,#550,#522): unified-account children — Education …
keyframesfound commentedon Nov 1, 2026
Closing — V1 Lightweight Education CV shipped on main (c0e8ce4; migration 20261101040000 prod-applied):
learner_snapshots(level/strengths/needs/goals + share toggle, one per learner viauq_learner_snapshot) andacademic_records(6 locked categories, year checks, per-record visibilityprivate|matched_tutors|public_tutor). Service-role only; every write scoped inacademic-records.functions.ts.EducationCvSectionunder the learner pill): learner diagnostic card with edit, 6-category timeline grouped by category, single+ Add Recordmodal (no wizard), per-record edit/delete, share toggle live.#547migrates them on claim).getCaseLearnerCvserves the compact "Student Academic Snapshot" on the tutor case card and the staff CaseDetailView — only when the share toggle is on and record visibility ≠ private; toggle off → tutors see the hidden notice.window.print()with a dedicated@media printblock scoped to.cv-print(site chrome hidden; export button hidden in print).getJoinEducationPrefill), without touching the wizard itself.public_tutorrows are the only publicly rendered slice (on the [Feature · V1 · #459] Unified Channel Profile: inline owner view, Materials & Hours tabs, Centre Affiliation & Pro-Bono capacity #548 Channel).