{"record":{"id":"6a5cfc0ecbed8af7","repo":"srbhr/Resume-Matcher","slug":"personalinfo-name-is-required","errorCode":null,"errorMessage":"personalInfo.name is required","messagePattern":"personalInfo\\.name is required","errorType":"validation","errorClass":"ValueError","httpStatus":422,"severity":"error","filePath":"apps/backend/app/schemas/resume_wizard.py","lineNumber":104,"sourceCode":"            raise ValueError(\"answer is required for answer actions\")\n        return self\n\n\nclass ResumeWizardTurnResponse(BaseModel):\n    \"\"\"Response for one wizard turn.\"\"\"\n\n    state: ResumeWizardState\n\n\nclass ResumeWizardFinalizeRequest(BaseModel):\n    \"\"\"Request to create the master resume from the wizard draft.\"\"\"\n\n    state: ResumeWizardState\n\n    @model_validator(mode=\"after\")\n    def _validate_ready_to_finalize(self) -> \"ResumeWizardFinalizeRequest\":\n        if not self.state.resume_data.personalInfo.name.strip():\n            raise ValueError(\"personalInfo.name is required\")\n        return self\n\n\nclass ResumeWizardFinalizeResponse(BaseModel):\n    \"\"\"Response after creating the master resume.\"\"\"\n\n    message: str\n    request_id: str\n    resume_id: str\n    processing_status: Literal[\"ready\"] = \"ready\"\n    is_master: bool\n","sourceCodeStart":86,"sourceCodeEnd":116,"githubUrl":"https://github.com/srbhr/Resume-Matcher/blob/116f9cc3b00e1ac91734a6c2679bf41ea64a0edc/apps/backend/app/schemas/resume_wizard.py#L86-L116","documentation":"ResumeWizardFinalizeRequest's model validator _validate_ready_to_finalize blocks finalization when state.resume_data.personalInfo.name is empty or whitespace-only. A master resume cannot be generated without a name, so the validator raises this ValueError.","triggerScenarios":"Submitting a finalize request whose state.resume_data.personalInfo.name is \"\", \" \", or never set by earlier wizard turns.","commonSituations":"User skips the intro/name question and tries to finalize; LLM merge failed to populate personalInfo; name fallback logic didn't run (e.g. deterministic name fallback missed); state carried over from an older session schema.","solutions":["Populate resume_data.personalInfo.name before finalizing (prompt the user or use a fallback)","Check the wizard state after each turn and require a non-blank name before enabling finalize","If the LLM should infer the name, verify the intro turn merged it into personalInfo","Re-run or repair the state rather than calling the finalize endpoint"],"exampleFix":"// before\nResumeWizardFinalizeRequest(state=state)  # state.resume_data.personalInfo.name == \"\"\n// after\nif not state.resume_data.personalInfo.name.strip():\n    state.resume_data.personalInfo.name = user_provided_or_fallback_name\nResumeWizardFinalizeRequest(state=state)","handlingStrategy":"validation","validationCode":"def can_finalize(state: ResumeWizardState) -> bool:\n    return bool(state.resume_data.personalInfo.name.strip())","typeGuard":"def has_name(state: ResumeWizardState) -> bool:\n    return state.resume_data.personalInfo.name.strip() != \"\"","tryCatchPattern":"try:\n    req = ResumeWizardFinalizeRequest.model_validate(body)\nexcept ValidationError as e:\n    raise HTTPException(422, \"a resume name is required before finalizing\") from e","preventionTips":["Gate the finalize button on a non-blank personalInfo.name","Require/derive the name during the intro turn before allowing later steps","Periodically validate state.resume_data against the schema during the session"],"tags":["pydantic","validation","missing-field"],"backgroundTag":"missing-required-field","analyzedSha":"116f9cc3b00e1ac91734a6c2679bf41ea64a0edc","analyzedAt":"2026-08-28T22:51:40.999Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}