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
Deleting an entry from the reconstructed résumé is a one-click destructive action with no confirmation — while deleting a single bullet inside that same entry asks first. The gradient is inverted: the cheaper, more recoverable action is guarded and the more expensive one is not.
RemoveButton (src/components/features/ReconstructedAdd.tsx:132) is a bare <Button>. It does not confirm.
So one click destroys the entry and all N of its bullets, with no intermediate state.
Before #858 this only applied to user-added entries — trivially re-creatable, so no confirm was warranted. #858 extended entry deletion to parsed entries, and that changes the calculus: a parsed entry carries parser output, and the only recovery is resetAll (which discards every edit in the session) or re-uploading the PDF.
#856 explicitly scoped out an undo toast. It did not scope out a confirm, and the asymmetry with #626 is what stands out.
Raised as a Secondary on #858 (#858) and deferred there on the reviewer's own recommendation — the index-remap and round-trip work in that PR is already large and well-tested, and this is a separable UX change.
Scope — all four sections
The same one-click delete ships in every section that has a remove control:
Decision:extend the #626 inline-confirm pattern rather than introducing a Dialog. A modal for a row-level delete is heavier than the interaction warrants and would diverge from the bullet path this issue exists to align with. No new component; the confirm state belongs beside the existing removes.pending shape.
Problem
Deleting an entry from the reconstructed résumé is a one-click destructive action with no confirmation — while deleting a single bullet inside that same entry asks first. The gradient is inverted: the cheaper, more recoverable action is guarded and the more expensive one is not.
RemoveButton(src/components/features/ReconstructedAdd.tsx:132) is a bare<Button>. It does not confirm.removeEntryWithBullets(src/lib/edit/entry-remove.ts) callsonRemoveBulletdirectly, which bypasses the per-bullet confirmation strip (removes.pending, [edit] no way to delete a bullet outside the WebGPU-gated rewrite panel; cleared bullets leave a ghost row #626) that guards removing one bullet in the Experience path.So one click destroys the entry and all N of its bullets, with no intermediate state.
Before #858 this only applied to user-added entries — trivially re-creatable, so no confirm was warranted. #858 extended entry deletion to parsed entries, and that changes the calculus: a parsed entry carries parser output, and the only recovery is
resetAll(which discards every edit in the session) or re-uploading the PDF.#856 explicitly scoped out an undo toast. It did not scope out a confirm, and the asymmetry with #626 is what stands out.
Raised as a Secondary on #858 (#858) and deferred there on the reviewer's own recommendation — the index-remap and round-trip work in that PR is already large and well-tested, and this is a separable UX change.
Scope — all four sections
The same one-click delete ships in every section that has a remove control:
Remove achievementsrc/components/features/ReconstructedResume.tsx:1058Remove projectsrc/components/features/ReconstructedResume.tsx:814Remove rolesrc/components/features/ReconstructedRole.tsx:440Remove educationsrc/components/features/ReconstructedEducationSkills.tsx:166Reuse analysis
Capability: confirm a destructive delete before it commits.
Existing surfaces found:
removes.pendingstate, rendered inline in the bullet row (src/components/features/ResumeBulletRow.tsx). This is the established in-repo pattern for exactly this concern, and matching it is the point of the issue.RemoveButton—src/components/features/ReconstructedAdd.tsx:132, already used by all four sections.Dialogprimitive —src/design-system/primitives/Dialog.tsx.Decision: extend the #626 inline-confirm pattern rather than introducing a
Dialog. A modal for a row-level delete is heavier than the interaction warrants and would diverge from the bullet path this issue exists to align with. No new component; the confirm state belongs beside the existingremoves.pendingshape.Implementation sketch
RemoveButtonsites through it: first click arms, second confirms, blur/escape disarms.removeEntryWithBulletsstays the single delete definition — the confirm gates the call, it does not change the two-write ordering the docblock pins.Acceptance criteria
removeBulletin the pinned bullets-first order (src/lib/edit/entry-remove.ts).npm run verifygreen.Not in scope
resetAllsemantics.