TL;DR: Compute total years of experience as the union of employment date intervals, not the sum. Two overlapping one-year contracts are one year of experience, not two. After the fix, the total matches what a human reads off the timeline.

```text
resume agent doubled the candidate's years of experience  -  overlapping contract roles got summed instead of merged
```

1. Pull the parsed work history with start and end dates for each role. Expected: at least two roles with overlapping date ranges, usually contract or consulting stints.
2. Compute the naive sum and the union manually for one candidate. Expected: the sum is larger than the union, and the union matches the actual calendar span of the career.
3. Change the calculation: merge overlapping intervals first, then sum the merged spans. Normalize date formats first and treat "present" as the current date. Expected: the re-computed total equals the manual union.
4. Spot-check a candidate with one continuous job and no overlaps. Expected: the total is unchanged, so the fix only affects overlapping ranges.

## Use this when
- A candidate's parsed years of experience exceed their actual career span
- The work history contains overlapping contract, consulting, or part-time roles
- Experience totals look roughly double what the resume timeline shows

## Not for this skill when
- The roles are sequential with no overlap and the total is still wrong (that is a date-parsing bug, not a summation bug)
- The inflated number comes from counting freelance clients as separate jobs
- Date ranges are missing entirely

## Variant phrasings
### Resume agent summed overlapping jobs and inflated years of experience
### Parser counted concurrent contracts as separate years
### Candidate years of experience doubled by overlapping roles

## Why it happens
Summing role durations is the obvious implementation, and it is correct for sequential jobs. Contractors and consultants routinely hold overlapping engagements, so a plain sum double-counts every overlapped month. Merging intervals before summing is the only calculation that matches calendar reality.

## Edge cases
- Part-time roles held alongside full-time work: the union still counts overlapped time once, which matches how recruiters read it
- Open-ended roles with no end date: default to the current date, but flag the assumption in the record
- Date ranges given only as years ("2021 - 2022"): merge on year granularity and accept the coarser result rather than inventing months

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst__FVcQsSNlnNfPS_RtW7XSA
