Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Return legs from /download/ to /: Fix now lands on the missing field, and a bfcache miss keeps the résumé

Open
#1,182 1 comment 0 reactions 1 assignee View on GitHub

@s-annam is already working on this.

Since Oct 7, 2026.

Assessment

This issue has not been assessed yet.

Description

improvement ready-for-agent ux:flow

Part of epic #1179. Blocked by #1181 (the /download/ page).

Problem

Once Download is its own page at /download/ (#1181), every route back to the editor on / is a real navigation, and two of them need more than a link:

  1. Fix now lands the user on the wrong spot. The soft gate's Fix now used to close the dialog and call fixFirstGap(missing) on the same page (ExportGateBody.tsx, ExportDialog.tsx:200-204). That scrolled to the first missing field and focused it. From /download/ it can only navigate to /, so the user arrives at the top of the résumé with no idea which field the gate meant.
  2. The return leg can lose an unedited parse. Going back to / is usually a bfcache restore with React state, and so edits, intact (useAutoRestoreResume.ts docblock, #783). On a bfcache miss (Chrome evicts freely, and / holds an open IndexedDB connection), / cold-mounts and auto-restores the newest library record. A résumé the user never edited was never autosaved (#824), so they land on the drop zone, or on a different résumé, after merely looking at Download. /jobs/ has the same exposure today, but Download is reached far more often.

Change

Fix now → / focused on the first gap
  • Add a one-shot sessionStorage handoff, ocv_fix_gap (mirror tailor-handoff.ts's shape and its fingerprintParse guard), carrying the gate's first missing item and the résumé fingerprint. Fix now writes it, then navigates to / (with history.back() when the referrer is our /, so the bfcache entry is reused rather than a new one pushed).
  • / consumes it on mount and on pageshow with persisted === true. The bfcache leg never remounts, which is exactly the trap #783 documents for the tailor handoff. If the fingerprint matches the parse on the page, call the existing fixFirstGap(...). Otherwise drop it silently.
  • It must not race useAutoRestoreResume. Like the pending tailor handoff, a pending fix-gap handoff makes auto-restore defer to it, using a non-destructive peek (hasPending…), never a consume.
Back to résumé and the bfcache-miss fallback
  • Back to résumé does history.back() when the previous entry is our /, so bfcache keeps the edits, and otherwise location.assign("/").
  • On a cold mount of / with no parse in memory, the download handoff (#1180) is a restore source. If ocv_download_handoff holds a résumé whose journeyKey matches no library record that auto-restore would pick, / restores that one. It is the résumé the user was just looking at, already sitting in tab-scoped storage. Restore it as a read-only view of the applied result, or as an authoring-lane load, whichever needs no edit replay. If neither is feasible without an edit-layer replay, stop at documenting the limitation in useAutoRestoreResume's docblock, file the follow-up, and say so in the PR.

Acceptance criteria

  • From /download/, Fix now with a missing email lands on / with the email field focused. This holds on a bfcache restore (e2e: page.goBack()) and on a cold load (e2e: open / with the handoff seeded).
  • A fix-gap handoff whose fingerprint does not match the page's parse is dropped without focusing anything (unit test).
  • With a fix-gap handoff pending, auto-restore does not consume or clobber it (unit test, mirroring the tailor-handoff guard).
  • Back to résumé reuses the history entry when the user came from /, so going Download → Back → Download → Back does not grow history.
  • Simulated bfcache miss (cold / with ocv_download_handoff present, no library record for it): the user sees the résumé they were downloading, not the drop zone, or the documented-limitation path is taken with a filed follow-up.
Dominant language
TypeScript
Stars
11
Forks
4
PR merge metrics
No merged PRs in 30d

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from offlinecv/OfflineCV

All issues in offlinecv/OfflineCV

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.