Skip to content

WW-98 Result

Files Touched

  • src/WorkWingman.Core/Models/EducationStubs.cs
  • src/WorkWingman.Core/Models/IntakeProfile.cs
  • src/WorkWingman.Core/Models/BackupDomainRegistry.cs
  • frontend/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 of AcademicTerm, AcademicCourse, RequirementRemaining etc.
  • SkillTrack: Contains TargetRole, JobPostingIds, RequiredSkills.
  • TopSkills: IntakeProfile.TopSkills is UNTOUCHED by this ticket — still a persisted List<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 new SkillRecord/SkillTrack model is future, explicit-ticket scope only, never silent.