Core Concepts

Activity Tracking

The Activity page — a Timeline of every piece of skill evidence, skills grouped with proficiency, and a career-path recommendation.

What it's for

The Skill-Scoring System explains how evidence turns into numbers. The Activity page (/activity) is where you actually look at that evidence: every graded task and assessment, every completion, every attendance record, as a browsable log — plus the same numbers rolled up by skill and by career path. It's built entirely from getUserSkillEvidence() and computeSkillScores() in lib/data/scoring.ts and lib/skills.ts, the same functions the resume uses, so the two views never disagree.

Timeline tab

A flat, dot-and-line log — buildActivityLog() in lib/skills.ts turns every position's graded tasks/assessments, attendance, and completion, plus every course's graded items and enrollment status, into one entry per event. Each entry shows:

  • A timestamp on the left. Graded items use their own date; completions use postingParticipant.completedAt; anything without a completion date yet (an active, uncompleted event position, for example) falls back to postingParticipant.assignedAt — a real timestamp, not a placeholder, so the Timeline never shows a blank date.
  • A tag on the right — {Job/Course/Event/Project} - {Assessment/Task/Attendance/Log/Completion} — naming which posting kind and which of the 5 scoring tiers this entry belongs to.
  • A title that reads like a real position, not a bare status word — a completed event position shows "Winner — WildHacks — 36hr Hackathon", not just "Winner".
  • One badge per tagged skill, each showing that skill next to the tier weight it earns (e.g. "Python: 0.01") — the actual TIER_WEIGHTS constant, not a summary percentage, so the scoring model is visible on every entry instead of being a black box.
  • Links to the underlying Activity (the job/course/event/project's own Hub page) and its Hub, plus a best-effort "Updated by" line (a course's professor, an event's organizer) — text only, not a clickable profile, since none of these demo Hubs have a real faculty/manager account seeded yet.

Skills tab

Skills are grouped into a 3-tier hierarchy by a local keyword classifier in components/app/SkillsSection.tsx: Category (STEM, Languages, Social Studies, Personality, Design, Business, Academics, Software) wraps Subject (Physics, Hindi, Mathematics, ...), which wraps individual skill tags (Electrostatics, Hindi Grammar, ...). A real subject renders as one aggregate card — its tags shown as chips underneath, not as separate peer skills — while Personality/Design/Business/Academics have no natural subject split, so their individual named skills (Leadership, Figma, ...) render directly under the Category. This is deliberately separate from CareerPath (below): the taxonomy here is about the shape of the skill itself, not a life-domain goal.

Each card renders its score, a Learning → Beginner → Amateur → Advanced → Pro progress bar (proficiencyLabel()'s 5 bands — 0/20/40/60/80 thresholds), and a count of how many jobs/courses/projects/events credit it (summed across every tag, for a Subject rollup card). Clicking a card opens a modal listing every posting behind it — every tag's evidence merged together for a Subject card — each broken into Assessments, Tasks (score% or a Due/Upcoming status), and Attendance.

Reports tab

  • Completions by kind — how many completed Jobs, Courses, Projects, Events.
  • Proficiency — how many skills fall in each of the 5 bands.
  • Recommended career path — every skill's score is summed into its inferred CareerPath (via inferPath(), a keyword heuristic) and ranked; rankCareerPaths() in lib/skills.ts does the summing and is shared with the Resume page's own recommendation note. Paths with zero matching skill score are hidden rather than padded in at 0%.
CareerPath itself is a 38-entry taxonomy spanning 9 life-activity domains (Technology, Business, Creative, Athletics, Sciences & Health, Aviation & Aerospace, Engineering, Public & Legal, plus one bucket per domain's specifics) — far broader than a job-search "target role." It's shared app-wide through CareerPathProvider (persisted to localStorage), selectable from the Explore page's Filter panel or the Resume page's Career Path dropdown, and it's what the Resume page's headline, summary, and Skills grouping are scoped to — see Dynamic Resume.

The Today page's Activity badge

Today's topnav Activity button shows a live count — the same buildActivityLog() output, length-counted — so the number always matches exactly what the Timeline tab would show if you clicked through.