## TL;DR

"Led" is a bullet verb, not a job title, but a parser scanning the whole document for title-like phrases will promote it. Restrict title extraction to the experience section, require titles to match known role patterns (noun phrases with seniority or function markers), and reject bare verbs. Section-aware parsing beats whole-document pattern matching.

## The query

```text
parser agent counted 'Led' in a volunteer section as management experience - bullet role headers misclassified as job titles
```

## Use this when

- Parsed job titles contain verb phrases ("Led", "Built", "Managed") or section headers.
- Volunteer, project, or summary sections leak into employment history.
- Management experience appears inflated by bullet headers.

## Not for

- Reference-letter headers parsed as jobs (that is a segmentation problem, separate skill).
- Date-parsing errors or overlapping-role double counting.
- Skills hallucinated from hobbies or interests sections.

## Steps

### Step 1: Confirm the misclassification in the parsed output

```bash
python -c "import json; d=json.load(open('candidate.json')); print([j['title'] for j in d['jobs']])"
```

Expected output: the title list including the bogus entry ("Led" or similar). Note which section it came from. If it came from outside the experience section, the section boundary is the bug.

### Step 2: Add section detection before title extraction

```python
# only these sections yield job titles; everything else is context
TITLE_SECTIONS = {"experience", "employment history", "work experience"}
```

Expected output: a section classifier that labels each document region. Volunteer work, projects, and summaries are labeled as their own sections and never feed the title extractor.

### Step 3: Validate candidate titles against a role lexicon

```bash
python validate_titles.py candidate.json --lexicon role-titles.txt
```

Expected output: titles that match known role patterns pass. Bare verbs ("Led", "Built", "Drove") fail validation and get flagged instead of recorded as management experience. The lexicon does not need to be exhaustive. It needs to reject verbs.

### Step 4: Require title-adjacent evidence

```python
# a real job title travels with a company name and a date range
def is_job(title_block):
    return title_block.has_company() and title_block.has_dates()
```

Expected output: the "Led" bullet fails the evidence check (no company, no dates nearby) while real titles pass. Structure beats pattern matching.

### Step 5: Re-parse and verify

```bash
python parse_resume.py resume.pdf | python validate_titles.py --lexicon role-titles.txt
```

Expected output: "Led" no longer appears as a title. Legitimate volunteer leadership roles ("Volunteer Coordinator, 2021-2023" with an org name) still parse correctly because they carry the structural evidence.

### Step 6: Track misclassification rate per resume template

Record in parser-metrics.txt: template modern-2col had 3 verb-title misclassifications.

Expected output: a running metric per template. When a new template starts producing verb-titles, the metric spikes and the team tunes the section classifier before bad data accumulates.

## Variant phrasings

### resume parser hallucinated 3 years of React experience from the hobbies section
Same section-boundary failure: skills extracted outside the skills and experience sections. Scope skill extraction to its sections too.

### parser read the target role from a cover-letter header as the current job
Same whole-document scanning bug. The cover letter is its own document zone with its own rules.

### bullet headers like Owned and Drove counted as executive titles
Same verb-title class. Step 3's lexicon rejects the whole family, not just "Led."

## Why it happens

Header-style bullets ("Led migration to Kubernetes", "Drove 30% cost reduction") match the same shape rules as titles: capitalized, short, leading the line. A parser that scans the whole document for title-shaped text cannot distinguish a bullet verb from a job title without section context. Volunteer sections are the classic trap because they legitimately contain leadership language that is not employment. The parser saw the shape right and the meaning wrong.

## Edge cases

- Genuine volunteer leadership roles ("Board Member", "Volunteer Coordinator") are real titles and should parse. The evidence check in step 4 (org name plus dates) keeps them while rejecting bare verbs.
- Resumes without explicit section headers need inferred sections (date-range density, bullet patterns). Inferred sections are less reliable, so raise the evidence bar there.
- Some cultures' resumes list the verb first in every bullet ("Led team of 5"). The lexicon approach handles this fine because it rejects verbs regardless of frequency.
- Do not fix this by blacklisting specific words. The next resume uses "Spearheaded." Structural checks (section plus evidence) generalize. Word lists do not.
- When the parser is uncertain, flag for human review rather than guessing. A flagged title costs a recruiter ten seconds. A wrong title costs a bad screen.

## Provenance

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