Follow-up from the #127 segmentation spike (docs/segmentation-spike.md), under epic #109. PR 3 — depends on SectionedResume (Follow-up A).
Goal
Replace the stripPromotedUrls phantom-entry scrub (openresume.ts:133, driver :196-:250) with a provenance/ownership model: a line consumed by the contact extractor (a promoted identity link) is marked consumed and never offered to extractProjects/extractAchievements/etc.
Why
Because extractContact matches LinkedIn/GitHub document-wide (anywhereOnDoc, extract-fields.ts:455), a footer "Links" line is promoted into the contact card AND survives as a phantom project/achievement entry. Today that duplicate is scrubbed after the fact by slug subtraction across every section body. Better segmentation alone does NOT delete this (spike §1.3) — the same URL is legitimately both contact and a links-section line. The right fix is ownership: the contact extractor claims the links it consumes so they never re-render.
Scope
Acceptance
Refs #127, #109.
Follow-up from the #127 segmentation spike (
docs/segmentation-spike.md), under epic #109. PR 3 — depends on SectionedResume (Follow-up A).Goal
Replace the
stripPromotedUrlsphantom-entry scrub (openresume.ts:133, driver:196-:250) with a provenance/ownership model: a line consumed by the contact extractor (a promoted identity link) is marked consumed and never offered toextractProjects/extractAchievements/etc.Why
Because
extractContactmatches LinkedIn/GitHub document-wide (anywhereOnDoc,extract-fields.ts:455), a footer "Links" line is promoted into the contact card AND survives as a phantom project/achievement entry. Today that duplicate is scrubbed after the fact by slug subtraction across every section body. Better segmentation alone does NOT delete this (spike §1.3) — the same URL is legitimately both contact and a links-section line. The right fix is ownership: the contact extractor claims the links it consumes so they never re-render.Scope
stripPromotedUrls,isPromotedUrl,PROMOTED_LABEL_RE,urlSlug-for-stripping, and the per-section strip driver inbuildHeuristicResult.Acceptance
Refs #127, #109.