Skip to content

Release/v1.3.0#23

Merged
tpikachu merged 6 commits into
masterfrom
release/v1.3.0
Jul 2, 2026
Merged

Release/v1.3.0#23
tpikachu merged 6 commits into
masterfrom
release/v1.3.0

Conversation

@tpikachu

@tpikachu tpikachu commented Jul 2, 2026

Copy link
Copy Markdown
Owner

No description provided.

tpikachu and others added 6 commits July 2, 2026 07:28
…ounding (v1.3 #1)

The Tailor Resume core: one LLM op (services/openai/tailor.ts, new 'tailor' model
key — full gpt-4.1 on balanced) takes a base resume × JD × application questions and
returns an ATS-friendly tailored resume (grounded ONLY in the base resume — never
invented experience), grounded answers, and the extracted jobTitle/company.

- New applications table (migration 0006, profile-cascade + created_at index) +
  applicationsRepo (global newest-first page() with LIKE search + profile join;
  delete() removes the dedicated job + its chunks).
- Each application owns a dedicated Job row holding the JD; indexJob now also
  indexes the application's tailored resume as job-scoped `tailored` chunks, and
  vectorStore.search drops base `resume` chunks when the selected job has tailored
  ones — so "Start interview" grounds sessions in the TAILORED resume + JD with the
  session pipeline untouched. Application-owned jobs are hidden from the regular
  Interviews list/page/count.
- applications:{page,get,tailor,delete} IPC + preload facade. The tailor handler
  runs ALL model calls before any DB write (an LLM failure persists nothing); an
  uploaded base resume materializes a real, reusable profile.
- tailor.test.ts (+8): request shape, grounding/ATS prompt, defensive parsing.

Verified: typecheck · 126 unit · build green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Save any application's tailored resume as an ATS-friendly PDF. A deliberately
minimal, dependency-free markdown→HTML converter (resumeHtml.ts — headings,
bullets, bold, paragraphs; HTML-escaped first; single column, standard fonts,
one inline style, no scripts) renders in a hidden ephemeral BrowserWindow via a
data: URL, then webContents.printToPDF (Letter, custom inch margins, tagged PDF)
and a native save dialog (sanitized "[name] - [title] at [company].pdf" default).
The window is destroyed in a finally so it can never leak.

applications:export-pdf IPC + preload; resumeHtml.test.ts (+5, incl. escaping).

Verified: typecheck · 131 unit · build green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…(v1.3 #3)

New "Tailor Resume" nav page (/tailor):
- Form: base resume from a profile OR uploaded/pasted (PDF/DOCX/TXT/MD via the
  existing extract pipeline); JD via paste/upload/URL fetch; optional application
  questions (one per line). "Tailor resume" runs the op with a busy overlay.
- Result opens in ApplicationModal: the tailored resume (markdown), the grounded
  application answers, Download PDF, and delete (two-step confirm).
- Applications table: dense DataTable, server-paginated + searchable, newest
  first, labeled "[name] - [jobTitle] at [company]". Per-row "Start interview"
  launches a live session with the application's (profile, job) — grounded in the
  TAILORED resume + JD via the tailored-chunk retrieval rule; shows ● live while
  that session runs. Row click opens the detail view.

Verified: typecheck · 131 unit · build green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fixes the 5 confirmed findings from the 4-dimension refute-verify review:

- Indexing is now BEST-EFFORT, after every row exists: reindexProfile (new-profile
  path) + indexJob moved into one try/catch that returns indexError instead of
  failing the whole op — a 429/network error can no longer orphan a profile,
  discard the paid tailor result, hide a saved application behind an error banner,
  or invite duplicate profiles/applications on retry. TailorPage surfaces the
  partial state with recovery guidance.
- New applications:reindex IPC + a "Re-index" button in ApplicationModal — the
  recovery path for a failed index (application jobs are hidden from the only
  other re-index trigger), and a way to re-embed after switching embedding models.
- The "Interview ended" save/discard prompt is now GLOBAL (SavePromptModal in
  App): sessions started from Tailor Resume and stopped via the Cue Card get the
  prompt wherever the user is; InterviewPage's table refreshes off pendingSave
  clearing (its duplicate modal removed).

Docs: IPC map (applications section), OpenAI service (tailor.ts), DB (applications
table, tailored chunks, deletion semantics, indexes), session log.

Verified: typecheck · 131 unit · build green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-vs-tailored diff (v1.3 #5)

Three refinements from live testing:

- Row delete: each applications-table row gets a ✕ with a two-step inline confirm
  (modal delete kept). Hidden for the live application's row; deleteApp guards and
  the modal's Delete disables — deleting mid-interview would silently downgrade the
  live session's grounding.
- No duplicate operations: the tailor handler resolves the owning profile up front
  (selected, else an existing profile with the SAME resume text), so repeat
  tailorings from one uploaded resume reuse one profile instead of creating
  duplicates; parseResume runs AT MOST ONCE per profile (skipped when already
  parsed) and reindexProfile only for created/newly-parsed profiles.
- Compare with base: ApplicationModal toggle showing side-by-side panes with
  word-level highlights (red = removed, green = added/rewritten) via a new
  dependency-free LCS diff (renderer/lib/wordDiff.ts, +6 tests; plain side-by-side
  fallback for very long resumes).

Fixes the 3 confirmed adversarial-review findings: out-of-range page self-heals
after deleting the last row of the last page; applications:reindex now also
re-embeds the owning profile's base chunks (a failed first index was otherwise
unrecoverable); delete-while-live is guarded at row, modal, and handler level.

Verified: typecheck · 137 unit · build green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Package Tailor Resume into a versioned release: tailor a base resume × JD into an
ATS-friendly resume + grounded application answers, download as PDF, saved as
searchable Applications, per-row Start interview grounded in the TAILORED resume
+ JD, base-vs-tailored comparison, and smart profile reuse. Adds
changelog/1.3.0.md (drives APP_VERSION + in-app What's New) and bumps
package.json to 1.3.0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@tpikachu tpikachu merged commit 7b1b011 into master Jul 2, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant