Skip to content

[Feature · V1 · #459] Lifelong Academic Records & Education CV #545

Closed

Description

@owlstonbusiness-svg

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/join tutor 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

  1. Every academic_record belongs either to the account owner (user_id, child_profile_id = null) OR to a specific Child Sub-Profile.
  2. Switching Learning ↔ Teaching Mode never hides or deletes records.
  3. 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.
  4. 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/join itself 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 / Nursery
  • primary — Primary School
  • secondary — Secondary / High School
  • post_secondary — University / Higher Diploma
  • extracurricular_award — Music, sports, competitions, awards
  • certification_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_current
  • grades_or_results (free text, e.g. “HL Economics 7”, “5**”, “A*”, “88/100”)
  • notes (optional, max 300 chars)

C. Visibility

  1. Default for learners/children: shared_with_matched_tutors (toggleable to private).
  2. When shared and a case is created for that learner, tutor sees Diagnostic Summary + Timeline on the case lead / active case.
  3. Teaching Mode: self-owned records get checkbox “Show on my Public Tutor Profile”. Unverified records show as Stated; Blue Tick only from /en/join verification.

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_records with fields listed above (child_profile_id nullable).
  • 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/join reads 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/join auto-pulls self-owned Academic Records without double entry.
  • /en/join itself remains the dedicated tutor onboarding path.
  • Grade field accepts free text.

8. Out of scope

9. Test plan

  1. Child portfolio: Add Early Years + Award records for Anson, set strengths/weaknesses, export PDF and confirm clean print.
  2. Tutor visibility: Share on → tutor sees on case; share off → hidden.
  3. 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_urls when 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 via media_urls.

Schema

  • academic_records.media_urls text[] default '{}', max 3 image URLs (R2).

Additional acceptance criteria

Activity

  1. owlstonbusiness-svg commented on Oct 31, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    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/join prefill only; join wizard not replaced.

  2. owlstonbusiness-svg commented on Oct 31, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    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> and child_profile_id = NULL so the CV becomes self-owned on the child's "Myself" profile. Implement #545 schema with that nullable child_profile_id + ownership flip in mind.

  3. owlstonbusiness-svg commented on Oct 31, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    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).

  4. owlstonbusiness-svg commented on Oct 31, 2026

    @owlstonbusiness-svg
    CollaboratorAuthor

    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.

  5. added a commit that references this issue on Nov 1, 2026
  6. keyframesfound commented on Nov 1, 2026

    @keyframesfound
    Owner

    Closing — V1 Lightweight Education CV shipped on main (c0e8ce4; migration 20261101040000 prod-applied):

    • Tables: learner_snapshots (level/strengths/needs/goals + share toggle, one per learner via uq_learner_snapshot) and academic_records (6 locked categories, year checks, per-record visibility private|matched_tutors|public_tutor). Service-role only; every write scoped in academic-records.functions.ts.
    • /account section (EducationCvSection under the learner pill): learner diagnostic card with edit, 6-category timeline grouped by category, single + Add Record modal (no wizard), per-record edit/delete, share toggle live.
    • Per-child separation: records/snapshot keyed (owner, child_profile_id) — the pill swap changes exactly what renders; claimed children's CVs belong to their account (#547 migrates them on claim).
    • Tutor visibility: getCaseLearnerCv serves 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.
    • Print / Save PDF: window.print() with a dedicated @media print block scoped to .cv-print (site chrome hidden; export button hidden in print).
    • /join prefill: "Check my Education CV → Import into this form" in the Academics step maps self-owned records into qualifications + achievements (getJoinEducationPrefill), without touching the wizard itself.
    • Privacy: verified transcripts stay optional/exclusive to /join Blue Tick; no public directory of learner CVs; public_tutor rows 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).
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

    ClaudeRoute to Claude Code: complex or UI-heavy workenhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions