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-)
| ID | Feature | Method / table | Status |
|---|---|---|---|
| CL-001 | Enroll / programs | programs() :138, config | ๐ข |
| CL-002 | XP โ reward payout | xpToRupees() :101 โ wallet (real credit, careerlab_reward tag, not earned/capped) | ๐ข |
| CL-003 | Certificates | cert store | ๐ข |
| YEP-001 | Application pipeline | yep_applications + yep_application_stages | ๐ก |
| YEP-002 | Interview / orientation | yep_interviews, yep_orientation_calls | ๐ก |
| YEP-003 | Agreement / conversion | yep_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.