Conversation
Review — Approve ✅ (stacked on #138 — merge that first)A well-scoped, well-documented deliberate scoring change. It removes the "pool all of rawText, then subtract a skills set" anti-pattern and instead pools bullets from the accomplishment sections, making skills exclusion structural rather than a side-channel. The #82 live-edit path is correctly re-threaded through the section view. Verified locally on Verification performed
What I checked closely
Notes (non-blocking)
None block merge. Clean structural win. 🤖 Generated with Claude Code |
Pool the anonymous scorer's experience-bullet set from the accomplishment sections (experience/projects/achievements) via SectionedResume instead of walking all of rawText and subtracting skills. Skills are excluded by construction. - Retire extractBulletsFromText + buildSkillsExclusion + stripBulletMarker; add extractBulletsFromSections + extractBulletsFromLines. - Experience-completeness check now asks "is there a non-empty experience section?" instead of "any bullet anywhere". - Bump ATS_SCORE_ALGO_VERSION 1.2 -> 1.3 (deliberate scoring change) with changelog entry. - Thread the edited SectionedResume through applyOverrides (new replaceBulletInSections + sections param/return) and App.tsx so live bullet edits re-grade Specificity/Structure (#82 integration). - Regenerated + spot-audited corpus goldens: 19 fixtures version-stamp-only (bullets already inside accomplishment sections); 5 moved (totalBullets dropped) because contact/summary/education/ un-segmented bullets correctly left the pool — all narrowing, none added. Resolves #133 Refs #109 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GstfZc8CpvugDY85bS541Y
|
Rebased onto Gates green on the rebased branch: On the four non-blocking review notes: all are flagging semantic shifts / pre-existing conditions, not change requests, so leaving code as-is. Note 4 (no corpus fixture pins the changed experience-completeness branch) is the only one with a possible follow-up — the |
Summary
Sources the anonymous scorer's experience-bullet pool from the accomplishment sections (experience / projects / achievements) of
SectionedResumevia a newextractBulletsFromSections, instead of walking all ofrawTextand subtracting a skills-line set. Skills are now excluded by construction (skills is not an accomplishment section), retiringextractBulletsFromText,buildSkillsExclusion, andstripBulletMarker— the "pool everything, subtract" shape that forced the #30 side-channel. The experience-completeness check now asks "is there a non-empty experience section?" rather than guessing from the global bullet count (spike §1.5). The #82 live bullet-edit path is threaded so an edit re-grades Specificity/Structure:applyOverridesnow takes and returns the editedSectionedResume(newreplaceBulletInSections), andApp.tsxfeeds the edited sections into the scorer.This is a deliberate scoring change:
ATS_SCORE_ALGO_VERSIONbumped 1.2 → 1.3 with a changelog entry.Resolves #133
Refs #109, #127, #82
Goldens movement (regenerated + spot-audited fixture-by-fixture)
19 of 24 fixtures are version-stamp-only (their bullets were already inside accomplishment sections — unchanged, as expected). 5 moved, all narrowing (totalBullets dropped; none increased → no double-counting):
• jane@…,• (312)…) were falsely pooled as experience bullets; removed → ratios riseOnly lossy keys/counts
*.expected.jsonsnapshots changed — no fixture binaries touched, so no PII surface.Test plan
npm run typecheckcleannpm run testgreen (616 tests, 41 files; 24 corpus fixtures match regenerated goldens)npm run lint(eslint) clean