Koovira Dev Docs
20-modules/careerlab-yep/overview.md

Module: CareerLab & YEP (education โ†’ hiring)

Status: ๐ŸŸข CareerLab Phase 1 live / ๐ŸŸก YEP pipeline built ยท Last validated: 2026-09-06 ยท Priority: P1

Two linked sub-systems: CareerLab (learning programs โ†’ XP โ†’ rewards โ†’ certs) and YEP (Youth Employment Program: a full employer-to-hire pipeline). Validated against classs/KvCareerLabModule.php, the yep_* tables, and config/yep_workflow.php.

CareerLab

  • Code: classs/KvCareerLabModule.php; careerlab_dashboard.php, careerlab_signup.php,

careerlab_verify.php.

  • Model: programs โ†’ tracks โ†’ tasks โ†’ XP โ†’ rewards โ†’ certs. Programs are config/settings-driven

(programs() :138, programByKey() :150) โ€” not a careerlab_programs table (that name does not exist; validate the exact store per program). isEnabled() :67 gates the module.

  • Rewards: XP converts to rupees via xpToRupees(xp) (:101); the actual credit for approved

rewards happens in approveReward() (classs/KvCareerLabModule.php:618-664), via the existing WalletModule::credit() โ€” still no new credit path. (corrected 2026-09-06: doc previously said rewards were credited with the wallet_cashback earned tag and were subject to the earned-credit cap. Code now shows otherwise โ€” classs/KvCareerLabModule.php:636-646 deliberately uses meta_source => 'careerlab_reward', which is NOT listed in WalletModule::EARNED_CREDIT_SOURCES [classs/WalletModule.php:2618-2622: referral_bonus, signup_bonus, wallet_cashback, global_cashback, scratch_card, points_convert, membership_cashback_cab]. The in-code comment says an earlier version used wallet_cashback "on the mistaken premise that avoiding WalletModule changes required reusing an existing tag; that made stipends practically unspendable. Reverted 2026-09-02." CareerLab task/commission rewards are therefore real, uncapped, non-expiring wallet credit โ€” NOT subject to the 15%/โ‚น25 earned-credit cap or the 365-day earned expiry described in ../../40-financial/wallet.md.)

  • Status: Phase 1 live on prod (2026-08-12), zero existing-class changes.

YEP (Youth Employment Program)

  • Model: an 18-table hiring pipeline: yep_applications (4), yep_application_stages,

yep_agreements, yep_interviews, yep_orientation_calls, yep_documents, yep_certifications, yep_conversion_log, โ€ฆ A candidate moves application โ†’ stages โ†’ interview โ†’ orientation โ†’ agreement โ†’ conversion, with documents + certifications.

  • Reachability caveat (memory yep-pages-reachability-trap): the merchant YEP desk looks like a

live PII leak but is already blocked fail-closed โ€” verify the gate before escalating.

Feature registry (prefix CL- / YEP-)

IDFeatureMethod / tableStatus
CL-001Enroll / programsprograms() :138, config๐ŸŸข
CL-002XP โ†’ reward payoutxpToRupees() :101 โ†’ wallet (real credit, careerlab_reward tag, not earned/capped)๐ŸŸข
CL-003Certificatescert store๐ŸŸข
YEP-001Application pipelineyep_applications + yep_application_stages๐ŸŸก
YEP-002Interview / orientationyep_interviews, yep_orientation_calls๐ŸŸก
YEP-003Agreement / conversionyep_agreements, yep_conversion_log๐ŸŸก

Financial impact

CareerLab task/commission rewards are real, uncapped wallet credit (careerlab_reward meta_source, not an earned-credit source โ€” see the correction above). YEP conversion may have placement fees โ€” validate against config/yep_workflow.php.

Errors / dependencies / change-impact

Depends on wallet (WalletModule::credit()), Jobs (hiring), identity, certificates. Errors: CL-E001 reward credit fails and is rolled back to pending (see approveReward() catch path, classs/KvCareerLabModule.php:654-658) โ€” not an earned-cap rejection, since these credits are not earned-tagged. Change-impact: reward payout touches real wallet balance, not the capped earned bucket โ€” re-test XPโ†’โ‚น crediting directly; YEP stage changes must respect the fail-closed PII gate.