WW-98 Result¶
Files Touched¶
src/WorkWingman.Core/Models/EducationStubs.cssrc/WorkWingman.Core/Models/IntakeProfile.cssrc/WorkWingman.Core/Models/BackupDomainRegistry.csfrontend/src/app/core/models.ts
Migration Approach for EducationEntry.Id¶
Added public string Id { get; set; } = Guid.NewGuid().ToString("N"); to EducationEntry.
This implicitly migrates already-persisted profiles on load via C# property initialization. During JSON deserialization with System.Text.Json, missing keys do not overwrite properties initialized with a default value, effectively assigning an ID dynamically to entries lacking one while allowing existing data to remain stable and avoid crashing.
LocalJsonStore Collection Names¶
education: Academic records (Shape: Dictionary)skills: User skills and proof items (Shape: Dictionary)skilltracks: Target roles and skill gaps (Shape: Dictionary)
Final Shape of Each Contract¶
- SkillRecord: Contains
Name,Claim,Prove(no aggregate score). - AcademicRecord: Contains
EducationEntryId, lists ofAcademicTerm,AcademicCourse,RequirementRemainingetc. - SkillTrack: Contains
TargetRole,JobPostingIds,RequiredSkills. - TopSkills:
IntakeProfile.TopSkillsis UNTOUCHED by this ticket — still a persistedList<string>, no[JsonIgnore], no type change. It is a pre-existing, heavily-consumed field (25+ apply engines, resume composer, HonestyGuard, draft generators) — do NOT JsonIgnore or retype it here or in any follow-up. A back-compat derived-projection relationship to the newSkillRecord/SkillTrackmodel is future, explicit-ticket scope only, never silent.