What problem does this solve?
The profile wizard at agent/profile_wizard.py already extracts name, email, phone, school, degree, and skills from a resume PDF. But the resulting data/master-resume.json ships with experience: [] — the user's actual work history isn't parsed.
This blocks resume tailoring (the loop's tailor.py re-ranks bullets per JD, but only if there are bullets to re-rank).
What to do
- Open
agent/resume_parser.py. The text extraction (extract_resume_text) already returns plain text from PDF/DOCX.
- Add an
_extract_experience() function that finds work-history blocks. Heuristics that work:
- Lines matching
^(.+?)\s+(\d{4}.*?(present|\d{4})) are likely role/dates
- Bullets starting with
•, -, or * under a role are bullets for that role
- Section headers like "EXPERIENCE", "WORK EXPERIENCE", "PROFESSIONAL EXPERIENCE" mark the boundary
- Return a list of
{"company": str, "title": str, "start": str, "end": str, "bullets": [str]} dicts.
- Wire it into
profile_wizard.py → to_master_resume_json() so experience gets populated.
Proposed solution
Acceptance
- A real PDF resume produces a non-empty
experience array
- Bullets keep their order
agent/run.py boots clean and the tailor module sees the bullets
Notes
- Don't try LLM-based parsing yet — keep it deterministic so it works without Ollama
- Test against 3-5 different real resumes (different formats) before considering done
Alternatives you considered
No response
Are you up for contributing this?
What problem does this solve?
The profile wizard at
agent/profile_wizard.pyalready extracts name, email, phone, school, degree, and skills from a resume PDF. But the resultingdata/master-resume.jsonships withexperience: []— the user's actual work history isn't parsed.This blocks resume tailoring (the loop's
tailor.pyre-ranks bullets per JD, but only if there are bullets to re-rank).What to do
agent/resume_parser.py. The text extraction (extract_resume_text) already returns plain text from PDF/DOCX._extract_experience()function that finds work-history blocks. Heuristics that work:^(.+?)\s+(\d{4}.*?(present|\d{4}))are likely role/dates•,-, or*under a role are bullets for that role{"company": str, "title": str, "start": str, "end": str, "bullets": [str]}dicts.profile_wizard.py→to_master_resume_json()soexperiencegets populated.Proposed solution
Acceptance
experiencearrayagent/run.pyboots clean and the tailor module sees the bulletsNotes
Alternatives you considered
No response
Are you up for contributing this?