Conversation
- AtsScoreReadout: add md:min-w-0/md:flex-1 + min-w-0 so score row
no longer collapses when the completeness hint is long; all 3
dimension cards keep full width
- regex.ts: DATE_ANCHOR/MONTH_YEAR_ANCHOR admit redacted placeholder
years (20XX, and XXXX/#### only when month-anchored) so roles like
"March 20XX – December 20XX" parse correctly as date ranges
- line-primitives.ts isProseLine + entry-blocks.ts: role descriptions
written as bullet-less prose paragraphs are now captured as the role
body, not absorbed into the header
- entry-blocks.ts R1 hybrid y-gap body signal: on the PDF path a
paragraph-sized vertical gap (>1.4× section line-height) drives the
header-vs-body split; DOCX/markdown (flat y) fall back to isProseLine.
Same gap folds a wrapped prose paragraph into one body unit so a blurb
stays one bullet instead of splitting mid-sentence
- score.ts: pool per-role descriptions as a fallback bullet source when
the accomplishment sections yield no marker bullets (glyph-less Word/
Office prose templates), mirroring the authed scorer's splitBullets so
Specificity/Structure grade the prose and the bullets render per role
- extract/experience.ts R2 guarded "Role, Company" comma split: single-
line headers like "Office manager, The Phone Company" split into title
+ company, guarded against legal suffixes ("Acme, Inc") and location
tails
- cascade.ts: count the experience `team` field in countExtractedChars
so better field mapping doesn't under-measure extraction and trip the
low-extraction-ratio hard-fail
- Re-baked 5 corpus snapshots (all improvements or negligible drift):
chanchal-sample conf 0→0.9 (exp 1→3, score 24→79 once prose grades as
bullets); chanchal-bulleted-skills 0→0.9 (exp 2→3);
single-word-name-mononym 0→0.86; weasyprint-two-column 0→0.64;
awesome-cv 0.9→0.89
Resolves #158
rohithgollapalli
left a comment
There was a problem hiding this comment.
Review
Solid parser PR — the entry-block rewrite, the top-origin y-gap math (sectionLineHeight/startsBodyByGap), and the redacted-year regex all check out. One real regression and one minor note.
1. src/lib/heuristics/extract/experience.ts:97-99 — splitRoleComma misattributes a city as the company for "Title, Location" headers (regression)
The guard only checks that the part before the comma looksLikeTitle and the part after isn't a bare legal suffix. It has no guard against a location tail when a title keyword is present before the comma — the documented location-tail defense ("no title keyword before the comma") only covers the "Company … City, ST" shape, not "Title, City".
Trace for Marketing Manager, San Francisco (a common header form):
before="Marketing Manager"(looksLikeTitle ✓),after="San Francisco"(not a legal suffix) → splits.- Downstream neither part
looksLikeCompany, so the else-branch hitsfirstLooksTitle && !secondLooksTitle→company = "San Francisco".
Before this PR the line stayed unsplit and company was left undefined — so the change actively introduces a wrong company field (a city). No corpus fixture exercises "Title, City", which is why tests stay green; it's a latent regression. Consider requiring looksLikeCompany(after) (or rejecting a known location shape) before splitting.
Minor — src/lib/score/score.ts:673-680
poolExperienceDescriptions only pools experience[].description, but the comment says it "mirrors the authed scorer," which also pools project (#95) and achievement (#96) descriptions. A glyph-less template whose prose lives only in a projects/achievements section (and whose accomplishment-section pool comes back empty) still grades 0. Low impact — worth a one-line note in the comment if intentional.
🤖 Generated with Claude Code
Address PR #159 review (rohithgollapalli): - splitRoleComma no longer cleaves a location tail off as the company. "Marketing Manager, San Francisco" (bare city), "Product Designer, Austin, TX" (City, ST), and intl "City, Country" tails are now vetoed via looksLikeLocationTail, while real "Role, Company" headers with no legal suffix (Nod Publishing, Southridge Video) still split. Closes the latent regression where a city was recorded as the employer. - poolExperienceDescriptions: document that it pools experience descriptions only, not project (#95) / achievement (#96) ones. - Add experience.role-comma.test.ts regression coverage. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018GAj62FwHV2WHunBTGCR9P
|
Both findings addressed in 8107a8f:
Typecheck clean, 721/721 green. |
Fixes redacted 20XX dates, prose-body capture, guarded Role,Company / Title,Location split, and prose-pool scoring for glyph-less Word templates; fixes score-readout render collapse. Resolves #158.
Fixes redacted 20XX dates, prose-body capture, guarded Role,Company / Title,Location split, and prose-pool scoring for glyph-less Word templates; fixes score-readout render collapse. Resolves #158.
Summary
Fixes the three defects the
chanchal-sharma-sample.pdfreferred-resume fixture (a Word/Office template with redacted20XXplaceholder years and glyph-less prose descriptions) surfaced, plus the score-readout render collapse:AtsScoreReadoutscore row no longer collapses when the completeness hint is long; the 3 dimension cards keep full width.DATE_ANCHOR/MONTH_YEAR_ANCHORadmit20XX(andXXXX/####only when month-anchored), soMarch 20XX – December 20XXparses as a date range. All 3 roles now parse with correct title/company/dates.isProseLinefallback for flat-y DOCX/markdown), and a wrapped paragraph folds into one body unit."Role, Company"single-line headers split into title + company (guarded againstAcme, Incand location tails), making all three roles map consistently.chanchal-samplegoes 1→3 roles, overall 24→79.cascade.tscounts the experienceteamfield incountExtractedCharsso the better field mapping doesn't trip the low-extraction-ratio hard-fail.5 corpus snapshots re-baked — all improvements or negligible drift (chanchal-sample/-bulleted-skills 0→0.9; single-word-name-mononym 0→0.86; weasyprint-two-column 0→0.64; awesome-cv 0.9→0.89).
Closes #158
Test plan
npm run typecheckcleannpm run testgreen (718 pass)npm run lintcleannpm run devon the target fixture (3 roles, descriptions render as bullets, score breakdown no longer collapses)