Follow-up from the #127 segmentation spike (docs/segmentation-spike.md), under epic #109. PR 2 — depends on the SectionedResume proof PR (Follow-up A).
Goal
Source the anonymous scorer's experience-bullet pool from the accomplishment sections (experience + projects + achievements) via SectionedResume, instead of walking all of rawText and subtracting skills.
Why
extractBulletsFromText (score.ts:612) walks the whole document and treats every marker-led line as an experience bullet, then subtracts skills via the (now-retired) side-channel. That "pool everything, subtract" shape is the structural reason #30 needed a side-channel at all (spike §1.6). Pooling directly from the accomplishment sections is what the authed scorer already does per-role (score.ts:284-:289); this aligns the two surfaces and removes the last raw-text re-derivation.
Scope
extractBulletsFromText (or its replacement) iterates input.sections.accomplishmentSections lines rather than rawText.
- Retire
buildSkillsExclusion (score.ts:583) and the excludeStripped param — skills lines are simply never in the pool.
- Also retire the scorer's
|| bullets.length > 0 experience-completeness fallback (score.ts:698) in favor of "is there a non-empty experience section?" (spike §1.5).
- Keep the
LONE_BULLET_RE Word-table merge (score.ts:564) but run it within the experience section.
Acceptance
- This is a deliberate scoring change. Bump
ATS_SCORE_ALGO_VERSION (score.ts:54) with a changelog entry.
- Corpus goldens regenerated AND spot-audited fixture-by-fixture (don't blind-regen — corpus-snapshot lesson). Document which fixtures moved and why.
- typecheck + corpus suite green.
Refs #127, #109.
Follow-up from the #127 segmentation spike (
docs/segmentation-spike.md), under epic #109. PR 2 — depends on the SectionedResume proof PR (Follow-up A).Goal
Source the anonymous scorer's experience-bullet pool from the accomplishment sections (experience + projects + achievements) via
SectionedResume, instead of walking all ofrawTextand subtracting skills.Why
extractBulletsFromText(score.ts:612) walks the whole document and treats every marker-led line as an experience bullet, then subtracts skills via the (now-retired) side-channel. That "pool everything, subtract" shape is the structural reason #30 needed a side-channel at all (spike §1.6). Pooling directly from the accomplishment sections is what the authed scorer already does per-role (score.ts:284-:289); this aligns the two surfaces and removes the last raw-text re-derivation.Scope
extractBulletsFromText(or its replacement) iteratesinput.sections.accomplishmentSectionslines rather thanrawText.buildSkillsExclusion(score.ts:583) and theexcludeStrippedparam — skills lines are simply never in the pool.|| bullets.length > 0experience-completeness fallback (score.ts:698) in favor of "is there a non-empty experience section?" (spike §1.5).LONE_BULLET_REWord-table merge (score.ts:564) but run it within the experience section.Acceptance
ATS_SCORE_ALGO_VERSION(score.ts:54) with a changelog entry.Refs #127, #109.