You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Part (a) of #653. Not a good first issue — this one changes scoring behaviour and needs per-glyph human adjudication.
Problem
The bullet-glyph vocabulary exists as divergent copies, and the divergence is live: glyphs the parser treats as bullets are invisible to the scorer, so those bullets drop out of the Specificity pool.
Plus copies in markdown-emit.ts, extract/group-bullets.ts and webllm/localize/achievements.ts — 8 in total per the #646 review.
⁃ (U+2043 hyphen bullet) and — (em dash) are parser bullets absent from the scorer's class. A résumé using either has its Experience bullets segmented correctly by the parser and then silently skipped by extractBulletsFromLines (score.ts:808-822), deflating Specificity. Conversely ▶, ►, · and � are scorer-only.
Merging the sets changes scores on existing résumés. That is a deliberate behaviour change requiring a version bump and a reviewed rebaseline, which is why it cannot ride along with the behaviour-preserving consolidations.
Implementation plan
Mint a new import-nothing leaf for the glyph vocabulary. House precedent is extract/title-shape.ts. Notline-primitives.ts — it imports regex.ts, and deriving there re-creates the cycle regex.ts:317-321 exists to avoid, dragging the 672-line regex.ts and its module-eval Intl gazetteer onto the eager entry graph via the score/edit consumers (the feat: primary role targeting, editable headline, and job-search handoff (#598) #605 failure class).
Derive all 8 copies from the leaf as named exported sets, preserving any distinction that survives adjudication as its own derived constant rather than collapsing it.
Bump ATS_SCORE_ALGO_VERSION.
Rebaseline the 54 corpus snapshots; review the score deltas fixture by fixture.
Acceptance criteria
One import-nothing leaf owns the glyph vocabulary; all 8 sites derive from it.
The leaf imports nothing, asserted by a test (follow title-shape.ts's contract).
Per-glyph adjudication is written down in the leaf's docblock, not just in the PR.
ATS_SCORE_ALGO_VERSION bumped.
Corpus rebaseline reviewed fixture-by-fixture; score deltas explained in the PR description.
A regression test covers a ⁃-bulleted and an —-bulleted résumé reaching the Specificity pool.
The / entry chunk does not gain regex.ts (build-verified).
Part (a) of #653. Not a good first issue — this one changes scoring behaviour and needs per-glyph human adjudication.
Problem
The bullet-glyph vocabulary exists as divergent copies, and the divergence is live: glyphs the parser treats as bullets are invisible to the scorer, so those bullets drop out of the Specificity pool.
Verified divergence:
src/lib/heuristics/line-primitives.ts:35(BULLET_CLASS)[•‣▪●◦⁃*\-–—]src/lib/heuristics/sections.ts:145(VISUAL_BULLET_RE)[•‣▪●◦⁃*\-–—]src/lib/heuristics/regex.ts:321(LEADING_BULLET_RE)[•‣▪●◦⁃*\-–—]src/lib/score/score.ts:136(BULLET_MARKER_RE)[-*•●–▪◦‣▶►·�]src/lib/score/score.ts:789(LONE_BULLET_RE)[•●▪◦‣▶►·�]src/lib/edit/apply-overrides.ts:105(LEADING_MARKER_RE)[-*•●–▪◦‣▶►·�]Plus copies in
markdown-emit.ts,extract/group-bullets.tsandwebllm/localize/achievements.ts— 8 in total per the #646 review.⁃(U+2043 hyphen bullet) and—(em dash) are parser bullets absent from the scorer's class. A résumé using either has its Experience bullets segmented correctly by the parser and then silently skipped byextractBulletsFromLines(score.ts:808-822), deflating Specificity. Conversely▶,►,·and�are scorer-only.Why this is separate from #653(b)/(c)/(d)
Merging the sets changes scores on existing résumés. That is a deliberate behaviour change requiring a version bump and a reviewed rebaseline, which is why it cannot ride along with the behaviour-preserving consolidations.
Implementation plan
extract/title-shape.ts. Notline-primitives.ts— it importsregex.ts, and deriving there re-creates the cycleregex.ts:317-321exists to avoid, dragging the 672-lineregex.tsand its module-evalIntlgazetteer onto the eager entry graph via the score/edit consumers (the feat: primary role targeting, editable headline, and job-search handoff (#598) #605 failure class).-and–in particular are ambiguous (a leading hyphen is also a date-range fragment and a negated number — see cleanRewriteLine eats the minus sign off a line-initial negative number (-5% churn→5% churn) #821).ATS_SCORE_ALGO_VERSION.Acceptance criteria
title-shape.ts's contract).ATS_SCORE_ALGO_VERSIONbumped.⁃-bulleted and an—-bulleted résumé reaching the Specificity pool./entry chunk does not gainregex.ts(build-verified).Parent: #653. Roadmap item 5(a) of #646.